From ecde167da74c86bc047aaf84c5e548cf65a5da98 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sat, 7 Jun 2008 20:34:49 +0200 Subject: Initial commit --- COPYING | 339 ++ INSTALL | 62 + Makefile | 120 + README | 61 + UChecksum.pas | 475 ++ UChecksumDruid.pas | 629 ++ UChmod.pas | 236 + UChown.pas | 198 + UColumns.pas | 221 + UConfig.pas | 1132 ++++ UConnectionManager.pas | 293 + UConnectionProperties.pas | 334 ++ UCopyMove.pas | 78 + UCore.pas | 2785 +++++++++ UCoreClasses.pas | 349 ++ UCoreUtils.pas | 1821 ++++++ UDirDelete.pas | 100 + UEngines.pas | 1140 ++++ UFileAssoc.pas | 358 ++ UFileTypeSettings.pas | 901 +++ UGTKLoader.pas | 62 + UGlibC_compat.pas | 256 + UGlibThreads.pas | 111 + UGnome.pas | 1274 ++++ ULocale.pas | 297 + ULogin.pas | 146 + UMain.pas | 6128 ++++++++++++++++++++ UMounterPrefs.pas | 565 ++ UNewDir.pas | 80 + UOverwrite.pas | 173 + UPreferences.pas | 822 +++ UProgress.pas | 142 + UProperties.pas | 144 + URemoteWait.pas | 106 + URunFromVFS.pas | 260 + USearch.pas | 1030 ++++ USelect.pas | 151 + USetPassword.pas | 105 + USplitFile.pas | 115 + USymlink.pas | 89 + UTestPlugin.pas | 181 + UToolTips.pas | 401 ++ UViewer.pas | 451 ++ libgtk_kylix/GTKClasses.pas | 174 + libgtk_kylix/GTKConsts.pas | 259 + libgtk_kylix/GTKControls.pas | 1050 ++++ libgtk_kylix/GTKDialogs.pas | 248 + libgtk_kylix/GTKExtCtrls.pas | 707 +++ libgtk_kylix/GTKForms.pas | 874 +++ libgtk_kylix/GTKMenus.pas | 530 ++ libgtk_kylix/GTKPixbuf.pas | 214 + libgtk_kylix/GTKStdCtrls.pas | 1008 ++++ libgtk_kylix/GTKText.pas | 167 + libgtk_kylix/GTKUtils.pas | 212 + libgtk_kylix/GTKView.pas | 1376 +++++ pixmaps/emblem_symbolic_link_png.inc | 29 + pixmaps/gnome_dev_cdrom_16_png.inc | 73 + pixmaps/gnome_dev_floppy_16_png.inc | 73 + pixmaps/gnome_dev_harddisk_16_png.inc | 73 + pixmaps/gnome_dev_removable_usb_16_png.inc | 73 + pixmaps/gnome_mime_application_zip_16_png.inc | 73 + .../gnome_mime_x_directory_smb_share_16_png.inc | 73 + pixmaps/stock_folder_16_png.inc | 73 + pixmaps/stock_lock_16_png.inc | 73 + pixmaps/stock_lock_48_png.inc | 585 ++ pixmaps/stock_new_16_png.inc | 73 + pixmaps/stock_up_one_dir_16_png.inc | 73 + translations/UTranslation_CZ.pas | 1256 ++++ translations/UTranslation_DE.pas | 1236 ++++ translations/UTranslation_EN.pas | 1267 ++++ translations/UTranslation_ES.pas | 1253 ++++ translations/UTranslation_FR.pas | 1254 ++++ translations/UTranslation_HU.pas | 1256 ++++ translations/UTranslation_IT.pas | 1255 ++++ translations/UTranslation_PL.pas | 1108 ++++ translations/UTranslation_RU.pas | 1254 ++++ translations/UTranslation_SR.pas | 1261 ++++ translations/UTranslation_SV.pas | 1252 ++++ translations/UTranslation_UA.pas | 1265 ++++ tuxcmd.conf | 32 + tuxcmd.dpr | 89 + tuxcmd.res | Bin 0 -> 32 bytes vfs/ModuleLoader.pas | 156 + vfs/UVFSCore.pas | 1075 ++++ vfs/common/vfs_types.h | 114 + vfs/null_plugin/COPYING | 339 ++ vfs/null_plugin/Makefile | 22 + vfs/null_plugin/README | 15 + vfs/null_plugin/null_plugin.c | 357 ++ vfs/null_plugin/vfs_types.h | 1 + vfs/uVFSprototypes.pas | 246 + 91 files changed, 50247 insertions(+) create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 Makefile create mode 100644 README create mode 100644 UChecksum.pas create mode 100644 UChecksumDruid.pas create mode 100644 UChmod.pas create mode 100644 UChown.pas create mode 100644 UColumns.pas create mode 100644 UConfig.pas create mode 100644 UConnectionManager.pas create mode 100644 UConnectionProperties.pas create mode 100644 UCopyMove.pas create mode 100644 UCore.pas create mode 100644 UCoreClasses.pas create mode 100644 UCoreUtils.pas create mode 100644 UDirDelete.pas create mode 100644 UEngines.pas create mode 100644 UFileAssoc.pas create mode 100644 UFileTypeSettings.pas create mode 100644 UGTKLoader.pas create mode 100644 UGlibC_compat.pas create mode 100644 UGlibThreads.pas create mode 100644 UGnome.pas create mode 100644 ULocale.pas create mode 100644 ULogin.pas create mode 100644 UMain.pas create mode 100644 UMounterPrefs.pas create mode 100644 UNewDir.pas create mode 100644 UOverwrite.pas create mode 100644 UPreferences.pas create mode 100644 UProgress.pas create mode 100644 UProperties.pas create mode 100644 URemoteWait.pas create mode 100644 URunFromVFS.pas create mode 100644 USearch.pas create mode 100644 USelect.pas create mode 100644 USetPassword.pas create mode 100644 USplitFile.pas create mode 100644 USymlink.pas create mode 100644 UTestPlugin.pas create mode 100644 UToolTips.pas create mode 100644 UViewer.pas create mode 100644 libgtk_kylix/GTKClasses.pas create mode 100644 libgtk_kylix/GTKConsts.pas create mode 100644 libgtk_kylix/GTKControls.pas create mode 100644 libgtk_kylix/GTKDialogs.pas create mode 100644 libgtk_kylix/GTKExtCtrls.pas create mode 100644 libgtk_kylix/GTKForms.pas create mode 100644 libgtk_kylix/GTKMenus.pas create mode 100644 libgtk_kylix/GTKPixbuf.pas create mode 100644 libgtk_kylix/GTKStdCtrls.pas create mode 100644 libgtk_kylix/GTKText.pas create mode 100644 libgtk_kylix/GTKUtils.pas create mode 100644 libgtk_kylix/GTKView.pas create mode 100644 pixmaps/emblem_symbolic_link_png.inc create mode 100644 pixmaps/gnome_dev_cdrom_16_png.inc create mode 100644 pixmaps/gnome_dev_floppy_16_png.inc create mode 100644 pixmaps/gnome_dev_harddisk_16_png.inc create mode 100644 pixmaps/gnome_dev_removable_usb_16_png.inc create mode 100644 pixmaps/gnome_mime_application_zip_16_png.inc create mode 100644 pixmaps/gnome_mime_x_directory_smb_share_16_png.inc create mode 100644 pixmaps/stock_folder_16_png.inc create mode 100644 pixmaps/stock_lock_16_png.inc create mode 100644 pixmaps/stock_lock_48_png.inc create mode 100644 pixmaps/stock_new_16_png.inc create mode 100644 pixmaps/stock_up_one_dir_16_png.inc create mode 100644 translations/UTranslation_CZ.pas create mode 100644 translations/UTranslation_DE.pas create mode 100644 translations/UTranslation_EN.pas create mode 100644 translations/UTranslation_ES.pas create mode 100644 translations/UTranslation_FR.pas create mode 100644 translations/UTranslation_HU.pas create mode 100644 translations/UTranslation_IT.pas create mode 100644 translations/UTranslation_PL.pas create mode 100644 translations/UTranslation_RU.pas create mode 100644 translations/UTranslation_SR.pas create mode 100644 translations/UTranslation_SV.pas create mode 100644 translations/UTranslation_UA.pas create mode 100644 tuxcmd.conf create mode 100644 tuxcmd.dpr create mode 100644 tuxcmd.res create mode 100644 vfs/ModuleLoader.pas create mode 100644 vfs/UVFSCore.pas create mode 100644 vfs/common/vfs_types.h create mode 100644 vfs/null_plugin/COPYING create mode 100644 vfs/null_plugin/Makefile create mode 100644 vfs/null_plugin/README create mode 100644 vfs/null_plugin/null_plugin.c create mode 120000 vfs/null_plugin/vfs_types.h create mode 100644 vfs/uVFSprototypes.pas diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..212ef34 --- /dev/null +++ b/INSTALL @@ -0,0 +1,62 @@ +INSTALL INSTRUCTIONS +-------------------- + +Here are the basic instructions, what you need to do if you want to compile +Txu Commander. + +Quick instructions: Type make help to see list of available targets. + + +There are two compilers supported: FreePascal and Kylix. + +FreePascal prerequisities +------------------------- +Install the FreePascal package from your distribution or grab the binary +snapshot from the official web site (http://freepascal.org/). Make sure +the /etc/fpc.cfg file contains valid configuration (consult the manual first) or +you may encounter file not found errors. + + +Kylix prerequisities +-------------------- +First of all you will need to install Borland Kylix. This project is designed +for use with version 3 Open Edition, but it should compile also with other +variations (Professional, Enterprise). +Then you will need the sources of 'gtk2 for pascal' project, they can be +downloaded from the project site on SourceForge +(http://gtk2forpascal.sourceforge.net/) or directly from our site +(http://tuxcmd.sourceforge.net/). +Extract the downloaded sources (tuxcmd-x.x.x.tar.bz2). Then you need to edit +the Makefile file. You have to specify real path to Kylix 3 installation +(it means top-level directory here, where the bin, help, lib +and source directories are located) - this is the KYLIXPREFIX variable. +For GTK2FORPASCAL_LIBDIR, specify the path to extracted gtk2 for pascal package +sources. These are enough informations required to compile the sources. +The correct make command is 'make kylix' + + + +At last, you will need basic development utilities, such as GNU make and +install and gcc & g++ with system development libraries. + +Since some of the VFS modules are written in C/C++ and require development +headers installed in the system, you may experience difficulties with their +installation. There's no configure script at this moment, only the gnome-vfs +module requires unusual packages (libgnomevfs2). + +So you have configured the sources and you are ready to compilation. Just type +make or gmake in the directory where is the Makefile file located. It will +compile the application and all VFS modules. There should not be any problems; +if some occurs, please check if you have specified correct paths or if you have +Kylix installed correctly. Also check if you have all required development +headers installed in your system. To make the application without the modules, +type 'make tuxcmd' and to make the modules separately run 'make modules'. + +To install the application, type 'make install'. You need to have write +permissions to the target directories, so you probably must be root to do this. +You can also run 'make clean' to clean the sources and 'make uninstall' to +safely remove the installed application and all modules. + +There are no support for any desktop environment yet, so don't expect any new +icons in your application menu. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..10ff1a5 --- /dev/null +++ b/Makefile @@ -0,0 +1,120 @@ +# Makefile -- Tux Commander build system +# +# Copyright (C) 2008 Tomas Bzatek +# Check for updates on tuxcmd.sourceforge.net +# +# 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 2 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 or +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +# Specify paths +DESTDIR=/usr + +# following paths are optional; needed only for Kylix compilation +KYLIXPREFIX=/usr/local/kylix3 +GTK2FORPASCAL_LIBDIR=./gtk2 + +### End of user writeable section + + + +INSTALL=install -c +INSTALL_DATA = ${INSTALL} -m 644 +CLEAN_OBJS=*.o *.a *.d *.s *.ppu *.dcu *.rst *~ *.~* core tuxcmd fpcver.inc +LIB_SUFFIX=`if test \`uname -m\` = x86_64; then echo 64; fi` + + +# -Ct must be disabled here, causes unneeded crashes +# -CR and -Cr must be disabled here, causes range check errors with gnome-power-manager +# -Cg generates internal compiler errors on i386 +CFLAGS= -vweh -Un -Ci -Co + + + +tuxcmd:: + echo "const" > fpcver.inc + echo " ConstFPCVersionString = '`fpc -iW`';" >> fpcver.inc + echo " ConstFPCDateString = '`fpc -iD`';" >> fpcver.inc + echo " ConstFPCCompilerOSString = '`fpc -iSO`';" >> fpcver.inc + echo " ConstFPCCompilerHostProcessorString = '`fpc -iSP`';" >> fpcver.inc + echo " ConstFPCTargetOSString = '`fpc -iTO`';" >> fpcver.inc + echo " ConstFPCTargetProcessorString = '`fpc -iTP`';" >> fpcver.inc + fpc -Mdelphi $(CFLAGS) \ + -d__FPC__ \ + -Fu./libgtk_kylix -Fu./translations -Fu./vfs \ + tuxcmd.dpr + +debug: CFLAGS += -g +debug: tuxcmd + + +kylix:: + $(KYLIXPREFIX)/bin/dcc -DKYLIX \ + -U$(GTK2FORPASCAL_LIBDIR)/glib -U$(GTK2FORPASCAL_LIBDIR)/pango \ + -U$(GTK2FORPASCAL_LIBDIR)/atk -U$(GTK2FORPASCAL_LIBDIR)/gtk+/gtk \ + -U$(GTK2FORPASCAL_LIBDIR)/gtk+/gdk -U$(GTK2FORPASCAL_LIBDIR)/gtk+/gdk-pixbuf \ + -U$(KYLIXPREFIX)/lib \ + -U./libgtk_kylix -U./translations -U./vfs ./tuxcmd.dpr + + +modules:: + (cd "vfs" && $(MAKE) `echo $@ | sed s/-recursive//` ) || exit 1; + +modules_install: + (cd "vfs" && $(MAKE) install "$(DESTDIR)") || exit 1; + + + +clean cleandir: + rm -f $(CLEAN_OBJS) + ( cd vfs && rm -f $(CLEAN_OBJS) ) + ( cd libgtk_kylix && rm -f $(CLEAN_OBJS) ) + ( cd translations && rm -f $(CLEAN_OBJS) ) + + +tuxcmd_install: + if [ ! -d $(DESTDIR) ]; then mkdir -p $(DESTDIR); fi; + if [ ! -d $(DESTDIR)/bin ]; then mkdir -p $(DESTDIR)/bin; fi; + if [ ! -d $(DESTDIR)/share ]; then mkdir -p $(DESTDIR)/share; fi; + if [ ! -d $(DESTDIR)/share/doc ]; then mkdir -p $(DESTDIR)/share/doc; fi; + if [ ! -d $(DESTDIR)/share/doc/tuxcmd ]; then mkdir -p $(DESTDIR)/share/doc/tuxcmd; fi; + if [ ! -d $(DESTDIR)/lib$(LIB_SUFFIX) ]; then mkdir -p $(DESTDIR)/lib$(LIB_SUFFIX); fi; + if [ ! -d $(DESTDIR)/lib$(LIB_SUFFIX)/tuxcmd ]; then mkdir -p $(DESTDIR)/lib$(LIB_SUFFIX)/tuxcmd; fi; + $(INSTALL) ./tuxcmd $(DESTDIR)/bin + $(INSTALL_DATA) ./COPYING $(DESTDIR)/share/doc/tuxcmd + $(INSTALL_DATA) ./README $(DESTDIR)/share/doc/tuxcmd + +uninstall: + if [ -f $(DESTDIR)/bin/tuxcmd ]; then rm -f $(DESTDIR)/bin/tuxcmd; fi; + if [ -d $(DESTDIR)/share/doc/tuxcmd ]; then rm -Rf $(DESTDIR)/share/doc/tuxcmd; fi; + if [ -d $(DESTDIR)/lib$(LIB_SUFFIX)/tuxcmd ]; then rm -Rf $(DESTDIR)/lib$(LIB_SUFFIX)/tuxcmd; fi; + +help:: + @echo "Tux Commander build system" + @echo + @echo "Following targets are available:" + @echo + @echo " tuxcmd Build tuxcmd with FreePascal [default]" + @echo " kylix Build tuxcmd with Kylix (needs paths setup in Makefile)" + @echo " install Install tuxcmd to the system (DESTDIR overrides default path)" + @echo " uninstall Remove tuxcmd from the system (DESTDIR overrides default path)" + @echo " clean Cleanup the build structure" + @echo " modules Build modules (in vfs/)" + @echo " modules_install Install modules to the system" + @echo + @exit 0 + +install: tuxcmd_install + +all: tuxcmd diff --git a/README b/README new file mode 100644 index 0000000..2bf4805 --- /dev/null +++ b/README @@ -0,0 +1,61 @@ +Tux Commander development release + Version: 0.6.36 + Release date: 2008-Jun-01 + +Copyright (c) 2008 Tomas Bzatek +http://tuxcmd.sourceforge.net + +Please check project site for more details + + + +Introduction +------------ + +Tux Commander is a windowed file manager with 2 panels side by side similar to +popular Total Commander or Midnight Commander file managers. The main goal of +this project is to create powerful and user friendly file manager for Unix +operating systems. + +General features: + * Graphical application, uses GTK2 windowing toolkit + * Two directory panels side by side (vertical) + * Tabbed interface, buttons for quick access to favorite places + * Configurable mounter bar for quick access to removable media and + network shares + * Multilingual user interface + * Basic VFS (Virtual File System) support, allowing you to browse archives + and network places + * Extendable via plugin system, several VFS modules available + in the distribution + * Portable, no installation required, usable right after the extraction + * Designed for GNOME and XFCE desktop environments while preserving complete + independency (libraries are loaded dynamically when available) + * Extension-based file type actions (associations) + * Threaded file operations + * Large files (> 4GB) support + * Main application written in Object Pascal language (with FreePascal + as default compiler), plugins are written in C/C++ language + + +Using Object Pascal language might be considered as limiting factor, however +we recently switched to FreePascal compiler, solving many compatibility issues. +Also, the x86_64 port was introduced and is officially supported as well as +the i386 platform. Kylix compatibility will be still maintained though. +This project uses Pascal GTK2 bindings from the gtk2 for pascal project, +which are now part of FreePascal v2.0 distribution. + + + +Install +---------- +For installation and compilation instructions please follow the INSTALL file. + + +Testing +---------- +Tux Commander needs testing, I would be pleased if you will send any comments +or bug reports. When sending a bug report, please run "tuxcmd --debug" +and attach the log to your e-mail. + + diff --git a/UChecksum.pas b/UChecksum.pas new file mode 100644 index 0000000..895f7ec --- /dev/null +++ b/UChecksum.pas @@ -0,0 +1,475 @@ +(* + Tux Commander - UChecksum - Checksum dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UChecksum; + +interface + +uses + glib2, gdk2, gtk2, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, GTKText, + UEngines; + +type + TFChecksum = class(TGTKDialog) + BottomBox, HBox: TGTKHBox; + CheckButton: TGTKButton; + ProgressBar: TGTKProgressBar; + HPaned: TGTKHPaned; + FileList: TGTKListView; + CommentTextView: TGTKTextView; + FileListScrolledWindow, CommentTextViewScrolledWindow: TGTKScrolledWindow; + StatLabel: TGTKLabel; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure FormResponse(Sender: TObject; const ResponseID: integer); + procedure FormShow(Sender: TObject); + procedure CheckButtonClick(Sender: TObject); + private + MD5Present, SFVPresent, CommentOpen, Processing, Stop: boolean; + procedure ConstructViews; + procedure ProcessLine(s, Path: string; const IsMD5: boolean); + procedure ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); + function CompareFunc(Sender: TObject; var model: PGtkTreeModel; var a, b: PGtkTreeIter): integer; + procedure GoProcess; + procedure MarkAsBad(const FileName: string); + public + Engine: TPanelEngine; + DataList: TList; + AListView: TGTKListView; + List: TList; + function ProcessFile(FileName: string): boolean; + end; + +var + FChecksum: TFChecksum; + +implementation + +uses ULocale, UCoreUtils, Libc, UCore, DateUtils; + +type TFileListItem = class + CRC: LongWord; + MD5: string; + Name, FullPath: string; + Status: byte; + IsMD5: boolean; + Size: Int64; + end; + + +procedure TFChecksum.FormCreate(Sender: TObject); +begin + WindowTypeHint := whNormal; + List := TList.Create; + MD5Present := False; + SFVPresent := False; + CommentOpen := False; + Processing := False; + Stop := False; + OnDestroy := FormDestroy; + SetDefaultSize(750, 350); + Caption := LANGVerifyChecksumsCaption; + Buttons := [mbClose]; + StatLabel := TGTKLabel.Create(Self); + StatLabel.Caption := LANGChecksumNotChecked; + StatLabel.UseMarkup := True; + BottomBox := TGTKHBox.Create(Self); + BottomBox.Homogeneous := False; + CheckButton := TGTKButton.Create(Self); + CheckButton.Caption := LANGCheckButtonCaptionCheck; + CheckButton.SetSizeRequest(90, -1); + ProgressBar := TGTKProgressBar.Create(Self); + ProgressBar.Text := '0 %'; + BottomBox.AddControlEx(StatLabel, False, False, 5); + BottomBox.AddControlEx(ProgressBar, True, True, 5); + BottomBox.AddControlEx(CheckButton, False, False, 5); + HBox := TGTKHBox.Create(Self); + HPaned := TGTKHPaned.Create(Self); + ConstructViews; + FileListScrolledWindow := TGTKScrolledWindow.Create(Self); + FileListScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + FileListScrolledWindow.VertScrollBarPolicy := sbAutomatic; + FileListScrolledWindow.ShadowType := stShadowIn; + FileListScrolledWindow.AddControl(FileList); + CommentTextViewScrolledWindow := TGTKScrolledWindow.Create(Self); + CommentTextViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + CommentTextViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + CommentTextViewScrolledWindow.ShadowType := stShadowIn; + CommentTextViewScrolledWindow.AddControl(CommentTextView); + HPaned.Child1 := FileListScrolledWindow; + HPaned.Child2 := CommentTextViewScrolledWindow; + ClientArea.AddControlEx(HPaned, True, True, 3); + ClientArea.AddControlEx(BottomBox, False, True, 0); + OnKeyDown := FormKeyDown; + OnCloseQuery := FormCloseQuery; + OnResponse := FormResponse; + OnShow := FormShow; + CheckButton.OnClick := CheckButtonClick; + + if CheckButton.Enabled then CheckButton.SetFocus + else ActionArea.SetFocus; +end; + +procedure TFChecksum.ConstructViews; +var Column: TGTKTreeViewColumn; + i: integer; +begin + FileList := TGTKListView.CreateTyped(Self, True, [lcPointer]); + FileList.SelectionMode := smSingle; + FileList.Tooltip := LANGFileListTooltip; + FileList.CellDataFunc := ListViewCellDataFunc; + FileList.CompareFunc := CompareFunc; + FileList.RulesHint := True; + Column := FileList.Columns.Add; + Column.Caption := LANGFilenameColumnCaption; + Column.FixedWidth := 350; + Column.SortID := 0; + Column := FileList.Columns.Add; + Column.Caption := 'CRC-32'; + Column.FixedWidth := 80; + for i := 1 to 2 do begin + FileList.Columns[i - 1].SizingMode := smFixed; + FileList.Columns[i - 1].Resizable := True; + FileList.Columns[i - 1].SetProperty('ypad', 0); + FileList.Columns[i - 1].SetProperty('yalign', 0.5); + end; + CommentTextView := TGTKTextView.Create(Self); + CommentTextView.ReadOnly := True; + CommentTextView.CursorVisible := True; +end; + +procedure TFChecksum.FormDestroy(Sender: TObject); +var i: integer; +begin + Application.ProcessMessages; + try + if List.Count > 0 then + for i := 0 to List.Count - 1 do + TFileListItem(List[i]).Free; + List.Free; + except end; +end; + +procedure TFChecksum.FormShow(Sender: TObject); +begin + CheckButton.Enabled := FileList.Items.Count > 0; + if MD5Present and (not SFVPresent) and (CommentTextView.TextBuffer.LineCount = 1) + then HPaned.Position := Width - 90; +end; + +procedure TFChecksum.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + Stop := True; +end; + +procedure TFChecksum.FormResponse(Sender: TObject; const ResponseID: integer); +begin + Stop := True; +end; + +procedure TFChecksum.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin +{ case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; } +end; + +function TFChecksum.ProcessFile(FileName: string): boolean; +const ChksumBlockSize = 32768; // Maximum of PByteArray +var FD: TEngineFileDes; + Error, Count, i, Start: integer; + Buffer: Pointer; + s: string; + Stat: PDataItemSL; + IsMD5: boolean; +begin + Result := False; + Stat := Engine.GetFileInfoSL(FileName); + if (Stat.Size > 128*1024) then begin + i := integer(Application.MessageBox(Format(LANGTheFileSYouAreTryingToOpenIsQuiteBig, [ANSIToUTF8(ExtractFileName(FileName))]), [mbYes, mbNo], mbWarning, mbNone, mbNo)); + if (i = integer(mbNo)) or (i = 251) then Exit; + end; + IsMD5 := (Pos('MD5', ANSIUpperCase(FileName)) > 0) or ((Pos('SFV', ANSIUpperCase(FileName)) = 0) and (Pos('SUM', ANSIUpperCase(FileName)) > 0)); + if IsMD5 then MD5Present := True + else SFVPresent := True; + if MD5Present and SFVPresent then FileList.Columns[1].Caption := 'CRC32/MD5' + else if MD5Present then FileList.Columns[1].Caption := 'MD5 sum' + else if SFVPresent then FileList.Columns[1].Caption := 'CRC-32'; + + try + Buffer := Libc.malloc(ChksumBlockSize); + Libc.memset(Buffer, 0, ChksumBlockSize); + except + Application.MessageBox(LANGAnErrorOccuredWhileInitializingMemoryBlock, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + FD := Engine.OpenFile(FileName, omRead, Error); + if Error <> 0 then begin + Application.MessageBox(Format(LANGAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(ExtractFileName(FileName)), ANSIToUTF8(GetErrorString(Error))]), [mbOK], mbError, mbNone, mbOK); + Libc.free(Buffer); + Exit; + end; + s := ''; + CommentOpen := True; + repeat + Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, Error); + if Error <> 0 then begin + Application.MessageBox(Format(LANGAnErrorOccuredWhileReadingFileSS, [ANSIToUTF8(ExtractFileName(FileName)), ANSIToUTF8(GetErrorString(Error))]), [mbOK], mbError, mbNone, mbOK); + Engine.CloseFile(FD); + Libc.free(Buffer); + Exit; + end; + // processing begins + Start := 1; + if Count > 0 then + for i := 0 to Count - 1 do + if (PByteArray(Buffer)^[i] in [13, 10]) or (i = Count - 1) then begin + s := s + Copy(PChar(Buffer), Start, i - Start + 1 + Ord(i = Count - 1)); + Start := i + 2; + if PByteArray(Buffer)^[i] in [13, 10] then begin + ProcessLine(s, ExtractFilePath(FileName), IsMD5); + s := ''; + end; + end; + // processing ends + until Count < ChksumBlockSize; + if Length(s) > 0 then ProcessLine(s, ExtractFilePath(FileName), IsMD5); + + CommentOpen := False; + Engine.CloseFile(FD); + Libc.free(Buffer); + Result := True; +end; + +procedure TFChecksum.ProcessLine(s, Path: string; const IsMD5: boolean); +var Item: TFileListItem; + ListItem: TGTKListItem; + S1, S2: string; + i: integer; + Stat: PDataItemSL; +begin + TrimCRLFESC(s); + if Length(s) < 1 then Exit; + if s[1] = ';' then begin + if CommentOpen then begin + CommentOpen := False; + if CommentTextView.TextBuffer.LineCount > 1 then begin + s1 := ''; + for i := 1 to 50 do s1 := s1 + Chr($2212); + CommentTextView.TextBuffer.InsertText(s1 + #13); + end; + end; + CommentTextView.TextBuffer.InsertText(ANSIToUTF8(Copy(s, 2, Length(s) - 1) + #13)); + end else begin + Trim(s); + if Pos(' ', s) = 0 then Exit; + Item := TFileListItem.Create; + Item.Status := 0; + Item.IsMD5 := IsMD5; + if not IsMD5 then begin // CRC32 + s1 := Trim(Copy(s, 1, LastDelimiter(' ', s) - 1)); + s2 := Trim(Copy(s, LastDelimiter(' ', s) + 1, Length(s) - LastDelimiter(' ', s))); + try + Item.CRC := StrToInt64('$' + s2); + except + Exit; + end; + Item.Name := ExtractFileName(s1); + Item.FullPath := IncludeTrailingPathDelimiter(Path) + s1; + end else begin // MD5 + s1 := Trim(Copy(s, 1, Pos(' ', s) - 1)); + s2 := Trim(Copy(s, Pos(' ', s) + 1, Length(s) - Pos(' ', s))); + try + Item.MD5 := LowerCase(s1); + except + Exit; + end; + s2 := ExcludeTrailingPathDelimiter(s2); + if Pos('/', s2) > 0 then s2 := Copy(s2, LastDelimiter('/', s2) + 1, Length(s2) - LastDelimiter('/', s2)); + Item.Name := ExtractFileName(s2); + Item.FullPath := IncludeTrailingPathDelimiter(Path) + s2; + end; + Stat := Engine.GetFileInfoSL(Item.FullPath); + if Assigned(Stat) then Item.Size := Stat.Size + else Item.Size := 0; + List.Add(Item); + ListItem := FileList.Items.Add; + ListItem.Data := Item; + if not Application.GTKVersion_2_0_5_Up then ListItem.SetValue(0, Item); + end; +end; + +procedure TFChecksum.ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); +const StatusStr : array[0..3] of string = ('?', 'OK', 'BAD', 'N/A'); +var Data: TFileListItem; + Path: PGtkTreePath; +begin + if not Application.GTKVersion_2_0_5_Up then gtk_tree_model_get(tree_model, iter, 0, @Data, -1) + else begin + Path := gtk_tree_model_get_path(tree_model, iter); + if not Assigned(Path) then Exit; + (Sender as TGTKListView).ConvertPathToChild(Path); + Data := List[gtk_tree_path_get_indices(Path)^]; + gtk_tree_path_free(Path); + end; + case gtk_tree_view_column_get_sort_column_id(tree_column) of + 0: g_object_set(cell, 'text', PChar(Format('[%s] %s', [StatusStr[Data.Status], ANSIToUTF8(Data.Name)])), nil); + -1: if not Data.IsMD5 then g_object_set(cell, 'text', PChar('0x' + IntToHex(Data.CRC, 8)), nil) + else g_object_set(cell, 'text', PChar(Data.MD5), nil); + end; +end; + +function TFChecksum.CompareFunc(Sender: TObject; var model: PGtkTreeModel; var a, b: PGtkTreeIter): integer; +var Data1, Data2: TFileListItem; + Path: PGtkTreePath; +begin + Result := 0; + if not Application.GTKVersion_2_0_5_Up then begin + gtk_tree_model_get(model, a, 0, @Data1, -1); + gtk_tree_model_get(model, b, 0, @Data2, -1); + end else begin + Path := gtk_tree_model_get_path(model, a); + if not Assigned(Path) then Exit; + Data1 := List[gtk_tree_path_get_indices(Path)^]; + gtk_tree_path_free(Path); + Path := gtk_tree_model_get_path(model, b); + if not Assigned(Path) then Exit; + Data2 := List[gtk_tree_path_get_indices(Path)^]; + gtk_tree_path_free(Path); + end; + if (Sender as TGTKView).SortColumnID = 0 then Result := CompareTextsEx(PChar(Data1.Name), PChar(Data2.Name)); +end; + +procedure TFChecksum.CheckButtonClick(Sender: TObject); +begin + if not Processing then GoProcess + else Stop := True; +end; + +procedure TFChecksum.GoProcess; +const ChksumBlockSize = 65536*4; +var i, Error, Count: integer; + FD: TEngineFileDes; + Buffer: Pointer; + MaxSize, OldPos: Int64; + Data: TFileListItem; + Time1, Time2: TDateTime; + CRC: LongWord; + MD5Hash: THash_MD5; +begin + if List.Count = 0 then Exit; + CheckButton.Caption := LANGCheckButtonCaptionStop; + Stop := False; + Processing := True; + UnselectAll(AListView, DataList); + StatLabel.Caption := LANGChecksumChecking; + StatLabel.UseMarkup := True; + + MaxSize := 0; + OldPos := 0; + for i := 0 to List.Count - 1 do Inc(MaxSize, TFileListItem(List[i]).Size); + ProgressBar.Max := MaxSize; + ProgressBar.Value := 0; + Application.ProcessMessages; + try + Buffer := Libc.malloc(ChksumBlockSize); + Libc.memset(Buffer, 0, ChksumBlockSize); + except + Application.MessageBox(LANGAnErrorOccuredWhileInitializingMemoryBlock, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + + Time1 := Now; + for i := 0 to List.Count - 1 do begin + if Stop then Break; + if i > 0 then Inc(OldPos, TFileListItem(List[i - 1]).Size); + ProgressBar.Value := OldPos; + ProgressBar.Text := Format('%d %%', [Trunc(ProgressBar.Fraction * 100)]); + FileList.Items[i].Selected := True; + FileList.Items[i].SetCursor(0, False, False, 0, 0); + Application.ProcessMessages; + Data := List[i]; + CRC := $FFFFFFFF; + MD5Hash := nil; + if Data.IsMD5 then MD5Hash := THash_MD5.Create; + FD := Engine.OpenFile(Data.FullPath, omRead, Error); + if Error <> 0 then begin + Data.Status := 3; + Continue; + end; + repeat + Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, Error); + if Error <> 0 then begin + Data.Status := 3; + Engine.CloseFile(FD); + Continue; + end; + if not Data.IsMD5 then CRC := CRC32(CRC, Buffer, Count) + else MD5Hash.Calc(Buffer^, Count); + ProgressBar.Value := ProgressBar.Value + Count; + ProgressBar.Text := Format('%d %%', [Trunc(ProgressBar.Fraction * 100)]); + Application.ProcessMessages; + until (Count < ChksumBlockSize) or Stop; + if Stop then Break; + Engine.CloseFile(FD); + if not Data.IsMD5 then Data.Status := Ord(not ((not CRC) = Data.CRC)) + 1 else begin + MD5Hash.Done; + Data.Status := Ord(AnsiCompareText(Data.MD5, MD5Hash.GetKeyStrH) <> 0) + 1; + MD5Hash.Free; + end; + if Data.Status in [2, 3] then MarkAsBad(Data.FullPath); + end; + Time2 := Now; + DebugMsg([Format('Checksum processing: %d:%3d = %.3f MB/s', [SecondOf(Time2 - Time1), MillisecondOf(Time2 - Time1), + (MaxSize / (SecondOf(Time2 - Time1) + MillisecondOf(Time2 - Time1) / 1000)) / (1024 * 1024)])]); + FileList.Items[List.Count - 1].RedrawRow; + Libc.free(Buffer); + ProgressBar.Fraction := 1; + CheckButton.Caption := LANGCheckButtonCaptionCheck; + if Stop then StatLabel.Caption := LANGChecksumInterrupted else begin + Error := 0; + if List.Count > 0 then + for i := 0 to List.Count - 1 do + if TFileListItem(List[i]).Status <> 1 then Inc(Error); + StatLabel.Caption := Format(LANGChecksumDOK, [Round(100 * (List.Count - Error) / List.Count)]); + end; + StatLabel.UseMarkup := True; + Stop := False; + Processing := False; + ActionArea.SetFocus; +end; + +procedure TFChecksum.MarkAsBad(const FileName: string); +var i: integer; +begin + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + if (not PDataItem(DataList[i])^.IsDir) and (not PDataItem(DataList[i])^.UpDir) and + (AnsiCompareText(Trim(PDataItem(DataList[i])^.AName), ExtractFileName(FileName)) = 0) then + begin + PDataItem(DataList[i])^.Selected := True; + AListView.Items[i].RedrawRow; + end; +end; + +end. + diff --git a/UChecksumDruid.pas b/UChecksumDruid.pas new file mode 100644 index 0000000..81266f6 --- /dev/null +++ b/UChecksumDruid.pas @@ -0,0 +1,629 @@ +(* + Tux Commander - UChecksumDruid - Checksum calculation druid + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UChecksumDruid; + +interface + +uses + glib2, gdk2, gtk2, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, + GTKView, GTKText, GTKUtils, + UEngines; + +type + TFChecksumDruid = class(TGTKDialog) + CancelButton, BackButton, ForwardButton: TGTKButton; + ButtonBox: TGTKHButtonBox; + TitleLabel, Page1Label, Page4Label, FilenameLabel, Page6Label, Page7Label, ProcessingLabel, Page6Spacer, ErrorLabel: TGTKLabel; + TitleLabelBox, PageAreaColor, LeftSpacer, Page2Color, Page3Color, Page4Color, Page5Color, Page6Color, LeftSpacer7: TGTKEventBox; + Page1, FileNameHBox, SeparateFileCheckHBox, Page7, ProgressHBox, ErrorTextViewHBox: TGTKHBox; + Page2, Page3, Page4, Page5, Page6: TGTKEventBox; + DruidArea, PageArea, Page2ClientArea, Page3ClientArea, Page5ClientArea, Page6ClientArea: TGTKVBox; + FileNameEntry: TGTKEntry; + SeparateFileCheckBox: TGTKCheckButton; + SFVRadioButton, MD5RadioButton: TGTKRadioButton; + Progress: TGTKProgressBar; + ErrorLabelScrolledWindow: TGTKScrolledWindow; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormResponse(Sender: TObject; const ResponseID: integer); + procedure CancelButtonClick(Sender: TObject); + procedure BackButtonClick(Sender: TObject); + procedure ForwardButtonClick(Sender: TObject); + procedure FileNameEntryChanged(Sender: TObject); + procedure SeparateFileCheckBoxToggled(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + ColorFG, ColorBG, ColorGray: PGdkColor; + CurrentPage: integer; + Processing, Stop, StopBreak: boolean; + Buffer: Pointer; + FileDes: TEngineFileDes; + BufferPos: integer; + procedure CreatePages; + procedure SetCurrentPage(const Num: integer; const GoingForward: boolean); + procedure Process; + function ProcessFile(const FName: string; const IsItSFV: boolean; var HashString: string): boolean; + procedure CheckStop; + procedure WriteLine(const FName, CheckedFName, HashString: string; const IsItSFV, CreateFile, CloseFile: boolean); + procedure WriteSFVComment(const FName: string); + public + Engine: TPanelEngine; + FileNames: TStringList; + DirName: string; + end; + +const NumPages = 7; + +var + FChecksumDruid: TFChecksumDruid; + +implementation + +uses ULocale, UCoreUtils, Libc, UCore, DateUtils, UConfig, StrUtils; + + +procedure TFChecksumDruid.FormCreate(Sender: TObject); +begin + CurrentPage := 0; + Processing := False; + Stop := False; + StopBreak := False; + Buffer := nil; + BufferPos := 0; + SetDefaultSize(400, 210); + Caption := LANGCreateChecksumsCaption; + OnDestroy := FormDestroy; + OnResponse := FormResponse; + FileNames := TStringList.Create; + ShowSeparator := False; + Buttons := []; + ActionArea.SetSizeRequest(0, 0); + DruidArea := TGTKVBox.Create(Self); + DruidArea.BorderWidth := 2; + ClientArea.AddControlEx(DruidArea, True, True, 0); + CancelButton := TGTKButton.CreateFromStock(Self, 'gtk-cancel'); + CancelButton.OnClick := CancelButtonClick; + BackButton := TGTKButton.CreateFromStock(Self, 'gtk-go-back'); + BackButton.OnClick := BackButtonClick; + ForwardButton := TGTKButton.CreateFromStock(Self, 'gtk-go-forward'); + ForwardButton.OnClick := ForwardButtonClick; + ButtonBox := TGTKHButtonBox.Create(Self); + ButtonBox.Layout := blEnd; + ButtonBox.Spacing := 10; + ButtonBox.BorderWidth := 5; + ButtonBox.AddControlEx(CancelButton, False, False, 0); + ButtonBox.AddControlEx(BackButton, False, False, 0); + ButtonBox.AddControlEx(ForwardButton, False, False, 0); + ClientArea.AddControlEndEx(ButtonBox, False, False, 0); + ColorFG := GetDefaultForegroundColor(3); + ColorBG := GetDefaultBackgroundColor(3); + ColorGray := GetDefaultBackgroundColor(2); + TitleLabel := TGTKLabel.Create(Self); + TitleLabelBox := TGTKEventBox.Create(Self); + TitleLabelBox.AddControl(TitleLabel); + TitleLabelBox.BorderWidth := 0; + TitleLabel.SetAlignment(0, 0.5); + TitleLabel.SetPadding(5, 5); + TitleLabel.SetForegroundColor(ColorFG); + TitleLabelBox.SetBackgroundColor(ColorBG); + DruidArea.AddControlEx(TitleLabelBox, False, False, 0); + PageAreaColor := TGTKEventBox.Create(Self); + PageAreaColor.SetBackgroundColor(ColorGray); + PageArea := TGTKVBox.Create(Self); + PageAreaColor.AddControl(PageArea); + DruidArea.AddControlEx(PageAreaColor, True, True, 0); + + CreatePages; + + SetCurrentPage(1, True); + OnKeyDown := FormKeyDown; +end; + +procedure TFChecksumDruid.FormDestroy(Sender: TObject); +begin + FileNames.Free; +end; + +procedure TFChecksumDruid.FormResponse(Sender: TObject; const ResponseID: integer); +begin + Stop := True; +end; + +procedure TFChecksumDruid.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin +// if Key = GDK_ESCAPE then ModalResult := mbCancel; + if (Key = GDK_RETURN) or (Key = GDK_KP_ENTER) then ForwardButtonClick(Sender); +end; + +procedure TFChecksumDruid.CreatePages; +begin + Page1 := TGTKHBox.Create(Self); + Page1.Homogeneous := False; + LeftSpacer := TGTKEventBox.Create(Self); + LeftSpacer.SetBackgroundColor(ColorBG); + LeftSpacer.SetSizeRequest(100, -1); + Page1Label := TGTKLabel.Create(Self); + Page1Label.LineWrap := True; + Page1Label.SetAlignment(0.5, 0.5); + Page1Label.Caption := LANGCCHKSUMPage1Text; + Page1.AddControlEx(LeftSpacer, False, False, 0); + Page1.AddControlEx(Page1Label, True, True, 0); + + Page2 := TGTKEventBox.Create(Self); + Page2.SetBackgroundColor(0, 0, 0); + Page2Color := TGTKEventBox.Create(Self); + Page2Color.BorderWidth := 1; + Page2Color.SetBackgroundColor(ColorGray); + Page2.AddControl(Page2Color); + Page2ClientArea := TGTKVBox.Create(Self); + Page2Color.AddControl(Page2ClientArea); + SFVRadioButton := TGTKRadioButton.Create(Self); + SFVRadioButton.Caption := LANGCCHKSUMSFVFile; + MD5RadioButton := TGTKRadioButton.Create(Self); + MD5RadioButton.Caption := LANGCCHKSUMMD5sumFile; + MD5RadioButton.SetRadioGroup(SFVRadioButton); + SFVRadioButton.Checked := True; + Page2ClientArea.AddControlEx(SFVRadioButton, False, False, 3); + Page2ClientArea.AddControlEx(MD5RadioButton, False, False, 3); + Page2ClientArea.BorderWidth := 30; + + Page3 := TGTKEventBox.Create(Self); + Page3.SetBackgroundColor(0, 0, 0); + Page3Color := TGTKEventBox.Create(Self); + Page3Color.BorderWidth := 1; + Page3Color.SetBackgroundColor(ColorGray); + Page3.AddControl(Page3Color); + Page3ClientArea := TGTKVBox.Create(Self); + Page3Color.AddControl(Page3ClientArea); + FilenameLabel := TGTKLabel.Create(Self); + FilenameLabel.Caption := LANGCCHKSUMFileName; + FilenameLabel.UseUnderline := True; + FileNameEntry := TGTKEntry.Create(Self); + FileNameEntry.Text := 'checksums.sfv'; + FileNameEntry.SetSizeRequest(215, -1); + FileNameEntry.OnChanged := FileNameEntryChanged; + FilenameLabel.FocusControl := FileNameEntry; + SeparateFileCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGCCHKSUMCreateSeparateChecksumFiles); + SeparateFileCheckBox.OnToggled := SeparateFileCheckBoxToggled; + Page3ClientArea.BorderWidth := 30; + FileNameHBox := TGTKHBox.Create(Self); + FileNameHBox.Homogeneous := False; + FileNameHBox.AddControlEx(FilenameLabel, False, False, 5); + FileNameHBox.AddControlEx(FileNameEntry, False, False, 5); + Page3ClientArea.AddControlEx(FileNameHBox, False, False, 0); + SeparateFileCheckHBox := TGTKHBox.Create(Self); + SeparateFileCheckHBox.Homogeneous := False; + SeparateFileCheckHBox.AddControlEx(SeparateFileCheckBox, False, False, 20); + SeparateFileCheckHBox.AddControlEx(TGTKLabel.Create(Self), True, True, 0); + Page3ClientArea.AddControlEx(SeparateFileCheckHBox, False, False, 5); + + Page4 := TGTKEventBox.Create(Self); + Page4.SetBackgroundColor(0, 0, 0); + Page4Color := TGTKEventBox.Create(Self); + Page4Color.BorderWidth := 1; + Page4Color.SetBackgroundColor(ColorGray); + Page4.AddControl(Page4Color); + Page4Label := TGTKLabel.Create(Self); + Page4Label.LineWrap := True; + Page4Label.SetAlignment(0.5, 0.5); + Page4Label.Caption := LANGCCHKSUMPage4Text; + Page4Color.AddControl(Page4Label); + + Page5 := TGTKEventBox.Create(Self); + Page5.SetBackgroundColor(0, 0, 0); + Page5Color := TGTKEventBox.Create(Self); + Page5Color.BorderWidth := 1; + Page5Color.SetBackgroundColor(ColorGray); + Page5.AddControl(Page5Color); + Page5ClientArea := TGTKVBox.Create(Self); + Page5Color.AddControl(Page5ClientArea); + ProcessingLabel := TGTKLabel.Create(Self); + ProcessingLabel.Caption := Format(LANGCCHKSUMNowProcessingFileS, ['---']); + ProcessingLabel.XPadding := 20; + ProcessingLabel.XAlign := 0; + ProcessingLabel.YPadding := 10; + ProcessingLabel.SetSizeRequest(10, -1); + Page5ClientArea.AddControlEx(ProcessingLabel, False, False, 10); + ProgressHBox := TGTKHBox.Create(Self); + Progress := TGTKProgressBar.Create(Self); + ProgressHBox.AddControlEx(Progress, True, True, 20); + Page5ClientArea.AddControlEx(ProgressHBox, True, True, 10); + Page5ClientArea.AddControlEx(TGTKLabel.Create(Self), True, True, 0); + + Page6 := TGTKEventBox.Create(Self); + Page6.SetBackgroundColor(0, 0, 0); + Page6Color := TGTKEventBox.Create(Self); + Page6Color.BorderWidth := 1; + Page6Color.SetBackgroundColor(ColorGray); + Page6.AddControl(Page6Color); + Page6Label := TGTKLabel.Create(Self); + Page6Label.LineWrap := True; + Page6Label.SetAlignment(0.5, 0.4); + Page6Label.Caption := LANGCCHKSUMPage6Text; + Page6Label.UseMarkup := True; + Page6Label.XAlign := 0.05; + Page6Label.YAlign := 0; + Page6Spacer := TGTKLabel.Create(Self); + Page6Spacer.SetSizeRequest(-1, 6); + Page6ClientArea := TGTKVBox.Create(Self); + Page6ClientArea.AddControlEx(Page6Spacer, False, False, 0); + Page6ClientArea.AddControlEx(Page6Label, False, False, 0); + Page6Color.AddControl(Page6ClientArea); + ErrorLabel := TGTKLabel.Create(Self); + ErrorLabel.Selectable := True; + ErrorLabel.SetAlignment(0, 0); + ErrorLabel.SetPadding(2, 2); + ErrorLabel.Alignment := taLeftJustify; + ErrorLabelScrolledWindow := TGTKScrolledWindow.Create(Self); + ErrorLabelScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ErrorLabelScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ErrorLabelScrolledWindow.AddWithViewPort(ErrorLabel); + ErrorTextViewHBox := TGTKHBox.Create(Self); + ErrorTextViewHBox.AddControlEx(ErrorLabelScrolledWindow, True, True, 25); + Page6ClientArea.AddControlEx(ErrorTextViewHBox, True, True, 10); + + Page7 := TGTKHBox.Create(Self); + Page7.Homogeneous := False; + LeftSpacer7 := TGTKEventBox.Create(Self); + LeftSpacer7.SetBackgroundColor(ColorBG); + LeftSpacer7.SetSizeRequest(100, -1); + Page7Label := TGTKLabel.Create(Self); + Page7Label.LineWrap := True; + Page1Label.SetAlignment(0.5, 0.5); + Page7Label.Caption := LANGCCHKSUMPage7Text; + Page7.AddControlEx(LeftSpacer7, False, False, 0); + Page7.AddControlEx(Page7Label, True, True, 0); + + PageArea.AddControlEx(Page1, True, True, 0); + PageArea.AddControlEx(Page2, True, True, 0); + PageArea.AddControlEx(Page3, True, True, 0); + PageArea.AddControlEx(Page4, True, True, 0); + PageArea.AddControlEx(Page5, True, True, 0); + PageArea.AddControlEx(Page6, True, True, 0); + PageArea.AddControlEx(Page7, True, True, 0); +end; + + +(********************************************************************************************************************************) +procedure TFChecksumDruid.SetCurrentPage(const Num: integer; const GoingForward: boolean); +const Ext: array[boolean] of string = ('.md5', '.sfv'); +var s: string; + i: TEngineFileDes; + Error: integer; +begin + // A simple test before we can continue + if (CurrentPage = 3) and (not SeparateFileCheckBox.Checked) and GoingForward then begin + s := UTF8ToANSI(FileNameEntry.Text); + i := Engine.OpenFile(s, omWrite, Error); + if Error <> 0 then begin + Application.MessageBox(Format(LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(ExtractFileName(s)), ANSIToUTF8(GetErrorString(Error))]), + [mbOK], mbError, mbNone, mbOK); + Exit; + end; + Engine.CloseFile(i); + end; + // Changing page + CurrentPage := Num; + if CurrentPage < 1 then CurrentPage := 1; + if CurrentPage > NumPages then CurrentPage := NumPages; + case CurrentPage of + 1: TitleLabel.SetMarkup(LANGCCHKSUMPage1Title); + 2: TitleLabel.SetMarkup(LANGCCHKSUMPage2Title); + 3: TitleLabel.SetMarkup(LANGCCHKSUMPage3Title); + 4: TitleLabel.SetMarkup(LANGCCHKSUMPage4Title); + 5: TitleLabel.SetMarkup(LANGCCHKSUMPage5Title); + 6: TitleLabel.SetMarkup(LANGCCHKSUMPage6Title); + 7: TitleLabel.SetMarkup(LANGCCHKSUMPage7Title); + end; + Page1.Visible := CurrentPage = 1; + Page2.Visible := CurrentPage = 2; + Page3.Visible := CurrentPage = 3; + Page4.Visible := CurrentPage = 4; + Page5.Visible := CurrentPage = 5; + Page6.Visible := CurrentPage = 6; + Page7.Visible := CurrentPage = 7; + BackButton.Enabled := CurrentPage > 1; + ForwardButton.Enabled := CurrentPage < NumPages; + if CurrentPage < NumPages then begin + if not ForwardButton.UseStock then ForwardButton.Caption := 'gtk-go-forward'; + ForwardButton.UseStock := True; + end else begin + ForwardButton.UseStock := False; + ForwardButton.Caption := LANGCCHKSUMFinishCaption; + end; + // after page changed + case CurrentPage of + 1: ForwardButton.SetFocus; + 2: if SFVRadioButton.Checked then SFVRadioButton.SetFocus + else MD5RadioButton.SetFocus; + 3: begin + SeparateFileCheckBox.Visible := MD5RadioButton.Checked and (FileNames.Count > 1); + FileNameEntry.Enabled := (not SeparateFileCheckBox.Checked) or (not SeparateFileCheckBox.Visible); + if FileNames.Count = 1 + then FileNameEntry.Text := ANSIToUTF8(ExtractFileName(FileNames[0]) + Ext[SFVRadioButton.Checked]) + else FileNameEntry.Text := ANSIToUTF8(DirName + Ext[SFVRadioButton.Checked]); + FileNameEntry.SetFocus; + FileNameEntryChanged(Self); + end; + 4: ForwardButton.SetFocus; + 5: Process; + 6: begin + BackButton.SetFocus; + ForwardButton.Enabled := False; + s := ErrorLabel.Caption; + if (Length(s) > 1) and (s[Length(s)] = #10) then Delete(s, Length(s), 1); + ErrorLabel.Caption := s; + end; + 7: begin + BackButton.Enabled := False; + CancelButton.Enabled := False; + ForwardButton.Enabled := True; + ForwardButton.SetFocus; + end; + end; +end; + +procedure TFChecksumDruid.CancelButtonClick(Sender: TObject); +begin + ModalResult := mbCancel; +end; + +procedure TFChecksumDruid.BackButtonClick(Sender: TObject); +begin + SetCurrentPage(CurrentPage - 1 - Ord(CurrentPage = 6), False); +end; + +procedure TFChecksumDruid.ForwardButtonClick(Sender: TObject); +begin + if CurrentPage = 7 then ModalResult := mbOK + else SetCurrentPage(CurrentPage + 1, True); +end; + +procedure TFChecksumDruid.FileNameEntryChanged(Sender: TObject); +begin + ForwardButton.Enabled := Length(Trim(FileNameEntry.Text)) > 0; +end; + +procedure TFChecksumDruid.SeparateFileCheckBoxToggled(Sender: TObject); +begin + FileNameEntry.Enabled := not SeparateFileCheckBox.Checked; +end; + +(********************************************************************************************************************************) +procedure TFChecksumDruid.CheckStop; +begin + if Stop and (not StopBreak) then + if Application.MessageBox(LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing, [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes + then StopBreak := True + else begin Stop := False; StopBreak := False; end; +end; + +procedure TFChecksumDruid.Process; +const Ext: array[boolean] of string = ('.md5', '.sfv'); +var i: integer; + MaxSize, LastValue: Int64; + Stat: PDataItemSL; + s, s2: string; +begin + if FileNames.Count = 0 then begin + SetCurrentPage(7, True); + Exit; + end; + FileNames.Sorted := True; + CancelButton.SetFocus; + ForwardButton.Enabled := False; + BackButton.Enabled := False; + Processing := True; + Stop := False; + StopBreak := False; + ErrorLabel.Caption := ''; + Application.ProcessMessages; + + // Compute maximal size of selected files + MaxSize := 0; + for i := 0 to FileNames.Count - 1 do begin + Stat := Engine.GetFileInfoSL(FileNames[i]); + if Assigned(Stat) then Inc(MaxSize, Stat.Size); + end; + Progress.Max := MaxSize; + Progress.Value := 0; + Progress.Text := '0 %'; + + if SFVRadioButton.Checked then WriteSFVComment(ProcessPattern(Engine, UTF8ToANSI(FileNameEntry.Text), IncludeTrailingPathDelimiter(ExtractFilePath(FileNames[0])), '', False)); + // Process each file + for i := 0 to FileNames.Count - 1 do begin + ProcessingLabel.Caption := Format(LANGCCHKSUMNowProcessingFileS, [ANSIToUTF8(ExtractFileName(FileNames[i]))]); + LastValue := Progress.Value; + Stat := Engine.GetFileInfoSL(FileNames[i]); + Application.ProcessMessages; + try + if ProcessFile(FileNames[i], SFVRadioButton.Checked, s) then begin + if not SeparateFileCheckBox.Checked + then s2 := ProcessPattern(Engine, UTF8ToANSI(FileNameEntry.Text), IncludeTrailingPathDelimiter(ExtractFilePath(FileNames[0])), '', False) + else s2 := IncludeTrailingPathDelimiter(ExtractFilePath(FileNames[i])) + ExtractFileName(FileNames[i]) + Ext[SFVRadioButton.Checked]; + WriteLine(s2, FileNames[i], s, SFVRadioButton.Checked, ((i = 0) and MD5RadioButton.Checked) or SeparateFileCheckBox.Checked, + (i = FileNames.Count - 1) or SeparateFileCheckBox.Checked); + end; + except end; + if Assigned(Stat) then Progress.Value := LastValue + Stat.Size; + Progress.Text := Format('%d %%', [Trunc(Progress.Fraction * 100)]); + Application.ProcessMessages; + CheckStop; + if StopBreak then Break; + end; + + Application.ProcessMessages; + Processing := False; + Stop := False; + StopBreak := False; + Application.ProcessMessages; + SetCurrentPage(7 - Ord(ErrorLabel.Caption <> ''), ErrorLabel.Caption = ''); +end; + +function TFChecksumDruid.ProcessFile(const FName: string; const IsItSFV: boolean; var HashString: string): boolean; +const ChksumBlockSize = 65536*4; +var FD: TEngineFileDes; + Error, Count: integer; + Buffer: Pointer; + CRC: LongWord; + MD5Hash: THash_MD5; +begin + HashString := ''; + Result := False; + try + Buffer := Libc.malloc(ChksumBlockSize); + Libc.memset(Buffer, 0, ChksumBlockSize); + except + ErrorLabel.Caption := ErrorLabel.Caption + LANGAnErrorOccuredWhileInitializingMemoryBlock + #10; + Exit; + end; + CRC := $FFFFFFFF; + MD5Hash := nil; + if not IsItSFV then MD5Hash := THash_MD5.Create; + + FD := Engine.OpenFile(FName, omRead, Error); + if Error <> 0 then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Exit; + end; + repeat + Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, Error); + if Error <> 0 then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileReadingFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Engine.CloseFile(FD); + Exit; + end; + if IsItSFV then CRC := CRC32(CRC, Buffer, Count) + else MD5Hash.Calc(Buffer^, Count); + Progress.Value := Progress.Value + Count; + Progress.Text := Format('%d %%', [Trunc(Progress.Fraction * 100)]); + Application.ProcessMessages; + CheckStop; + until (Count < ChksumBlockSize) or Stop; + Engine.CloseFile(FD); + Libc.free(Buffer); + + if IsItSFV then HashString := IntToHex(not CRC, 8) else + begin + MD5Hash.Done; + HashString := MD5Hash.GetKeyStrH; + MD5Hash.Free; + end; + Result := True; +end; + +const ChksumBlockSize = 32768; // Maximum of PByteArray + +procedure TFChecksumDruid.WriteLine(const FName, CheckedFName, HashString: string; const IsItSFV, CreateFile, CloseFile: boolean); +var i, Error, Count: integer; + s: string; +begin + if CreateFile then begin + FileDes := Engine.OpenFile(FName, omWrite, Error); + if Error <> 0 then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Exit; + end; + try + Buffer := Libc.malloc(ChksumBlockSize); + Libc.memset(Buffer, 0, ChksumBlockSize); + except + ErrorLabel.Caption := ErrorLabel.Caption + LANGAnErrorOccuredWhileInitializingMemoryBlock + #10; + Exit; + end; + BufferPos := -1; + end; + if Buffer = nil then Exit; + + if IsItSFV then s := Format('%s %s'#13#10, [ExtractFileName(CheckedFName), Trim(ANSIUpperCase(HashString))]) + else s := Format('%s %s'#10, [Trim(AnsiLowerCase(HashString)), ExtractFileName(CheckedFName)]); + for i := 1 to Length(s) do begin + if BufferPos + 1 >= ChksumBlockSize then begin + Count := Engine.WriteFile(FileDes, Buffer, ChksumBlockSize, Error); + BufferPos := -1; + if (Error <> 0) or (Count <> ChksumBlockSize) then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileWritingFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Exit; + end; + end; + Inc(BufferPos); + PByteArray(Buffer)^[BufferPos] := Byte(s[i]); + end; + + if CloseFile then begin + Inc(BufferPos); // Counting with zero-starting element + Count := Engine.WriteFile(FileDes, Buffer, BufferPos, Error); + if (Error <> 0) or (Count <> BufferPos) then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileWritingFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Exit; + end; + BufferPos := -1; + Engine.CloseFile(FileDes); + Libc.free(Buffer); + end; +end; + +procedure TFChecksumDruid.WriteSFVComment(const FName: string); +var i, Error, Count: integer; + Stat: PDataItemSL; + s: string; +begin + FileDes := Engine.OpenFile(FName, omWrite, Error); + if Error <> 0 then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Exit; + end; + try + Buffer := Libc.malloc(ChksumBlockSize); + Libc.memset(Buffer, 0, ChksumBlockSize); + except + ErrorLabel.Caption := ErrorLabel.Caption + LANGAnErrorOccuredWhileInitializingMemoryBlock + #10; + Exit; + end; + BufferPos := -1; + if Buffer = nil then Exit; + + s := Format('; Generated by WIN-SFV32 v1 [added for sfv32 compatibility]'#13#10'; Using Tux Commander v%s [%s] on %s'#13#10 + + '; http://tuxcmd.sourceforge.net/'#13#10'; '#13#10'; /----'#13#10, [ConstAboutVersion, ConstAboutBuildDate, + FormatDateTime('mm.dd.yyyy "at" hh:nn:ss', Now)]); + for i := 0 to FileNames.Count - 1 do begin + Stat := Engine.GetFileInfoSL(FileNames[i]); + if Assigned(Stat) then s := s + Format('; %s %s %s'#13#10, [PadRightStr(IntToStr(Stat^.Size), 11), + FormatDateTime('hh:nn.ss yyyy-mm-dd', Stat^.ModifyTime), ExtractFileName(FileNames[i])]); + end; + s := s + '; \----'#13#10'; '#13#10; + + for i := 1 to Length(s) do begin + if BufferPos + 1 >= ChksumBlockSize then begin + Count := Engine.WriteFile(FileDes, Buffer, ChksumBlockSize, Error); + BufferPos := -1; + if (Error <> 0) or (Count <> ChksumBlockSize) then begin + ErrorLabel.Caption := ErrorLabel.Caption + Format(LANGCCHKSUMAnErrorOccuredWhileWritingFileSS, [ANSIToUTF8(ExtractFileName(FName)), ANSIToUTF8(GetErrorString(Error))]); + Exit; + end; + end; + Inc(BufferPos); + PByteArray(Buffer)^[BufferPos] := Byte(s[i]); + end; +end; + +end. + + diff --git a/UChmod.pas b/UChmod.pas new file mode 100644 index 0000000..971260b --- /dev/null +++ b/UChmod.pas @@ -0,0 +1,236 @@ +(* + Tux Commander - UChmod - Change permissions dialog + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UChmod; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKMenus; + +type + TFChmod = class(TGTKDialog) + HBox, HBox2, HBox3: TGTKHBox; + VBox: TGTKVBox; + PermissionFrame, FileFrame: TGTKFrame; + RecursiveCheckButton, cbSUID, cbSGID, cbSticky, cbUSRRead, cbUSRWrite, cbUSRExec, cbGRPRead, cbGRPWrite, cbGRPExec, + cbALLRead, cbALLWrite, cbALLExec: TGTKCheckButton; + RecursiveOptionMenu: TGTKOptionMenu; + miAllFiles, miDirectories, miFiles: TGTKMenuItem; + FileLabel, OctalLabel, TextLabel: TGTKLabel; + OctalEntry: TGTKEntry; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure RecursiveCheckButtonToggled(Sender: TObject); + procedure PermissionsCheckBoxToggle(Sender: TObject); + procedure OctalEntryChanged(Sender: TObject); + private + Busy: boolean; + public + LastMode: Cardinal; + procedure AssignMode(const Mode: Cardinal; const FileName, User, Group: string); + end; + +var + FChmod: TFChmod; + +implementation + +uses Libc, ULocale, UCoreUtils; + + +procedure TFChmod.FormCreate(Sender: TObject); +begin + SetDefaultSize(-1, -1); + LastMode := 0; + Busy := True; + Caption := LANGFChmod_Caption; + Buttons := [mbOK, mbCancel]; + HBox := TGTKHBox.Create(Self); + HBox.Homogeneous := False; + HBox.BorderWidth := 6; + PermissionFrame := TGTKFrame.Create(Self); + PermissionFrame.Caption := LANGFChmod_PermissionFrame; + FileFrame := TGTKFrame.Create(Self); + FileFrame.Caption := LANGFChmod_FileFrame; + HBox.AddControlEx(PermissionFrame, True, True, 5); + HBox.AddControlEx(FileFrame, True, True, 5); + HBox2 := TGTKHBox.Create(Self); + HBox2.Homogeneous := False; + HBox2.BorderWidth := 5; + RecursiveCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_ApplyRecursivelyFor); + RecursiveCheckButton.OnToggled := RecursiveCheckButtonToggled; + RecursiveOptionMenu := TGTKOptionMenu.Create(Self); + miAllFiles := TGTKMenuItem.Create(Self); + miAllFiles.Caption := LANGFChmod_miAllFiles; + RecursiveOptionMenu.Items.Add(miAllFiles); + miDirectories := TGTKMenuItem.Create(Self); + miDirectories.Caption := LANGFChmod_miDirectories; + RecursiveOptionMenu.Items.Add(miDirectories); + miFiles := TGTKMenuItem.Create(Self); + miFiles.Caption := LANGmiFiles_Caption; + RecursiveOptionMenu.Items.Add(miFiles); + HBox2.AddControlEx(TGTKLabel.Create(Self), False, False, 10); + HBox2.AddControlEx(RecursiveCheckButton, False, False, 5); + HBox2.AddControlEx(RecursiveOptionMenu, False, False, 5); + + HBox3 := TGTKHBox.Create(Self); + HBox3.Homogeneous := False; + HBox3.BorderWidth := 5; + OctalLabel := TGTKLabel.Create(Self); + OctalLabel.Caption := LANGFChmod_OctalLabel; + OctalEntry := TGTKEntry.Create(Self); + OctalEntry.MaxLength := 4; + OctalEntry.SetSizeRequest(50, -1); + OctalLabel.FocusControl := OctalEntry; + OctalLabel.UseUnderline := True; + TextLabel := TGTKLabel.Create(Self); + TextLabel.Caption := 'Text: rw-rw-r--'; + TextLabel.UseMarkup := True; + HBox3.AddControlEx(TGTKLabel.Create(Self), False, False, 10); + HBox3.AddControlEx(OctalLabel, False, False, 5); + HBox3.AddControlEx(OctalEntry, False, False, 5); + HBox3.AddControlEx(TGTKVSeparator.Create(Self), False, False, 10); + HBox3.AddControlEx(TextLabel, False, False, 10); + + ClientArea.AddControlEx(HBox, True, True, 0); + ClientArea.AddControlEx(TGTKHSeparator.Create(Self), False, False, 5); + ClientArea.AddControlEx(HBox3, False, False, 0); + ClientArea.AddControlEx(TGTKHSeparator.Create(Self), False, False, 5); + ClientArea.AddControlEx(HBox2, False, False, 0); + + FileLabel := TGTKLabel.Create(Self); + FileLabel.SetAlignment(0, 0); + FileLabel.SetPadding(10, 5); + FileLabel.Caption := 'File: .adobe'#10'Text: rw-rw-rw'#10 + + 'Octal: 666'#10'Owner: root'#10 + + 'Group: root'; + FileLabel.UseMarkup := True; + FileFrame.AddControl(FileLabel); + + VBox := TGTKVBox.Create(Self); + VBox.BorderWidth := 5; + cbSUID := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_SUID); + VBox.AddControlEx(cbSUID, False, False, 0); cbSUID.OnToggled := PermissionsCheckBoxToggle; + cbSGID := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_SGID); + VBox.AddControlEx(cbSGID, False, False, 0); cbSGID.OnToggled := PermissionsCheckBoxToggle; + cbSticky := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_Sticky); + VBox.AddControlEx(cbSticky, False, False, 0); cbSticky.OnToggled := PermissionsCheckBoxToggle; + VBox.AddControlEx(TGTKHSeparator.Create(Self), False, False, 2); + cbUSRRead := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_RUSR); + VBox.AddControlEx(cbUSRRead, False, False, 0); cbUSRRead.OnToggled := PermissionsCheckBoxToggle; + cbUSRWrite := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_WUSR); + VBox.AddControlEx(cbUSRWrite, False, False, 0); cbUSRWrite.OnToggled := PermissionsCheckBoxToggle; + cbUSRExec := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_XUSR); + VBox.AddControlEx(cbUSRExec, False, False, 0); cbUSRExec.OnToggled := PermissionsCheckBoxToggle; + VBox.AddControlEx(TGTKHSeparator.Create(Self), False, False, 2); + cbGRPRead := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_RGRP); + VBox.AddControlEx(cbGRPRead, False, False, 0); cbGRPRead.OnToggled := PermissionsCheckBoxToggle; + cbGRPWrite := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_WGRP); + VBox.AddControlEx(cbGRPWrite, False, False, 0); cbGRPWrite.OnToggled := PermissionsCheckBoxToggle; + cbGRPExec := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_XGRP); + VBox.AddControlEx(cbGRPExec, False, False, 0); cbGRPExec.OnToggled := PermissionsCheckBoxToggle; + VBox.AddControlEx(TGTKHSeparator.Create(Self), False, False, 2); + cbALLRead := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_ROTH); + VBox.AddControlEx(cbALLRead, False, False, 0); cbALLRead.OnToggled := PermissionsCheckBoxToggle; + cbALLWrite := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_WOTH); + VBox.AddControlEx(cbALLWrite, False, False, 0); cbALLWrite.OnToggled := PermissionsCheckBoxToggle; + cbALLExec := TGTKCheckButton.CreateWithLabel(Self, LANGFChmod_XOTH); + VBox.AddControlEx(cbALLExec, False, False, 0); cbALLExec.OnToggled := PermissionsCheckBoxToggle; + PermissionFrame.AddControl(VBox); + + Busy := False; + OnKeyDown := FormKeyDown; + OctalEntry.OnChanged := OctalEntryChanged; + RecursiveCheckButtonToggled(Self); +end; + +procedure TFChmod.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFChmod.RecursiveCheckButtonToggled(Sender: TObject); +begin + RecursiveOptionMenu.Enabled := RecursiveCheckButton.Checked; +end; + +procedure TFChmod.PermissionsCheckBoxToggle(Sender: TObject); +var Mode: Cardinal; +begin + if Busy then Exit; Busy := True; + Mode := 0; + {$WARNINGS OFF} + Mode := Mode or (Ord(cbSUID.Checked) * __S_ISUID); + Mode := Mode or (Ord(cbSGID.Checked) * __S_ISGID); + Mode := Mode or (Ord(cbSticky.Checked) * __S_ISVTX); + Mode := Mode or (Ord(cbUSRRead.Checked) * S_IRUSR); + Mode := Mode or (Ord(cbUSRWrite.Checked) * S_IWUSR); + Mode := Mode or (Ord(cbUSRExec.Checked) * S_IXUSR); + Mode := Mode or (Ord(cbGRPRead.Checked) * S_IRGRP); + Mode := Mode or (Ord(cbGRPWrite.Checked) * S_IWGRP); + Mode := Mode or (Ord(cbGRPExec.Checked) * S_IXGRP); + Mode := Mode or (Ord(cbALLRead.Checked) * S_IROTH); + Mode := Mode or (Ord(cbALLWrite.Checked) * S_IWOTH); + Mode := Mode or (Ord(cbALLExec.Checked) * S_IXOTH); + {$WARNINGS ON} + LastMode := Mode; + TextLabel.Caption := Format(LANGFChmod_TextLabel, [AttrToStr(Mode, False)]);; + TextLabel.UseMarkup := True; + OctalEntry.Text := Format('%.4d', [AttrToOctal(Mode)]); + Busy := False; +end; + +procedure TFChmod.OctalEntryChanged(Sender: TObject); +var Mode: Cardinal; +begin + if Busy then Exit; Busy := True; + Mode := OctalToAttr(StrToIntDef(OctalEntry.Text, 0)); + LastMode := Mode; + cbSUID.Checked := Mode and __S_ISUID = __S_ISUID; + cbSGID.Checked := Mode and __S_ISGID = __S_ISGID; + cbSticky.Checked := Mode and __S_ISVTX = __S_ISVTX; + cbUSRRead.Checked := Mode and S_IRUSR = S_IRUSR; + cbUSRWrite.Checked := Mode and S_IWUSR = S_IWUSR; + cbUSRExec.Checked := Mode and S_IXUSR = S_IXUSR; + cbGRPRead.Checked := Mode and S_IRGRP = S_IRGRP; + cbGRPWrite.Checked := Mode and S_IWGRP = S_IWGRP; + cbGRPExec.Checked := Mode and S_IXGRP = S_IXGRP; + cbALLRead.Checked := Mode and S_IROTH = S_IROTH; + cbALLWrite.Checked := Mode and S_IWOTH = S_IWOTH; + cbALLExec.Checked := Mode and S_IXOTH = S_IXOTH; + TextLabel.Caption := Format(LANGFChmod_TextLabel, [AttrToStr(Mode, False)]);; + TextLabel.UseMarkup := True; + Busy := False; +end; + +procedure TFChmod.AssignMode(const Mode: Cardinal; const FileName, User, Group: string); +begin + LastMode := Mode mod $1000; + OctalEntry.Text := Format('%.4d', [AttrToOctal(LastMode)]); + FileLabel.Caption := Format(LANGFChmod_FileLabel, [ANSIToUTF8(FileName), AttrToStr(Mode), AttrToOctal(Mode), ANSIToUTF8(User), ANSIToUTF8(Group)]); + FileLabel.UseMarkup := True; + if Length(FileName) > 20 then FileLabel.SetSizeRequest(200, -1); +end; + +end. + diff --git a/UChown.pas b/UChown.pas new file mode 100644 index 0000000..c85fa00 --- /dev/null +++ b/UChown.pas @@ -0,0 +1,198 @@ +(* + Tux Commander - UChown - Change owner dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UChown; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKMenus, GTKView; + +type + TFChown = class(TGTKDialog) + HBox, HBox2: TGTKHBox; + VBox: TGTKVBox; + OwnerFrame, GroupFrame, FileFrame: TGTKFrame; + OwnerListView, GroupListView: TGTKListView; + OwnerListViewScrolledWindow, GroupListViewScrolledWindow: TGTKScrolledWindow; + RecursiveCheckButton: TGTKCheckButton; + FileLabel: TGTKLabel; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure OwnerListViewSelectionChanged(Sender: TObject); + procedure GroupListViewSelectionChanged(Sender: TObject); + public + LastUID, LastGID: integer; + procedure AssignMode(const Mode: Cardinal; const FileName: string; const UID, GID: integer); + private + procedure FillData; + end; + +var + FChown: TFChown; + +implementation + +uses Libc, ULocale, UCoreUtils, UCoreClasses; + + +procedure TFChown.FormCreate(Sender: TObject); +begin + SetDefaultSize(-1, -1); + LastUID := geteuid; + LastGID := getegid; + Caption := LANGFChown_Caption; + Buttons := [mbOK, mbCancel]; + HBox := TGTKHBox.Create(Self); + HBox.Homogeneous := False; + HBox.BorderWidth := 6; + OwnerFrame := TGTKFrame.Create(Self); + OwnerFrame.Caption := LANGFChown_OwnerFrame; + GroupFrame := TGTKFrame.Create(Self); + GroupFrame.Caption := LANGFChown_GroupFrame; + FileFrame := TGTKFrame.Create(Self); + FileFrame.Caption := LANGFChown_FileFrame; + HBox.AddControlEx(OwnerFrame, True, True, 5); + HBox.AddControlEx(GroupFrame, True, True, 5); + HBox.AddControlEx(FileFrame, True, True, 5); + HBox2 := TGTKHBox.Create(Self); + HBox2.Homogeneous := False; + RecursiveCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGFChown_ApplyRecursively); + HBox2.AddControlEx(RecursiveCheckButton, False, False, 15); + + ClientArea.AddControlEx(HBox, True, True, 0); + ClientArea.AddControlEx(TGTKHSeparator.Create(Self), False, False, 5); + ClientArea.AddControlEx(HBox2, False, False, 3); + + FileLabel := TGTKLabel.Create(Self); + FileLabel.SetAlignment(0, 0); + FileLabel.SetPadding(10, 5); + FileLabel.Caption := 'File: .adobe'#10'Text: rw-rw-rw'#10 + + 'Octal: 666'#10'Owner: root'#10 + + 'Group: root'; + FileLabel.UseMarkup := True; + FileFrame.AddControl(FileLabel); + + OwnerListView := TGTKListView.CreateTyped(Self, False, [lcText, lcNumber]); + OwnerListView.RulesHint := True; + OwnerListView.ShowHeaders := False; + OwnerListView.Columns.Add.AddAttribute('text', 0); + OwnerListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + OwnerListViewScrolledWindow.ShadowType := stShadowIn; + OwnerListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + OwnerListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + OwnerListViewScrolledWindow.BorderWidth := 10; + OwnerListViewScrolledWindow.AddControl(OwnerListView); + OwnerListViewScrolledWindow.SetSizeRequest(200, 200); + OwnerFrame.AddControl(OwnerListViewScrolledWindow); + + GroupListView := TGTKListView.CreateTyped(Self, False, [lcText, lcNumber]); + GroupListView.RulesHint := True; + GroupListView.ShowHeaders := False; + GroupListView.Columns.Add.AddAttribute('text', 0); + GroupListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + GroupListViewScrolledWindow.ShadowType := stShadowIn; + GroupListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + GroupListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + GroupListViewScrolledWindow.BorderWidth := 10; + GroupListViewScrolledWindow.AddControl(GroupListView); + GroupListViewScrolledWindow.SetSizeRequest(200, 200); + GroupFrame.AddControl(GroupListViewScrolledWindow); + + FillData; + OnKeyDown := FormKeyDown; +end; + +procedure TFChown.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFChown.AssignMode(const Mode: Cardinal; const FileName: string; const UID, GID: integer); +var i: integer; + susr, sgrp: string; +begin + LastUID := UID; + LastGID := GID; + susr := 'N/A'; + sgrp := 'N/A'; + // Lookup and select current user and group + if OwnerListView.Items.Count > 0 then + for i := 0 to OwnerListView.Items.Count - 1 do + if OwnerListView.Items[i].AsInteger(1) = UID then begin + OwnerListView.Items[i].Selected := True; + OwnerListView.Items[i].SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + susr := OwnerListView.Items[i].AsString(0); + Break; + end; + if GroupListView.Items.Count > 0 then + for i := 0 to GroupListView.Items.Count - 1 do + if GroupListView.Items[i].AsInteger(1) = GID then begin + GroupListView.Items[i].Selected := True; + GroupListView.Items[i].SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + sgrp := GroupListView.Items[i].AsString(0); + Break; + end; + // Fill more info + FileLabel.Caption := Format(LANGFChmod_FileLabel, [ANSIToUTF8(FileName), AttrToStr(Mode), AttrToOctal(Mode), susr, sgrp]); + FileLabel.UseMarkup := True; + if Length(FileName) > 20 then FileLabel.SetSizeRequest(200, -1); + OwnerListView.OnSelectionChanged := OwnerListViewSelectionChanged; + GroupListView.OnSelectionChanged := GroupListViewSelectionChanged; +end; + +procedure TFChown.FillData; +var UsrManager: TUserManager; + i: integer; + Item: TGTKListItem; +begin + UsrManager := TUserManager.Create; + try + if UsrManager.UserList.Count > 0 then + for i := 0 to UsrManager.UserList.Count - 1 do begin + Item := OwnerListView.Items.Add; + Item.SetValue(0, ANSIToUTF8(TUser(UsrManager.UserList[i]).UserName)); + Item.SetValue(1, TUser(UsrManager.UserList[i]).UID); + end; + if UsrManager.GroupList.Count > 0 then + for i := 0 to UsrManager.GroupList.Count - 1 do begin + Item := GroupListView.Items.Add; + Item.SetValue(0, ANSIToUTF8(TGroup(UsrManager.GroupList[i]).GroupName)); + Item.SetValue(1, TGroup(UsrManager.GroupList[i]).GID); + end; + finally + UsrManager.Free; + end; +end; + +procedure TFChown.OwnerListViewSelectionChanged(Sender: TObject); +begin + if Assigned(OwnerListView.Selected) then LastUID := OwnerListView.Selected.AsInteger(1); +end; + +procedure TFChown.GroupListViewSelectionChanged(Sender: TObject); +begin + if Assigned(GroupListView.Selected) then LastGID := GroupListView.Selected.AsInteger(1); +end; + +end. + diff --git a/UColumns.pas b/UColumns.pas new file mode 100644 index 0000000..70c736f --- /dev/null +++ b/UColumns.pas @@ -0,0 +1,221 @@ +(* + Tux Commander - UColumns - Panel Columns Settings dialog + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UColumns; + +interface + +uses + glib2, gdk2, gtk2, pango, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, + UCoreClasses; + +type + TFColumns = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + ListView: TGTKListView; + ListViewScrolledWindow: TGTKScrolledWindow; + ListViewTable: TGTKTable; + MoveUpButton, MoveDownButton: TGTKImageButton; + procedure FormCreate(Sender: TObject); override; + procedure ListViewSelectionChanged(Sender: TObject); + procedure MoveUpDownButtonButtonClick(Sender: TObject); + procedure ListViewColumnToggled(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem); + private + procedure AddColumnItems; + public + procedure ApplyColumnList; + end; + +var + FColumns: TFColumns; + +implementation + +uses ULocale, UCoreUtils, UConfig, UCore; + + +procedure TFColumns.FormCreate(Sender: TObject); +var Column: TGTKTreeViewColumn; + row_targets: TGtkTargetEntry; +begin + row_targets.target := PChar('GTK_TREE_MODEL_ROW'); + row_targets.flags := GTK_TARGET_SAME_WIDGET; + row_targets.info := 1; + + SetDefaultSize(250, 350); + Caption := LANGColumns_Caption; + Buttons := [mbOK, mbCancel]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [LANGColumns_Title]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-justify-center', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + ListViewTable := TGTKTable.Create(Self); + ListViewTable.BorderWidth := 7; + ClientArea.AddControlEx(ListViewTable, True, True, 0); + + ListView := TGTKListView.CreateTyped(Self, False, [lcBoolean, lcText, lcNumber]); + + { ListView.Reorderable := True; + g_object_set(ListView.FWidget, 'reorderable', integer(True), nil); } + gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(ListView.FWidget), GDK_BUTTON1_MASK, @row_targets, 1, GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(ListView.FWidget), @row_targets, 1, GDK_ACTION_MOVE); + + ListView.RulesHint := True; + ListView.ShowHeaders := False; + Column := ListView.Columns.AddTyped(ctToggle); + Column.AddAttribute('active', 0); + Column.Resizable := False; + Column.FixedWidth := 20; + Column.SizingMode := smFixed; + Column.OnToggled := ListViewColumnToggled; + Column := ListView.Columns.Add; + Column.AddAttribute('text', 1); + Column.Resizable := False; + Column.SizingMode := smAutoSize; + ListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ListViewScrolledWindow.AddControl(ListView); + ListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.ShadowType := stShadowIn; + + MoveUpButton := TGTKImageButton.CreateWithoutLabel(Self); + MoveUpButton.SetFromStock('gtk-go-up', isSmallToolbar); + MoveUpButton.Tooltip := LANGColumns_MoveUpButtonTooltip; + MoveUpButton.CanFocus := False; + MoveDownButton := TGTKImageButton.CreateWithoutLabel(Self); + MoveDownButton.SetFromStock('gtk-go-down', isSmallToolbar); + MoveDownButton.Tooltip := LANGColumns_MoveDownButtonTooltip; + MoveDownButton.CanFocus := False; + + ListViewTable.AddControlEx(0, 1, 3, 4, ListViewScrolledWindow, [taoExpand, taoFill], [taoExpand, taoFill], 0, 5); + ListViewTable.AddControlEx(3, 2, 1, 1, MoveUpButton, [taoShrink, taoFill], [taoShrink], 5, 5); + ListViewTable.AddControlEx(3, 3, 1, 1, MoveDownButton, [taoShrink, taoFill], [taoShrink], 5, 5); + ListViewTable.AddControlEx(3, 1, 1, 1, TGTKLabel.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 0, 2); + ListViewTable.AddControlEx(3, 4, 1, 1, TGTKLabel.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 0, 2); + + AddColumnItems; + + ListView.OnSelectionChanged := ListViewSelectionChanged; + MoveUpButton.OnClick := MoveUpDownButtonButtonClick; + MoveDownButton.OnClick := MoveUpDownButtonButtonClick; + + ListView.SetFocus; +end; + +procedure TFColumns.ListViewSelectionChanged(Sender: TObject); +begin + try + MoveUpButton.Enabled := Assigned(ListView.Selected) and (ListView.Selected.Index > 0); + MoveDownButton.Enabled := Assigned(ListView.Selected) and (ListView.Selected.Index < ListView.Items.Count - 1); + except end; +end; + +procedure TFColumns.MoveUpDownButtonButtonClick(Sender: TObject); +var i, Old, New: integer; + s: string; + b: boolean; +begin + if Assigned(ListView.Selected) then begin + Old := ListView.Selected.Index; + if (Sender = MoveUpButton) and (Old > 0) then New := Old - 1 else + if (Sender = MoveDownButton) and (Old < ListView.Items.Count - 1) then New := Old + 1 else Exit; + b := boolean(ListView.Items[New].AsInteger(0)); + ListView.Items[New].SetValue(0, integer(ListView.Items[Old].AsBoolean(0))); // Stupid but works + ListView.Items[Old].SetValue(0, integer(b)); + s := ListView.Items[New].AsString(1); + ListView.Items[New].SetValue(1, ListView.Items[Old].AsString(1)); + ListView.Items[Old].SetValue(1, s); + i := ListView.Items[New].AsInteger(2); + ListView.Items[New].SetValue(2, ListView.Items[Old].AsInteger(2)); + ListView.Items[Old].SetValue(2, i); + ListView.Items[New].Selected := True; + ListView.Items[New].SetCursor(1, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + end; +end; + +procedure TFColumns.AddColumnItems; +var Item: TGTKListItem; + i: integer; +begin + for i := 1 to 10 do begin + Item := ListView.Items.Add; + Item.SetValue(0, Integer(ConfColumnVisible[i])); + Item.SetValue(1, ConfColumnTitlesLong[ConfColumnIDs[i]]); + Item.SetValue(2, ConfColumnIDs[i]); + end; +end; + +procedure TFColumns.ListViewColumnToggled(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem); +begin + if Assigned(Item) then Item.SetValue(0, not Item.AsBoolean(0)); +end; + + +procedure TFColumns.ApplyColumnList; +var i, j: integer; + TempIDs, TempArrayI: array[1..ConstNumPanelColumns] of integer; + TempArrayB: array[1..ConstNumPanelColumns] of boolean; +begin + // Copy the old items + for i := 1 to ConstNumPanelColumns do begin + TempIDs[i] := ConfColumnIDs[i]; + TempArrayI[i] := ConfColumnSizes[i]; + TempArrayB[i] := ConfColumnVisible[i]; + end; + + // Search for moved columns + for i := 0 to ListView.Items.Count - 1 do + for j := 1 to ConstNumPanelColumns do + if ListView.Items[i].AsInteger(2) = TempIDs[j] then begin + ConfColumnIDs[i + 1] := ListView.Items[i].AsInteger(2); + ConfColumnSizes[i + 1] := TempArrayI[j]; + ConfColumnVisible[i + 1] := boolean(ListView.Items[i].AsInteger(0)); + Break; + end; +end; + + + + + +end. + diff --git a/UConfig.pas b/UConfig.pas new file mode 100644 index 0000000..68da691 --- /dev/null +++ b/UConfig.pas @@ -0,0 +1,1132 @@ +(* + Tux Commander - UConfig - Configuration saving/restoring, various constants + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UConfig; + +interface + +uses Classes, ULocale; + +resourcestring + ConstAppTitle = 'Tux Commander'; + ConstAboutVersion = '0.6.36'; + ConstAboutBuildDate = '2008-06-01'; + +{$IFDEF __FPC__} + {$INCLUDE fpcver.inc} +{$ENDIF} + +const ConfDefaultNormalItemFGColor = '#000000'; + ConfDefaultActiveItemFGColor = '#FFFFFF'; + ConfDefaultInactiveItemFGColor = '#000000'; + ConfDefaultSelectedItemFGColor = '#FF0000'; + ConfDefaultLinkItemFGColor = '#A0A0A0'; + ConfDefaultDotFileItemFGColor = '#606060'; + ConfDefaultNormalItemBGColor = '#FFFFFF'; + ConfDefaultActiveItemBGColor = '#000000'; + ConfDefaultInactiveItemBGColor = '#D0D0D0'; + + ConfSelItemsDelim = ';'; + ConfDefaultPanelFont = 'Sans 10'; + ConfDefaultSettingsDir = '.tuxcmd'; // Also has to be changed in UGTKLoader + ConfDblClickDelay = 500; + ConfQuickRenameDelay = ConfDblClickDelay + 250; + ConfInactiveTimerDelay = 0; + ConfEditViewFileSizeLimit = 10*1024*1024; // 10 MB + ConfAppNA = '---'; + ConfDefaultRowHeight = 16; + ConstInternalProgressTimer = 25; // default = 25ms + ConstRemoteWaitDialogDelay = 800; // default = 800ms + ConstFileListTipsDelay = 400; + ConstFileListTipsDelayNeighbour = 95; + ConstNumPanelColumns = 10; + ConstPathDelim = '#'; + ConstFullPathFormatStr = '%s#%s'; + + ConstTerminalCommand_xterm = 'xterm -T "TuxCommand" -e sh -c ''%s ; echo -n Press ENTER to exit... ; read'''; + ConstTerminalCommand_rxvt = 'rxvt -T "TuxCommand" -e sh -c ''%s ; echo -n Press ENTER to exit... ; read'''; + ConstTerminalCommand_rxvt2 = 'rxvt +si +sw -sl 1000 -g 130x50 -bg black -fg grey -T "TuxCommand" -e sh -c ''%s ; echo -n Press ENTER to exit... ; read'''; + ConstTerminalCommand_gnometerminal = 'gnome-terminal -t "TuxCommand" --geometry=110x40 --working-directory=%cwd -x sh -c ''%s ; echo -n Press ENTER to exit... ; read'''; + ConfViewersApps: array[1..6] of string = ('gedit', 'gvim', 'less', 'emacs', 'nano', 'vi'); + ConfEditorApps: array[1..5] of string = ('gedit', 'gvim', 'emacs', 'nano', 'vi'); + ConfTerminalApps: array[1..4] of string = (ConstTerminalCommand_xterm, ConstTerminalCommand_rxvt, ConstTerminalCommand_rxvt2, ConstTerminalCommand_gnometerminal); + ConfTerminalAppsWParam: array[1..4] of string = ('xterm', 'rxvt', 'rxvt', 'gnome-terminal'); + +const SMOOTH_SCROLL_STEPS = 5; + SMOOTH_SCROLL_DURATION = 45; + SMOOTH_SCROLL_STEPS_PAGE = 10; + SMOOTH_SCROLL_DURATION_PAGE = 120; + + + + +var ConfPanelSep, ConfRowHeight, ConfRowHeightReal, ConfNumHistoryItems, + ConfMainWindowWidth, ConfMainWindowHeight, ConfMainWindowPosLeft, ConfMainWindowPosTop, ConfMainWindowState, + ConfMainWindowLeftSortColumn, ConfMainWindowLeftSortType, ConfMainWindowRightSortColumn, ConfMainWindowRightSortType, + ConfSizeFormat, ConfSizeGroupPrecision, ConfCmdLineTerminalBehaviour, ConfViewerTerminalBehaviour, + ConfEditorTerminalBehaviour, ConfLeftTabBarTabIndex, ConfRightTabBarTabIndex, ConfSwitchOtherPanelBehaviour, + ConfTabMaxLength: integer; + + ConfLeftPath, ConfRightPath, ConfPanelFont, ConfProfileName, ConfViewer, ConfEditor, ConfTerminalCommand, + ConfNormalItemFGColor, ConfActiveItemFGColor, ConfInactiveItemFGColor, ConfSelectedItemFGColor, ConfLinkItemFGColor, + ConfDotFileItemFGColor, ConfNormalItemBGColor, ConfActiveItemBGColor, ConfInactiveItemBGColor, + ParamLeftDir, ParamRightDir: string; + + ParamDebug, ConfShowDotFiles, ConfClearReadOnlyAttr, ConfDisableMouseRename, ConfUseSystemFont, ConfUseFileTypeIcons, + ConfFocusRefresh, ConfNewStyleAltO, ConfDirsInBold, ConfDisableDirectoryBrackets, ParamDisableGnome, ConfWMCompatMode, + ConfUseLibcSystem, ConfUseInternalViewer, ParamDisablePlugins: boolean; + ConfNormalItemDefaultColors, ConfCursorDefaultColors, ConfInactiveItemDefaultColors, ConfSelectedItemDefaultColors, + ConfLinkItemDefaultColors, ConfDotFileItemDefaultColors, ConfLynxLikeMotion, ConfSizeGroupRequestZeroDigits, + ConfDisableFileTips, ConfInsMoveDown, ConfSpaceMovesDown, ConfShowFuncButtons, ConfSelectAllDirs, ConfOctalPerm: boolean; + ConfMounterUseFSTab, ConfShowTextUIDs, ConfMounterPushDown, ConfSavePanelTabs, ConfDuplicateTabWarning, + ConfOpenConnectionsWarning: boolean; + + ConfShowMounterBar: integer; + ConfColumnSizes, ConfColumnIDs: array[1..ConstNumPanelColumns] of integer; + ConfColumnVisible: array[1..ConstNumPanelColumns] of boolean; + ConfUseURI: boolean; + ConfColumnTitlesLong, ConfColumnTitlesShort: array[1..ConstNumPanelColumns] of string; + ConfParamForceLang: string; + ConfTempPath: string; + ConfUseSmoothScrolling: boolean; + + + + +procedure SetDefaults; +procedure ReadMainSettings; +procedure WriteMainSettings; +procedure ReadMainGUISettings; +procedure WriteMainGUISettings; +procedure ReadAssoc; +procedure WriteAssoc; +procedure ReadBookmarks; +procedure WriteBookmarks; +procedure ReadMounter; +procedure WriteMounter; +procedure ReadTabs(const LeftPanel: boolean; TabList: TStringList; TabSortIDs, TabSortTypes: TList); +procedure WriteTabs(const LeftPanel: boolean; TabList: TStringList; TabSortIDs, TabSortTypes: TList); +procedure ReadConnections; +procedure WriteConnections; +procedure SearchForDefaultApps; +function CheckConfFilesMod(var ChangedMainGUI, ChangedAssoc, ChangedBookmarks, ChangedMounter, ChangedConnections: boolean): boolean; +// Returns True if something has changed + +implementation + +uses Libc, SysUtils, IniFiles, UCoreUtils, UCore, UFileAssoc, UCoreClasses, UGnome, UVFSCore; + +var InternalQuickExit, InternalDeleteHistory: boolean; + InternalMainGUIConfmtime, InternalBookmarksConfmtime, InternalFAssocConfmtime, InternalMounterConfmtime, + InternalConnMgrConfmtime: Longint; + + +function GetFileTime(FileName: string): Longint; forward; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure SetDefaults; +var i: integer; +begin + InternalMainGUIConfmtime := -1; + InternalBookmarksConfmtime := -1; + InternalFAssocConfmtime := -1; + InternalMounterConfmtime := -1; + InternalConnMgrConfmtime := -1; + InternalQuickExit := False; + ConfPanelSep := 50; + ConfLeftPath := '/'; + ConfRightPath := '/'; + ConfColumnSizes[1] := 150; // Name + ConfColumnSizes[2] := 190; // Name + Extension + ConfColumnSizes[3] := 40; // Extension + ConfColumnSizes[4] := 90; // Size + ConfColumnSizes[5] := 75; // Date + Time + ConfColumnSizes[6] := 40; // Date + ConfColumnSizes[7] := 40; // Time + ConfColumnSizes[8] := 40; // User + ConfColumnSizes[9] := 40; // Group + ConfColumnSizes[10] := 70; // Attributes + for i := 1 to ConstNumPanelColumns do ConfColumnIDs[i] := i; + ConfColumnVisible[1] := True; + ConfColumnVisible[2] := False; + ConfColumnVisible[3] := True; + ConfColumnVisible[4] := True; + ConfColumnVisible[5] := True; + ConfColumnVisible[6] := False; + ConfColumnVisible[7] := False; + ConfColumnVisible[8] := False; + ConfColumnVisible[9] := False; + ConfColumnVisible[10] := True; + ConfRowHeight := -1; + ConfRowHeightReal := ConfDefaultRowHeight; + ConfPanelFont := ConfDefaultPanelFont; + ConfProfileName := 'Profile_Default'; + ParamDebug := False; + ConfShowDotFiles := False; + ConfClearReadOnlyAttr := True; + ConfViewer := ConfAppNA; + ConfEditor := ConfAppNA; + ConfTerminalCommand := ConfAppNA; + ConfNumHistoryItems := 20; + ConfDisableMouseRename := False; + InternalDeleteHistory := False; + ConfUseSystemFont := True; + ConfUseFileTypeIcons := True; + ConfMainWindowWidth := 800; + ConfMainWindowHeight := 600; + ConfMainWindowPosLeft := -1; + ConfMainWindowPosTop := -1; + ConfMainWindowState := 0; + ConfMainWindowLeftSortColumn := 0; + ConfMainWindowLeftSortType := 0; // soAscending + ConfMainWindowRightSortColumn := 0; + ConfMainWindowRightSortType := 0; + ConfFocusRefresh := False; + ConfLynxLikeMotion := False; + ConfSizeFormat := 0; + ConfSizeGroupPrecision := 2; + ConfSizeGroupRequestZeroDigits := True; + ConfNewStyleAltO := True; + ConfDirsInBold := False; + ConfDisableDirectoryBrackets := False; + ParamDisableGnome := False; + ConfWMCompatMode := False; + ConfDisableFileTips := False; + ConfInsMoveDown := True; + ConfSpaceMovesDown := False; + ConfShowFuncButtons := True; + ConfSelectAllDirs := True; + ConfOctalPerm := False; + ConfCmdLineTerminalBehaviour := 0; // 0 = Autodetect, 1 = Terminal, 2 = no term. + ConfViewerTerminalBehaviour := 0; + ConfEditorTerminalBehaviour := 0; + ConfUseLibcSystem := False; + ConfUseInternalViewer := False; + ConfMounterUseFSTab := True; + ConfShowMounterBar := 1; // 0 = No mounter bar, 1 = one mounter bar, 2 = two mounter bars above the panels + ConfShowTextUIDs := True; + ConfMounterPushDown := False; + ConfUseURI := False; + ParamDisablePlugins := False; + ParamLeftDir := ''; + ParamRightDir := ''; + ConfLeftTabBarTabIndex := -1; + ConfRightTabBarTabIndex := -1; + ConfSavePanelTabs := True; + ConfParamForceLang := ''; + ConfSwitchOtherPanelBehaviour := -1; + ConfDuplicateTabWarning := True; + ConfOpenConnectionsWarning := True; + ConfTabMaxLength := 25; + ConfTempPath := '/tmp/tuxcmd'; + ConfUseSmoothScrolling := False; + + // Setup default values for colors + ConfNormalItemFGColor := ConfDefaultNormalItemFGColor; + ConfNormalItemBGColor := ConfDefaultNormalItemBGColor; + ConfActiveItemFGColor := ConfDefaultActiveItemFGColor; + ConfActiveItemBGColor := ConfDefaultActiveItemBGColor; + ConfInactiveItemFGColor := ConfDefaultInactiveItemFGColor; + ConfInactiveItemBGColor := ConfDefaultInactiveItemBGColor; + ConfSelectedItemFGColor := ConfDefaultSelectedItemFGColor; + ConfLinkItemFGColor := ConfDefaultLinkItemFGColor; + ConfDotFileItemFGColor := ConfDefaultDotFileItemFGColor; + ConfNormalItemDefaultColors := False; + ConfCursorDefaultColors := False; + ConfInactiveItemDefaultColors := False; + ConfSelectedItemDefaultColors := False; + ConfLinkItemDefaultColors := False; + ConfDotFileItemDefaultColors := False; + SetupColors; +end; + +procedure ReadMainSettings; +var s: string; + IniFile: TMyIniFile; + i, j: integer; +begin + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot read user settings']); + Exit; + end; + + DebugMsg(['Using profile ''', ConfProfileName, '''']); + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'options', True); + try + if ParamLeftDir <> '' then ConfLeftPath := ParamLeftDir else + ConfLeftPath := IniFile.ReadString(ConfProfileName, 'LeftPath', ConfLeftPath); + if ParamRightDir <> '' then ConfRightPath := ParamRightDir else + ConfRightPath := IniFile.ReadString(ConfProfileName, 'RightPath', ConfRightPath); + ConfShowDotFiles := IniFile.ReadBool(ConfProfileName, 'ShowDotFiles', ConfShowDotFiles); + ConfPanelSep := IniFile.ReadInteger(ConfProfileName, 'PanelSep', ConfPanelSep); + ConfMainWindowWidth := IniFile.ReadInteger(ConfProfileName, 'MainWindowWidth', ConfMainWindowWidth); + ConfMainWindowHeight := IniFile.ReadInteger(ConfProfileName, 'MainWindowHeight', ConfMainWindowHeight); + ConfMainWindowPosLeft := IniFile.ReadInteger(ConfProfileName, 'MainWindowPosLeft', ConfMainWindowPosLeft); + ConfMainWindowPosTop := IniFile.ReadInteger(ConfProfileName, 'MainWindowPosTop', ConfMainWindowPosTop); + ConfMainWindowState := IniFile.ReadInteger(ConfProfileName, 'MainWindowState', ConfMainWindowState); + for i := 1 to ConstNumPanelColumns do begin + ConfColumnSizes[i] := IniFile.ReadInteger(ConfProfileName, Format('ColumnSize[%d]', [i]), ConfColumnSizes[i]); + ConfColumnIDs[i] := IniFile.ReadInteger(ConfProfileName, Format('ColumnIDs[%d]', [i]), ConfColumnIDs[i]); + ConfColumnVisible[i] := IniFile.ReadBool(ConfProfileName, Format('ColumnVisible[%d]', [i]), ConfColumnVisible[i]); + end; + ConfMainWindowLeftSortColumn := IniFile.ReadInteger(ConfProfileName, 'MainWindowLeftSortColumn', ConfMainWindowLeftSortColumn); + ConfMainWindowLeftSortType := IniFile.ReadInteger(ConfProfileName, 'MainWindowLeftSortType', ConfMainWindowLeftSortType); + ConfMainWindowRightSortColumn := IniFile.ReadInteger(ConfProfileName, 'MainWindowRightSortColumn', ConfMainWindowRightSortColumn); + ConfMainWindowRightSortType := IniFile.ReadInteger(ConfProfileName, 'MainWindowRightSortType', ConfMainWindowRightSortType); + if not InternalDeleteHistory then begin + i := IniFile.ReadInteger('CommandLineHistory', 'NumItems', 0); + if i > 0 then + for j := 0 to i - 1 do + CommandLineHistory.Add(IniFile.ReadString('CommandLineHistory', Format('Item%d', [j]), '')); + i := IniFile.ReadInteger('SelectHistory', 'NumItems', 0); + if i > 0 then + for j := 0 to i - 1 do begin + s := IniFile.ReadString('SelectHistory', Format('Item%d', [j]), ''); + if s <> '*.*' then SelectHistory.Add(s); + end; + i := IniFile.ReadInteger('SearchHistory', 'NumItems', 0); + if i > 0 then + for j := 0 to i - 1 do + SearchHistory.Add(IniFile.ReadString('SearchHistory', Format('Item%d', [j]), '')); + end; + ConfShowMounterBar := IniFile.ReadInteger(ConfProfileName, 'ShowMounterBar', ConfShowMounterBar); + + finally + try IniFile.Free; except end; + end; + except end; +end; + +procedure WriteMainSettings; +var s: string; + IniFile: TMyIniFile; + i: integer; +begin + if InternalQuickExit then Exit; + ConfLeftPath := LeftLocalEngine.Path; + ConfRightPath := RightLocalEngine.Path; + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot save user settings']); + Exit; + end; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'options', False); + try try + IniFile.WriteString(ConfProfileName, 'LeftPath', ConfLeftPath); + IniFile.WriteString(ConfProfileName, 'RightPath', ConfRightPath); + IniFile.WriteBool(ConfProfileName, 'ShowDotFiles', ConfShowDotFiles); + IniFile.WriteInteger(ConfProfileName, 'PanelSep', ConfPanelSep); + IniFile.WriteInteger(ConfProfileName, 'MainWindowState', ConfMainWindowState); + if ConfMainWindowState <> 4 then begin + IniFile.WriteInteger(ConfProfileName, 'MainWindowWidth', ConfMainWindowWidth); + IniFile.WriteInteger(ConfProfileName, 'MainWindowHeight', ConfMainWindowHeight); + IniFile.WriteInteger(ConfProfileName, 'MainWindowPosLeft', ConfMainWindowPosLeft); + IniFile.WriteInteger(ConfProfileName, 'MainWindowPosTop', ConfMainWindowPosTop); + end; + for i := 1 to ConstNumPanelColumns do begin + IniFile.WriteInteger(ConfProfileName, Format('ColumnSize[%d]', [i]), ConfColumnSizes[i]); + IniFile.WriteInteger(ConfProfileName, Format('ColumnIDs[%d]', [i]), ConfColumnIDs[i]); + IniFile.WriteBool(ConfProfileName, Format('ColumnVisible[%d]', [i]), ConfColumnVisible[i]); + end; + IniFile.WriteInteger(ConfProfileName, 'MainWindowLeftSortColumn', ConfMainWindowLeftSortColumn); + IniFile.WriteInteger(ConfProfileName, 'MainWindowLeftSortType', ConfMainWindowLeftSortType); + IniFile.WriteInteger(ConfProfileName, 'MainWindowRightSortColumn', ConfMainWindowRightSortColumn); + IniFile.WriteInteger(ConfProfileName, 'MainWindowRightSortType', ConfMainWindowRightSortType); + IniFile.WriteInteger('CommandLineHistory', 'NumItems', CommandLineHistory.Count); + IniFile.WriteInteger('SelectHistory', 'NumItems', SelectHistory.Count); + IniFile.WriteInteger('SearchHistory', 'NumItems', SearchHistory.Count); + if CommandLineHistory.Count > 0 then + for i := 0 to CommandLineHistory.Count - 1 do + IniFile.WriteString('CommandLineHistory', Format('Item%d', [i]), CommandLineHistory[i]); + if SelectHistory.Count > 0 then + for i := 0 to SelectHistory.Count - 1 do + IniFile.WriteString('SelectHistory', Format('Item%d', [i]), SelectHistory[i]); + if SearchHistory.Count > 0 then + for i := 0 to SearchHistory.Count - 1 do + IniFile.WriteString('SearchHistory', Format('Item%d', [i]), SearchHistory[i]); + IniFile.WriteInteger(ConfProfileName, 'ShowMounterBar', ConfShowMounterBar); + + except + on E: Exception do DebugMsg(['*** Error: Cannot save user settings (', E.ClassName, '): ', E.Message]); + end; + finally + IniFile.Free; + end; + except end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ReadMainGUISettings; +var s: string; + IniFile: TMyIniFile; +begin + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot read user settings']); + Exit; + end; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'gui', True); + try + ConfPanelFont := IniFile.ReadString(ConfProfileName, 'PanelFont', ConfDefaultPanelFont); + ConfRowHeight := IniFile.ReadInteger(ConfProfileName, 'RowHeight', ConfRowHeight); + if ConfRowHeight > 0 then ConfRowHeightReal := ConfRowHeight; + ConfClearReadOnlyAttr := IniFile.ReadBool(ConfProfileName, 'ClearReadOnlyAttr', ConfClearReadOnlyAttr); + ConfViewer := IniFile.ReadString(ConfProfileName, 'Viewer', ConfViewer); + ConfEditor := IniFile.ReadString(ConfProfileName, 'Editor', ConfEditor); + ConfTerminalCommand := IniFile.ReadString(ConfProfileName, 'TerminalCommand', ConfTerminalCommand); + ConfNumHistoryItems := IniFile.ReadInteger('General', 'NumHistoryItems', ConfNumHistoryItems); + ConfDisableMouseRename := IniFile.ReadBool(ConfProfileName, 'DisableMouseRename', ConfDisableMouseRename); + ConfUseSystemFont := IniFile.ReadBool(ConfProfileName, 'UseSystemFont', ConfUseSystemFont); + ConfUseFileTypeIcons := IniFile.ReadBool(ConfProfileName, 'UseFileTypeIcons', ConfUseFileTypeIcons); + // Read color settings + ConfNormalItemFGColor := IniFile.ReadString(ConfProfileName, 'NormalItemFGColor', ConfNormalItemFGColor); + ConfNormalItemBGColor := IniFile.ReadString(ConfProfileName, 'NormalItemBGColor', ConfNormalItemBGColor); + ConfActiveItemFGColor := IniFile.ReadString(ConfProfileName, 'ActiveItemFGColor', ConfActiveItemFGColor); + ConfActiveItemBGColor := IniFile.ReadString(ConfProfileName, 'ActiveItemBGColor', ConfActiveItemBGColor); + ConfInactiveItemFGColor := IniFile.ReadString(ConfProfileName, 'InactiveItemFGColor', ConfInactiveItemFGColor); + ConfInactiveItemBGColor := IniFile.ReadString(ConfProfileName, 'InactiveItemBGColor', ConfInactiveItemBGColor); + ConfSelectedItemFGColor := IniFile.ReadString(ConfProfileName, 'SelectedItemFGColor', ConfSelectedItemFGColor); + ConfLinkItemFGColor := IniFile.ReadString(ConfProfileName, 'LinkItemFGColor', ConfLinkItemFGColor); + ConfDotFileItemFGColor := IniFile.ReadString(ConfProfileName, 'DotFileItemFGColor', ConfDotFileItemFGColor); + ConfNormalItemDefaultColors := IniFile.ReadBool(ConfProfileName, 'NormalItemDefaultColors', ConfNormalItemDefaultColors); + ConfCursorDefaultColors := IniFile.ReadBool(ConfProfileName, 'CursorDefaultColors', ConfCursorDefaultColors); + ConfInactiveItemDefaultColors := IniFile.ReadBool(ConfProfileName, 'InactiveItemDefaultColors', ConfInactiveItemDefaultColors); + ConfSelectedItemDefaultColors := IniFile.ReadBool(ConfProfileName, 'SelectedItemDefaultColors', ConfSelectedItemDefaultColors); + ConfLinkItemDefaultColors := IniFile.ReadBool(ConfProfileName, 'LinkItemDefaultColors', ConfLinkItemDefaultColors); + ConfDotFileItemDefaultColors := IniFile.ReadBool(ConfProfileName, 'DotFileItemDefaultColors', ConfDotFileItemDefaultColors); + ConfLynxLikeMotion := IniFile.ReadBool(ConfProfileName, 'LynxLikeMotion', ConfLynxLikeMotion); + ConfDirsInBold := IniFile.ReadBool(ConfProfileName, 'DirsInBold', ConfDirsInBold); + ConfNewStyleAltO := IniFile.ReadBool(ConfProfileName, 'NewStyleAltO', ConfNewStyleAltO); + ConfWMCompatMode := IniFile.ReadBool(ConfProfileName, 'WMCompatibilityMode', ConfWMCompatMode); + ConfDisableFileTips := IniFile.ReadBool(ConfProfileName, 'DisableFileTips', ConfDisableFileTips); + ConfDisableDirectoryBrackets := IniFile.ReadBool(ConfProfileName, 'DisableDirectoryBrackets', ConfDisableDirectoryBrackets); + ConfInsMoveDown := IniFile.ReadBool(ConfProfileName, 'InsMoveDown', ConfInsMoveDown); + ConfSpaceMovesDown := IniFile.ReadBool(ConfProfileName, 'SpaceMovesDown', ConfSpaceMovesDown); + ConfSelectAllDirs := IniFile.ReadBool(ConfProfileName, 'SelectAllDirs', ConfSelectAllDirs); + ConfShowFuncButtons := IniFile.ReadBool(ConfProfileName, 'ShowFuncButtons', ConfShowFuncButtons); + ConfOctalPerm := IniFile.ReadBool(ConfProfileName, 'OctalPerm', ConfOctalPerm); + ConfFocusRefresh := IniFile.ReadBool(ConfProfileName, 'FocusRefresh', ConfFocusRefresh); + ConfSizeFormat := IniFile.ReadInteger(ConfProfileName, 'SizeFormat', ConfSizeFormat); + ConfSizeGroupPrecision := IniFile.ReadInteger(ConfProfileName, 'SizeGroupPrecision', ConfSizeGroupPrecision); + ConfSizeGroupRequestZeroDigits := IniFile.ReadBool(ConfProfileName, 'SizeGroupRequestZeroDigits', ConfSizeGroupRequestZeroDigits); + ConfCmdLineTerminalBehaviour := IniFile.ReadInteger(ConfProfileName, 'CmdLineTerminalBehaviour', ConfCmdLineTerminalBehaviour); + ConfViewerTerminalBehaviour := IniFile.ReadInteger(ConfProfileName, 'ViewerTerminalBehaviour', ConfViewerTerminalBehaviour); + ConfEditorTerminalBehaviour := IniFile.ReadInteger(ConfProfileName, 'EditorTerminalBehaviour', ConfEditorTerminalBehaviour); + ConfUseLibcSystem := IniFile.ReadBool(ConfProfileName, 'CompatUseLibcSystem', ConfUseLibcSystem); + ConfUseInternalViewer := IniFile.ReadBool(ConfProfileName, 'UseInternalViewer', ConfUseInternalViewer); + ConfSwitchOtherPanelBehaviour := IniFile.ReadInteger(ConfProfileName, 'SwitchOtherPanelBehaviour', ConfSwitchOtherPanelBehaviour); + ConfDuplicateTabWarning := IniFile.ReadBool(ConfProfileName, 'DuplicateTabWarning', ConfDuplicateTabWarning); + ConfOpenConnectionsWarning := IniFile.ReadBool(ConfProfileName, 'OpenConnectionsWarning', ConfOpenConnectionsWarning); + ConfShowTextUIDs := IniFile.ReadBool(ConfProfileName, 'ShowTextUIDs', ConfShowTextUIDs); + + + (********************************************* NEW !!!! *************************************************) + ConfSavePanelTabs := IniFile.ReadBool(ConfProfileName, 'SavePanelTabs', ConfSavePanelTabs); + ConfTabMaxLength := IniFile.ReadInteger(ConfProfileName, 'TabMaxLength', ConfTabMaxLength); + ConfTempPath := IniFile.ReadString(ConfProfileName, 'TempPath', ConfTempPath); + ConfUseSmoothScrolling := IniFile.ReadBool(ConfProfileName, 'UseSmoothScrolling', ConfUseSmoothScrolling); + + + SearchForDefaultApps; + finally + try IniFile.Free; except end; + InternalMainGUIConfmtime := GetFileTime(IncludeTrailingPathDelimiter(s) + 'gui'); + end; + except end; +end; + +procedure WriteMainGUISettings; +var s: string; + IniFile: TMyIniFile; +begin + if InternalQuickExit then Exit; + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot save user settings']); + Exit; + end; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'gui', False); + try try + IniFile.WriteString(ConfProfileName, 'PanelFont', ConfPanelFont); + IniFile.WriteInteger(ConfProfileName, 'RowHeight', ConfRowHeight); + IniFile.WriteBool(ConfProfileName, 'ClearReadOnlyAttr', ConfClearReadOnlyAttr); + IniFile.WriteString(ConfProfileName, 'Viewer', ConfViewer); + IniFile.WriteString(ConfProfileName, 'Editor', ConfEditor); + IniFile.WriteString(ConfProfileName, 'TerminalCommand', ConfTerminalCommand); + IniFile.WriteInteger('General', 'NumHistoryItems', ConfNumHistoryItems); + IniFile.WriteBool(ConfProfileName, 'DisableMouseRename', ConfDisableMouseRename); + IniFile.WriteBool(ConfProfileName, 'UseSystemFont', ConfUseSystemFont); + IniFile.WriteBool(ConfProfileName, 'UseFileTypeIcons', ConfUseFileTypeIcons); + + // Save color settings + IniFile.WriteString(ConfProfileName, 'NormalItemFGColor', ConfNormalItemFGColor); + IniFile.WriteString(ConfProfileName, 'NormalItemBGColor', ConfNormalItemBGColor); + IniFile.WriteString(ConfProfileName, 'ActiveItemFGColor', ConfActiveItemFGColor); + IniFile.WriteString(ConfProfileName, 'ActiveItemBGColor', ConfActiveItemBGColor); + IniFile.WriteString(ConfProfileName, 'InactiveItemFGColor', ConfInactiveItemFGColor); + IniFile.WriteString(ConfProfileName, 'InactiveItemBGColor', ConfInactiveItemBGColor); + IniFile.WriteString(ConfProfileName, 'SelectedItemFGColor', ConfSelectedItemFGColor); + IniFile.WriteString(ConfProfileName, 'LinkItemFGColor', ConfLinkItemFGColor); + IniFile.WriteString(ConfProfileName, 'DotFileItemFGColor', ConfDotFileItemFGColor); + IniFile.WriteBool(ConfProfileName, 'NormalItemDefaultColors', ConfNormalItemDefaultColors); + IniFile.WriteBool(ConfProfileName, 'CursorDefaultColors', ConfCursorDefaultColors); + IniFile.WriteBool(ConfProfileName, 'InactiveItemDefaultColors', ConfInactiveItemDefaultColors); + IniFile.WriteBool(ConfProfileName, 'SelectedItemDefaultColors', ConfSelectedItemDefaultColors); + IniFile.WriteBool(ConfProfileName, 'LinkItemDefaultColors', ConfLinkItemDefaultColors); + IniFile.WriteBool(ConfProfileName, 'DotFileItemDefaultColors', ConfDotFileItemDefaultColors); + IniFile.WriteBool(ConfProfileName, 'LynxLikeMotion', ConfLynxLikeMotion); + IniFile.WriteInteger(ConfProfileName, 'SizeFormat', ConfSizeFormat); + IniFile.WriteInteger(ConfProfileName, 'SizeGroupPrecision', ConfSizeGroupPrecision); + IniFile.WriteBool(ConfProfileName, 'SizeGroupRequestZeroDigits', ConfSizeGroupRequestZeroDigits); + IniFile.WriteBool(ConfProfileName, 'NewStyleAltO', ConfNewStyleAltO); + IniFile.WriteBool(ConfProfileName, 'DirsInBold', ConfDirsInBold); + IniFile.WriteBool(ConfProfileName, 'DisableDirectoryBrackets', ConfDisableDirectoryBrackets); + IniFile.WriteBool(ConfProfileName, 'WMCompatibilityMode', ConfWMCompatMode); + IniFile.WriteBool(ConfProfileName, 'DisableFileTips', ConfDisableFileTips); + IniFile.WriteBool(ConfProfileName, 'InsMoveDown', ConfInsMoveDown); + IniFile.WriteBool(ConfProfileName, 'SpaceMovesDown', ConfSpaceMovesDown); + IniFile.WriteBool(ConfProfileName, 'ShowFuncButtons', ConfShowFuncButtons); + IniFile.WriteBool(ConfProfileName, 'SelectAllDirs', ConfSelectAllDirs); + IniFile.WriteBool(ConfProfileName, 'OctalPerm', ConfOctalPerm); + IniFile.WriteBool(ConfProfileName, 'FocusRefresh', ConfFocusRefresh); + IniFile.WriteInteger(ConfProfileName, 'CmdLineTerminalBehaviour', ConfCmdLineTerminalBehaviour); + IniFile.WriteInteger(ConfProfileName, 'ViewerTerminalBehaviour', ConfViewerTerminalBehaviour); + IniFile.WriteInteger(ConfProfileName, 'EditorTerminalBehaviour', ConfEditorTerminalBehaviour); + IniFile.WriteBool(ConfProfileName, 'CompatUseLibcSystem', ConfUseLibcSystem); + IniFile.WriteBool(ConfProfileName, 'UseInternalViewer', ConfUseInternalViewer); + IniFile.WriteInteger(ConfProfileName, 'SwitchOtherPanelBehaviour', ConfSwitchOtherPanelBehaviour); + IniFile.WriteBool(ConfProfileName, 'DuplicateTabWarning', ConfDuplicateTabWarning); + IniFile.WriteBool(ConfProfileName, 'OpenConnectionsWarning', ConfOpenConnectionsWarning); + IniFile.WriteBool(ConfProfileName, 'ShowTextUIDs', ConfShowTextUIDs); + + (********************************************* NEW !!!! *************************************************) + IniFile.WriteBool(ConfProfileName, 'SavePanelTabs', ConfSavePanelTabs); + IniFile.WriteInteger(ConfProfileName, 'TabMaxLength', ConfTabMaxLength); + IniFile.WriteString(ConfProfileName, 'TempPath', ConfTempPath); + IniFile.WriteBool(ConfProfileName, 'UseSmoothScrolling', ConfUseSmoothScrolling); + + except + on E: Exception do DebugMsg(['*** Error: Cannot save user settings (', E.ClassName, '): ', E.Message]); + end; + + finally + IniFile.Free; + InternalMainGUIConfmtime := GetFileTime(IncludeTrailingPathDelimiter(s) + 'gui'); + end; + except end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ReadAssoc; +var s: string; + IniFile: TMyIniFile; + Sections: TStringList; + i, j, cnt: integer; + Item: TFileAssoc; + Action: TAssocAction; +begin + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot read file association settings']); + Exit; + end; + + try + if not Assigned(AssocList) then AssocList := TList.Create else + if AssocList.Count > 0 then for i := 0 to AssocList.Count - 1 do TFileAssoc(AssocList[i]).Free; + except end; + AssocList.Clear; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'filetypes', True); + try + Sections := TStringList.Create; + IniFile.ReadSections(Sections); + if Sections.Count > 0 then + for i := 0 to Sections.Count - 1 do + if Sections[i] <> 'General' then begin + Item := TFileAssoc.Create; + with Item do begin + if (Sections[i] = ConstFTAMetaDirectory) or (Sections[i] = ConstFTAMetaFile) + then Extensions := '' + else Extensions := Sections[i]; + FileTypeName := IniFile.ReadString(Sections[i], 'FileTypeName', ''); + DefaultAction := IniFile.ReadInteger(Sections[i], 'DefaultAction', 0); + cnt := IniFile.ReadInteger(Sections[i], 'NumActions', 0); + FileTypeIcon := IniFile.ReadString(Sections[i], 'FileTypeIcon', ''); + ColorString := IniFile.ReadString(Sections[i], 'ColorString', ''); + if cnt > 0 then + for j := 0 to cnt - 1 do begin + Action := TAssocAction.Create; + with Action do begin + ActionName := IniFile.ReadString(Sections[i], Format('Action%dName', [j]), ''); + ActionCommand := IniFile.ReadString(Sections[i], Format('Action%dCommand', [j]), ''); + RunInTerminal := IniFile.ReadBool(Sections[i], Format('Action%dRunInTerminal', [j]), False); + AutodetectGUI := IniFile.ReadBool(Sections[i], Format('Action%dAutodetectGUI', [j]), True); + end; + if (Action.ActionName <> '') {and (Action.ActionCommand <> '')} then ActionList.Add(Action); + end; + end; + {if Length(Trim(Item.Extensions)) > 0 then} AssocList.Add(Item); + end; + Sections.Free; + AddDefaultItems(AssocList); + if Assigned(FileIcon) then RecreateIcons(AssocList); + finally + try IniFile.Free; except end; + InternalFAssocConfmtime := GetFileTime(IncludeTrailingPathDelimiter(s) + 'filetypes'); + end; + except end; +end; + +procedure WriteAssoc; +var i, j: integer; + IniFile: TMyIniFile; + s, SectionTitle: string; +begin + if InternalQuickExit then Exit; + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot save file association settings']); + Exit; + end; + s := IncludeTrailingPathDelimiter(s) + 'filetypes'; + if Libc.access(PChar(s), R_OK) = 0 then Libc.remove(PChar(s)); + + IniFile := TMyIniFile.Create(s, False); + try try + if AssocList.Count > 0 then + for i := 0 to AssocList.Count - 1 do + with TFileAssoc(AssocList[i]) do begin + if (FileTypeName = ConstFTAMetaDirectory) or (FileTypeName = ConstFTAMetaFile) + then SectionTitle := FileTypeName + else SectionTitle := Extensions; + IniFile.EraseSection(SectionTitle); + IniFile.WriteString(SectionTitle, 'FileTypeName', FileTypeName); + IniFile.WriteString(SectionTitle, 'FileTypeIcon', FileTypeIcon); + IniFile.WriteInteger(SectionTitle, 'DefaultAction', DefaultAction); + IniFile.WriteInteger(SectionTitle, 'NumActions', ActionList.Count); + IniFile.WriteString(SectionTitle, 'ColorString', ColorString); + if ActionList.Count > 0 then + for j := 0 to ActionList.Count - 1 do begin + IniFile.WriteString(SectionTitle, Format('Action%dName', [j]), TAssocAction(ActionList[j]).ActionName); + IniFile.WriteString(SectionTitle, Format('Action%dCommand', [j]), TAssocAction(ActionList[j]).ActionCommand); + IniFile.WriteBool(SectionTitle, Format('Action%dRunInTerminal', [j]), TAssocAction(ActionList[j]).RunInTerminal); + IniFile.WriteBool(SectionTitle, Format('Action%dAutodetectGUI', [j]), TAssocAction(ActionList[j]).AutodetectGUI); + end; + end; + except + on E: Exception do DebugMsg(['*** Error: Cannot save file association settings (', E.ClassName, '): ', E.Message]); + end; + finally + IniFile.Free; + InternalFAssocConfmtime := GetFileTime(s); + end; + except end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ReadBookmarks; +var s: string; +begin + try + s := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir) + 'bookmarks'; + Bookmarks.LoadFromFile(s); + InternalBookmarksConfmtime := GetFileTime(s); + except + end; +end; + +procedure WriteBookmarks; +var s: string; +begin + if InternalQuickExit then Exit; + try + s := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir) + 'bookmarks'; + Bookmarks.SaveToFile(s); + InternalBookmarksConfmtime := GetFileTime(s); + except + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ReadMounter; +var s: string; + IniFile: TMyIniFile; + Sections: TStringList; + i: integer; + Item: TMounterItem; +begin + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot read file association settings']); + Exit; + end; + + try + if not Assigned(MounterList) then MounterList := TList.Create else + if MounterList.Count > 0 then for i := 0 to MounterList.Count - 1 do TMounterItem(MounterList[i]).Free; + except end; + MounterList.Clear; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'mounter', True); + try + Sections := TStringList.Create; + IniFile.ReadSections(Sections); + if Sections.Count > 0 then + for i := 0 to Sections.Count - 1 do + if Sections[i] = 'General' then begin + ConfMounterUseFSTab := IniFile.ReadBool('General', 'MounterUseFSTab', ConfMounterUseFSTab); + ConfMounterPushDown := IniFile.ReadBool('General', 'MounterPushDown', ConfMounterPushDown); + end else begin + Item := TMounterItem.Create; + with Item do begin + Device := Sections[i]; + DisplayText := IniFile.ReadString(Sections[i], 'DisplayText', ''); + MountPath := IniFile.ReadString(Sections[i], 'MountPath', ''); + IconPath := IniFile.ReadString(Sections[i], 'IconPath', ''); + MountCommand := IniFile.ReadString(Sections[i], 'MountCommand', ''); + UmountCommand := IniFile.ReadString(Sections[i], 'UmountCommand', ''); + DeviceType := IniFile.ReadInteger(Sections[i], 'DeviceType', 0); + end; + MounterList.Add(Item); + end; + Sections.Free; + finally + try IniFile.Free; except end; + InternalMounterConfmtime := GetFileTime(IncludeTrailingPathDelimiter(s) + 'mounter'); + end; + except end; +end; + +procedure WriteMounter; +var i: integer; + IniFile: TMyIniFile; + s, SectionTitle: string; +begin + if InternalQuickExit then Exit; + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot save file association settings']); + Exit; + end; + s := IncludeTrailingPathDelimiter(s) + 'mounter'; + if Libc.access(PChar(s), R_OK) = 0 then Libc.remove(PChar(s)); + + IniFile := TMyIniFile.Create(s, False); + try try + IniFile.WriteBool('General', 'MounterUseFSTab', ConfMounterUseFSTab); + IniFile.WriteBool('General', 'MounterPushDown', ConfMounterPushDown); + if MounterList.Count > 0 then + for i := 0 to MounterList.Count - 1 do + with TMounterItem(MounterList[i]) do begin + SectionTitle := Device; + IniFile.EraseSection(SectionTitle); + IniFile.WriteString(SectionTitle, 'DisplayText', DisplayText); + IniFile.WriteString(SectionTitle, 'MountPath', MountPath); + IniFile.WriteString(SectionTitle, 'IconPath', IconPath); + IniFile.WriteString(SectionTitle, 'MountCommand', MountCommand); + IniFile.WriteString(SectionTitle, 'UmountCommand', UmountCommand); + IniFile.WriteInteger(SectionTitle, 'DeviceType', DeviceType); + end; + except + on E: Exception do DebugMsg(['*** Error: Cannot save file association settings (', E.ClassName, '): ', E.Message]); + end; + finally + IniFile.Free; + InternalMounterConfmtime := GetFileTime(s); + end; + except end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ReadTabs(const LeftPanel: boolean; TabList: TStringList; TabSortIDs, TabSortTypes: TList); +const PanelPrefixes: array[boolean] of string = ('Left', 'Right'); +var s, Section: string; + IniFile: TMyIniFile; + i, j: integer; + NumItems: integer; +begin + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot read panel tabs']); + Exit; + end; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'tabs', True); + try + Section := Format('%s_%spanel', [ConfProfileName, PanelPrefixes[LeftPanel]]); + NumItems := IniFile.ReadInteger(Section, 'NumTabs', 0); + if LeftPanel then ConfLeftTabBarTabIndex := IniFile.ReadInteger(Section, 'TabIndex', ConfLeftTabBarTabIndex) + else ConfRightTabBarTabIndex := IniFile.ReadInteger(Section, 'TabIndex', ConfRightTabBarTabIndex); + if NumItems > 0 then + for i := 0 to NumItems - 1 do begin + s := IniFile.ReadString(Section, Format('Tab%d', [i]), ''); + if Length(s) > 0 then TabList.Add(s); + j := IniFile.ReadInteger(Section, Format('Tab%d_SortID', [i]), 0); + TabSortIDs.Add(Pointer(j)); + j := IniFile.ReadInteger(Section, Format('Tab%d_SortType', [i]), 0); + TabSortTypes.Add(Pointer(j)); + end; + finally + try IniFile.Free; except end; + end; + except end; +end; + +procedure WriteTabs(const LeftPanel: boolean; TabList: TStringList; TabSortIDs, TabSortTypes: TList); +const PanelPrefixes: array[boolean] of string = ('Left', 'Right'); +var s, Section: string; + IniFile: TMyIniFile; + i: integer; +begin + if InternalQuickExit then Exit; + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot save panel tabs']); + Exit; + end; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'tabs', False); + try try + Section := Format('%s_%spanel', [ConfProfileName, PanelPrefixes[LeftPanel]]); + IniFile.EraseSection(Section); + IniFile.WriteInteger(Section, 'NumTabs', TabList.Count); + if LeftPanel then IniFile.WriteInteger(Section, 'TabIndex', ConfLeftTabBarTabIndex) + else IniFile.WriteInteger(Section, 'TabIndex', ConfRightTabBarTabIndex); + if TabList.Count > 0 then + for i := 0 to TabList.Count - 1 do begin + IniFile.WriteString(Section, Format('Tab%d', [i]), TabList[i]); + IniFile.WriteInteger(Section, Format('Tab%d_SortID', [i]), Integer(TabSortIDs[i])); + IniFile.WriteInteger(Section, Format('Tab%d_SortType', [i]), Integer(TabSortTypes[i])); + end; + except + on E: Exception do DebugMsg(['*** Error: Cannot save panel tabs settings (', E.ClassName, '): ', E.Message]); + end; + finally + IniFile.Free; + end; + except end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ReadConnections; +var s: string; + IniFile: TMyIniFile; + Sections: TStringList; + i: integer; + Item: TConnMgrItem; +begin + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot read connection manager settings']); + Exit; + end; + + try + if not Assigned(ConnectionMgrList) then ConnectionMgrList := TList.Create else + if ConnectionMgrList.Count > 0 then for i := 0 to ConnectionMgrList.Count - 1 do TConnMgrItem(ConnectionMgrList[i]).Free; + except end; + ConnectionMgrList.Clear; + + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(s) + 'connmgr', True); + try + Sections := TStringList.Create; + IniFile.ReadSections(Sections); + if Sections.Count > 0 then + for i := 0 to Sections.Count - 1 do +{ if Sections[i] = 'General' then begin + ConfMounterUseFSTab := IniFile.ReadBool('General', 'MounterUseFSTab', ConfMounterUseFSTab); + ConfMounterPushDown := IniFile.ReadBool('General', 'MounterPushDown', ConfMounterPushDown); + end else} begin + Item := TConnMgrItem.Create; + with Item do begin + ConnectionName := Sections[i]; + ServiceType := IniFile.ReadString(Sections[i], 'ServiceType', ''); + Server := IniFile.ReadString(Sections[i], 'Server', ''); + Username := IniFile.ReadString(Sections[i], 'Username', ''); + Password := IniFile.ReadString(Sections[i], 'Password', ''); + TargetDir := IniFile.ReadString(Sections[i], 'TargetDir', ''); + PluginID := IniFile.ReadString(Sections[i], 'PluginID', ''); + URI := ConstructURI(False, ServiceType, Server, Username, Password, TargetDir); + end; + ConnectionMgrList.Add(Item); + end; + Sections.Free; + finally + try IniFile.Free; except end; + InternalConnMgrConfmtime := GetFileTime(IncludeTrailingPathDelimiter(s) + 'connmgr'); + end; + except end; +end; + +procedure WriteConnections; +var i: integer; + IniFile: TMyIniFile; + s, SectionTitle: string; +begin + if InternalQuickExit then Exit; + try + s := IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir; + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + DebugMsg(['*** Error: Cannot save connection manager settings']); + Exit; + end; + s := IncludeTrailingPathDelimiter(s) + 'connmgr'; + if Libc.access(PChar(s), R_OK) = 0 then Libc.remove(PChar(s)); + + IniFile := TMyIniFile.Create(s, False); + try try +// IniFile.WriteBool('General', 'MounterUseFSTab', ConfMounterUseFSTab); + if ConnectionMgrList.Count > 0 then + for i := 0 to ConnectionMgrList.Count - 1 do + with TConnMgrItem(ConnectionMgrList[i]) do begin + SectionTitle := ConnectionName; + IniFile.EraseSection(SectionTitle); + IniFile.WriteString(SectionTitle, 'ServiceType', ServiceType); + IniFile.WriteString(SectionTitle, 'Server', Server); + IniFile.WriteString(SectionTitle, 'Username', Username); + IniFile.WriteString(SectionTitle, 'Password', Password); + IniFile.WriteString(SectionTitle, 'TargetDir', TargetDir); + IniFile.WriteString(SectionTitle, 'PluginID', PluginID); + end; + except + on E: Exception do DebugMsg(['*** Error: Cannot save connection manager settings (', E.ClassName, '): ', E.Message]); + end; + finally + IniFile.Free; + InternalConnMgrConfmtime := GetFileTime(s); + end; + except end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure SearchForDefaultApps; +var i: integer; + PATH: string; +begin + PATH := GetEnvironmentVariable('PATH'); + if ConfViewer = ConfAppNA then + for i := 1 to Length(ConfViewersApps) do + if FileSearch(ConfViewersApps[i], PATH) <> '' then begin + ConfViewer := ConfViewersApps[i]; + Break; + end; + if ConfEditor = ConfAppNA then + for i := 1 to Length(ConfEditorApps) do + if FileSearch(ConfEditorApps[i], PATH) <> '' then begin + ConfEditor := ConfEditorApps[i]; + Break; + end; + if ConfTerminalCommand = ConfAppNA then + for i := Length(ConfTerminalAppsWParam) downto 1 do + if FileSearch(ConfTerminalAppsWParam[i], PATH) <> '' then begin + ConfTerminalCommand := ConfTerminalApps[i]; + Break; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function GetFileTime(FileName: string): Longint; +var StatBuf : TStatBuf64; +begin + Result := -1; + if __lxstat64(_STAT_VER, PChar(FileName), StatBuf) <> 0 then Exit; + Result := StatBuf.st_mtime; +end; + +function CheckConfFilesMod(var ChangedMainGUI, ChangedAssoc, ChangedBookmarks, ChangedMounter, ChangedConnections: boolean): boolean; +var s: string; +begin + s := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(GetHomePath) + ConfDefaultSettingsDir); + ChangedMainGUI := (GetFileTime(s + 'gui') > 0) and (GetFileTime(s + 'gui') > InternalMainGUIConfmtime); + ChangedAssoc := (GetFileTime(s + 'filetypes') > 0) and (GetFileTime(s + 'filetypes') > InternalFAssocConfmtime); + ChangedBookmarks := (GetFileTime(s + 'bookmarks') > 0) and (GetFileTime(s + 'bookmarks') > InternalBookmarksConfmtime); + ChangedMounter := (GetFileTime(s + 'mounter') > 0) and (GetFileTime(s + 'mounter') > InternalMounterConfmtime); + ChangedConnections := (GetFileTime(s + 'connmgr') > 0) and (GetFileTime(s + 'connmgr') > InternalConnMgrConfmtime); + Result := ChangedMainGUI or ChangedAssoc or ChangedBookmarks or ChangedMounter or ChangedConnections; + InternalMainGUIConfmtime := GetFileTime(s + 'gui'); + InternalFAssocConfmtime := GetFileTime(s + 'filetypes'); + InternalBookmarksConfmtime := GetFileTime(s + 'bookmarks'); + InternalMounterConfmtime := GetFileTime(s + 'mounter'); + InternalConnMgrConfmtime := GetFileTime(s + 'connmgr'); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure SetMiscLocaleStrings; +begin + ConfColumnTitlesLong[1] := LANGColumns_TitlesLongName; + ConfColumnTitlesLong[2] := LANGColumns_TitlesLongNameExt; + ConfColumnTitlesLong[3] := LANGColumns_TitlesLongExt; + ConfColumnTitlesLong[4] := LANGColumns_TitlesLongSize; + ConfColumnTitlesLong[5] := LANGColumns_TitlesLongDateTime; + ConfColumnTitlesLong[6] := LANGColumns_TitlesLongDate; + ConfColumnTitlesLong[7] := LANGColumns_TitlesLongTime; + ConfColumnTitlesLong[8] := LANGColumns_TitlesLongUser; + ConfColumnTitlesLong[9] := LANGColumns_TitlesLongGroup; + ConfColumnTitlesLong[10] := LANGColumns_TitlesLongAttr; + ConfColumnTitlesShort[1] := LANGColumns_TitlesShortName; + ConfColumnTitlesShort[2] := LANGColumns_TitlesShortNameExt; + ConfColumnTitlesShort[3] := LANGColumns_TitlesShortExt; + ConfColumnTitlesShort[4] := LANGColumns_TitlesShortSize; + ConfColumnTitlesShort[5] := LANGColumns_TitlesShortDateTime; + ConfColumnTitlesShort[6] := LANGColumns_TitlesShortDate; + ConfColumnTitlesShort[7] := LANGColumns_TitlesShortTime; + ConfColumnTitlesShort[8] := LANGColumns_TitlesShortUser; + ConfColumnTitlesShort[9] := LANGColumns_TitlesShortGroup; + ConfColumnTitlesShort[10] := LANGColumns_TitlesShortAttr; +end; + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ParseCMDLine; +var i: integer; + s: string; +begin + if ParamCount > 0 then + for i := 1 to ParamCount do begin + s := AnsiUpperCase(ParamStr(i)); + if s = '--DEBUG' then ParamDebug := True else + if s = '--DISABLE-GNOME' then ParamDisableGnome := True else + if s = '--DELETE-HISTORY' then InternalDeleteHistory := True else + if s = '--ENABLE-URI' then ConfUseURI := True else + if s = '--DISABLE-PLUGINS' then ParamDisablePlugins := True else + if Pos('--PROFILE=', s) = 1 then begin + ConfProfileName := 'Profile_' + Trim(Copy(ParamStr(i), 11, Length(s) - 10)); + if ConfProfileName = '' then ConfProfileName := 'Default'; + end else + if Pos('--LEFT=', s) = 1 then ParamLeftDir := Copy(ParamStr(i), 8, Length(s) - 7) else + if Pos('--RIGHT=', s) = 1 then ParamRightDir := Copy(ParamStr(i), 9, Length(s) - 8) else + if Pos('--LANG=', s) = 1 then ConfParamForceLang := Copy(ParamStr(i), 8, Length(s) - 7) else + if (s = '--HELP') or (s = '-H') then begin + WriteLn('Tux Commander v', ConstAboutVersion, ' [built ', ConstAboutBuildDate, ']'); + WriteLn('Copyright (c) 2008 Tomas Bzatek'); + WriteLn('Website: tuxcmd.sourceforge.net'); + WriteLn; + WriteLn('Usage: tuxcmd [options...]'); + WriteLn; + WriteLn('Options:'); + WriteLn(' --debug Enable debug messages'); + WriteLn(' --profile= Use different configuration profile'); + WriteLn(' --delete-history Delete command-line, selection and search history'); + WriteLn(' (use in case of locale problems)'); + WriteLn(' --disable-gnome Don''t load GNOME libraries'); + WriteLn(' --disable-plugins Don''t load VFS modules'); + WriteLn(' --left= Start left panel at '); + WriteLn(' --right= Start right panel at '); + WriteLn(' --lang= Force GUI language (the string is'); + WriteLn(' standard two-char language id'); + InternalQuickExit := True; + Halt(1); + end else WriteLn('tuxcmd: Unknown commandline option: ', ParamStr(i)); + end; +end; + + + +initialization + SetDefaults; + ParseCMDLine; + {$IFDEF __FPC__} + DebugMsg(['Tux Commander v', ConstAboutVersion, ' [', ConstAboutBuildDate, '] FreePascal build ', + '(version ', ConstFPCVersionString, ' ', ConstFPCDateString, ', define ', {$IFDEF CPU64}'x86_64'{$ELSE}'i386'{$ENDIF}, + ', compiled on ', ConstFPCCompilerOSString, '/', ConstFPCCompilerHostProcessorString, + ' for ', ConstFPCTargetOSString, '/', ConstFPCTargetProcessorString, ')']); + {$ELSE} + DebugMsg(['Tux Commander v', ConstAboutVersion, ' [', ConstAboutBuildDate, '] Kylix build']); + {$ENDIF} + // Load GNOME libs + if not ParamDisableGnome then LoadGnomeLibs; + // Create basic objects + CommandLineHistory := TStringList.Create; + CommandLineHistory.CaseSensitive := True; + Bookmarks := TStringList.Create; + Bookmarks.CaseSensitive := True; + // Initialize the modules + DoInitPlugins; + // Initialize locales + SetTranslationTexts(ConfParamForceLang); + SetMiscLocaleStrings; + // Load the settings + ReadMainSettings; + ReadMainGUISettings; + ReadAssoc; + ReadBookmarks; + ReadMounter; + ReadConnections; + + // Apply the settings + LoadIcons; + RecreateIcons(AssocList); +finalization + // Save the settings + WriteBookmarks; + WriteConnections; + WriteMainSettings; + if ConfSavePanelTabs then begin + WriteTabs(True, LeftPanelTabs, LeftTabSortIDs, LeftTabSortTypes); + WriteTabs(False, RightPanelTabs, RightTabSortIDs, RightTabSortTypes); + end; + // Destroy the objects + LeftLocalEngine.Free; + RightLocalEngine.Free; + CommandLineHistory.Free; + Bookmarks.Free; +end. diff --git a/UConnectionManager.pas b/UConnectionManager.pas new file mode 100644 index 0000000..1c1a057 --- /dev/null +++ b/UConnectionManager.pas @@ -0,0 +1,293 @@ +(* + Tux Commander - UConnectionManager - Connection manager dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UConnectionManager; + +interface + +uses + glib2, gdk2, gtk2, pango, SysUtils, Types, Classes, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, + UCoreClasses; + +type + TFConnectionManager = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + ListView: TGTKListView; + ListViewScrolledWindow: TGTKScrolledWindow; + ListViewTable: TGTKTable; + AddConnectionButton, EditButton, RemoveButton: TGTKImageButton; + procedure FormCreate(Sender: TObject); override; + procedure ListViewSelectionChanged(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure AddConnectionButtonClick(Sender: TObject); + procedure EditButtonClick(Sender: TObject); + procedure RemoveButtonClick(Sender: TObject); + procedure ListViewDblClick(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + private + procedure FillList; + end; + +var + FConnectionManager: TFConnectionManager; + +implementation + +uses ULocale, UCoreUtils, UConfig, UCore, UConnectionProperties, UVFSCore; + +const Connect_Button_ID = integer(mbOK); + + +procedure TFConnectionManager.FormCreate(Sender: TObject); +var Column: TGTKTreeViewColumn; +begin + SetDefaultSize(550, 450); + Caption := LANGConnMgr_Caption; + AddButton(LANGConnMgr_ConnectButton, Connect_Button_ID); + Buttons := [mbClose]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [LANGConnMgr_OpenConnection]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-connect', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + ListViewTable := TGTKTable.Create(Self); + ListViewTable.BorderWidth := 7; + ClientArea.AddControlEx(ListViewTable, True, True, 0); + + ListView := TGTKListView.CreateTyped(Self, False, [lcPointer, lcText, lcText]); + + ListView.RulesHint := True; + ListView.ShowHeaders := True; + Column := ListView.Columns.Add; + Column.AddAttribute('text', 1); + Column.Resizable := True; + Column.FixedWidth := 200; + Column.SizingMode := smFixed; + Column.Caption := LANGConnMgr_NameColumn; + Column.Clickable := True; + Column.SortID := 1; + Column := ListView.Columns.Add; + Column.AddAttribute('text', 2); + Column.Resizable := True; + Column.SizingMode := smFixed; + Column.Caption := LANGConnMgr_URIColumn; + Column.Clickable := True; + Column.SortID := 2; + ListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ListViewScrolledWindow.AddControl(ListView); + ListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.ShadowType := stShadowIn; + + AddConnectionButton := TGTKImageButton.Create(Self); + AddConnectionButton.SetFromStock('gtk-add', isSmallToolbar); + AddConnectionButton.Caption := LANGConnMgr_AddConnectionButtonCaption; + AddConnectionButton.UseUnderline := True; + AddConnectionButton.Tooltip := LANGConnMgr_AddConnectionButtonTooltip; + EditButton := TGTKImageButton.Create(Self); + EditButton.Caption := LANGConnMgr_EditButtonCaption; + EditButton.UseUnderline := True; + EditButton.Tooltip := LANGConnMgr_EditButtonTooltip; + RemoveButton := TGTKImageButton.Create(Self); + RemoveButton.SetFromStock('gtk-remove', isSmallToolbar); + RemoveButton.Caption := LANGConnMgr_RemoveButtonCaption; + RemoveButton.UseUnderline := True; + RemoveButton.Tooltip := LANGConnMgr_RemoveButtonTooltip; + + ListViewTable.AddControlEx(0, 1, 3, 5, ListViewScrolledWindow, [taoExpand, taoFill], [taoExpand, taoFill], 0, 5); + ListViewTable.AddControlEx(3, 2, 1, 1, AddConnectionButton, [taoShrink, taoFill], [taoShrink], 5, 5); + ListViewTable.AddControlEx(3, 3, 1, 1, EditButton, [taoShrink, taoFill], [taoShrink], 5, 5); + ListViewTable.AddControlEx(3, 4, 1, 1, RemoveButton, [taoShrink, taoFill], [taoShrink], 5, 5); +// ListViewTable.AddControlEx(3, 1, 1, 1, TGTKLabel.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 0, 2); + ListViewTable.AddControlEx(3, 5, 1, 1, TGTKLabel.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 0, 2); + + + FillList; + ListView.OnSelectionChanged := ListViewSelectionChanged; + ListView.OnDblClick := ListViewDblClick; + ListView.SetFocus; + if ListView.Items.Count > 0 then ListView.Items[0].SetCursor(0, False, False, 0, 0); + ListViewSelectionChanged(Self); + AddConnectionButton.OnClick := AddConnectionButtonClick; + EditButton.OnClick := EditButtonClick; + RemoveButton.OnClick := RemoveButtonClick; + OnKeyDown := FormKeyDown; +end; + +procedure TFConnectionManager.ListViewSelectionChanged(Sender: TObject); +begin + try + EditButton.Enabled := Assigned(ListView.Selected); + RemoveButton.Enabled := Assigned(ListView.Selected); + SetResponseSensitive(Connect_Button_ID, Assigned(ListView.Selected)); + except end; +end; + +procedure TFConnectionManager.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: if Assigned(ListView.Selected) then ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFConnectionManager.ListViewDblClick(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +begin + if Assigned(ListView.Selected) then ModalResult := mbOK; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFConnectionManager.AddConnectionButtonClick(Sender: TObject); +var Item: TGTKListItem; + ConnMgrItem: TConnMgrItem; +begin + try + FConnectionProperties := TFConnectionProperties.Create(Self); + if FConnectionProperties.Run = mbOK then begin + ConnMgrItem := TConnMgrItem.Create; + with FConnectionProperties do begin + ConnMgrItem.ConnectionName := NameEntry.Text; + ConnMgrItem.URI := MakeURI(False); + ConnMgrItem.ServiceType := Copy(ConnMgrItem.URI, 1, Pos('://', ConnMgrItem.URI) - 1); + ConnMgrItem.Server := ServerEntry.Text; + ConnMgrItem.Username := UserNameEntry.Text; + ConnMgrItem.Password := PasswordEntry.Text; + ConnMgrItem.TargetDir := TargetDirEntry.Text; + ConnMgrItem.PluginID := ''; + if PluginOptionMenu.ItemIndex <> 0 then ConnMgrItem.PluginID := TVFSPlugin(PluginList[PluginOptionMenu.ItemIndex - 1]).VFSName; + end; + ConnectionMgrList.Add(ConnMgrItem); + Item := ListView.Items.Add; + Item.SetValue(0, ConnMgrItem); + Item.SetValue(1, ConnMgrItem.ConnectionName); + Item.SetValue(2, FConnectionProperties.MakeURI(True)); + end; + finally + FConnectionProperties.Free; + end; +end; + +procedure TFConnectionManager.EditButtonClick(Sender: TObject); +var Item: TGTKListItem; + ConnMgrItem: TConnMgrItem; + i: integer; +begin + try + Item := ListView.Selected; + if Item = nil then Exit; + ConnMgrItem := Item.AsPointer(0); + if ConnMgrItem = nil then Exit; + FConnectionProperties := TFConnectionProperties.Create(Self); + FConnectionProperties.NameEntry.Text := ConnMgrItem.ConnectionName; + FConnectionProperties.URIEntry.Text := ConnMgrItem.URI; + FConnectionProperties.ServiceTypeOptionMenuChanged(Sender); + // Find the plugin by PluginID + for i := 0 to PluginList.Count - 1 do + if TVFSPlugin(PluginList[i]).VFSName = ConnMgrItem.PluginID then begin + FConnectionProperties.PluginOptionMenu.ItemIndex := i + 1; + Break; + end; + + if FConnectionProperties.Run = mbOK then begin + with FConnectionProperties do begin + ConnMgrItem.ConnectionName := NameEntry.Text; + ConnMgrItem.URI := MakeURI(False); + ConnMgrItem.ServiceType := Copy(ConnMgrItem.URI, 1, Pos('://', ConnMgrItem.URI) - 1); + ConnMgrItem.Server := ServerEntry.Text; + ConnMgrItem.Username := UserNameEntry.Text; + ConnMgrItem.Password := PasswordEntry.Text; + ConnMgrItem.TargetDir := TargetDirEntry.Text; + ConnMgrItem.PluginID := ''; + if PluginOptionMenu.ItemIndex <> 0 then ConnMgrItem.PluginID := TVFSPlugin(PluginList[PluginOptionMenu.ItemIndex - 1]).VFSName; + end; + Item.SetValue(1, ConnMgrItem.ConnectionName); + Item.SetValue(2, FConnectionProperties.MakeURI(True)); + end; + finally + FConnectionProperties.Free; + end; +end; + +procedure TFConnectionManager.RemoveButtonClick(Sender: TObject); +var Item: TGTKListItem; + ConnMgrItem: TConnMgrItem; + i: integer; +begin + Item := ListView.Selected; + if Item = nil then Exit; + ConnMgrItem := Item.AsPointer(0); + if ConnMgrItem = nil then Exit; + if Application.MessageBox(Format(LANGConnMgr_DoYouWantDelete, [Item.AsString(1)]), + [mbYes, mbNo], mbQuestion, mbYes, mbNo) = mbYes then + begin + if ConnectionMgrList.Count > 0 then + for i := 0 to ConnectionMgrList.Count - 1 do + if ConnectionMgrList[i] = ConnMgrItem then begin + ConnectionMgrList.Delete(i); + Break; + end; + ConnMgrItem.Free; + ListView.Items.Delete(Item.Index); + end; +end; + +procedure TFConnectionManager.FillList; +var i: integer; + Item: TGTKListItem; + ConnMgrItem: TConnMgrItem; +begin + if ConnectionMgrList.Count > 0 then + for i := 0 to ConnectionMgrList.Count - 1 do begin + ConnMgrItem := ConnectionMgrList[i]; + Item := ListView.Items.Add; + Item.SetValue(0, ConnMgrItem); + Item.SetValue(1, ConnMgrItem.ConnectionName); + Item.SetValue(2, ConstructURI(True, ConnMgrItem.ServiceType, ConnMgrItem.Server, ConnMgrItem.Username, + ConnMgrItem.Password, ConnMgrItem.TargetDir)); + end; + +end; + + + + +end. + diff --git a/UConnectionProperties.pas b/UConnectionProperties.pas new file mode 100644 index 0000000..0731eab --- /dev/null +++ b/UConnectionProperties.pas @@ -0,0 +1,334 @@ +(* + Tux Commander - UConnectionProperties - Connection properties dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UConnectionProperties; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKMenus; + +type + TFConnectionProperties = class(TGTKDialog) + Label1, Label2, Label3, Label4, Label5, Label6, Label7, Label8, Label9: TGTKLabel; + Box: TGTKVBox; + Table1, Table2: TGTKTable; + PluginOptionMenu, ServiceTypeOptionMenu: TGTKOptionMenu; + URIEntry, NameEntry, ServerEntry, UserNameEntry, PasswordEntry, TargetDirEntry: TGTKEntry; + MaskPasswordCheckButton: TGTKCheckButton; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure NameEntryChanged(Sender: TObject); + procedure URIEntryChanged(Sender: TObject); + procedure ServiceTypeOptionMenuChanged(Sender: TObject); + procedure MaskPasswordCheckButtonToggled(Sender: TObject); + private + CurrentURI: string; + Lock: boolean; + function ValidSettings: boolean; + public + function MakeURI(Hidden: boolean): string; + end; + +var + FConnectionProperties: TFConnectionProperties; + + + +implementation + +uses ULocale, UVFSCore, UCoreUtils; + +const ServiceTypeTable_Count = 6; +var ServiceTypeTable: array[1..ServiceTypeTable_Count, 0..1] of string; + + + +procedure TFConnectionProperties.FormCreate(Sender: TObject); +var i: integer; + MenuItem: TGTKMenuItem; +begin + // Set the constants + ServiceTypeTable[1, 0] := LANGConnProp_FTP; ServiceTypeTable[1, 1] := 'ftp'; + ServiceTypeTable[2, 0] := LANGConnProp_SFTP; ServiceTypeTable[2, 1] := 'sftp'; + ServiceTypeTable[3, 0] := LANGConnProp_SMB; ServiceTypeTable[3, 1] := 'smb'; + ServiceTypeTable[4, 0] := LANGConnProp_HTTP; ServiceTypeTable[4, 1] := 'http'; + ServiceTypeTable[5, 0] := LANGConnProp_HTTPS; ServiceTypeTable[5, 1] := 'https'; + ServiceTypeTable[6, 0] := LANGConnProp_Other; ServiceTypeTable[6, 1] := 'unknown'; + + // Initialization + SetDefaultSize(350, -1); + Caption := LANGConnProp_Caption; + Buttons := [mbOK, mbCancel]; + Box := TGTKVBox.Create(Self); + Box.BorderWidth := 8; + ClientArea.AddControlEx(Box, True, True, 0); + Label1 := TGTKLabel.Create(Self); + Label1.XAlign := 0; + Label1.XPadding := 0; + Label1.Caption := LANGConnProp_VFSModule; + PluginOptionMenu := TGTKOptionMenu.Create(Self); + Label1.FocusControl := PluginOptionMenu; + Label1.UseMarkup := True; + Label1.UseUnderline := True; + Label2 := TGTKLabel.Create(Self); + Label2.XAlign := 0; + Label2.XPadding := 0; + Label2.Caption := Format('%s', [LANGConnProp_URI]); + URIEntry := TGTKEntry.Create(Self); + URIEntry.Tooltip := LANGConnProp_URIEntryTooltip; + Label2.FocusControl := URIEntry; + Label2.UseMarkup := True; + Label2.UseUnderline := True; + Label3 := TGTKLabel.Create(Self); + Label3.XAlign := 0; + Label3.XPadding := 0; + Label3.Caption := Format('%s', [LANGConnProp_DetailedInformations]); + Label3.UseMarkup := True; + Label4 := TGTKLabel.Create(Self); + Label4.XAlign := 0; + Label4.XPadding := 0; + Label4.Caption := Format('%s', [LANGConnProp_Name]); + NameEntry := TGTKEntry.Create(Self); + Label4.FocusControl := NameEntry; + Label4.UseMarkup := True; + Label4.UseUnderline := True; + + + Label5 := TGTKLabel.Create(Self); + Label5.XAlign := 0; + Label5.XPadding := 0; + Label5.Caption := LANGConnProp_Server; + ServerEntry := TGTKEntry.Create(Self); + Label5.FocusControl := ServerEntry; + Label5.UseMarkup := True; + Label5.UseUnderline := True; + Label6 := TGTKLabel.Create(Self); + Label6.XAlign := 0; + Label6.XPadding := 0; + Label6.Caption := LANGConnProp_Username; + UserNameEntry := TGTKEntry.Create(Self); + UserNameEntry.Tooltip := LANGConnProp_UserNameEntryTooltip; + Label6.FocusControl := UserNameEntry; + Label6.UseMarkup := True; + Label6.UseUnderline := True; + Label7 := TGTKLabel.Create(Self); + Label7.XAlign := 0; + Label7.XPadding := 0; + Label7.Caption := LANGConnProp_Password; + PasswordEntry := TGTKEntry.Create(Self); + PasswordEntry.Visibility := False; + Label7.FocusControl := PasswordEntry; + Label7.UseMarkup := True; + Label7.UseUnderline := True; + Label8 := TGTKLabel.Create(Self); + Label8.XAlign := 0; + Label8.XPadding := 0; + Label8.Caption := LANGConnProp_TargetDirectory; + TargetDirEntry := TGTKEntry.Create(Self); + Label8.FocusControl := TargetDirEntry; + Label8.UseMarkup := True; + Label8.UseUnderline := True; + Label9 := TGTKLabel.Create(Self); + Label9.XAlign := 0; + Label9.XPadding := 0; + Label9.Caption := LANGConnProp_ServiceType; + ServiceTypeOptionMenu := TGTKOptionMenu.Create(Self); + Label9.FocusControl := PluginOptionMenu; + Label9.UseMarkup := True; + Label9.UseUnderline := True; + MaskPasswordCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGConnProp_MaskPassword); + MaskPasswordCheckButton.Checked := True; + + Table1 := TGTKTable.Create(Self); + Box.AddControlEx(Table1, True, True, 5); + Table1.AddControlEx(0, 0, 1, 1, Label4, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table1.AddControlEx(1, 0, 1, 1, NameEntry, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table1.AddControlEx(0, 1, 1, 1, Label2, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table1.AddControlEx(1, 1, 1, 1, URIEntry, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table1.AddControlEx(0, 2, 1, 1, Label1, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table1.AddControlEx(1, 2, 1, 1, PluginOptionMenu, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table1.AddControlEx(0, 3, 2, 1, TGTKVBox.Create(Self), [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 10); + Table1.AddControlEx(0, 4, 2, 1, Label3, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + + + Table2 := TGTKTable.Create(Self); + Box.AddControlEx(Table2, True, True, 5); + Table2.AddControlEx(0, 0, 1, 1, TGTKHBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table2.AddControlEx(1, 0, 1, 1, Label9, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 0, 1, 1, ServiceTypeOptionMenu, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(1, 1, 1, 1, Label5, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 1, 1, 1, ServerEntry, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(1, 2, 1, 1, Label6, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 2, 1, 1, UserNameEntry, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(1, 3, 1, 1, Label7, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 3, 1, 1, PasswordEntry, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 4, 1, 1, MaskPasswordCheckButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + Table2.AddControlEx(1, 5, 1, 1, Label8, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 5, 1, 1, TargetDirEntry, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + + + // Fill the plugins menu + MenuItem := TGTKMenuItem.CreateTyped(Self, itLabel); + MenuItem.Caption := LANGConnProp_MenuItemCaption; + PluginOptionMenu.Items.Add(MenuItem); + for i := 0 to PluginList.Count - 1 do begin + MenuItem := TGTKMenuItem.CreateTyped(Self, itImageText); + MenuItem.SetCaptionPlain(Format('%s [%s]', [TVFSPlugin(PluginList[i]).VFSName, + ANSIToUTF8(ExtractFileName(TVFSPlugin(PluginList[i]).FullPath))])); + PluginOptionMenu.Items.Add(MenuItem); + end; + + // Fill the protocol menu + for i := 1 to ServiceTypeTable_Count do begin + MenuItem := TGTKMenuItem.CreateTyped(Self, itImageText); + MenuItem.Caption := ServiceTypeTable[i, 0]; + ServiceTypeOptionMenu.Items.Add(MenuItem); + end; + + + Lock := True; + OnKeyDown := FormKeyDown; + NameEntry.OnChanged := NameEntryChanged; + URIEntry.OnChanged := URIEntryChanged; + ServiceTypeOptionMenu.OnChanged := ServiceTypeOptionMenuChanged; + ServerEntry.OnChanged := ServiceTypeOptionMenuChanged; + UserNameEntry.OnChanged := ServiceTypeOptionMenuChanged; + PasswordEntry.OnChanged := ServiceTypeOptionMenuChanged; + TargetDirEntry.OnChanged := ServiceTypeOptionMenuChanged; + MaskPasswordCheckButton.OnToggled := MaskPasswordCheckButtonToggled; + + + NameEntry.SetFocus; + NameEntryChanged(Self); + Lock := False; +end; + +procedure TFConnectionProperties.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: if ValidSettings then ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFConnectionProperties.MaskPasswordCheckButtonToggled(Sender: TObject); +begin + PasswordEntry.Visibility := not MaskPasswordCheckButton.Checked; + ServiceTypeOptionMenuChanged(Self); +end; + +(********************************************************************************************************************************) +function TFConnectionProperties.ValidSettings: boolean; +begin + Result := (Length(Trim(NameEntry.Text)) > 0) and (Length(Trim(URIEntry.Text)) > 0); + if Result then Result := (Pos('://', URIEntry.Text) > 1) and (Pos('://', URIEntry.Text) < Length(URIEntry.Text) - 2) and + (Pos(ServiceTypeTable[ServiceTypeTable_Count, 1] + '://', URIEntry.Text) <= 0); +end; + +procedure TFConnectionProperties.NameEntryChanged(Sender: TObject); +begin + SetResponseSensitive(integer(mbOK), ValidSettings); +end; + +procedure TFConnectionProperties.URIEntryChanged(Sender: TObject); +var i, j: integer; + s, s2: string; +begin + NameEntryChanged(Sender); + s2 := URIEntry.Text; + Lock := True; + + // Find the service type + if Pos('://', s2) > 1 then begin + s := Trim(Copy(s2, 1, Pos('://', s2) - 1)); + j := ServiceTypeTable_Count; + for i := 1 to ServiceTypeTable_Count - 1 do + if AnsiCompareText(s, ServiceTypeTable[i, 1]) = 0 then begin + j := i; + Break; + end; + ServiceTypeOptionMenu.ItemIndex := j - 1; + Delete(s2, 1, Pos('://', s2) + 2); + end; + + // Get the target directory + if Pos('/', s2) > 0 then begin + s := Copy(s2, Pos('/', s2), Length(s2) - Pos('/', s2) + 1); + if (s = '') or (s = '/') then TargetDirEntry.Text := '' + else TargetDirEntry.Text := s; + Delete(s2, Pos('/', s2), Length(s2) - Pos('/', s2) + 1); + end else TargetDirEntry.Text := ''; + + // Get the server string + if Pos('@', s2) > 0 then begin + s := Copy(s2, Pos('@', s2) + 1, Length(s2) - Pos('@', s2)); + if s <> '' then ServerEntry.Text := s; + Delete(s2, Pos('@', s2), Length(s2) - Pos('@', s2) + 1); + + // Get the user/pass + if Pos(':', s2) > 0 then begin + s := Copy(s2, Pos(':', s2) + 1, Length(s2) - Pos(':', s2)); + if s = '' then PasswordEntry.Text := '' else + if Pos('*', s) <= 0 then PasswordEntry.Text := s; + Delete(s2, Pos(':', s2), Length(s2) - Pos(':', s2) + 1); + end else PasswordEntry.Text := ''; + UserNameEntry.Text := s2; + end else ServerEntry.Text := s2; + + CurrentURI := MakeURI(False); + Lock := False; +end; + +function TFConnectionProperties.MakeURI(Hidden: boolean): string; +var Prefix: string; +begin + Prefix := ServiceTypeTable[ServiceTypeTable_Count, 1]; + if ServiceTypeOptionMenu.ItemIndex < ServiceTypeTable_Count - 1 + then Prefix := ServiceTypeTable[ServiceTypeOptionMenu.ItemIndex + 1, 1] else + if Pos('://', URIEntry.Text) > 1 then Prefix := Copy(URIEntry.Text, 1, Pos('://', URIEntry.Text) - 1); + Result := Prefix + '://'; + if Length(UserNameEntry.Text) > 0 then begin + Result := Result + UserNameEntry.Text; + if Length(PasswordEntry.Text) > 0 then + if Hidden then Result := Result + ':' + StringOfChar('*', Length(PasswordEntry.Text)) + else Result := Result + ':' + PasswordEntry.Text; + Result := Result + '@'; + end; + Result := Result + ServerEntry.Text; + if Length(TargetDirEntry.Text) > 0 then begin + if TargetDirEntry.Text[1] <> '/' then Result := Result + '/'; + Result := Result + TargetDirEntry.Text; + end; +end; + +procedure TFConnectionProperties.ServiceTypeOptionMenuChanged(Sender: TObject); +begin + if Lock then Exit; + CurrentURI := MakeURI(False); + URIEntry.OnChanged := nil; + URIEntry.Text := MakeURI(MaskPasswordCheckButton.Checked); + URIEntry.OnChanged := URIEntryChanged; + NameEntryChanged(Sender); +end; + + + +end. + diff --git a/UCopyMove.pas b/UCopyMove.pas new file mode 100644 index 0000000..8426706 --- /dev/null +++ b/UCopyMove.pas @@ -0,0 +1,78 @@ +(* + Tux Commander - UCopyMove - Copy and Rename/Move dialog and related funcions + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UCopyMove; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFCopyMove = class(TGTKDialog) + Label1: TGTKLabel; + Entry: TGTKEntry; + Box: TGTKVBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + { Private declarations } + public + { Public declarations } + end; + +var + FCopyMove: TFCopyMove; + +implementation + +uses ULocale; + + +procedure TFCopyMove.FormCreate(Sender: TObject); +begin + SetDefaultSize(380, -1); + Caption := LANGCopyFilesSC; + Buttons := [mbOK, mbCancel]; + Box := TGTKVBox.Create(Self); + Label1 := TGTKLabel.Create(Self); + Label1.Caption := 'Copy 1 file(s) to:'; + Label1.XAlign := 0; + Label1.XPadding := 0; + Label1.SetSizeRequest(-1, 20); + Entry := TGTKEntry.Create(Self); + Box.AddControlEx(Label1, False, False, 0); + Box.AddControlEx(Entry, False, False, 0); + Box.BorderWidth := 8; + ClientArea.AddControlEx(Box, True, True, 0); + OnKeyDown := FormKeyDown; + Entry.SetFocus; +end; + +procedure TFCopyMove.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + + +end. + diff --git a/UCore.pas b/UCore.pas new file mode 100644 index 0000000..694d249 --- /dev/null +++ b/UCore.pas @@ -0,0 +1,2785 @@ +(* + Tux Commander - UCore - Some engine-related core functions + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UCore; +interface + +uses glib2, SyncObjs, Classes, GTKForms, GTKView, Libc, UGlibC_compat, UEngines, UCoreUtils, UProgress, UVFSCore; + + +function FillPanel(List: TList; ListView: TGTKListView; Engine: TPanelEngine; LeftPanel: boolean): boolean; +function ChangeDir(Engine: TPanelEngine; Path: string; var SelItem: string; const AutoFallBack: boolean): integer; +function MakeDirectory(ListView: TGTKListView; Engine: TPanelEngine; LeftPanel: boolean; NewDir: string): boolean; +procedure FindNextSelected(ListView: TGTKListView; DataList: TList; var Item1, Item2: string); +procedure UnselectAll(ListView: TGTKListView; DataList: TList); + +type TWorkerThread = class(TThread) + private + FCancelled: boolean; + GUIMutex: TCriticalSection; + protected + procedure Execute; override; + procedure CommitGUIUpdate; + public + // Data to updating + FProgress1Pos, FProgress2Pos, FProgress1Max, FProgress2Max: Int64; + FProgress1Text, FProgress2Text, FLabel1Text, FLabel2Text: string; + FGUIProgress1Pos, FGUIProgress2Pos, FGUIProgress1Max, FGUIProgress2Max: Int64; + FGUIProgress1Text, FGUIProgress2Text, FGUILabel1Text, FGUILabel2Text: string; + FGUIChanged: boolean; + + FCancelMessage: string; + FDoneThread, FShowCancelMessage, + FDialogShowDirDelete, FDialogShowOverwrite, FDialogShowNewDir, FDialogShowMsgBox, + FSigDialogDirDelete, FSigDialogOverwrite, FSigDialogNewDir, FSigDialogMsgBox: boolean; + FDialogResultDirDelete, FDialogResultOverwrite, FDialogResultNewDir: integer; + + FDirDeleteButtonsType: integer; + FDirDeleteLabel1Text, FDirDeleteLabel2Text, FDirDeleteLabel3Text, FDirDeleteCaption: string; + FDirDeleteLabel2Visible, FDirDeleteLabel3Visible: boolean; + + FOverwriteButtonsType: integer; + FOverwriteFromLabel, FOverwriteFromInfoLabel, FOverwriteToLabel, FOverwriteToInfoLabel, + FOverwriteRenameStr, FOverwriteSourceFile, FOverwriteDestFile: string; + + FNewDirCaption, FNewDirLabel, FNewDirEdit: string; + FMsgBoxText: string; + FMsgBoxButtons: TMessageButtons; + FMsgBoxStyle: TMessageStyle; + FMsgBoxDefault, FMsgBoxEscape, FDialogResultMsgBox: TMessageButton; + + + // Parameters + ProgressForm: TFProgress; + Engine, SrcEngine, DestEngine: TPanelEngine; + LeftPanel: boolean; + DataList: TList; + ParamBool1, ParamBool2, ParamBool3, ParamBool4, ParamBool5: boolean; + ParamString1, ParamString2, ParamString3: string; + ParamPointer1: Pointer; + ParamInt64: Int64; + ParamInt1, ParamInt2: integer; + ParamLongWord1: LongWord; + ParamCardinal1, ParamCardinal2: Cardinal; + ParamFloat1, ParamFloat2: Extended; + ParamDataItem1: PDataItem; + WorkerProcedure: procedure(SenderThread: TWorkerThread); + SelectedItem: PDataItem; + ExtractFromVFSMode, ExtractFromVFSAll: boolean; + ErrorHappened: boolean; + + constructor Create; + destructor Destroy; override; + procedure CancelIt; + function Cancelled: boolean; + + procedure UpdateProgress1(const Progress: Int64; const ProgressText: string); + procedure UpdateProgress2(const Progress: Int64; const ProgressText: string); + procedure SetProgress1Params(const ProgressMax: Int64); + procedure SetProgress2Params(const ProgressMax: Int64); + procedure UpdateCaption1(const CaptionText: string); + procedure UpdateCaption2(const CaptionText: string); + + function ShowDirDeleteDialog(ButtonsType: integer; const Label1Text: string; const Label2Text: string = ''; + const Label3Text: string = ''; const DirDeleteCaption: string = ''): integer; + function ShowOverwriteDialog(ButtonsType: integer; const FromLabel, FromInfoLabel, ToLabel, ToInfoLabel, RenameStr, + SourceFile, DestFile: string): integer; + function ShowNewDirDialog(Caption, LabelCaption, Edit: string): integer; + function ShowMessageBox(const Text: string; Buttons: TMessageButtons; Style: TMessageStyle; + Default, Escape: TMessageButton): TMessageButton; + end; + + TGetDirSizeThread = class(TThread) + private + FCancelled: boolean; + protected + procedure Execute; override; + public + Finished: boolean; + Engine: TPanelEngine; + Path: string; + Result: Int64; + constructor Create; + procedure CancelIt; + end; + + TOpenDirThread = class(TThread) + private + procedure Execute; override; + public + AEngine: TPanelEngine; + xEngine: TVFSEngine; + APath: string; + ASelItem: string; + AAutoFallBack: boolean; + ADirList: TList; + ChDirResult, ListingResult, VFSOpenResult: integer; + Finished, CancelIt: boolean; + RunningTime: Int64; + APlugin: TVFSPlugin; + AFullPath, AHighlightItem: string; + Password: string; + constructor Create; +{ destructor Destroy; override; } + end; + + +// Thread aware functions (also half-thread-safe) without any piece of GTK code +procedure DeleteFilesWorker(SenderThread: TWorkerThread); +procedure CopyFilesWorker(SenderThread: TWorkerThread); +procedure MergeFilesWorker(SenderThread: TWorkerThread); +procedure SplitFilesWorker(SenderThread: TWorkerThread); +procedure ChmodFilesWorker(SenderThread: TWorkerThread); +procedure ChownFilesWorker(SenderThread: TWorkerThread); +procedure DummyThreadWorker(SenderThread: TWorkerThread); + +// Classic functions - don't need progress window +function CreateSymlink(const FileName, PossibleNewName: string; Engine: TPanelEngine) : boolean; +function EditSymlink(const FileName: string; Engine: TPanelEngine) : boolean; +function HandleLogin(Parent: TComponent; Engine: TPanelEngine; UserName, Password: string): boolean; +procedure GetDirSize(AListView: TGTKListView; Engine: TPanelEngine; DataList: TList; AllItems: boolean); + + +type TMounterItem = class + public + DisplayText, MountPath, Device, IconPath, MountCommand, UmountCommand: string; + DeviceType: integer; + function Mounted: boolean; + function IsInFSTab: boolean; + function Mount: boolean; + function Umount: boolean; + function Eject: boolean; + end; + + TConnMgrItem = class + public + ConnectionName: string; + URI: string; // generated at runtime + ServiceType, Server, Username, Password, TargetDir: string; + PluginID: string; // leave blank for default + end; + +procedure FillDefaultFstabMounterItems; + +procedure ProcessProgressThread(SenderThread: TWorkerThread; ProgressForm: TFProgress); + +function CRCGetInfo(FileName: string; Engine: TPanelEngine; var TargetName: string; var TargetCRC: LongWord; var Size: Int64): boolean; + +function ComputeBlockSize(TotalSize: Int64): longint; + +function PurgeDirectory(APath: string): boolean; +procedure CleanTempDirs; + +procedure DebugWriteListSL(List: TList); +procedure DebugWriteList(List: TList); + +var LeftLocalEngine, RightLocalEngine: TPanelEngine; + LeftPanelData, RightPanelData, AssocList, MounterList, ConnectionMgrList: TList; + CommandLineHistory, Bookmarks: TStringList; + LeftPanelTabs, RightPanelTabs: TStringList; + LeftTabSortIDs, RightTabSortIDs: TList; + LeftTabSortTypes, RightTabSortTypes: TList; + FMainEscPressed: boolean; + UsedTempPaths: TStringList; + SelectHistory, SearchHistory: TStringList; + +(********************************************************************************************************************************) +implementation +(********************************************************************************************************************************) +uses SysUtils, DateUtils, StrUtils, UConfig, UDirDelete, UOverwrite, ULocale, + UNewDir, UFileAssoc, USymlink, UCoreClasses, ULogin, uVFSprototypes, + URemoteWait, UMain; + + + +(********************************************************************************************************************************) +procedure ClearListData(List: TList); +var i: integer; +begin + try + if not Assigned(List) then Exit; + if List.Count > 0 then + for i := 0 to List.Count - 1 do + FreeDataItem(PDataItem(List[i])); + List.Clear; + except + on E: Exception do DebugMsg(['*** Exception raised in UCore.ClearListData (', E.ClassName, '): ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +procedure AddUpDirItem(ListView: TGTKListView; DataList: TList); +var ListItem: TGTKListItem; + Data: PDataItem; + j: integer; + s: string; +begin + if ListView.Items.Count = 0 + then ListItem := ListView.Items.Add + else ListItem := ListView.Items[0]; + Data := Libc.malloc(SizeOf(TDataItem)); + Libc.memset(Data, 0, SizeOf(TDataItem)); + with Data^ do begin + UpDir := True; + IsDotFile := False; + AName := nil; + LnkPointTo := nil; + Selected := False; + IsLnk := False; + for j := 0 to Length(ColumnData) - 1 do ColumnData[j] := nil; + for j := 1 to ConstNumPanelColumns do + if ConfColumnVisible[j] then + case ConfColumnIDs[j] of + 1, 2: begin + if ConfDisableDirectoryBrackets then s := '..' + else s := '[..]'; + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s)); + end; + 4: ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(LANGDIR)); + end; + Icon := UpDirIcon.FPixbuf; + ItemColor := NormalItemGDKColor; + if not Application.GTKVersion_2_0_5_Up then ListItem.SetValue(0, Data); + end; + ListItem.Data := Data; + DataList.Add(Data); +end; + +(********************************************************************************************************************************) +function FillPanel(List: TList; ListView: TGTKListView; Engine: TPanelEngine; LeftPanel: boolean): boolean; +var DataList: TList; + i, j, SortColumnID, ItemCount : integer; + ListItem : TGTKListItem; + Ext, s, s2 : string; + SortOrder: TGTKTreeViewSortOrder; + Time1, Time2: TDateTime; + IsRoot: boolean; + UsrManager: TUserManager; +begin + Result := False; + try + UsrManager := nil; + if LeftPanel then DataList := LeftPanelData + else DataList := RightPanelData; + IsRoot := (Engine.Path = '/') and (not ((Engine is TVFSEngine) and (Engine as TVFSEngine).ArchiveMode)); +{ Time1 := Now; + Time2 := Now; + DebugMsg(['Get Listing: ', SecondOf(Time2 - Time1), ':', MillisecondOf(Time2 - Time1)]); } + + Time1 := Now; + SortColumnID := ListView.SortColumnID; + SortOrder := ListView.SortOrder; + ListView.SetSortInfo(-1, soAscending); + ClearListData(DataList); + if List.Count + Ord(not IsRoot) < ListView.Items.Count then + for i := ListView.Items.Count - 1 downto List.Count + Ord(not IsRoot) do + ListView.Items.Delete(i); + ItemCount := ListView.Items.Count; + + Time2 := Now; + DebugMsg(['Items clear: ', SecondOf(Time2 - Time1), ':', MillisecondOf(Time2 - Time1)]); + + Time1 := Now; + if ((Engine is TVFSEngine) and (Engine as TVFSEngine).ArchiveMode) or (Engine.Path <> '/') then AddUpDirItem(ListView, DataList); + + if List.Count > 0 then + for i := 0 to List.Count - 1 do + with PDataItem(List[i])^ do begin + if i + Ord(not IsRoot) > ItemCount - 1 + then ListItem := ListView.Items.Add + else ListItem := ListView.Items[i + Ord(not IsRoot)]; + s := String(AName); + Ext := ''; + if not IsDir then SeparateExt(s, s, Ext); + Ext := ANSIToUTF8(Ext); + + // Fill the column data + for j := 1 to ConstNumPanelColumns do + if ConfColumnVisible[j] then + case ConfColumnIDs[j] of + 1: begin + if IsDir and (not ConfDisableDirectoryBrackets) + then s2 := ANSIToUTF8(Format('[%s]', [s])) + else s2 := ANSIToUTF8(s); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 2: begin + if IsDir and (not ConfDisableDirectoryBrackets) + then s2 := ANSIToUTF8(Format('[%s]', [AName])) + else s2 := ANSIToUTF8(AName); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 3: ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(Ext)); + 4: begin + if IsDir then s2 := LANGDIR + else s2 := ANSIToUTF8(FormatSize(Size, 0)); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 5: begin + s2 := FormatDateTime('ddddd tt', ModifyTime); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 6: begin + s2 := FormatDateTime('ddddd', ModifyTime); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 7: begin + s2 := FormatDateTime('tt', ModifyTime); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 8: begin + if ConfShowTextUIDs then begin + if not Assigned(UsrManager) then UsrManager := TUserManager.Create; + s2 := AnsiToUTF8(UsrManager.GetUserName(UID, False)); + end else s2 := IntToStr(UID); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 9: begin + if ConfShowTextUIDs then begin + if not Assigned(UsrManager) then UsrManager := TUserManager.Create; + s2 := AnsiToUTF8(UsrManager.GetGroupName(GID, False)); + end else s2 := IntToStr(GID); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + 10: begin + if ConfOctalPerm then s2 := Format('%.4d', [AttrToOctal(Mode mod $1000)]) + else s2 := AttrToStr(Mode); + ColumnData[ConfColumnIDs[j] - 1] := strdup(PChar(s2)); + end; + end; + + ItemColor := nil; + AddFileTypeIcon(List[i]); + DataList.Add(List[i]); + ListItem.Data := DataList[DataList.Count - 1]; + if not Application.GTKVersion_2_0_5_Up then ListItem.SetValue(0, List[i]); + end; + Time2 := Now; + DebugMsg(['Fill panel: ', SecondOf(Time2 - Time1), ':', MillisecondOf(Time2 - Time1)]); + +// DebugWriteList(DataList); + + if Assigned(UsrManager) then UsrManager.Free; + Time1 := Now; + ListView.SetSortInfo(SortColumnID, SortOrder); + Time2 := Now; + DebugMsg(['Sorting: ', SecondOf(Time2 - Time1), ':', MillisecondOf(Time2 - Time1)]); + DebugMsg(['------------------------------']); + Result := True; + except + on E: Exception do begin + Application.MessageBox(Format(LANGErrorGettingListingForSPanelNoPath, [LANGPanelStrings[LeftPanel], E.Message]), [mbOK], mbError, mbNone, mbOK); + Exit; + end; + end; +end; + +(********************************************************************************************************************************) +function ChangeDir(Engine: TPanelEngine; Path: string; var SelItem: string; const AutoFallBack: boolean): integer; + + procedure GoUp(var NewPath: string); + var x: integer; + begin + if NewPath = PathDelim then Exit; + NewPath := ExcludeTrailingPathDelimiter(NewPath); + if Length(Trim(NewPath)) < 2 then Exit; + x := PosEnd(PathDelim, NewPath); + SelItem := Copy(NewPath, x + 1, Length(NewPath) - x); + NewPath := Copy(NewPath, 1, x); + NewPath := IncludeTrailingPathDelimiter(NewPath); + end; + +var APath: string; + Error : integer; +begin + Result := 1; + try + APath := Engine.Path; + if Path = '..' then GoUp(APath) + else begin + APath := IncludeTrailingPathDelimiter(APath); + Path := IncludeTrailingPathDelimiter(Path); + if (Length(Path) > 0) and (Path[1] <> '/') + then APath := APath + Path + else APath := Path; + APath := IncludeTrailingPathDelimiter(APath); + end; + + // AutoFallback loop + Error := Engine.ChangeDir(APath); + while AutoFallback and (Error <> 0) and (APath <> '/') do begin + GoUp(APath); + Error := Engine.ChangeDir(APath); + end; + // Going on... + if Error <> 0 then begin + Result := Error; + DebugMsg(['*** UCore.ChangeDir: error during Engine.ChangeDir: ', GetErrorString(Error)]); + Exit; + end; + Engine.Path := APath; + Result := 0; + except + on E: Exception do begin + DebugMsg(['*** Exception raised in UCore.ChangeDir (', E.ClassName, '): ', E.Message]); + Result := 1; + end; + end; +end; + +(********************************************************************************************************************************) +function MakeDirectory(ListView: TGTKListView; Engine: TPanelEngine; LeftPanel: boolean; NewDir: string): boolean; +var Error: integer; +begin + Result := False; + try + Error := Engine.MakeDir(IncludeTrailingPathDelimiter(Engine.Path) + NewDir); + if Error <> 0 then begin + Application.MessageBox(Format(LANGErrorCreatingNewDirectorySInSPanel, [NewDir, LANGPanelStrings[LeftPanel], ANSIToUTF8(GetErrorString(Error))]), [mbOK], mbError, mbNone, mbOK); + Exit; + end; + Result := True; + except + on E: Exception do begin + Application.MessageBox(Format(LANGErrorCreatingNewDirectorySInSPanelNoPath, [LANGPanelStrings[LeftPanel], E.Message]), [mbOK], mbError, mbNone, mbOK); + Exit; + end; + end; +end; + +(********************************************************************************************************************************) +procedure DeleteFilesWorker(SenderThread: TWorkerThread); +var SkipAll: boolean; + + function HandleDelete(AFileRec: PDataItemSL): boolean; + var Res, Response: integer; + begin + Result := True; +// DebugMsg(['Debug: IsDir: ', AFileRec^.IsDir, ', Stage1: ', AFileRec^.Stage1, ', IsLnk: ', AFileRec^.IsLnk, '; Result = ', AFileRec^.IsDir and AFileRec^.Stage1 and (not AFileRec^.IsLnk)]); + if AFileRec^.IsDir and AFileRec^.Stage1 and (not AFileRec^.IsLnk) then Exit; + Res := SenderThread.Engine.Remove(String(AFileRec^.AName)); +// DebugMsg(['Result : ', Res]); + if Res <> 0 then + if SkipAll then Result := True else + begin + Response := SenderThread.ShowDirDeleteDialog(1, LANGTheFileDirectory, ANSIToUTF8(String(AFileRec^.AName)), + Format(LANGCouldNotBeDeletedS, [ANSIToUTF8(GetErrorString(Res))])); + case Response of + 1 : Result := True; + 3 : begin + SkipAll := True; + Result := True; + end; + 2 : Result := HandleDelete(AFileRec); + else Result := False; + end; + end; + end; + +var i: longint; + AList: TList; + CurrPath: string; + Fr: Single; + Response: integer; + DeleteAll, SkipToNext: boolean; + +begin + SkipAll := False; + AList := TList.Create; + AList.Clear; + with SenderThread do begin + CurrPath := IncludeTrailingPathDelimiter(Engine.Path); + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if (not UpDir) and Selected then + if IsDir and (not IsLnk) + then Engine.FillDirFiles(CurrPath + String(AName), AList, 1) + else AList.Add(Engine.GetFileInfoSL(CurrPath + String(AName))); + if (AList.Count = 0) and Assigned(SelectedItem) and (not SelectedItem^.UpDir) then + with SelectedItem^ do + if IsDir and (not IsLnk) + then Engine.FillDirFiles(CurrPath + String(AName), AList, 1) + else AList.Add(Engine.GetFileInfoSL(CurrPath + String(AName))); + if Engine.ChangeDir(CurrPath, False) <> 0 then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour might occur.']); + Engine.ExplicitChDir('/'); + + SetProgress1Params(AList.Count); + CommitGUIUpdate; + DeleteAll := False; + SkipToNext := False; + +// DebugWriteListSL(AList); + + if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1); + if AList.Count > 0 then + for i := 0 to AList.Count - 1 do begin + if Cancelled then begin + FCancelMessage := LANGUserCancelled; + FShowCancelMessage := True; + Break; + end; + if SkipToNext and (PDataItemSL(AList[i])^.Level > 1) then Continue; + if SkipToNext and (PDataItemSL(AList[i])^.Level = 1) and (not PDataItemSL(AList[i])^.Stage1) then begin + SkipToNext := False; + Continue; + end; + // Check for non-empty directory + if (not DeleteAll) and (PDataItemSL(AList[i])^.Level = 1) and PDataItemSL(AList[i])^.Stage1 and PDataItemSL(AList[i])^.IsDir and + (not PDataItemSL(AList[i])^.IsLnk) and (i < AList.Count - 2) and (PDataItemSL(AList[i + 1])^.Level = 2) then + begin + Response := ShowDirDeleteDialog(4, Format(LANGTheDirectorySIsNotEmpty, [ANSIToUTF8(string(PDataItemSL(AList[i])^.AName))]), + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories); + case Response of + 1 : ; // Do nothing in this case - I will not bother with changing the structure; it works :-) + 2 : DeleteAll := True; + 3 : SkipToNext := True; + else Break; + end; + end; + // Process delete + if not HandleDelete(AList[i]) then Break; + UpdateProgress1(i, Format('%d%%', [Round(Fr * i)])); + UpdateCaption1(ANSIToUTF8(PDataItemSL(AList[i])^.AName)); + CommitGUIUpdate; + end; + + // Free the objects + if AList.Count > 0 then + for i := AList.Count - 1 downto 0 do FreeDataItem(PDataItemSL(AList[i])); + AList.Clear; + AList.Free; + if Engine.ChangeDir(CurrPath, False) <> 0 then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour might occur.']); + end; + SenderThread.FDoneThread := True; +end; + + + + + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + // Return False to break the process + function CopyFilesWorker_ProgressFunc(Sender: Pointer; BytesDone: Int64): boolean; cdecl; + begin +// DebugMsg(['*** CopyFilesWorker: ProgressFunc called (Sender=', QWord(Sender), ', BytesDone=', BytesDone, ')']); + try + if Assigned(Sender) and (TObject(Sender) is TWorkerThread) then + with TWorkerThread(Sender) do begin + if BytesDone = 0 then UpdateProgress1(0, '0%') + else UpdateProgress1(BytesDone, Format('%d%%', [Round(ParamFloat2 * BytesDone)])); + UpdateProgress2(ParamInt64 + BytesDone, Format('%d%%', [Round(ParamFloat1 * (ParamInt64 + BytesDone))])); + Result := not Cancelled; + CommitGUIUpdate; + end else DebugMsg(['*** CopyFilesWorker: Sender is not TWorkerThread']); + except + on E: Exception do DebugMsg(['*** Exception raised in ProgressFunc(Sender=', QWord(Sender), ', BytesDone=', BytesDone, '): (', E.ClassName, '): ', E.Message]); + end; + end; + + // Return True to ignore the error (Skip, Skip All, Ignore, Cancel) + function CopyFilesWorker_ErrorFunc(Sender: Pointer; ErrorType, ErrorNum: integer; FileName: string): boolean; cdecl; + var s, s2, s3: string; + begin + with TWorkerThread(Sender) do begin + if ParamBool2 then begin + Result := True; + Exit; + end; + case ErrorType of + 1 : s := LANGMemoryAllocationFailed; + 2 : s := LANGCannotOpenSourceFile; + 3 : s := LANGCannotOpenDestinationFile; + 4 : s := LANGCannotCloseDestinationFile; + 5 : s := LANGCannotCloseSourceFile; + 6 : s := LANGCannotReadFromSourceFile; + 7 : s := LANGCannotWriteToDestinationFile; + end; + if ParamBool1 then s2 := LANGCopyError + else s2 := LANGMoveError; + if ErrorType <> 1 then s3 := ANSIToUTF8(FileName) + else s3 := ''; + case ShowDirDeleteDialog(3, s, s3, ANSIToUTF8(GetErrorString(ErrorNum)), s2) of + 0 : begin // Cancel button + Result := False; + CancelIt; + end; + 2 : Result := True; // Ignore + 3 : begin // Skip All + ParamBool2 := True; { Skip All Err } + Result := False; //** True? + end; + else {1, 124, 255 :} Result := False; // Skip + end; + end; + end; + + +procedure CopyFilesWorker(SenderThread: TWorkerThread); +// ParamFloat1 = Fr - internal +// ParamFloat2 = Fr2 - internal +// ParamInt64 = SizeDone - internal +// ParamBool1 = ModeCopy - internal +// ParamBool2 = SkipAllErr - internal +// ParamBool3 = CopyMode +// ParamBool4 = QuickRename +// ParamBool5 = OneFile +// ParamString1 = NewPath +// ParamString2 = Filepath +// ParamDataItem1 = QuickRenameDataItem +var DefResponse: integer; // Global variables for this function + SkipAll: boolean; + + + + // Returns True if file was successfully copied, if not, the file will be deleted in LocalCopyFile + function ManualCopyFile(SourceFile, DestFile: string; Append: boolean): boolean; + var fsrc, fdst: TEngineFileDes; + Error, BSize: integer; + Buffer: Pointer; + BytesDone, BytesRead, BytesWritten: Int64; + Res: boolean; + begin + DebugMsg(['ManualCopyFile: ', SourceFile, ' ---> ', DestFile]); + with SenderThread do begin + Result := False; + Error := 0; + fsrc := SrcEngine.OpenFile(SourceFile, omRead, Error); + if Error <> 0 then begin + CopyFilesWorker_ErrorFunc(SenderThread, 2, Error, SourceFile); // Cannot open source file + Exit; + end; + if Append then fdst := DestEngine.OpenFile(DestFile, omAppend, Error) + else fdst := DestEngine.OpenFile(DestFile, omWrite, Error); + if Error <> 0 then begin + SrcEngine.CloseFile(fsrc); + CopyFilesWorker_ErrorFunc(SenderThread, 3, Error, SourceFile); // Cannot open target file + Exit; + end; + + BytesDone := 0; + Res := True; + + BSize := DestEngine.GetBlockSize; + Buffer := Libc.malloc(BSize); + if Buffer = nil then begin + CopyFilesWorker_ErrorFunc(SenderThread, 1, errno, SourceFile); // Memory allocation failed + Libc.free(Buffer); + Exit; + end; + Libc.memset(Buffer, 0, BSize); + + BytesWritten := 0; + repeat + BytesRead := SrcEngine.ReadFile(fsrc, Buffer, BSize, Error); + if (BytesRead = 0) and (Error <> 0) then + Res := CopyFilesWorker_ErrorFunc(SenderThread, 6, Error, SourceFile); // Cannot read from source file + if BytesRead > 0 then begin + BytesWritten := DestEngine.WriteFile(fdst, Buffer, BytesRead, Error); + if (BytesWritten < BytesRead) then + Res := CopyFilesWorker_ErrorFunc(SenderThread, 7, Error, DestFile); // Cannot write to source file + end; + Inc(BytesDone, BytesRead); + if not CopyFilesWorker_ProgressFunc(SenderThread, BytesDone) then begin + Res := False; + Break; + end; + until (BytesRead = 0) or (BytesWritten < BytesRead); + Libc.free(Buffer); + + if DestEngine.CloseFile(fdst) <> 0 then begin + CopyFilesWorker_ErrorFunc(SenderThread, 4, errno, DestFile); // Cannot close target file + Exit; + end; + if SrcEngine.CloseFile(fsrc) <> 0 then begin + CopyFilesWorker_ErrorFunc(SenderThread, 5, errno, SourceFile); // Cannot close source file + Exit; + end; + Result := Res; + end; + end; + + // Returns True if the file was successfully copied and will be deleted on move + function LocalCopyFile(SourceFile, DestFile: string; Append: boolean): boolean; + var DataSrc, DataDest: PDataItemSL; + begin + try + with SenderThread do begin + if ((SrcEngine is TLocalTreeEngine) and (DestEngine is TLocalTreeEngine)) or + ((SrcEngine is TLocalTreeEngine) and (not (DestEngine is TLocalTreeEngine))) + then Result := DestEngine.CopyFileIn(SenderThread, SourceFile, DestFile, @CopyFilesWorker_ProgressFunc, @CopyFilesWorker_ErrorFunc, Append) else +// DebugMsg(['2 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$']); + if (not (SrcEngine is TLocalTreeEngine)) and (DestEngine is TLocalTreeEngine) + then Result := SrcEngine.CopyFileOut(SenderThread, SourceFile, DestFile, @CopyFilesWorker_ProgressFunc, @CopyFilesWorker_ErrorFunc, Append) + // both files are on different engines, we will have to handle the copy process ourselves + else Result := ManualCopyFile(SourceFile, DestFile, Append); +// DebugMsg(['3 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$']); + + // If size differs, then delete target file + if (not Append) and (not Result) then begin +// DebugMsg(['4 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$']); + DataSrc := SrcEngine.GetFileInfoSL(SourceFile); + if DataSrc = nil then Exit; + DataDest := DestEngine.GetFileInfoSL(DestFile); + if DataDest = nil then Exit; + if DataSrc^.Size <> DataDest^.Size then DestEngine.Remove(DestFile); + end; + end; +// DebugMsg(['(II) CopyFilesWorker.LocalCopyFile: finished']); + except + on E: Exception do DebugMsg(['*** Exception raised in LocalCopyFile(SourceFile=', SourceFile, ', DestFile=', DestFile, ', Append=', Append, '): (', E.ClassName, '): ', E.Message]); + end; + end; + + function IsOnSameFS(SrcPath, DestPath: string): boolean; + begin + DebugMsg(['### IsOnSameFS: "', SrcPath, '" vs. "', DestPath, '"'#10'## Prefix = "', SenderThread.SrcEngine.GetPrefix, '" vs. "', SenderThread.DestEngine.GetPrefix, '"']); + with SenderThread do + if SrcEngine.GetPrefix <> DestEngine.GetPrefix + then Result := False + else Result := DestEngine.IsOnSameFS(SrcPath, DestPath); + end; + + function TwoSameFiles(Path1, Path2: string; TestCaseInsensitiveFS: boolean): boolean; + begin + with SenderThread do begin + if SrcEngine.GetPrefix <> DestEngine.GetPrefix then Result := False else + if AnsiCompareStr(Path1, Path2) = 0 then Result := True else + Result := TestCaseInsensitiveFS and DestEngine.TwoSameFiles(Path1, Path2); + end; + end; + + function DoOperation(AFileRec: PDataItemSL; const Dst: string; var ErrorKind: integer; const Append: boolean): integer; + begin + try + ErrorKind := 0; + Result := 0; + with SenderThread do + with AFileRec^ do begin + if IsLnk then begin + // Explicit copy the file + if ParamBool3 or (not IsOnSameFS(String(AName), ExtractFileDir(Dst))) then begin + ErrorKind := DestEngine.MakeSymLink(Dst, String(LnkPointTo)); + if ErrorKind <> 0 then Result := ERRCreateLink; + if not ParamBool3 then begin + ErrorKind := SrcEngine.Remove(String(AName)); + if ErrorKind <> 0 then Result := ERRRemove; + end; + end else begin // Move the file + ErrorKind := DestEngine.RenameFile(String(AName), Dst); + if ErrorKind <> 0 then Result := ERRCopyMove; + end; + end else // is not link + if ParamBool3 then begin // Copy mode + if LocalCopyFile(String(AName), Dst, Append) then begin + if IsOnRO and ConfClearReadOnlyAttr and (Mode and S_IWUSR = 0) then Mode := Mode or S_IWUSR; + DestEngine.Chmod(Dst, Mode); + DestEngine.Chown(Dst, UID, GID); + DestEngine.ChangeTimes(Dst, mtime, atime); + end; + end else // Move mode + if IsOnSameFS(String(AName), ExtractFileDir(Dst)) then begin + if TwoSameFiles(String(AName), Dst, True) and (not TwoSameFiles(String(AName), Dst, False)) then begin + DebugMsg(['*** Activating double-rename due to renaming on case-insensitive FS']); + ErrorKind := DestEngine.RenameFile(String(AName), Dst + '_tcmd'); + if ErrorKind = 0 then ErrorKind := DestEngine.RenameFile(Dst + '_tcmd', Dst); + end else ErrorKind := DestEngine.RenameFile(String(AName), Dst); + if ErrorKind <> 0 then Result := ERRCopyMove; + end else begin + if LocalCopyFile(String(AName), Dst, Append) then begin + if IsOnRO and ConfClearReadOnlyAttr and (Mode and S_IWUSR = 0) then Mode := Mode or S_IWUSR; + DestEngine.Chmod(Dst, Mode); + DestEngine.Chown(Dst, UID, GID); + DestEngine.ChangeTimes(Dst, mtime, atime); + if not Cancelled then begin + ErrorKind := SrcEngine.Remove(String(AName)); + if ErrorKind <> 0 then Result := ERRRemove; + end; + end; + end; + end; +// DebugMsg(['(II) CopyFilesWorker.DoOperation: finished']); + except + on E: Exception do DebugMsg(['*** Exception raised in DoOperation(AFileRec=', QWord(AFileRec), ', Dst=', Dst, ', ErrorKind=', ErrorKind, ', Append=', Append, '): (', E.ClassName, '): ', E.Message]); + end; + end; + + // Return False to break the processing (Cancel) + function HandleCopy(AFileRec: PDataItemSL; NewFilePath: string): boolean; + var Res, Response, ErrorKind, r: integer; + Item: PDataItemSL; + s, s1, s3, cap: string; + begin + Result := True; + try + with SenderThread do begin + + // Second stage - change permissions + if (not AFileRec^.Stage1) and (ParamBool3 or ((not ParamBool3) and (not AFileRec^.ForceMove))) then + with AFileRec^ do begin + if IsOnRO and ConfClearReadOnlyAttr and (Mode and S_IWUSR = 0) then Mode := Mode or S_IWUSR; + DestEngine.Chmod(NewFilePath, Mode); + DestEngine.Chown(NewFilePath, UID, GID); + DestEngine.ChangeTimes(NewFilePath, mtime, atime); + if not ParamBool3 then SrcEngine.Remove(String(AName)); // Remove directory + Exit; + end; + + // First stage - copy data + if AFileRec^.IsDir then begin + Res := 0; + if AFileRec^.ForceMove and (not ParamBool3) + then begin + if TwoSameFiles(ExcludeTrailingPathDelimiter(string(AFileRec^.AName)), ExcludeTrailingPathDelimiter(string(AFileRec^.ADestination)), True) and (not + TwoSameFiles(ExcludeTrailingPathDelimiter(string(AFileRec^.AName)), ExcludeTrailingPathDelimiter(string(AFileRec^.ADestination)), False)) then + begin + DebugMsg(['*** Activating double-rename due to renaming on case-insensitive FS']); + ErrorKind := DestEngine.RenameFile(string(AFileRec^.AName), ExcludeTrailingPathDelimiter(string(AFileRec^.ADestination)) + '_tcmd'); + if ErrorKind = 0 then ErrorKind := DestEngine.RenameFile(ExcludeTrailingPathDelimiter(string(AFileRec^.ADestination)) + '_tcmd', ExcludeTrailingPathDelimiter(string(AFileRec^.ADestination))); + end else ErrorKind := DestEngine.RenameFile(string(AFileRec^.AName), string(AFileRec^.ADestination)); + if ErrorKind <> 0 then Res := ERRCopyMove + else Res := 0; + end else + if not DestEngine.DirectoryExists(NewFilePath, True) then begin + ErrorKind := DestEngine.MakeDir(NewFilePath); + if ErrorKind <> 0 then Res := ERRMkDir + else Res := 0; + end; + end else begin // not a directory + if not DestEngine.DirectoryExists(ExtractFileDir(NewFilePath), True) then DestEngine.MakeDir(ExtractFileDir(NewFilePath)); + SetProgress1Params(AFileRec^.Size + Ord(AFileRec^.Size = 0)); + if AFileRec^.Size <= 1 then ParamFloat2 := 1 else ParamFloat2 := 100 / (AFileRec^.Size - 1); + CopyFilesWorker_ProgressFunc(SenderThread, 0); + Res := 0; + if DestEngine.FileExists(NewFilePath, True) and + (not (not ParamBool3 and (not TwoSameFiles(NewFilePath, AFileRec^.AName, False)) and TwoSameFiles(NewFilePath, AFileRec^.AName, True))) + then begin + Response := DefResponse; + Item := DestEngine.GetFileInfoSL(NewFilePath); + if Response = 0 then begin + Response := ShowOverwriteDialog(1 + Ord(ParamBool3), Format(LANGOverwriteS, [ANSIToUTF8(NewFilePath)]), + Format(LANGOvewriteSBytesS, [FormatSize(Item^.Size, 0), FormatDateTime('ddddd t', Item^.ModifyTime)]), + Format(LANGWithFileS, [ANSIToUTF8(AFileRec^.AName)]), + Format(LANGOvewriteSBytesS, [FormatSize(AFileRec^.Size, 0), FormatDateTime('ddddd t', AFileRec^.ModifyTime)]), + ANSIToUTF8(ExtractFileName(NewFilePath)), ExtractFileName(AFileRec^.AName), ExtractFileName(NewFilePath)); + s := FOverwriteRenameStr; + case Response of + // 1: Overwrite + // 3: Skip + 2 {Overwrite All}, 5 {Overwrite All Older}, 6 {Skip All}: DefResponse := Response; + 4 {Cancel}, 124 {Close Window}, 255: begin + Result := False; + Exit; + end; + 7: {Rename} begin + NewFilePath := Copy(NewFilePath, 1, LastDelimiter(PathDelim, NewFilePath)) + s; + Result := HandleCopy(AFileRec, NewFilePath); + Exit; + end; + 8 {Append}: begin + Res := DoOperation(AFileRec, NewFilePath, ErrorKind, True); + end; + end; + end; + + // Remove destination file if exists and should be overwritten + if (Response in [1, 2]) or ((Response = 5) and (Item^.ModifyTime < AFileRec^.ModifyTime)) then begin + r := DestEngine.Remove(NewFilePath); + while r <> 0 do begin + Res := ShowDirDeleteDialog(1, LANGTheFile, ANSIToUTF8(String(NewFilePath)), + Format(LANGCouldNotBeDeletedS, [ANSIToUTF8(GetErrorString(r))]), LANGCopyError); + case Res of + 1: begin + Result := True; + Exit; + end; + 2: r := DestEngine.Remove(NewFilePath); + 0, 124, 255: begin + Result := False; + Exit; + end; + end; + end; + Res := DoOperation(AFileRec, NewFilePath, ErrorKind, False); + end; + end else Res := DoOperation(AFileRec, NewFilePath, ErrorKind, False); + end; + + // Error handling + if (Res <> 0) and (not SkipAll) then begin + if ParamBool3 then cap := LANGCopy + else cap := LANGMove; + case Res of + ERRCreateLink: begin + s1 := LANGTheSymbolicLink; + if ErrorKind = 0 then s3 := LANGCouldNotBeCreated else + s3 := Format(LANGCouldNotBeCreatedS, [ANSIToUTF8(GetErrorString(ErrorKind))]); + end; + ERRMkDir: begin + s1 := LANGTheDirectory; + if ErrorKind = 0 then s3 := LANGCouldNotBeCreated else + s3 := Format(LANGCouldNotBeCreatedS, [ANSIToUTF8(GetErrorString(ErrorKind))]); + end; + ERRRemove: begin + if AFileRec^.IsDir then s1 := LANGTheDirectory else + if AFileRec^.IsLnk then s1 := LANGTheSymbolicLink else + s1 := LANGTheFile; + if ErrorKind = 0 then s3 := LANGCouldNotBeDeleted else + s3 := Format(LANGCouldNotBeDeletedS, [ANSIToUTF8(GetErrorString(ErrorKind))]); + end; + ERRCopyMove: begin + if ParamBool3 then s1 := LANGCannotCopyFile else + s1 := LANGCannotMoveFile; + if ErrorKind = 0 then s3 := '' else + s3 := ANSIToUTF8(GetErrorString(ErrorKind)); + end; + end; + Response := ShowDirDeleteDialog(1, s1, ANSIToUTF8(String(NewFilePath)), s3, cap); + case Response of + 1 : Result := True; // Skip + 2 : Result := HandleCopy(AFileRec, NewFilePath); // Retry + 3 : begin // Skip All + SkipAll := True; + Result := True; + end; + 0, 124, 255 : Result := False; // Cancel + end; + end; + end; +// DebugMsg(['(II) CopyFilesWorker.HandleCopy: finished']); + except + on E: Exception do DebugMsg(['*** Exception raised in HandleCopy(AFileRec=', QWord(AFileRec), ', NewFilePath=', NewFilePath, '): (', E.ClassName, '): ', E.Message]); + end; + end; + + procedure HandleProcessPattern(AList: TList; CurrPath, FullPath, ParamFileName: string; ParamDir, Ren: boolean); + var s, s2: string; + b, CaseInsensitiveRename: boolean; + Info: PDataItemSL; + begin + with SenderThread do + if not Ren then begin + if ParamDir then SrcEngine.FillDirFiles(FullPath, AList, 1) + else begin + Info := SrcEngine.GetFileInfoSL(FullPath); + if Info = nil then DebugMsg(['$$$ Copy: Something went wrong while building the filelist...']) + else AList.Add(Info); + end; + end else begin + s := ProcessPattern(DestEngine, ParamString1, CurrPath, ParamFileName, ParamDir); + CaseInsensitiveRename := (AnsiCompareStr(ParamString1, ParamFileName) <> 0) and (AnsiCompareText(ParamString1, ParamFileName) = 0) and + ParamDir and DestEngine.TwoSameFiles(IncludeTrailingPathDelimiter(CurrPath) + ParamString1, IncludeTrailingPathDelimiter(CurrPath) + ParamFileName); +// DebugMsg(['HandleProcessPattern: s = ', s]); + b := False; + if ParamDir then begin + b := DestEngine.DirectoryExists(ExcludeTrailingPathDelimiter(s)) and (not CaseInsensitiveRename); + if (not b) and (s <> '/') then begin + s2 := ExcludeTrailingPathDelimiter(s); + s2 := ExcludeTrailingPathDelimiter(Copy(s2, 1, LastDelimiter('/', s2))); + b := DestEngine.DirectoryExists(ExcludeTrailingPathDelimiter(s2)); + end; + end; + if (not ParamDir) or (ParamDir and b and IsOnSameFS(ExcludeTrailingPathDelimiter(FullPath), s2)) + then begin + Info := SrcEngine.GetFileInfoSL(FullPath); + if Info = nil then DebugMsg(['$$$ Copy: Something went wrong while building the filelist...']) + else begin + Info^.ADestination := strdup(PChar(s)); + Info^.ForceMove := True; + AList.Add(Info); + end; + end else SrcEngine.FillDirFiles(FullPath, AList, 1); + end; + end; + +var i: longint; + List: TList; + CurrPath, SaveDestPath, SaveSrcPath, s: string; + MaxSize: Int64; +begin + List := TList.Create; + List.Clear; + with SenderThread do begin + ErrorHappened := False; + FCancelled := False; + SaveSrcPath := ''; + CurrPath := IncludeTrailingPathDelimiter(SrcEngine.Path); + SaveDestPath := DestEngine.Path; + ParamString1 := ExcludeTrailingPathDelimiter(ParamString1); + if ParamString1 = '' then ParamString1 := PathDelim; + + if ParamBool5 then begin // HandleVFSFromArchive + if not ExtractFromVFSAll then HandleProcessPattern(List, CurrPath, ParamString2, ExtractFileName(ParamString2), False, False) + else begin + SaveSrcPath := IncludeTrailingPathDelimiter(SrcEngine.Path); + SrcEngine.SetPath('/'); + CurrPath := '/'; + HandleProcessPattern(List, '/', '/', '', True, False); + end; + end else + if ParamBool4 then begin // Quick-Rename + with ParamDataItem1^ do + HandleProcessPattern(List, CurrPath, CurrPath + String(AName), String(AName), IsDir and (not IsLnk), True); + end else begin // Not Quick-Rename + if not ExtractFromVFSMode then begin + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if (not UpDir) and Selected + then HandleProcessPattern(List, CurrPath, CurrPath + String(AName), String(AName), IsDir and (not IsLnk), not ParamBool3); + if (List.Count = 0) and Assigned(SelectedItem) and (not SelectedItem^.UpDir) then + with SelectedItem^ do + HandleProcessPattern(List, CurrPath, CurrPath + String(AName), String(AName), IsDir and (not IsLnk), not ParamBool3); + end else begin // Extract from VFS mode + DebugMsg(['CopyFilesWorker: Should not be reached']); + if (not ExtractFromVFSAll) and Assigned(SelectedItem) + then HandleProcessPattern(List, CurrPath, CurrPath + String(SelectedItem^.AName), String(SelectedItem^.AName), SelectedItem^.IsDir and (not SelectedItem^.IsLnk), not ParamBool3) + else begin + SaveSrcPath := IncludeTrailingPathDelimiter(SrcEngine.Path); + SrcEngine.SetPath('/'); + CurrPath := '/'; + HandleProcessPattern(List, '/', '/', '', True, False); + end; + end; + end; + +{ if DestEngine.ChangeDir(CurrPath, False) <> 0 then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour may occur.']); + if SrcEngine.ChangeDir(CurrPath, False) <> 0 then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour may occur.']); } +// DebugWriteListSL(List); + + __chdir('/'); + // Compute total size of files to copy + MaxSize := 0; ParamInt64 := 0; + if List.Count > 0 then + for i := 0 to List.Count - 1 do + if PDataItemSL(List[i])^.Stage1 and (PDataItemSL(List[i])^.Size > 0) and (not PDataItemSL(List[i])^.IsDir) and (not PDataItemSL(List[i])^.IsLnk) + then Inc(MaxSize, PDataItemSL(List[i])^.Size); + SrcEngine.BlockSize := ComputeBlockSize(MaxSize); + DestEngine.BlockSize := ComputeBlockSize(MaxSize); + + // Prepare the Progress window + SetProgress2Params(MaxSize + Ord(MaxSize = 0)); + UpdateProgress1(0, '0%'); + UpdateProgress2(0, '0%'); + CommitGUIUpdate; + + DefResponse := 0; + ParamBool1 := ParamBool3; + SkipAll := False; + ParamBool2 := False; + + if MaxSize < 2 then ParamFloat1 := 1 else ParamFloat1 := 100 / (MaxSize - 1); + if List.Count > 0 then + for i := 0 to List.Count - 1 do begin + if Assigned(PDataItemSL(List[i])^.ADestination) + then s := string(PDataItemSL(List[i])^.ADestination) + else + begin + s := ProcessPattern(DestEngine, ParamString1, CurrPath, Copy(PDataItemSL(List[i])^.AName, Length(CurrPath) + 1, Length(PDataItemSL(List[i])^.AName) - Length(CurrPath)), + PDataItemSL(List[i])^.IsDir and (not PDataItemSL(List[i])^.IsLnk)); +// DebugMsg(['s2 = ', Copy(PDataItemSL(List[i])^.AName, Length(CurrPath) + 1, Length(PDataItemSL(List[i])^.AName) - Length(CurrPath)), ', s = ', s]); + end; + UpdateCaption1(Format(LANGFromS, [ANSIToUTF8(string(PDataItemSL(List[i])^.AName))])); + UpdateCaption2(Format(LANGToS, [ANSIToUTF8(s)])); + CommitGUIUpdate; + if TwoSameFiles(s, string(PDataItemSL(List[i])^.AName), ParamBool3) and (not PDataItemSL(List[i])^.IsDir) then begin + FCancelMessage := LANGCannotCopyFileToItself; + FShowCancelMessage := True; + ErrorHappened := True; + Break; + end; + if s <> string(PDataItemSL(List[i])^.AName) then + if not HandleCopy(List[i], s) then begin + ErrorHappened := True; + Break; + end; + if (not PDataItemSL(List[i])^.IsDir) and (not PDataItemSL(List[i])^.IsLnk) + then Inc(ParamInt64, PDataItemSL(List[i])^.Size); + if Cancelled then begin + FCancelMessage := LANGUserCancelled; + FShowCancelMessage := True; + ErrorHappened := True; + Break; + end; + end; + + // Free the objects + if List.Count > 0 then + for i := List.Count - 1 downto 0 do FreeDataItem(PDataItemSL(List[i])); + List.Clear; + List.Free; + if DestEngine.ChangeDir(SaveDestPath, False) <> 0 then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour might occur.']); + if SaveSrcPath <> '' then CurrPath := SaveSrcPath; + if SrcEngine.ChangeDir(CurrPath, False) <> 0 then DebugMsg(['*** WARNING: Cannot change to the origin location, strange behaviour might occur.']); + end; + SenderThread.FDoneThread := True; + DebugMsg(['(II) CopyFilesWorker: finished']); +end; + + +(********************************************************************************************************************************) +function ComputeBlockSize(TotalSize: Int64): longint; +begin + if TotalSize < 512*1024 then Result := 32*1024 else + if TotalSize < 1024*1024 then Result := 64*1024 else + if TotalSize < 2048*1024 then Result := 96*1024 else + if TotalSize < 4096*1024 then Result := 128*1024 else + if TotalSize < 8192*1024 then Result := 256*1024 else +{ if TotalSize < 256*1024*1024 then Result := 512*1024 else + if TotalSize < 768*1024*1024 then Result := 2048*1024 else } + Result := 4096*1024; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure DebugWriteListSL(List: TList); +var i: integer; + Item: PDataItemSL; +begin + if not ParamDebug then Exit; + if not Assigned(List) then begin + WriteLn('List not assigned'); + Exit; + end; + WriteLn('********************************************************'); + WriteLn('** List.Count = ', List.Count, ' base @ ', integer(pointer(List))); + if List.Count > 0 then + for i := 0 to List.Count - 1 do + if not Assigned(List[i]) then WriteLn('**** List Item idx ', i, '; base @ nil') else + try + WriteLn('**** List Item idx ', i, '; base @ ', integer(List[i]), '; sizeof = ', SizeOf(List[i])); + Item := List[i]; + WriteLn(' Stage1: ', Item^.Stage1, ', Level: ', Item^.Level, ', IsDir: ', Item^.IsDir, ', IsLnk: ', Item^.IsLnk, ', ForceMove: ', Item^.ForceMove{, ', Size: ', Item^.Size}); + WriteLn(' AName: ', Item^.AName); + WriteLn(' LnkPointTo: ', Item^.LnkPointTo); + WriteLn(' ADestination: ', Item^.ADestination); + except + on E: Exception do + WriteLn('(EE): Exception ', E.ClassName, ' raised: ', E.Message); + end; + WriteLn('** End of listing'); + WriteLn('********************************************************'); +end; + +procedure DebugWriteList(List: TList); +var i: integer; + Item: PDataItem; +begin + if not ParamDebug then Exit; + if not Assigned(List) then begin + WriteLn('List not assigned'); + Exit; + end; + WriteLn('********************************************************'); + WriteLn('** List.Count = ', List.Count, ' base @ ', integer(pointer(List))); + if List.Count > 0 then + for i := 0 to List.Count - 1 do + if not Assigned(List[i]) then WriteLn('**** List Item idx ', i, '; base @ nil') else + try + WriteLn('**** List Item idx ', i, '; base @ ', integer(List[i]), '; sizeof = ', SizeOf(List[i])); + Item := List[i]; + WriteLn(' IsDir: ', Item^.IsDir, ', IsLnk: ', Item^.IsLnk, ', Size: ', Item^.Size); + WriteLn(' AName: ', Item^.AName); + WriteLn(' LnkPointTo: ', Item^.LnkPointTo); + except + on E: Exception do + WriteLn('(EE): Exception ', E.ClassName, ' raised: ', E.Message); + end; + WriteLn('** End of listing'); + WriteLn('********************************************************'); +end; + +(********************************************************************************************************************************) +procedure FindNextSelected(ListView: TGTKListView; DataList: TList; var Item1, Item2: string); +var i: integer; + SelCount: longint; +begin + SelCount := 0; + Item1 := ''; Item2 := ''; + if (not Assigned(ListView.Selected)) or PDataItem(ListView.Selected.Data)^.UpDir then Exit; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + Item1 := string(PDataItem(ListView.Selected.Data)^.AName); + if (PDataItem(ListView.Selected.Data)^.Selected and (SelCount > 0)) or (SelCount = 0) then begin + if ListView.ConvertToSorted(ListView.Selected.Index) < ListView.Items.Count then + for i := ListView.ConvertToSorted(ListView.Selected.Index) + 1 to DataList.Count - 1 do + if not PDataItem(DataList[ListView.ConvertFromSorted(i)])^.Selected then begin + Item2 := string(PDataItem(DataList[ListView.ConvertFromSorted(i)])^.AName); + Break; + end; + if (Item2 = '') and (ListView.ConvertToSorted(ListView.Selected.Index) > 0) then + for i := ListView.ConvertToSorted(ListView.Selected.Index) - 1 downto 0 do + if (not PDataItem(DataList[ListView.ConvertFromSorted(i)])^.Selected) and + (not PDataItem(DataList[ListView.ConvertFromSorted(i)])^.UpDir) then + begin + Item2 := string(PDataItem(DataList[ListView.ConvertFromSorted(i)])^.AName); + Break; + end; + end; +end; + +(********************************************************************************************************************************) +procedure UnselectAll(ListView: TGTKListView; DataList: TList); +var i: integer; +begin + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected then begin + Selected := False; + ListView.Items[i].RedrawRow; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function CRCGetInfo(FileName: string; Engine: TPanelEngine; var TargetName: string; var TargetCRC: LongWord; var Size: Int64): boolean; + + procedure ProcessLine(Str: string); + var UPS: string; + begin + try + TrimCRLFESC(Str); + if Length(Str) < 1 then Exit; + UPS := AnsiUpperCase(Str); + if Pos('FILENAME', UPS) = 1 then TargetName := Trim(Copy(Str, Pos('=', Str) + 1, Length(Str) - Pos('=', Str))) else + if Pos('SIZE', UPS) = 1 then Size := StrToInt64Def(Trim(Copy(Str, Pos('=', Str) + 1, Length(Str) - Pos('=', Str))), 0) else + if Pos('CRC32', UPS) = 1 then TargetCRC := StrToInt64Def('$' + Trim(Copy(Str, Pos('=', Str) + 1, Length(Str) - Pos('=', Str))), 0); + except end; + end; + +const CRCBlockSize = 32768; +var i, Error, Count, Start: integer; + FD: TEngineFileDes; + Buffer: Pointer; + s: string; +begin + Result := False; + if Pos('.', FileName) > 1 then FileName := ChangeFileExt(FileName, '.crc') + else FileName := FileName + '.crc'; + try + Buffer := Libc.malloc(CRCBlockSize); + Libc.memset(Buffer, 0, CRCBlockSize); + except + Application.MessageBox(LANGAnErrorOccuredWhileInitializingMemoryBlock, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + FD := Engine.OpenFile(FileName, omRead, Error); + if Error <> 0 then Exit; + + s := ''; + repeat + Count := Engine.ReadFile(FD, Buffer, CRCBlockSize, Error); + if Error <> 0 then begin + Libc.free(Buffer); + Engine.CloseFile(FD); + Exit; + end; + // processing begins + Start := 1; + if Count > 0 then + for i := 0 to Count - 1 do + if (PByteArray(Buffer)^[i] in [13, 10]) or (i = Count - 1) then begin + s := s + Copy(PChar(Buffer), Start, i - Start + 1 + Ord(i = Count - 1)); + Start := i + 2; + if PByteArray(Buffer)^[i] in [13, 10] then begin + ProcessLine(s); + s := ''; + end; + end; + // processing ends + until Count < CRCBlockSize; + if Length(s) > 0 then ProcessLine(s); + + Engine.CloseFile(FD); + Libc.free(Buffer); + Result := True; +end; + +(********************************************************************************************************************************) +procedure MergeFilesWorker(SenderThread: TWorkerThread); +// ParamBool1 = HasInitialCRC +// ParamString1 = NewPath +// ParamString2 = FileName +// ParamString3 = TargetName +// ParamLongWord1 = TargetCRC +// ParamInt64 = TargetSize + +var FD: TEngineFileDes; + Error, Count, MergeBlockSize: integer; + Buffer: Pointer; + CurrentCRC: LongWord; + PrivateCancel: boolean; + SizeDone: Int64; + TargetName: string; + + + function PasteFile(FName: string): boolean; + var FDR: TEngineFileDes; + wCount: integer; + Stat: PDataItemSL; + begin + Result := False; + with SenderThread do begin + if ParamBool1 then UpdateCaption2(Format(LANGToS, [ANSIToUTF8(FName)])) + else UpdateCaption1(Format(LANGFromS, [ANSIToUTF8(FName)])); + UpdateProgress1(0, '0 %'); + CommitGUIUpdate; + Stat := Engine.GetFileInfoSL(FName); + if not Assigned(Stat) then Exit; + SetProgress1Params(Stat^.Size); + FDR := Engine.OpenFile(FName, omRead, Error); + if Error <> 0 then Exit; + repeat + Count := Engine.ReadFile(FDR, Buffer, MergeBlockSize, Error); + if Error <> 0 then begin + Engine.CloseFile(FD); + Exit; + end; + wCount := Engine.WriteFile(FD, Buffer, Count, Error); + if (Error <> 0) or (Count <> wCount) then begin + FCancelMessage := Format(LANGAnErrorOccuredWhileWritingFileSS, [ANSIToUTF8(ExtractFileName(TargetName)), ANSIToUTF8(GetErrorString(Error))]); + FShowCancelMessage := True; + PrivateCancel := True; + Result := True; // Fake this to don't show next disc dialog + Exit; + end; + CurrentCRC := CRC32(CurrentCRC, Buffer, Count); + UpdateProgress1(FProgress1Pos + Count, Format('%d %%', [Trunc((FProgress1Pos + Count) / FProgress1Max * 100)])); + Inc(SizeDone, Count); + if ParamBool1 then UpdateProgress2(SizeDone, Format('%d %%', [Trunc(SizeDone / FProgress2Max * 100)])); + CommitGUIUpdate; + until (Count < MergeBlockSize) or Cancelled; + Engine.CloseFile(FDR); + end; + Result := True; + end; + + +var CurrFile, SourcePath, TargetFinalName: string; + HasFinalCRC, b: boolean; + Stat: PDataItemSL; +begin + with SenderThread do begin + HasFinalCRC := ParamBool1; + TargetFinalName := ParamString3; + if (Length(ParamString2) > 4) and (ANSIUpperCase(RightStr(ParamString2, 4)) = '.CRC') + then CurrFile := ChangeFileExt(ExtractFileName(ParamString2), '.001') + else CurrFile := ExtractFileName(ParamString2); + SourcePath := ExtractFilePath(ParamString2); + if ParamString3 = '' then ParamString3 := ChangeFileExt(ExtractFileName(ParamString2), '.out'); + TargetName := ProcessPattern(Engine, ParamString1, Engine.Path, ParamString3, False); + if Engine.FileExists(TargetName, True) then + if ShowMessageBox(Format(LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt, [ANSIToUTF8(TargetName)]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes then + begin + Error := Engine.Remove(TargetName); + if Error <> 0 then begin + FCancelMessage := Format(LANGTheTargetFileSCannotBeRemovedS, [ANSIToUTF8(ExtractFileName(TargetName)), ANSIToUTF8(GetErrorString(Error))]); + FShowCancelMessage := True; + Exit; + end; + end else Exit; + + Stat := Engine.GetFileInfoSL(ParamString2); + if Assigned(Stat) then MergeBlockSize := ComputeBlockSize(Stat^.Size) + else MergeBlockSize := 65536*4; + try + Buffer := Libc.malloc(MergeBlockSize); + Libc.memset(Buffer, 0, MergeBlockSize); + except + FCancelMessage := LANGAnErrorOccuredWhileInitializingMemoryBlock; + FShowCancelMessage := True; + Exit; + end; + FD := Engine.OpenFile(TargetName, omWrite, Error); + if Error <> 0 then begin + FCancelMessage := Format(LANGAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(TargetName), ANSIToUTF8(GetErrorString(Error))]); + FShowCancelMessage := True; + Libc.free(Buffer); + Exit; + end; + + CurrentCRC := $FFFFFFFF; + SizeDone := 0; + PrivateCancel := False; + if ParamBool1 then begin + SetProgress2Params(ParamInt64); + UpdateProgress2(0, '0 %'); + UpdateCaption2(Format(LANGFromS, [ANSIToUTF8(TargetName)])); + CommitGUIUpdate; + end; { else begin + Label2.XAlign := 0; + Label2.XPadding := 20; + end; } + + repeat + b := PasteFile(IncludeTrailingPathDelimiter(SourcePath) + CurrFile); + if not b then begin + PrivateCancel := ShowNewDirDialog(LANGMergeCaption, LANGPleaseInsertNextDiskOrGiveDifferentLocation, ANSIToUTF8(SourcePath)) <> integer(mbOK); + if not PrivateCancel then begin + SourcePath := UTF8ToANSI(FNewDirEdit); + if not HasFinalCRC then + HasFinalCRC := CRCGetInfo(IncludeTrailingPathDelimiter(SourcePath) + CurrFile, Engine, TargetFinalName, ParamLongWord1, ParamInt64); + Continue; + end; + end; + try + CurrFile := Copy(CurrFile, 1, LastDelimiter('.', CurrFile)) + Format('%.3d', [StrToInt( + Copy(CurrFile, LastDelimiter('.', CurrFile) + 1, Length(CurrFile) - LastDelimiter('.', CurrFile))) + 1]); + except + CurrFile := ''; + end; + until (SizeDone = ParamInt64) or Cancelled or PrivateCancel {or ((not b) and (not HasInitialCRC))} or (CurrFile = ''); + if (not ParamBool1) and HasFinalCRC then Engine.RenameFile(TargetName, IncludeTrailingPathDelimiter(ExtractFilePath(TargetName)) + TargetFinalName); + if Cancelled and (not PrivateCancel) then begin + FCancelMessage := LANGUserCancelled; + FShowCancelMessage := True; + end; + if not (Cancelled or PrivateCancel) then + if HasFinalCRC then begin + if not CurrentCRC = ParamLongWord1 + then ShowMessageBox(Format(LANGMergeOfSSucceeded, [ANSIToUTF8(ExtractFileName(TargetFinalName))]), [mbOK], mbInfo, mbNone, mbOK) + else ShowMessageBox(LANGWarningCreatedFileFailsCRCCheck, [mbOK], mbWarning, mbNone, mbOK); + end else ShowMessageBox(Format(LANGMergeOfSSucceeded_NoCRCFileAvailable, [ANSIToUTF8(ExtractFileName(TargetFinalName))]), [mbOK], mbInfo, mbNone, mbOK); + Engine.CloseFile(FD); + end; + Libc.free(Buffer); + SenderThread.FDoneThread := True; +end; + +(********************************************************************************************************************************) +function WriteCRCFile(Engine: TPanelEngine; TargetFile, SplitFileName: string; const FileSize: Int64; const FileCRC: Longword): boolean; +var FD: TEngineFileDes; + Error, Count: integer; + s: string; +begin + Result := False; + if Pos('.', TargetFile) > 1 then TargetFile := ChangeFileExt(TargetFile, '.crc') + else TargetFile := TargetFile + '.crc'; + FD := Engine.OpenFile(TargetFile, omWrite, Error); + if Error <> 0 then begin + Application.MessageBox(Format(LANGAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(TargetFile), ANSIToUTF8(GetErrorString(Error))]), [mbOK], mbError, mbNone, mbOK); + Exit; + end; + s := Format('filename=%s'#13#10'size=%d'#13#10'crc32=%s'#13#10, [SplitFileName, FileSize, ANSIUpperCase(IntToHex(FileCRC, 8))]); + Count := Engine.WriteFile(FD, @s[1], Length(s), Error); + if (Error <> 0) or (Count <> Length(s)) then begin + Application.MessageBox(Format(LANGAnErrorOccuredWhileWritingFileSS, [ANSIToUTF8(TargetFile), ANSIToUTF8(GetErrorString(Error))]), [mbOK], mbError, mbNone, mbOK); + Exit; + end; + Engine.CloseFile(FD); + Result := True; +end; + +(********************************************************************************************************************************) +procedure SplitFilesWorker(SenderThread: TWorkerThread); +// ParamInt64 = SplitSize +// ParamString1 = FileName +// ParamString2 = NewPath +// ParamBool1 = DeleteTarget + +const SplitBlockSize = 65536*4; +var FD: TEngineFileDes; + Error: integer; + FileCRC: LongWord; + Buffer: Pointer; + PrivateCancel: boolean; + FilePath: string; + SizeDone, TDF, FileSize, CurrSize: Int64; + + + function WriteSplitPart(TargetFile: string; PartSize: Int64; var Written: Int64): boolean; + var FDW: TEngineFileDes; + Count, wCount, bl: integer; + begin + Result := False; + Written := 0; + with SenderThread do begin + FDW := Engine.OpenFile(TargetFile, omWrite, Error); + DebugMsg(['-- Opening file ', ExtractFileName(TargetFile), ', PartSize = ', PartSize]); + if Error <> 0 then Exit; + if ParamInt64 > 0 then begin + UpdateCaption2(Format(LANGToS, [ANSIToUTF8(TargetFile)])); + SetProgress1Params(PartSize); + UpdateProgress1(0, '0 %'); + end else UpdateCaption1(Format(LANGToS, [ANSIToUTF8(TargetFile)])); + CommitGUIUpdate; + repeat + DebugMsg(['Seek to ', Engine.FileSeek(FD, SizeDone + Written, Error), ', Written = ', Written]); + if Written + SplitBlockSize > PartSize then bl := PartSize - Written + else bl := SplitBlockSize; + Count := Engine.ReadFile(FD, Buffer, bl, Error); + if (Error <> 0) or (Count <> bl) then begin + Engine.CloseFile(FDW); + DebugMsg(['Read Error: ', GetErrorString(Error), ', Count = ', Count, ', bl = ', bl]); + if (Count <> bl) and (Error = 0) then Error := EIO; + Exit; + end; + wCount := Engine.WriteFile(FDW, Buffer, Count, Error); + Inc(Written, wCount); + FileCRC := CRC32(FileCRC, Buffer, wCount); + if (Error <> 0) or (Count <> wCount) then begin + Engine.CloseFile(FDW); + DebugMsg(['Write Error: ', GetErrorString(Error), ', Count = ', Count, ', wCount = ', wCount]); + if (wCount <> Count) and (Error = 0) then Error := ENOSPC; + Exit; + end; + UpdateProgress1(FProgress1Pos + wCount, Format('%d %%', [Trunc((FProgress1Pos + wCount) / FProgress1Max * 100)])); + if ParamInt64 > 0 then UpdateProgress2(FProgress2Pos + wCount, Format('%d %%', [Trunc((FProgress2Pos + wCount) / FProgress2Max * 100)])); + CommitGUIUpdate; + until (Written = PartSize) or Cancelled or PrivateCancel; + Engine.CloseFile(FDW); + end; + DebugMsg(['-- Closing file ', ExtractFileName(TargetFile), ', PartSize = ', PartSize, ', Written = ', Written]); + Result := True; + end; + + // Returns True if it should break the process + function NewDiskQuestion: boolean; + begin + Result := False; + with SenderThread do begin + TDF := Engine.GetFileSystemFree(FilePath); + // Calculate part size + if ParamInt64 = 0 then begin + if FileSize - SizeDone > TDF then CurrSize := TDF + else CurrSize := FileSize - SizeDone; + end else + if SizeDone + ParamInt64 > FileSize then CurrSize := FileSize - SizeDone + else CurrSize := ParamInt64; + if (TDF < 512) {or (CurrSize < 512)} or (TDF < CurrSize) then begin + DebugMsg(['-- New disk question']); + Engine.ExplicitChDir('/'); + PrivateCancel := ShowNewDirDialog(LANGSplitCaption, LANGPleaseInsertNextDiskOrGiveDifferentLocation, + ANSIToUTF8(FilePath)) <> integer(mbOK); + if not PrivateCancel then FilePath := UTF8ToANSI(FNewDirEdit); + Result := PrivateCancel; + end; + end; + end; + + +var i: integer; + OriginalFName, st, FileName: string; + ws: Int64; + Stat: PDataItemSL; + b: boolean; + List: TList; +begin + with SenderThread do begin + Stat := Engine.GetFileInfoSL(ParamString1); + if not Assigned(Stat) then begin + FCancelMessage := Format(LANGCannotOpenFileS, [ANSIToUTF8(ParamString1)]); + FShowCancelMessage := True; + Exit; + end; + if (ParamInt64 > 0) and (Stat^.Size > ParamInt64 * 999) then begin + FCancelMessage := LANGCannotSplitTheFileToMoreThan999Parts; + FShowCancelMessage := True; + Exit; + end; + FileSize := Stat^.Size; + SizeDone := 0; + FileCRC := $FFFFFFFF; + List := TList.Create; + + try + Buffer := Libc.malloc(SplitBlockSize); + Libc.memset(Buffer, 0, SplitBlockSize); + except + FCancelMessage := LANGAnErrorOccuredWhileInitializingMemoryBlock; + FShowCancelMessage := True; + Exit; + end; + FD := Engine.OpenFile(ParamString1, omRead, Error); + if Error <> 0 then begin + FCancelMessage := Format(LANGAnErrorOccuredWhileOpeningFileSS, [ANSIToUTF8(ParamString1), ANSIToUTF8(GetErrorString(Error))]); + Libc.free(Buffer); + Exit; + end; + FilePath := IncludeTrailingPathDelimiter(ProcessPattern(Engine, ParamString2, Engine.Path, '', True)); + FileName := ExtractFileName(ParamString1); + OriginalFName := FileName; + if Pos('.', FileName) > 1 then FileName := ChangeFileExt(FileName, '.001') + else FileName := FileName + '.001'; + PrivateCancel := False; + + if ParamInt64 > 0 then begin + SetProgress2Params(FileSize); + UpdateProgress2(0, '0 %'); + end else begin + SetProgress1Params(FileSize); + UpdateProgress1(0, '0 %'); + end; + UpdateCaption1(Format(LANGFromS, [ANSIToUTF8(IncludeTrailingPathDelimiter(FilePath) + OriginalFName)])); + CommitGUIUpdate; + + repeat + TDF := Engine.GetFileSystemFree(FilePath); + // Delete target files if necessary + if ParamBool1 and ((TDF < 512) or (TDF < FileSize) or (TDF < ParamInt64)) then try + if List.Count > 0 then + for i := List.Count - 1 downto 0 do + FreeDataItem(PDataItem(List[i])); + List.Clear; + Error := Engine.GetListing(List, ConfShowDotFiles, FilePath); + if (Error = 0) and (List.Count > 0) then begin + st := ''; + if List.Count < 6 then begin + for i := 0 to List.Count - 1 do + st := st + ' ' + AnsiToUTF8(string(PDataItem(List[i])^.AName)) + #10; + b := ShowMessageBox(Format(LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem, [st]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes; + end else b := ShowMessageBox(Format(LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem, [List.Count]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes; + if b then + for i := 0 to List.Count - 1 do begin + Error := Engine.Remove(IncludeTrailingPathDelimiter(FilePath) + string(PDataItem(List[i])^.AName)); + if Error <> 0 then ShowMessageBox(Format(LANGTheTargetFileSCannotBeRemovedS, [ANSIToUTF8(IncludeTrailingPathDelimiter(FilePath) + string(PDataItem(List[i])^.AName)), ANSIToUTF8(GetErrorString(Error))]), [mbOK], mbError, mbNone, mbOK); + end; + end; + except end; + // Test for target file existence + if Engine.FileExists(IncludeTrailingPathDelimiter(FilePath) + FileName) then begin + b := ShowMessageBox(Format(LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt, [ANSIToUTF8(IncludeTrailingPathDelimiter(FilePath) + FileName)]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes; + if b then begin + Error := Engine.Remove(IncludeTrailingPathDelimiter(FilePath) + FileName); + if Error <> 0 then begin + FCancelMessage := Format(LANGTheTargetFileSCannotBeRemovedS, [ANSIToUTF8(IncludeTrailingPathDelimiter(FilePath) + FileName), ANSIToUTF8(GetErrorString(Error))]); + FShowCancelMessage := True; + PrivateCancel := True; + Break; + end; + end else begin + PrivateCancel := True; + Break; + end; + end; + // Free space check + if NewDiskQuestion then Break; + // Writing + ws := 0; + if (CurrSize >= 512) and (TDF >= CurrSize) then begin + b := WriteSplitPart(IncludeTrailingPathDelimiter(FilePath) + FileName, CurrSize, ws); + if (not b) and (ParamInt64 > 0) then begin + FCancelMessage := Format(LANGAnErrorOccuredWhileOperationS, [ANSIToUTF8(GetErrorString(Error))]); + FShowCancelMessage := True; + PrivateCancel := True; + Break; + end; + Inc(SizeDone, ws); + if ParamInt64 > 0 then UpdateProgress2(SizeDone, Format('%d %%', [Trunc(SizeDone / FileSize * 100)])) + else UpdateProgress1(SizeDone, Format('%d %%', [Trunc(SizeDone / FileSize * 100)])); + CommitGUIUpdate; + end; + // Free space check - New disk question after operation + if NewDiskQuestion then Break; + // Change filename + if ws > 0 then + try FileName := Copy(FileName, 1, LastDelimiter('.', FileName)) + + Format('%.3d', [StrToInt(Copy(FileName, LastDelimiter('.', FileName) + 1, + Length(FileName) - LastDelimiter('.', FileName))) + 1]); + except + FileName := ''; + end; + until (SizeDone = FileSize) or Cancelled or PrivateCancel or (FileName = ''); + if Cancelled and (not PrivateCancel) then begin + FCancelMessage := LANGUserCancelled; + FShowCancelMessage := True; + end; + if not (Cancelled or PrivateCancel) then begin + repeat + TDF := Engine.GetFileSystemFree(FilePath); + if (TDF < 512) and (not NewDiskQuestion) then Break; + until (TDF >= 512) or PrivateCancel or Cancelled; + if WriteCRCFile(Engine, IncludeTrailingPathDelimiter(FilePath) + FileName, OriginalFName, SizeDone, not FileCRC) + then ShowMessageBox(Format(LANGSplitOfSSucceeded, [ANSIToUTF8(OriginalFName)]), [mbOK], mbInfo, mbNone, mbOK) + else begin + FCancelMessage := Format(LANGSplitOfSFailed, [ANSIToUTF8(OriginalFName)]); + FShowCancelMessage := True; + end; + end; + Engine.CloseFile(FD); + end; + List.Free; + SenderThread.FDoneThread := True; +end; + +(********************************************************************************************************************************) +procedure ChmodFilesWorker(SenderThread: TWorkerThread); +// ParamBool1 = Recursive +// ParamInt1 = All/Dir/Files +// ParamCardinal1 = Mode + +var SkipAll: boolean; + + function HandleChmod(AFileRec: PDataItemSL): boolean; + var Res, Response: integer; + begin + Result := True; + with SenderThread do begin +// DebugMsg(['Chmod Debug: IsDir: ', AFileRec^.IsDir, ', Stage1: ', AFileRec^.Stage1, ', IsLnk: ', AFileRec^.IsLnk, '; Result = ', AFileRec^.IsDir and AFileRec^.Stage1 and (not AFileRec^.IsLnk)]); + if AFileRec^.IsDir and ParamBool1 and AFileRec^.Stage1 and (not AFileRec^.IsLnk) then Exit; + if (not AFileRec^.IsDir) and ParamBool1 and (ParamInt1 = 1) then Exit; // Directories only + if AFileRec^.IsDir and ParamBool1 and (ParamInt1 = 2) then Exit; // Files only + Res := Engine.Chmod(String(AFileRec^.AName), ParamCardinal1); +// DebugMsg(['Result : ', Res]); + if Res <> 0 then + if SkipAll then Result := True else + begin + Response := ShowDirDeleteDialog(1, LANGTheFileDirectory, ANSIToUTF8(String(AFileRec^.AName)), Format(LANGCouldNotBeChmoddedS, + [ANSIToUTF8(GetErrorString(Res))]), LANGDialogChangePermissions); + case Response of + 1 : Result := True; + 3 : begin + SkipAll := True; + Result := True; + end; + 2 : Result := HandleChmod(AFileRec); + else Result := False; + end; + end; + end; + end; + +var i: longint; + AList: TList; + CurrPath: string; + Fr: Single; +begin + SkipAll := False; + with SenderThread do begin + AList := TList.Create; + AList.Clear; + CurrPath := IncludeTrailingPathDelimiter(Engine.Path); + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if (not UpDir) and Selected then + if IsDir and (not IsLnk) and ParamBool1 + then Engine.FillDirFiles(CurrPath + String(AName), AList, 1) + else AList.Add(Engine.GetFileInfoSL(CurrPath + String(AName))); + if (AList.Count = 0) and Assigned(SelectedItem) and (not SelectedItem^.UpDir) then + with SelectedItem^ do + if IsDir and (not IsLnk) and ParamBool1 + then Engine.FillDirFiles(CurrPath + String(AName), AList, 1) + else AList.Add(Engine.GetFileInfoSL(CurrPath + String(AName))); + Engine.ExplicitChDir('/'); + SetProgress1Params(AList.Count); + UpdateProgress1(0, '0 %'); + CommitGUIUpdate; + +// DebugWriteListSL(AList); + + if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1); + if AList.Count > 0 then + for i := 0 to AList.Count - 1 do begin + if Cancelled then begin + FCancelMessage := LANGUserCancelled; + FShowCancelMessage := True; + Break; + end; + // Process chmod + if not HandleChmod(AList[i]) then Break; + UpdateProgress1(i, Format('%d%%', [Round(Fr * i)])); + UpdateCaption1(ANSIToUTF8(PDataItemSL(AList[i])^.AName)); + CommitGUIUpdate; + end; + + // Free the objects + if AList.Count > 0 then + for i := AList.Count - 1 downto 0 do FreeDataItem(PDataItemSL(AList[i])); + AList.Clear; + AList.Free; + end; + SenderThread.FDoneThread := True; +end; + + +(********************************************************************************************************************************) +procedure ChownFilesWorker(SenderThread: TWorkerThread); +// ParamBool1 = Recursive +// ParamCardinal1 = UID +// ParamCardinal2 = GID +var SkipAll: boolean; + + function HandleChown(AFileRec: PDataItemSL): boolean; + var Res, Response: integer; + begin + Result := True; + with SenderThread do begin +// DebugMsg(['Chown Debug: IsDir: ', AFileRec^.IsDir, ', Stage1: ', AFileRec^.Stage1, ', IsLnk: ', AFileRec^.IsLnk, '; Result = ', AFileRec^.IsDir and AFileRec^.Stage1 and (not AFileRec^.IsLnk)]); + if (AFileRec^.IsDir and ParamBool1 and AFileRec^.Stage1 and (not AFileRec^.IsLnk)) or + ((not AFileRec^.IsDir) and ParamBool1) then Exit; + Res := Engine.Chown(String(AFileRec^.AName), ParamCardinal1, ParamCardinal2); +// DebugMsg(['Result : ', Res]); + if Res <> 0 then + if SkipAll then Result := True else + begin + Response := ShowDirDeleteDialog(1, LANGTheFileDirectory, ANSIToUTF8(String(AFileRec^.AName)), Format(LANGCouldNotBeChownedS, + [ANSIToUTF8(GetErrorString(Res))]), LANGDialogChangeOwner); + case Response of + 1 : Result := True; + 3 : begin + SkipAll := True; + Result := True; + end; + 2 : Result := HandleChown(AFileRec); + else Result := False; + end; + end; + end; + end; + +var i: longint; + AList: TList; + CurrPath: string; + Fr: Single; +begin + SkipAll := False; + with SenderThread do begin + AList := TList.Create; + AList.Clear; + CurrPath := IncludeTrailingPathDelimiter(Engine.Path); + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if (not UpDir) and Selected then + if IsDir and (not IsLnk) and ParamBool1 + then Engine.FillDirFiles(CurrPath + String(AName), AList, 1) + else AList.Add(Engine.GetFileInfoSL(CurrPath + String(AName))); + if (AList.Count = 0) and Assigned(SelectedItem) and (not SelectedItem^.UpDir) then + with SelectedItem^ do + if IsDir and (not IsLnk) and ParamBool1 + then Engine.FillDirFiles(CurrPath + String(AName), AList, 1) + else AList.Add(Engine.GetFileInfoSL(CurrPath + String(AName))); + Engine.ExplicitChDir('/'); + SetProgress1Params(AList.Count); + UpdateProgress1(0, '0 %'); + CommitGUIUpdate; + +// DebugWriteListSL(AList); + + if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1); + if AList.Count > 0 then + for i := 0 to AList.Count - 1 do begin + if Cancelled then begin + FCancelMessage := LANGUserCancelled; + FShowCancelMessage := True; + Break; + end; + // Process chmod + if not HandleChown(AList[i]) then Break; + UpdateProgress1(i, Format('%d%%', [Round(Fr * i)])); + UpdateCaption1(ANSIToUTF8(PDataItemSL(AList[i])^.AName)); + CommitGUIUpdate; + end; + + // Free the objects + if AList.Count > 0 then + for i := AList.Count - 1 downto 0 do FreeDataItem(PDataItemSL(AList[i])); + AList.Clear; + AList.Free; + end; + SenderThread.FDoneThread := True; +end; + + +(********************************************************************************************************************************) +procedure DummyThreadWorker(SenderThread: TWorkerThread); +var i: integer; +begin + DebugMsg(['(II) DummyThreadWorker: begin']); + with SenderThread do begin + SetProgress1Params(100); + SetProgress2Params(100); + UpdateProgress1(0, '0 %'); + UpdateProgress2(100, '100 %'); + CommitGUIUpdate; + for i := 1 to 100 do begin + Sleep(100); + DebugMsg([' (II) DummyThreadWorker: done ', i, ' / 100']); + UpdateProgress1(i, Format('%d%%', [i])); + UpdateCaption1(Format('Test %d test', [i])); + UpdateProgress2(101-i, Format('%d%%', [101-i])); + UpdateCaption2(Format('Test %d test', [101-i])); + CommitGUIUpdate; + if Cancelled then Break; + end; + end; + DebugMsg(['(II) DummyThreadWorker: finish']); + SenderThread.FDoneThread := True; +end; + +(********************************************************************************************************************************) +function CreateSymlink(const FileName, PossibleNewName: string; Engine: TPanelEngine) : boolean; +var AFSymLink: TFSymlink; + + function HandleCreateSymlink(const OldName, NewName: string): boolean; + var Res, Response: integer; + begin + Res := Engine.MakeSymLink(NewName, OldName); + Result := Res = 0; + if not Result then begin + try + FDirDelete := TFDirDelete.Create(AFSymlink); + FDirDelete.Caption := LANGDialogMakeSymlink; + FDirDelete.AddButtons(2); + FDirDelete.Label1.Caption := LANGTheSymbolicLink; + FDirDelete.Label2.Caption := ANSIToUTF8(NewName); + FDirDelete.Label3.Caption := Format(LANGCouldNotBeCreatedS, [ANSIToUTF8(GetErrorString(Res))]); + FDirDelete.Label3.Visible := True; + Response := Integer(FDirDelete.Run); + finally + FDirDelete.Free; + end; + case Response of + 1 : Result := HandleCreateSymlink(OldName, NewName); + else Result := False; + end; + end; + end; + + +begin + Result := False; + try + AFSymlink := TFSymlink.Create(Application.MainForm); + AFSymlink.FromEntry.Text := ANSIToUTF8(FileName); + AFSymlink.ToEntry.Text := ANSIToUTF8(PossibleNewName); + AFSymlink.ToEntry.SetFocus; + AFSymlink.ToEntry.SelectAll; + if AFSymlink.Run = mbOK then Result := HandleCreateSymlink(UTF8ToANSI(AFSymlink.FromEntry.Text), + ProcessPattern(Engine, UTF8ToANSI(AFSymlink.ToEntry.Text), Engine.Path, '', False)); + finally + AFSymlink.Free; + end; +end; + +(********************************************************************************************************************************) +function EditSymlink(const FileName: string; Engine: TPanelEngine) : boolean; +var Data: PDataItemSL; + AFSymLink: TFSymlink; + + function HandleEditSymlink(const ExistingName, PointTo: string): boolean; + var Res, Response: integer; + begin + Res := Engine.Remove(ExistingName); + Result := Res = 0; + if not Result then begin + try + FDirDelete := TFDirDelete.Create(AFSymlink); + FDirDelete.Caption := LANGDialogEditSymlink; + FDirDelete.AddButtons(2); + FDirDelete.Label1.Caption := LANGTheSymbolicLink; + FDirDelete.Label2.Caption := ANSIToUTF8(ExistingName); + FDirDelete.Label3.Caption := Format(LANGCouldNotBeDeletedS, [ANSIToUTF8(GetErrorString(Res))]); + FDirDelete.Label3.Visible := True; + Response := Integer(FDirDelete.Run); + finally + FDirDelete.Free; + end; + case Response of + 1 : HandleEditSymlink(ExistingName, PointTo); + end; + Exit; + end; + Res := Engine.MakeSymLink(ExistingName, PointTo); + Result := Res = 0; + if not Result then begin + try + FDirDelete := TFDirDelete.Create(AFSymlink); + FDirDelete.Caption := LANGDialogMakeSymlink; + FDirDelete.AddButtons(2); + FDirDelete.Label1.Caption := LANGTheSymbolicLink; + FDirDelete.Label2.Caption := ANSIToUTF8(ExistingName); + FDirDelete.Label3.Caption := Format(LANGCouldNotBeCreatedS, [ANSIToUTF8(GetErrorString(Res))]); + FDirDelete.Label3.Visible := True; + Response := Integer(FDirDelete.Run); + finally + FDirDelete.Free; + end; + case Response of + 1 : Result := HandleEditSymlink(ExistingName, PointTo); + else Result := False; + end; + end; + end; + +begin + Result := False; + Data := Engine.GetFileInfoSL(FileName); + try + AFSymlink := TFSymlink.Create(Application); + AFSymlink.Caption := LANGFEditSymlink_Caption; + AFSymlink.FromEntry.Text := ANSIToUTF8(FileName); + AFSymlink.Label1.Caption := LANGFEditSymlink_SymbolicLinkFilename; + AFSymlink.Label1.UseUnderline := True; + AFSymlink.Label2.Caption := LANGFEditSymlink_SymbolicLinkPointsTo; + AFSymlink.Label2.UseUnderline := True; + AFSymlink.FromEntry.Enabled := False; + AFSymlink.ToEntry.Text := ANSIToUTF8(Data^.LnkPointTo); + AFSymlink.ToEntry.SelectAll; + if AFSymlink.Run = mbOK then Result := HandleEditSymlink(UTF8ToANSI(AFSymlink.FromEntry.Text), UTF8ToANSI(AFSymlink.ToEntry.Text)); + finally + AFSymlink.Free; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ProcessProgressThread(SenderThread: TWorkerThread; ProgressForm: TFProgress); +var AFDirDelete: TFDirDelete; + AFOverwrite: TFOverwrite; + AFNewDir: TFNewDir; +begin + DebugMsg([' ** ProcessProgressThread --begin']); + try + while not SenderThread.FDoneThread do begin +// Write('.'); + Sleep(ConstInternalProgressTimer); +// DebugMsg([' ** ProcessProgressThread: updating UI (FProgress1Pos = ', SenderThread.FProgress1Pos, ', FProgress2Pos = ', SenderThread.FProgress2Pos]); + + +// DebugMsg(['ProcessProgressThread - before mutex']); + SenderThread.GUIMutex.Acquire; +// WriteLn('ProcessProgressThread - ted mam lock ja! -- enter'); + + try + if SenderThread.FGUIChanged then begin + if SenderThread.FGUIProgress1Max > 1 + then ProgressForm.ProgressBar.Fraction := SenderThread.FGUIProgress1Pos / SenderThread.FGUIProgress1Max + else ProgressForm.ProgressBar.Fraction := 0; +// ProgressForm.ProgressBar.Value := SenderThread.FGUIProgress1Pos; + ProgressForm.ProgressBar.Text := SenderThread.FGUIProgress1Text; + ProgressForm.Label2.Caption := SenderThread.FGUILabel1Text; + if ProgressForm.FTwoBars then begin + if SenderThread.FGUIProgress2Max > 1 + then ProgressForm.ProgressBar2.Fraction := SenderThread.FGUIProgress2Pos / SenderThread.FGUIProgress2Max + else ProgressForm.ProgressBar2.Fraction := 0; +// ProgressForm.ProgressBar2.Value := SenderThread.FGUIProgress2Pos; + ProgressForm.ProgressBar2.Text := SenderThread.FGUIProgress2Text; + ProgressForm.Label3.Caption := SenderThread.FGUILabel2Text; + end; + ProgressForm.ProgressBar.Max := SenderThread.FGUIProgress1Max; + ProgressForm.ProgressBar2.Max := SenderThread.FGUIProgress2Max; + SenderThread.FGUIChanged := False; + end; + except + on E: Exception do DebugMsg(['*** Exception raised in UCore.ProcessProgressThread::updating progress bars block (', E.ClassName, '): ', E.Message]); + end; + + +// Sleep(1000); +// WriteLn('ProcessProgressThread - ted mam lock ja! -- leave'); + SenderThread.GUIMutex.Release; + + +// DebugMsg(['Before refresh']); + Application.ProcessMessages; +// DebugMsg(['After refresh']); + + try + if SenderThread.FDialogShowDirDelete then begin + AFDirDelete := nil; + try + AFDirDelete := TFDirDelete.Create(SenderThread.ProgressForm as TComponent); + AFDirDelete.Caption := SenderThread.FDirDeleteCaption; + AFDirDelete.AddButtons(SenderThread.FDirDeleteButtonsType); + AFDirDelete.Label1.Caption := SenderThread.FDirDeleteLabel1Text; + AFDirDelete.Label2.Caption := SenderThread.FDirDeleteLabel2Text; + AFDirDelete.Label3.Caption := SenderThread.FDirDeleteLabel3Text; + AFDirDelete.Label2.Visible := SenderThread.FDirDeleteLabel2Visible; + AFDirDelete.Label3.Visible := SenderThread.FDirDeleteLabel3Visible; + SenderThread.FDialogResultDirDelete := Integer(AFDirDelete.Run); + if (SenderThread.FDirDeleteButtonsType = 3) and (SenderThread.FDialogResultDirDelete = 2) and (not SenderThread.ParamBool3) + then case Application.MessageBox(LANGIgnoreError, [mbYes, mbNo{, mbCancel}], mbWarning, mbYes, mbNo) of + mbNo: SenderThread.FDialogResultDirDelete := 1; + mbCancel: SenderThread.FDialogResultDirDelete := 0; + end; + finally + AFDirDelete.Free; + end; + SenderThread.FDialogShowDirDelete := False; + SenderThread.FSigDialogDirDelete := True; + end; + + if SenderThread.FDialogShowOverwrite then begin + AFOverwrite := nil; + try + AFOverwrite := TFOverwrite.Create(SenderThread.ProgressForm as TComponent); + AFOverwrite.AddButtons(SenderThread.FOverwriteButtonsType); + AFOverwrite.FromLabel.Caption := SenderThread.FOverwriteFromLabel; + AFOverwrite.FromInfoLabel.Caption := SenderThread.FOverwriteFromInfoLabel; + AFOverwrite.ToLabel.Caption := SenderThread.FOverwriteToLabel; + AFOverwrite.ToInfoLabel.Caption := SenderThread.FOverwriteToInfoLabel; + AFOverwrite.RenameStr := SenderThread.FOverwriteRenameStr; + AFOverwrite.SourceFile := SenderThread.FOverwriteSourceFile; + AFOverwrite.DestFile := SenderThread.FOverwriteDestFile; + SenderThread.FDialogResultOverwrite := Integer(AFOverwrite.Run); + SenderThread.FOverwriteRenameStr := UTF8ToANSI(AFOverwrite.RenameStr); + finally + AFOverwrite.Free; + end; + SenderThread.FDialogShowOverwrite := False; + SenderThread.FSigDialogOverwrite := True; + end; + + if SenderThread.FDialogShowNewDir then begin + AFNewDir := nil; + try + AFNewDir := TFNewDir.Create(SenderThread.ProgressForm as TComponent); + AFNewDir.Caption := SenderThread.FNewDirCaption; + AFNewDir.Label1.Caption := SenderThread.FNewDirLabel; + AFNewDir.Entry.Text := SenderThread.FNewDirEdit; + AFNewDir.Entry.SelectAll; + SenderThread.FDialogResultNewDir := Integer(AFNewDir.Run); + SenderThread.FNewDirEdit := AFNewDir.Entry.Text; + finally + AFNewDir.Free; + end; + SenderThread.FDialogShowNewDir := False; + SenderThread.FSigDialogNewDir := True; + end; + + if SenderThread.FDialogShowMsgBox then begin + SenderThread.FDialogResultMsgBox := Application.MessageBox(SenderThread.FMsgBoxText, SenderThread.FMsgBoxButtons, + SenderThread.FMsgBoxStyle, SenderThread.FMsgBoxDefault, + SenderThread.FMsgBoxEscape); + SenderThread.FDialogShowMsgBox := False; + SenderThread.FSigDialogMsgBox := True; + end; + finally end; + end; + if SenderThread.FShowCancelMessage then + if SenderThread.FCancelMessage = LANGUserCancelled + then Application.MessageBox(SenderThread.FCancelMessage, [mbOK], mbWarning, mbNone, mbOK) + else Application.MessageBox(SenderThread.FCancelMessage, [mbOK], mbError, mbNone, mbOK); + except + on E: Exception do DebugMsg(['*** Exception raised in UCore.ProcessProgressThread (', E.ClassName, '): ', E.Message]); + end; + DebugMsg([' ** ProcessProgressThread --end']); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TWorkerThread.Execute; +begin + if Assigned(WorkerProcedure) then WorkerProcedure(Self); +end; + +constructor TWorkerThread.Create; +begin + inherited Create(True); + FreeOnTerminate := False; + GUIMutex := TCriticalSection.Create; + FCancelled := False; + ProgressForm := nil; + Engine := nil; + DataList := nil; + ParamPointer1 := nil; + WorkerProcedure := nil; + SelectedItem := nil; + FDoneThread := False; + FShowCancelMessage := False; + FDialogShowDirDelete := False; + FDialogShowOverwrite := False; + FSigDialogDirDelete := False; + FSigDialogOverwrite := False; + FDialogShowNewDir := False; + FSigDialogNewDir := False; + FDialogShowMsgBox := False; + FSigDialogMsgBox := False; + ExtractFromVFSMode := False; + ErrorHappened := False; + ParamBool1 := False; + ParamBool2 := False; + ParamBool3 := False; + ParamBool4 := False; + ParamBool5 := False; + FGUIChanged := False; +end; + +destructor TWorkerThread.Destroy; +begin + GUIMutex.Free; + inherited Destroy; +end; + +procedure TWorkerThread.CancelIt; +begin + FCancelled := True; +end; + +function TWorkerThread.Cancelled: boolean; +begin + Result := FCancelled or ProgressForm.Cancelled; +end; + +procedure TWorkerThread.UpdateProgress1(const Progress: Int64; const ProgressText: string); +begin +// DebugMsg([' ** TWorkerThread.UpdateProgress1(Progress = ', Progress, ', ProgressText = ', ProgressText]); + FProgress1Pos := Progress; + FProgress1Text := ProgressText; +end; + +procedure TWorkerThread.UpdateProgress2(const Progress: Int64; const ProgressText: string); +begin +// DebugMsg([' ** TWorkerThread.UpdateProgress2(Progress = ', Progress, ', ProgressText = ', ProgressText]); + FProgress2Pos := Progress; + FProgress2Text := ProgressText; +end; + +procedure TWorkerThread.SetProgress1Params(const ProgressMax: Int64); +begin + FProgress1Max := ProgressMax; +end; + +procedure TWorkerThread.SetProgress2Params(const ProgressMax: Int64); +begin + FProgress2Max := ProgressMax; +end; + +procedure TWorkerThread.UpdateCaption1(const CaptionText: string); +begin + FLabel1Text := CaptionText; +end; + +procedure TWorkerThread.UpdateCaption2(const CaptionText: string); +begin + FLabel2Text := CaptionText; +end; + +procedure TWorkerThread.CommitGUIUpdate; +begin + GUIMutex.Acquire; +// WriteLn('TWorkerThread.CommitGUIUpdate, ted mam lock ja! -- enter'); + FGUIProgress1Pos := FProgress1Pos; + FGUIProgress2Pos := FProgress2Pos; + FGUIProgress1Max := FProgress1Max; + FGUIProgress2Max := FProgress2Max; + FGUIProgress1Text := FProgress1Text; + FGUIProgress2Text := FProgress2Text; + FGUILabel1Text := FLabel1Text; + FGUILabel2Text := FLabel2Text; + FGUIChanged := True; +// Sleep(1000); +// WriteLn('TWorkerThread.CommitGUIUpdate, ted mam lock ja! -- leave'); + GUIMutex.Release; +end; + +function TWorkerThread.ShowDirDeleteDialog(ButtonsType: integer; const Label1Text: string; const Label2Text: string = ''; const Label3Text: string = ''; const DirDeleteCaption: string = ''): integer; +begin + FDialogResultDirDelete := integer(mbCancel); + FDirDeleteLabel1Text := Label1Text; + FDirDeleteLabel2Text := Label2Text; + FDirDeleteLabel3Text := Label3Text; + FDirDeleteLabel2Visible := Label2Text <> ''; + FDirDeleteLabel3Visible := Label3Text <> ''; + FDirDeleteButtonsType := ButtonsType; + if DirDeleteCaption = '' then FDirDeleteCaption := LANGRemoveDirectory + else FDirDeleteCaption := DirDeleteCaption; + FDialogShowDirDelete := True; + repeat + Sleep(ConstInternalProgressTimer); + until FSigDialogDirDelete; + FSigDialogDirDelete := False; + Result := FDialogResultDirDelete; +end; + +function TWorkerThread.ShowOverwriteDialog(ButtonsType: integer; const FromLabel, FromInfoLabel, ToLabel, ToInfoLabel, RenameStr, SourceFile, DestFile: string): integer; +begin + FDialogResultOverwrite := integer(mbCancel); + FOverwriteButtonsType := ButtonsType; + FOverwriteFromLabel := FromLabel; + FOverwriteFromInfoLabel := FromInfoLabel; + FOverwriteToLabel := ToLabel; + FOverwriteToInfoLabel := ToInfoLabel; + FOverwriteRenameStr := RenameStr; + FOverwriteSourceFile := SourceFile; + FOverwriteDestFile := DestFile; + FDialogShowOverwrite := True; + repeat + Sleep(ConstInternalProgressTimer); + until FSigDialogOverwrite; + FSigDialogOverwrite := False; + Result := FDialogResultOverwrite; +end; + +function TWorkerThread.ShowNewDirDialog(Caption, LabelCaption, Edit: string): integer; +begin + FNewDirCaption := Caption; + FNewDirLabel := LabelCaption; + FNewDirEdit := Edit; + FDialogShowNewDir := True; + repeat + Sleep(ConstInternalProgressTimer); + until FSigDialogNewDir; + FSigDialogNewDir := False; + Result := FDialogResultNewDir; +end; + +function TWorkerThread.ShowMessageBox(const Text: string; Buttons: TMessageButtons; Style: TMessageStyle; Default, Escape: TMessageButton): TMessageButton; +begin + FMsgBoxText := Text; + FMsgBoxButtons := Buttons; + FMsgBoxStyle := Style; + FMsgBoxDefault := Default; + FMsgBoxEscape := Escape; + FDialogShowMsgBox := True; + repeat + Sleep(ConstInternalProgressTimer); + until FSigDialogMsgBox; + FSigDialogMsgBox := False; + Result := FDialogResultMsgBox; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure FillDefaultFstabMounterItems; +var fd: PGlibc_IOFile; + mntent: PGlibc_mntent; + MounterItem: TMounterItem; +begin + while MounterList.Count > 0 do begin + TMounterItem(MounterList[MounterList.Count - 1]).Free; + MounterList.Delete(MounterList.Count - 1); + end; + MounterList.Clear; + + fd := glibc_setmntent(_PATH_MNTTAB, 'r'); + if fd = nil then Exit; + // Get mount name + mntent := glibc_getmntent(fd); + while mntent <> nil do begin + if (mntent^.mnt_dir <> '/') and (mntent^.mnt_dir <> '/boot') and (Pos('/proc', mntent^.mnt_dir) <> 1) and + (Pos('/dev', mntent^.mnt_dir) <> 1) and (mntent^.mnt_dir <> 'swap') and (mntent^.mnt_dir <> '') then + begin + MounterItem := TMounterItem.Create; + MounterItem.DisplayText := ''; + MounterItem.MountPath := mntent^.mnt_dir; + MounterItem.Device := mntent^.mnt_fsname; + if (Pos('ISO9660', UpperCase(mntent^.mnt_type)) > 0) or (Pos('CDROM', UpperCase(mntent^.mnt_dir)) > 0) or + (Pos('CDRW', UpperCase(mntent^.mnt_dir)) > 0) or (Pos('DVD', UpperCase(mntent^.mnt_dir)) > 0) + then MounterItem.DeviceType := 2 else + if (Pos('FLOPPY', UpperCase(mntent^.mnt_dir)) > 0) then MounterItem.DeviceType := 3 else + if (Pos('ZIP', UpperCase(mntent^.mnt_type)) > 0) or (Pos('USB', UpperCase(mntent^.mnt_dir)) > 0) or + (Pos('CAMERA', UpperCase(mntent^.mnt_dir)) > 0) then MounterItem.DeviceType := 1 else + if (Pos('NFS', UpperCase(mntent^.mnt_type)) > 0) or (Pos('SMB', UpperCase(mntent^.mnt_type)) > 0) or + (Pos('NETW', UpperCase(mntent^.mnt_dir)) > 0) then MounterItem.DeviceType := 4 else + MounterItem.DeviceType := 0; + MounterList.Add(MounterItem); + end; + mntent := glibc_getmntent(fd); + end; + glibc_endmntent(fd); +end; + +function TMounterItem.Mounted: boolean; +var fd: PGlibc_IOFile; + mntent: PGlibc_mntent; +begin + Result := False; + fd := glibc_setmntent(_PATH_MOUNTED, 'r'); + if fd = nil then Exit; + // Get mount name + mntent := glibc_getmntent(fd); + while mntent <> nil do begin +// DebugMsg(['mntent^.mnt_dir = ', Int64(mntent^.mnt_dir)]); +// DebugMsg(['mntent^.mnt_dir = ', mntent^.mnt_dir]); +// DebugMsg(['sizeof(mntent^.mnt_dir) = ', sizeof(mntent^.mnt_dir)]); +// DebugMsg(['sizeof(TGlibc_mntent) = ', sizeof(TGlibc_mntent)]); +// DebugMsg(['string(mntent^.mnt_dir) = ', string(mntent^.mnt_dir)]); +// DebugMsg(['MountPath = ', MountPath]); + if mntent^.mnt_dir = MountPath then begin + Result := True; + Break; + end; + mntent := glibc_getmntent(fd); + end; + glibc_endmntent(fd); +end; + +function TMounterItem.IsInFSTab: boolean; +var fd: PGlibc_IOFile; + mntent: PGlibc_mntent; +begin + Result := False; + fd := glibc_setmntent(_PATH_MNTTAB, 'r'); + if fd = nil then Exit; + // Get mount name + mntent := glibc_getmntent(fd); + while mntent <> nil do begin + if (mntent^.mnt_dir = MountPath) and (mntent^.mnt_fsname = Device) then begin + Result := True; + Break; + end; + mntent := glibc_getmntent(fd); + end; + glibc_endmntent(fd); +end; + +function TMounterItem.Mount: boolean; +var s: string; +begin + if Length(MountCommand) = 0 then begin + if IsInFSTab then s := Format('mount "%s"', [MountPath]) + else s := Format('mount "%s" "%s"', [Device, MountPath]); + end else begin + s := ReplaceStr(MountCommand, '%dev', Device); + s := ReplaceStr(s, '%dir', MountPath); + end; + Result := HandleSystemCommand(s, Format(LANGErrorMount, [ANSIToUTF8(MountPath)])); +end; + +function TMounterItem.Umount: boolean; +var s: string; +begin + if Length(UmountCommand) = 0 then begin + if IsInFSTab then s := Format('umount "%s"', [MountPath]) + else s := Format('umount "%s" "%s"', [Device, MountPath]); + end else begin + s := ReplaceStr(UmountCommand, '%dev', Device); + s := ReplaceStr(s, '%dir', MountPath); + end; + Result := HandleSystemCommand(s, Format(LANGErrorUmount, [ANSIToUTF8(MountPath)])); +end; + +function TMounterItem.Eject: boolean; +var s: string; +begin + if Length(UmountCommand) = 0 then begin + if IsInFSTab then s := Format('eject "%s"', [MountPath]) + else s := Format('eject "%s" "%s"', [Device, MountPath]); + end else begin + s := ReplaceStr(UmountCommand, '%dev', Device); + s := ReplaceStr(s, '%dir', MountPath); + end; + Result := HandleSystemCommand(s, Format(LANGErrorEject, [ANSIToUTF8(MountPath)])); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function HandleLogin(Parent: TComponent; Engine: TPanelEngine; UserName, Password: string): boolean; +var b: boolean; +begin + Result := False; + b := Engine.Login(UserName, Password) = cVFS_OK; + if not b then + repeat + try + FLogin := TFLogin.Create(Parent); + b := FLogin.Run = mbOK; + UserName := FLogin.UserEntry.Text; + Password := FLogin.PasswordEntry.Text; + finally + FLogin.Free; + end; + if not b then Exit; + if b then b := Engine.Login(UserName, Password) = cVFS_OK; + until b; + Result := True; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGetDirSizeThread.Execute; +begin + Result := Engine.GetDirSize(Path); + Finished := True; +end; + +constructor TGetDirSizeThread.Create; +begin + inherited Create(True); + FreeOnTerminate := False; + FCancelled := False; + Finished := False; + Result := -1; +end; + +procedure TGetDirSizeThread.CancelIt; +begin + FCancelled := True; + Engine.BreakProcessing(1); +end; + +procedure GetDirSize(AListView: TGTKListView; Engine: TPanelEngine; DataList: TList; AllItems: boolean); +var t: __time_t; + b: boolean; + FRemoteWait: TFRemoteWait; + + function DoGetDirSizeItem(Index: integer): boolean; + var Item: TGTKListItem; + Data: PDataItem; + APath, s: string; + ASize: Int64; +// List: TList; + Thread: TGetDirSizeThread; + begin + Result := True; + try + Item := AListView.Items[Index]; + if not Assigned(Item) then Exit; + Data := Item.Data; + if (not Assigned(Data)) or (not Data^.IsDir) then Exit; + APath := IncludeTrailingPathDelimiter(Engine.Path) + string(Data^.AName); + +{ List := TList.Create; + Engine.FillDirFiles(APath, List, 1); + DebugWriteListSL(List); } + + Thread := TGetDirSizeThread.Create; + try + Thread.Path := APath; + Thread.Engine := Engine; + Thread.Resume; +// Thread.Execute; + while not Thread.Finished do begin + Sleep(ConstInternalProgressTimer); + if not b and (__time(nil) >= t + 2) then begin + FRemoteWait := TFRemoteWait.Create(Application); +// FRemoteWait.Label2.Visible := False; + FRemoteWait.ParentForm := FMain; + FRemoteWait.ShowModal; + b := True; + end; + Application.ProcessMessages; + if FMainEscPressed or (Assigned(FRemoteWait) and FRemoteWait.Cancelled) then Thread.CancelIt; + end; + ASize := Thread.Result; + finally + Thread.Free; + end; + + if (ASize < 0) or FMainEscPressed or (Assigned(FRemoteWait) and FRemoteWait.Cancelled) then Exit; + Data^.Size := ASize; + s := ANSIToUTF8(FormatSize(ASize, 0)); + Libc.free(Data^.ColumnData[3]); +// Data^.ColumnData[3] := Libc.malloc(Length(s) + 1); +// Libc.memset(Data^.ColumnData[3], 0, Length(s) + 1); + Data^.ColumnData[3] := strdup(PChar(s)); + except end; + end; + + +var i, j: integer; + Data: PDataItem; +begin + t := __time(nil); + b := False; + FRemoteWait := nil; + + if not AllItems then DoGetDirSizeItem(AListView.Selected.Index) else + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do begin + j := AListView.ConvertFromSorted(i); + Data := DataList[j]; + if Data^.IsDir and (not Data^.UpDir) then begin + if not DoGetDirSizeItem(j) then Break; + if FMainEscPressed then Break; + AListView.Items[j].RedrawRow; + end; + end; + if FRemoteWait <> nil then FRemoteWait.Free; + ChDir('/'); +end; + + + +(********************************************************************************************************************************) +constructor TOpenDirThread.Create; +begin + inherited Create(True); + FreeOnTerminate := False; + Finished := False; + CancelIt := False; + ChDirResult := 0; + ListingResult := 0; + VFSOpenResult := 0; + RunningTime := 0; + APlugin := nil; + xEngine := nil; + Password := ''; +end; + +procedure TOpenDirThread.Execute; +var tt: TDateTime; +begin + try +// Writeln('execute.'); + tt := Now; + try +// WriteLn('x1'); + if APlugin <> nil then begin + xEngine := TVFSEngine.Create(APlugin); + xEngine.ParentEngine := AEngine; + xEngine.ArchiveMode := True; + AEngine.LastHighlightItem := AHighlightItem; + xEngine.SavePath := AEngine.Path; + AEngine := xEngine; + if Length(Password) > 0 then (xEngine as TVFSEngine).Password := Password; + VFSOpenResult := (xEngine as TVFSEngine).VFSOpenEx(AFullPath); + end else VFSOpenResult := 0; +// WriteLn('x2'); + + if (VFSOpenResult = 0) and (not CancelIt) then begin +// WriteLn('x3'); + ChDirResult := ChangeDir(AEngine, APath, ASelItem, AAutoFallBack); +// WriteLn('x4'); + + if (ChDirResult = 0) and (not CancelIt) then begin +// WriteLn('x5'); + ListingResult := AEngine.GetListing(ADirList, ConfShowDotFiles); +// WriteLn('x6'); + end; +// WriteLn('x7'); + end; + except + on E: Exception do DebugMsg(['*** TOpenDirThread.Execute -Exception: ', E.Message]); + end; + RunningTime := MilliSecondsBetween(tt, Now); +// WriteLn('x8'); + finally + Finished := True; + end; +{ except + on E: Exception do DebugMsg(['*** Exception raised in TOpenDirThread.Execute (', E.ClassName, '): ', E.Message]); + end; } +end; + +{ destructor TOpenDirThread.Destroy; +begin + if (APlugin <> nil) and (xEngine <> nil) then + try + xEngine.Free; + except + on E: Exception do DebugMsg(['*** TOpenDirThread.Destroy -Exception: ', E.Message]); + end; + inherited Destroy; +end; } + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function PurgeDirectory(APath: string): boolean; +var Handle : PDirectoryStream; + DirEnt : PDirent64; + StatBuf : PGlibc_stat64; + Buf : PChar; +begin + try + Result := True; + APath := IncludeTrailingPathDelimiter(APath); + Handle := Libc.opendir(PChar(APath)); + if not Assigned(Handle) then begin + Result := False; + Exit; + end; + repeat + DirEnt := readdir64(Handle); + if Assigned(DirEnt) and Assigned(PChar(@DirEnt^.d_name[0])) then begin + Buf := Pchar(@DirEnt^.d_name[0]); + if (Buf <> '.') and (Buf <> '..') and (DirEnt^.d_name[0] <> #0) then begin + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(APath + string(Buf)), StatBuf) = 0 then + if __S_ISTYPE(StatBuf.st_mode, __S_IFDIR) + then PurgeDirectory(APath + string(Buf)) + else begin +// DebugMsg(['Removing ', APath + string(Buf)]); + Result := Result and (Libc.remove(PChar(APath + string(Buf))) = 0); + end; + Libc.free(StatBuf); + end; + end; + until DirEnt = nil; + closedir(Handle); +// DebugMsg(['Removing ', ExcludeTrailingPathDelimiter(APath)]); + Result := Result and (Libc.remove(PChar(ExcludeTrailingPathDelimiter(APath))) = 0); + except + on E: Exception do DebugMsg(['*** Exception raised in UCore.PurgeDirectory(APath = ', APath, '): ', E.ClassName, ': ', E.Message]); + end; +end; + +procedure CleanTempDirs; +var i: integer; +begin + try + if Assigned(UsedTempPaths) and (UsedTempPaths.Count > 0) then + for i := 0 to UsedTempPaths.Count - 1 do + DebugMsg(['(II) PurgeDirectory: Cleaning directory "', UsedTempPaths[i], '", Successfull = ', PurgeDirectory(UsedTempPaths[i])]); + UsedTempPaths.Clear; + except + on E: Exception do DebugMsg(['*** Exception raised in UCore.CleanTempDirs (', E.ClassName, '): ', E.Message]); + end; +end; + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + + +initialization + LeftPanelData := TList.Create; + RightPanelData := TList.Create; + LeftLocalEngine := TLocalTreeEngine.Create; + RightLocalEngine := TLocalTreeEngine.Create; + FMainEscPressed := False; + LeftPanelTabs := TStringList.Create; + RightPanelTabs := TStringList.Create; + LeftTabSortIDs := TList.Create; + RightTabSortIDs := TList.Create; + LeftTabSortTypes := TList.Create; + RightTabSortTypes := TList.Create; + MounterList := nil; + ConnectionMgrList := nil; + ConnectionMgrList := TList.Create; + UsedTempPaths := TStringList.Create; + SelectHistory := TStringList.Create; + SearchHistory := TStringList.Create; +finalization + ClearListData(LeftPanelData); + ClearListData(RightPanelData); + LeftPanelTabs.Free; + RightPanelTabs.Free; + LeftTabSortIDs.Free; + RightTabSortIDs.Free; + LeftTabSortTypes.Free; + RightTabSortTypes.Free; + MounterList.Free; + LeftPanelData.Free; + RightPanelData.Free; + AssocList.Free; + ConnectionMgrList.Free; + CleanTempDirs; + UsedTempPaths.Free; + SelectHistory.Free; + SearchHistory.Free; +end. diff --git a/UCoreClasses.pas b/UCoreClasses.pas new file mode 100644 index 0000000..c53289f --- /dev/null +++ b/UCoreClasses.pas @@ -0,0 +1,349 @@ +(* + Tux Commander - UCoreClasses - Some useful core classes + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UCoreClasses; + +interface + +uses gdk2pixbuf, gtk2, gdk2, glib2, SysUtils, Classes, Libc, IniFiles, GTKClasses, GTKStdCtrls, GTKDialogs, GTKPixbuf, UGnome, + UEngines; + +type TUser = class + public + UserName, FullName, HomeDir, LoginShell: string; + UID, GID: Cardinal; + end; + + TGroup = class + public + GroupName: string; + GID: Cardinal; + Users: TStrings; + end; + + TUserManager = class + private + public + UserList, GroupList: TList; + constructor Create; + destructor Destroy; override; + function GetUserName(UID: Cardinal; const ShowNA: boolean = True): string; + function GetGroupName(GID: Cardinal; const ShowNA: boolean = True): string; + end; + + + TMyIniFile = class(TIniFile) + private + FReadOnly: boolean; + public + constructor Create(const FileName: string; const ReadOnly: boolean); + procedure UpdateFile; override; + end; + + TGTKImageButton = class(TGTKButton) + private + FHBox: PGtkWidget; + FLabel: PGtkWidget; + FImage: PGtkWidget; + FEventBoxLeft, FEventBoxRight: PGtkWidget; + function GetCaption: string; + procedure SetCaption(Value: string); + procedure SetIcon(Value: TGDKPixbuf); + procedure SetSpacing(Value: integer); + public + procedure SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); + published + constructor Create(AOwner: TComponent); override; + constructor CreateWithoutLabel(AOwner: TComponent); + property Caption: string read GetCaption write SetCaption; + property Icon: TGDKPixbuf write SetIcon; + property Spacing: integer write SetSpacing; + end; + + TGTKImageToggleButton = class(TGTKToggleButton) + private + FHBox: PGtkWidget; + FLabel: PGtkWidget; + FImage: PGtkWidget; + function GetCaption: string; + procedure SetCaption(Value: string); + procedure SetIcon(Value: TGDKPixbuf); + public + procedure SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); + published + constructor Create(AOwner: TComponent); override; + constructor CreateWithoutLabel(AOwner: TComponent); + property Caption: string read GetCaption write SetCaption; + property Icon: TGDKPixbuf write SetIcon; + end; + + +implementation + +uses GTKForms, GTKUtils, ULocale, UConfig, UCore, UCoreUtils; + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TUserManager.Create; +var pwd: PPasswordRecord; + User: TUser; + grp: PGroup; + Group: TGroup; + i: integer; +begin + inherited Create; + UserList := TList.Create; + GroupList := TList.Create; + // Load and process /etc/passwd + try + setpwent; + pwd := getpwent; + while pwd <> nil do begin + User := TUser.Create; + User.UserName := PgcharToString(pwd^.pw_name); + User.FullName := PgcharToString(pwd^.pw_gecos); + User.HomeDir := PgcharToString(pwd^.pw_dir); + User.LoginShell := PgcharToString(pwd^.pw_shell); + User.UID := pwd^.pw_uid; + User.GID := pwd^.pw_gid; + UserList.Add(User); + pwd := getpwent; + end; + endpwent; + except end; + // Load and process /etc/group + try + setgrent; + grp := getgrent; + while grp <> nil do begin + Group := TGroup.Create; + Group.GroupName := PgcharToString(grp^.gr_name); + Group.GID := grp^.gr_gid; + Group.Users := TStringList.Create; + {$R-} + if grp^.gr_mem^ <> nil then begin + i := 0; + repeat + Group.Users.Add(PgcharToString(PCharArray(grp^.gr_mem^)[i])); + Inc(i); + until PCharArray(grp^.gr_mem^)[i] = nil; + end; + {$R+} + GroupList.Add(Group); + grp := getgrent; + end; + endgrent; + except end; +end; + +destructor TUserManager.Destroy; +var i: integer; +begin + if UserList.Count > 0 then + for i := UserList.Count - 1 downto 0 do begin + TUser(UserList[i]).Free; + UserList.Delete(i); + end; + UserList.Clear; + UserList.Free; + if GroupList.Count > 0 then + for i := GroupList.Count - 1 downto 0 do begin + TGroup(GroupList[i]).Users.Clear; + TGroup(GroupList[i]).Users.Free; + TGroup(GroupList[i]).Free; + GroupList.Delete(i); + end; + GroupList.Clear; + GroupList.Free; + inherited Destroy; +end; + +function TUserManager.GetUserName(UID: Cardinal; const ShowNA: boolean = True): string; +var i: integer; +begin + if ShowNA then Result := 'N/A' + else Result := IntToStr(UID); + if UserList.Count > 0 then + for i := 0 to UserList.Count - 1 do + if TUser(UserList[i]).UID = UID then begin + Result := TUser(UserList[i]).UserName; + Break; + end; +end; + +function TUserManager.GetGroupName(GID: Cardinal; const ShowNA: boolean = True): string; +var i: integer; +begin + if ShowNA then Result := 'N/A' + else Result := IntToStr(GID); + if GroupList.Count > 0 then + for i := 0 to GroupList.Count - 1 do + if TGroup(GroupList[i]).GID = GID then begin + Result := TGroup(GroupList[i]).GroupName; + Break; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TMyIniFile.Create(const FileName: string; const ReadOnly: boolean); +begin + FReadOnly := ReadOnly; + inherited Create(FileName); +end; + +procedure TMyIniFile.UpdateFile; +begin + if not FReadOnly then inherited UpdateFile; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKImageButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_button_new; + FLabel := gtk_label_new(''); + FImage := gtk_image_new; + FHBox := gtk_hbox_new(False, 2); + FEventBoxLeft := gtk_vbox_new(false, 0); + FEventBoxRight := gtk_vbox_new(false, 0); + gtk_box_pack_start(PGtkBox(FHBox), FEventBoxLeft, False, False, 0); + gtk_box_pack_start(PGtkBox(FHBox), FImage, False, False, 0); + gtk_box_pack_start(PGtkBox(FHBox), FLabel, True, True, 0); + gtk_box_pack_start(PGtkBox(FHBox), FEventBoxRight, False, False, 0); + gtk_container_add(PGtkContainer(FWidget), FHBox); + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGTKButton_OnClick), Self); + gtk_widget_show(FLabel); + gtk_widget_show(FImage); + gtk_widget_show(FHBox); + gtk_widget_show(FEventBoxLeft); + gtk_widget_show(FEventBoxRight); + Show; +end; + +constructor TGTKImageButton.CreateWithoutLabel(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_button_new; + FLabel := gtk_label_new(''); + FImage := gtk_image_new; + FHBox := gtk_hbox_new(False, 2); + FEventBoxLeft := gtk_vbox_new(false, 0); + FEventBoxRight := gtk_vbox_new(false, 0); + gtk_box_pack_start(PGtkBox(FHBox), FEventBoxLeft, False, False, 0); + gtk_box_pack_start(PGtkBox(FHBox), FImage, False, False, 0); + gtk_box_pack_start(PGtkBox(FHBox), FEventBoxRight, False, False, 0); + gtk_container_add(PGtkContainer(FWidget), FHBox); + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGTKButton_OnClick), Self); + gtk_widget_show(FLabel); + gtk_widget_show(FImage); + gtk_widget_show(FHBox); + gtk_widget_show(FEventBoxLeft); + gtk_widget_show(FEventBoxRight); + Show; +end; + +function TGTKImageButton.GetCaption: string; +begin + Result := gtk_label_get_text(PGtkLabel(FLabel)); +end; + +procedure TGTKImageButton.SetCaption(Value: string); +begin + gtk_label_set_text_with_mnemonic(PGtkLabel(FLabel), PChar(Value)); +end; + +procedure TGTKImageButton.SetIcon(Value: TGDKPixbuf); +begin + if Assigned(Value) and Assigned(Value.FPixbuf) then + gtk_image_set_from_pixbuf(PGtkImage(FImage), Value.FPixbuf); +end; + +procedure TGTKImageButton.SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); +begin + gtk_image_set_from_stock(PGtkImage(FImage), PChar(Stock_ID), Ord(IconSize)); +end; + +procedure TGTKImageButton.SetSpacing(Value: integer); +begin + gtk_widget_set_size_request(FEventBoxLeft, Value, -1); + gtk_widget_set_size_request(FEventBoxRight, Value, -1); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKImageToggleButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_toggle_button_new; + FLabel := gtk_label_new(''); + FImage := gtk_image_new; + FHBox := gtk_hbox_new(False, 2); + gtk_box_pack_start(PGtkBox(FHBox), FImage, False, False, 0); + gtk_box_pack_start(PGtkBox(FHBox), FLabel, True, True, 0); + gtk_container_add(PGtkContainer(FWidget), FHBox); + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGTKButton_OnClick), Self); + gtk_widget_show(FLabel); + gtk_widget_show(FImage); + gtk_widget_show(FHBox); + Show; +end; + +constructor TGTKImageToggleButton.CreateWithoutLabel(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_button_new; + FLabel := gtk_label_new(''); + FImage := gtk_image_new; + gtk_container_add(PGtkContainer(FWidget), FImage); + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGTKButton_OnClick), Self); + gtk_widget_show(FLabel); + gtk_widget_show(FImage); + Show; +end; + +function TGTKImageToggleButton.GetCaption: string; +begin + Result := gtk_label_get_text(PGtkLabel(FLabel)); +end; + +procedure TGTKImageToggleButton.SetCaption(Value: string); +begin + gtk_label_set_text(PGtkLabel(FLabel), PChar(Value)); +end; + +procedure TGTKImageToggleButton.SetIcon(Value: TGDKPixbuf); +begin + if Assigned(Value) and Assigned(Value.FPixbuf) then + gtk_image_set_from_pixbuf(PGtkImage(FImage), Value.FPixbuf); +end; + +procedure TGTKImageToggleButton.SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); +begin + gtk_image_set_from_stock(PGtkImage(FImage), PChar(Stock_ID), Ord(IconSize)); +end; + +(********************************************************************************************************************************) + + +end. diff --git a/UCoreUtils.pas b/UCoreUtils.pas new file mode 100644 index 0000000..0e12550 --- /dev/null +++ b/UCoreUtils.pas @@ -0,0 +1,1821 @@ +(* + Tux Commander - UCoreUtils - Some other useful core functions + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + Portions of this unit (CRC32, THash_MD5) are part of the Delphi Encryption Compendium + Copyright: Hagen Reddmann mailto:HaReddmann@AOL.COM + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UCoreUtils; + +interface + +uses gdk2pixbuf, gtk2, gdk2, glib2, SysUtils, Classes, Libc, GTKControls, GTKStdCtrls, GTKClasses, UEngines; + +type + PIntArray = ^TIntArray; + TIntArray = array[0..1023] of LongWord; + + TOpenStringArray = array of string; + + THash_MD5 = class + private + FCount: Int64; + FBuffer: array[0..63] of Byte; + FDigest: array[0..9] of LongWord; + protected + function TestVector: Pointer; + procedure Transform(Buffer: PIntArray); + public + constructor Create; + procedure Init; + procedure Done; + procedure Calc(const Data; DataSize: Integer); + function DigestKey: string; + function GetKeyStrH: string; + end; + + +const ConstERRSpawn = 26; + ConstQuotationCharacters = [' ', '"', '''', '(', ')', ':', '&']; + +function GetErrorString(ErrorNo: integer): string; +function GetSignalString(SignalNo: integer): string; + +function UnixTimeToTDateTime(UnixTime: Int64): TDateTime; +function FormatSize(Value: Int64; Base: integer): string; + +function AttrToStr(const Mode: Cardinal; IncludeFileType: boolean = True): string; +function AttrToOctal(const Mode: Cardinal): integer; +function OctalToAttr(Octal: Cardinal): Cardinal; +{ Convert an octal specified number to decimal } +{ Copied from linux.pp (Free Pascal run time library) - Copyright (c) 1999-2000 by Michael Van Canneyt, BSD parts (c) 2000 by Marco van de Voort, members of the Free Pascal development team } + +function PosEnd(Substr: string; S: string): Integer; +function GetHomePath: string; +function GetUserName: string; +function GetHostName: string; +procedure SeparateExt(const Original: string; var Name, Ext: string); +procedure SeparateNameDir(Original: string; var Path, FileName: string); +function PadRightStr(const Str: string; Len: byte): string; + +function IsWild(InputStr, Wilds: string; IgnoreCase: Boolean): Boolean; +{ IsWild compares InputString with WildCard string and returns True if corresponds. } +{ Copied from Delphi VCL Extensions (RX) - Copyright (c) 1995, 1996 AO ROSNO, Copyright (c) 1997, 1998 Master-Bank } +function ReplaceStr(const S, Srch, Replace: string): string; +{ Returns string with every occurrence of Srch string replaced with Replace string. } +{ Copied from Delphi VCL Extensions (RX) - Copyright (c) 1995, 1996 AO ROSNO, Copyright (c) 1997, 1998 Master-Bank } +function NumCountChars(const Char: char; const S: string): integer; + +procedure ParseString(const Str, Separator: string; var SubStrings: TOpenStringArray); + + +function ProcessPattern(Engine: TPanelEngine; Pattern, APath, FileName: string; const Directory: boolean): string; +// Processess pattern with FileName located in APath and return destination path+filename +procedure ShowAbout; + +procedure TrimCRLFESC(var s: string); +procedure TrimQuotes(var s: string); +function QuoteStr(const Str: string): string; +function QuoteMarkupStr(const Str: string): string; +function QuotePercentStr(const Str: string): string; +function RemoveQuotation(const Str: string): string; +function GetStrSize(s: string): Int64; +procedure DebugMsg(Params: array of const); +function SpawnProcess(const AppPath: string; var Running: boolean; const Parameters: array of string): Cardinal; +function ExecuteProgram(const AppCMDLine, CWD: string; const AutodetectGUI, RunInTerminal: boolean; var ErrorSignal: integer): boolean; +function IsItX11App(const Application: string): boolean; +function HandleSystemCommand(const Command, ErrorText: string): boolean; + +function CompareTextsEx(S1, S2: PChar): integer; +function LVCompareItems(Data1, Data2: PDataItem; const Ascending: boolean; const SortColumnID: integer): integer; +procedure SortDataList(var List: TList; const Ascending: boolean; const SortColumnID: integer); +procedure GetFirstLastPanelColumn(var FirstColumn, LastColumn: integer); + +procedure SetupColors; + +function ConstructURI(HidePasswd: boolean; Protocol, Server, Username, Password, Dir: string): string; +function URIHidePassword(const SrcURI: string): string; + +{$IFDEF __FPC__} +function StrToDateDef(const S: string; const Default: TDateTime): TDateTime; +function UnixToDateTime(const AValue: Int64): TDateTime; +{$ENDIF} + +procedure SaveItemToHistory(s: string; History: TStringList); + + + + +// Calculate CRC32 Checksum, CRC is default $FFFFFFFF, +// After calc you must inverse Result with NOT +function CRC32(CRC: LongWord; Data: Pointer; DataSize: LongWord): LongWord; + +procedure ReportGTKVersion; + +// Internal locking +procedure InternalLock; +procedure InternalUnLock; +function InternalLockUnlocked: boolean; +procedure InternalLockInit(Locked: boolean); + +var ChildExitStatus: sig_atomic_t; + + AppPath, IconPath: string; // Used in UFileTypeSettings + + NormalItemGDKColor, ActiveItemGDKColor, InactiveItemGDKColor, SelectedItemGDKColor, DotFileItemGDKColor, LinkItemGDKColor, + NormalItemGDKBackground, ActiveItemGDKBackground, InactiveItemGDKBackground: PGdkColor; + InactiveItemBGColorNum: LongWord; + + +implementation + +uses DateUtils, GTKForms, GTKUtils, GTKView, ULocale, UConfig, UCore, UGnome, UMain; + +(********************************************************************************************************************************) +function GetErrorString(ErrorNo: integer): string; +begin + if ErrorNo >= 0 then Result := String(strerror(ErrorNo)) + else + case ErrorNo of + ERRException : Result := LANGUnknownException; + ERRNoAccess : Result := LANGNoAccess; + else Result := LANGUnknownError; + end; +end; + +(********************************************************************************************************************************) +function GetSignalString(SignalNo: integer): string; +begin + Result := strsignal(SignalNo); +end; + +(********************************************************************************************************************************) +function UnixTimeToTDateTime(UnixTime: Int64): TDateTime; +//var tm : PUnixTime; +begin + Result := UnixToDateTime(UnixTime); +{ tm := localtime(@UnixTime); + Result := EncodeDate(tm^.tm_year + 1900, tm^.tm_mon + 1, tm^.tm_mday) + + EncodeTime(tm^.tm_hour, tm^.tm_min, tm^.tm_sec, 0); } +end; + +(********************************************************************************************************************************) +function FormatFloat64(Value: Int64; Sep: string): string; +var i : integer; + Orig : string; +begin + Result := IntToStr(Value); + Orig := Result; + if (Sep <> '') and (Length(Result) > 2) then + for i := Length(Result) downto 2 do + if (Length(Orig) - i + 1) mod 3 = 0 then + Insert(Sep, Result, i); +end; + +function FormatSize(Value: Int64; Base: integer): string; +var s: string; + i: integer; +begin + if Base < 1 then Base := 1; + case ConfSizeFormat of + 0 : begin // System default formatting + Result := FormatFloat('###,###,##0', Value div Base); + end; + 1 : begin // 123456 + Result := IntToStr(Value div Base); + end; + 2 : begin // 123,456 + Result := FormatFloat64(Value div Base, ','); + end; + 3 : begin // 123 456 + Result := FormatFloat64(Value div Base, ' '); + end; + 4 : begin // 123'456 + Result := FormatFloat64(Value div Base, ''''); + end; + 5 : begin // 123kB - Grouped + s := '###,###,##0'; + if ConfSizeGroupPrecision > 0 then begin + s := s + '.'; + for i := 1 to ConfSizeGroupPrecision do + if ConfSizeGroupRequestZeroDigits then s := s + '0' + else s := s + '#'; + end; + if (Value >= 1024*1024*1024) or (Base = 1024*1024*1024) then Result := FormatFloat(s + ' GB', Value / (1024*1024*1024)) else + if (Value >= 1024*1024) or (Base = 1024*1024) then Result := FormatFloat(s + ' MB', Value / (1024*1024)) else + if (Value >= 1024) or (Base = 1024) then Result := FormatFloat(s + ' kB', Value / (1024)) else + Result := IntToStr(Value); + end; + end; + if ConfSizeFormat in [0..4] then begin + if Result = '' then Result := '0'; + if Base = 1024 then Result := Result + ' kB' else + if Base = 1024*1024 then Result := Result + ' MB' else + if Base = 1024*1024*1024 then Result := Result + ' GB'; + end; + if Result = '' then Result := '0'; +end; + +(********************************************************************************************************************************) +function AttrToStr(const Mode: Cardinal; IncludeFileType: boolean = True): string; +begin + if IncludeFileType then begin + if __S_ISTYPE(Mode, __S_IFLNK) then Result := 'l' else + if __S_ISTYPE(Mode, __S_IFDIR) then Result := 'd' else + if __S_ISTYPE(Mode, __S_IFBLK) then Result := 'b' else + if __S_ISTYPE(Mode, __S_IFCHR) then Result := 'c' else + if __S_ISTYPE(Mode, __S_IFIFO) then Result := 'f' else + if __S_ISTYPE(Mode, __S_IFSOCK) then Result := 's' else Result := '-'; + end else Result := ''; + if Mode and S_IRUSR = S_IRUSR then Result := Result + 'r' else Result := Result + '-'; + if Mode and S_IWUSR = S_IWUSR then Result := Result + 'w' else Result := Result + '-'; + if Mode and __S_ISUID = __S_ISUID then if Mode and S_IXUSR = S_IXUSR then Result := Result + 's' else Result := Result + 'S' else + if Mode and S_IXUSR = S_IXUSR then Result := Result + 'x' else Result := Result + '-'; + if Mode and S_IRGRP = S_IRGRP then Result := Result + 'r' else Result := Result + '-'; + if Mode and S_IWGRP = S_IWGRP then Result := Result + 'w' else Result := Result + '-'; + if Mode and __S_ISGID = __S_ISGID then if Mode and S_IXGRP = S_IXGRP then Result := Result + 's' else Result := Result + 'S' else + if Mode and S_IXGRP = S_IXGRP then Result := Result + 'x' else Result := Result + '-'; + if Mode and S_IROTH = S_IROTH then Result := Result + 'r' else Result := Result + '-'; + if Mode and S_IWOTH = S_IWOTH then Result := Result + 'w' else Result := Result + '-'; + if Mode and __S_ISVTX = __S_ISVTX then if Mode and S_IXOTH = S_IXOTH then Result := Result + 't' else Result := Result + 'T' else + if Mode and S_IXOTH = S_IXOTH then Result := Result + 'x' else Result := Result + '-'; +end; + +(********************************************************************************************************************************) +function AttrToOctal(const Mode: Cardinal): integer; +var x, Mult: Cardinal; +begin + Result := 0; + Mult := 1; + x := Mode; + while x > 0 do begin + Result := Result + Integer((x mod 8) * Mult); + x := x div 8; + Mult := Mult * 10; + end; +end; + +(********************************************************************************************************************************) +function OctalToAttr(Octal: Cardinal): Cardinal; +var octnr, oct : Cardinal; +begin + octnr := 0; + oct := 0; + while (Octal > 0) do begin + oct := oct or ((Octal mod 10) shl octnr); + Octal := Octal div 10; + inc(octnr, 3); + end; + Result := oct; +end; + +(********************************************************************************************************************************) +function PosEnd(Substr: string; S: string): Integer; +var i : integer; +begin + Result := 0; + if (Length(Trim(S)) < 1) or (Length(Trim(Substr)) < 1) or (Length(Trim(Substr)) > Length(Trim(S))) then Exit; + for i := Length(S) - Length(SubStr) downto 1 do + if Copy(s, i, Length(Substr)) = SubStr then begin + Result := i; + Break; + end; +end; + +(********************************************************************************************************************************) +function GetHomePath: string; +begin + Result := PgcharToString(g_get_home_dir); +end; + +(********************************************************************************************************************************) +function GetUserName: string; +begin + Result := PgcharToString(g_get_user_name); +end; + +(********************************************************************************************************************************) +function GetHostName: string; +var s: PChar; +begin + s := Libc.malloc(65536); + Libc.memset(s, 0, 65536); + Libc.gethostname(s, 65536); + Result := PgcharToString(strdup(s)); + Libc.free(s); +end; + +(********************************************************************************************************************************) +procedure SeparateExt(const Original: string; var Name, Ext: string); +var j: integer; +begin + Ext := ''; + Name := Original; + if {(Pos('.', Original) > 1) and } (Length(Original) > 2) then begin + j := LastDelimiter('.', Original); + if (j > 1) and (j < Length(Original)) then begin + Ext := Copy(Original, j + 1, Length(Original) - j); + Delete(Name, j, Length(Name) - j + 1); + end; + end; +end; + +(********************************************************************************************************************************) +procedure SeparateNameDir(Original: string; var Path, FileName: string); +var j: integer; +begin + Original := ExcludeTrailingPathDelimiter(Original); + Path := Original; + FileName := ''; + if (Pos('/', Original) > 0) and (Length(Original) > 2) then begin + j := LastDelimiter('/', Original); + if j > 0 then begin + FileName := Copy(Original, j + 1, Length(Original) - j); + Delete(Path, j, Length(Original) - j + 1); + end; + end; +end; + +(********************************************************************************************************************************) +function PadRightStr(const Str: string; Len: byte): string; +var i: integer; +begin + Result := Str; + for i := 1 to Len - Length(Str) do Insert(' ', Result, 1); +end; + +(********************************************************************************************************************************) +function SearchNext(var Wilds: string): Integer; + +{ looking for next *, returns position and string until position } +begin + Result := Pos('*', Wilds); + if Result > 0 then Wilds := Copy(Wilds, 1, Result - 1); +end; + + +function FindPart(const HelpWilds, InputStr: string): Integer; + +{ FindPart compares a string with '?' and another, returns the position of HelpWilds in InputStr. } +var + I, J: Integer; + Diff: Integer; +begin + I := Pos('?', HelpWilds); + if I = 0 then begin + { if no '?' in HelpWilds } + Result := Pos(HelpWilds, InputStr); + Exit; + end; + { '?' in HelpWilds } + Diff := Length(InputStr) - Length(HelpWilds); + if Diff < 0 then begin + Result := 0; + Exit; + end; + { now move HelpWilds over InputStr } + for I := 0 to Diff do begin + for J := 1 to Length(HelpWilds) do begin + if (InputStr[I + J] = HelpWilds[J]) or + (HelpWilds[J] = '?') then + begin + if J = Length(HelpWilds) then begin + Result := I + 1; + Exit; + end; + end + else Break; + end; + end; + Result := 0; +end; + + +function IsWild(InputStr, Wilds: string; IgnoreCase: Boolean): Boolean; + +var + CWild, CInputWord: Integer; { counter for positions } + I, LenHelpWilds: Integer; + MaxInputWord, MaxWilds: Integer; { Length of InputStr and Wilds } + HelpWilds: string; +begin + if Wilds = InputStr then begin + Result := True; + Exit; + end; + repeat { delete '**', because '**' = '*' } + I := Pos('**', Wilds); + if I > 0 then + Wilds := Copy(Wilds, 1, I - 1) + '*' + Copy(Wilds, I + 2, MaxInt); + until I = 0; + if (Wilds = '*') or (Wilds = '*.*') then begin { for fast end, if Wilds only '*' } + Result := True; + Exit; + end; + MaxInputWord := Length(InputStr); + MaxWilds := Length(Wilds); + if IgnoreCase then begin { upcase all letters } + InputStr := AnsiUpperCase(InputStr); + Wilds := AnsiUpperCase(Wilds); + end; + if (MaxWilds = 0) or (MaxInputWord = 0) then begin + Result := False; + Exit; + end; + CInputWord := 1; + CWild := 1; + Result := True; + repeat + if InputStr[CInputWord] = Wilds[CWild] then begin { equal letters } + { goto next letter } + Inc(CWild); + Inc(CInputWord); + Continue; + end; + if Wilds[CWild] = '?' then begin { equal to '?' } + { goto next letter } + Inc(CWild); + Inc(CInputWord); + Continue; + end; + if Wilds[CWild] = '*' then begin { handling of '*' } + HelpWilds := Copy(Wilds, CWild + 1, MaxWilds); + I := SearchNext(HelpWilds); + LenHelpWilds := Length(HelpWilds); + if I = 0 then begin + { no '*' in the rest, compare the ends } + if HelpWilds = '' then Exit; { '*' is the last letter } + { check the rest for equal Length and no '?' } + {$R-} + for I := 0 to LenHelpWilds - 1 do begin + if (HelpWilds[LenHelpWilds - I] <> InputStr[MaxInputWord - I]) and + (HelpWilds[LenHelpWilds - I]<> '?') then + begin + Result := False; + Exit; + end; + end; + {$R+} + Exit; + end; + { handle all to the next '*' } + Inc(CWild, 1 + LenHelpWilds); + I := FindPart(HelpWilds, Copy(InputStr, CInputWord, MaxInt)); + if I = 0 then begin + Result := False; + Exit; + end; + CInputWord := I + LenHelpWilds; + Continue; + end; + Result := False; + Exit; + until (CInputWord > MaxInputWord) or (CWild > MaxWilds); + { no completed evaluation } + if CInputWord <= MaxInputWord then Result := False; + if (CWild <= MaxWilds) and (Wilds[MaxWilds] <> '*') then Result := False; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + +(********************************************************************************************************************************) +type TPatternCacheItem = record + Pattern, APath, FileName: string; + DirDidNotExist: boolean; + end; + +var PatternCache : array of TPatternCacheItem; + +function ProcessPattern(Engine: TPanelEngine; Pattern, APath, FileName: string; const Directory: boolean): string; +var Path : string; + + procedure ProcessParam(const Part: string); + begin + // Check for upper directory + if (Length(Part) >= 2) and (Copy(Part, 1, 2) = '..') then begin + if (Path <> '/') and (LastDelimiter('/', Path) > 1) then begin + Path := ExcludeTrailingPathDelimiter(Path); + Delete(Path, LastDelimiter('/', Path), Length(Path) - LastDelimiter('/', Path) + 1); + Path := IncludeTrailingPathDelimiter(Path); + end; + end else + if Part = '.' then begin end else // On current dir ('.') do nothing + // Add directory + Path := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(Path) + Part); + end; + + function ProcessPart(WildPart, FilePart: string): string; + var i, j, CWild, CInputWord, MaxInputWord, MaxWilds, LenHelpWilds: integer; + HelpWilds, s: string; + begin + Result := ''; + if (WildPart = '*') or (Length(WildPart) = 0) then Result := FilePart else + if LastDelimiter('*?', WildPart) = 0 then Result := WildPart else + begin + repeat { delete '**', because '**' = '*' } + I := Pos('**', WildPart); + if I > 0 then WildPart := Copy(WildPart, 1, I - 1) + '*' + Copy(WildPart, I + 2, MaxInt); + until I = 0; + MaxInputWord := Length(FilePart); + MaxWilds := Length(WildPart); + CInputWord := 1; + CWild := 1; + repeat + if not (WildPart[CWild] in ['?', '*']) then begin + Result := Result + WildPart[CWild]; + if WildPart[CWild] = FilePart[CInputWord] then Inc(CInputWord); + Inc(CWild); + Continue; + end; + if WildPart[CWild] = '?' then begin + if Length(FilePart) <= CWild then Result := Result + FilePart[CWild]; + Inc(CWild); + if Length(FilePart) < CWild then Inc(CInputWord); + Continue; + end; + if WildPart[CWild] = '*' then begin { handling of '*' } + HelpWilds := Copy(WildPart, CWild + 1, MaxWilds); + I := SearchNext(HelpWilds); + LenHelpWilds := Length(HelpWilds); + if (I = 0) and (HelpWilds = '') then begin + { no '*' in the rest, compare the ends } + Result := Result + Copy(FilePart, CInputWord, MaxInputWord - CInputWord + 1); + Break; { '*' is the last letter } + end; + if (I = 0) and (Pos('?', HelpWilds) = 0) then begin + Result := Result + Copy(FilePart, CInputWord, MaxInputWord - CInputWord + 1) + HelpWilds; + Break; + end; + s := Copy(FilePart, CInputWord, MaxInputWord - CInputWord + 1); + i := FindPart(HelpWilds, s); + if i = 0 then Result := Result + HelpWilds else + begin + for j := 1 to Length(HelpWilds) do + if HelpWilds[j] = '?' then HelpWilds[j] := s[j - 1 + i]; + Result := Result + Copy(s, 1, i + Length(HelpWilds) - 1); + Inc(CInputWord, i + LenHelpWilds - 1); + end; + Inc(CWild, 1 + LenHelpWilds); + Continue; + end; + Break; + until (CInputWord > MaxInputWord) or (CWild > MaxWilds); + end; + end; + + function ProcessWilds(WildStr, AFile: string): string; + var i, j, WPC, FPC: integer; + DotFile: boolean; + begin + if (WildStr = '*.*') or (WildStr = '') then Result := AFile else + if WildStr = '*' then begin + if (Pos('.', AFile) = 0) or (Copy(AFile, 1, 1) = '.') then Result := AFile else + Result := Copy(AFile, 1, LastDelimiter('.', AFile) - 1); + end else begin + Result := ''; + DotFile := False; + if (Length(AFile) > 0) and (AFile[1] = '.') then begin + DotFile := True; + Delete(AFile, 1, 1); + end; + // Trim redundant parameters + WPC := 0; + for i := 1 to Length(WildStr) do if WildStr[i] = '.' then Inc(WPC); + FPC := 0; + for i := 1 to Length(AFile) do if AFile[i] = '.' then Inc(FPC); + if WPC > FPC then + for j := 1 to WPC - FPC do begin + Result := '.' + Copy(WildStr, LastDelimiter('.', WildStr) + 1, Length(WildStr) - LastDelimiter('.', WildStr)) + Result; + Delete(WildStr, LastDelimiter('.', WildStr), Length(WildStr) - LastDelimiter('.', WildStr) + 1); + end; + // Going processing + while (LastDelimiter('.', WildStr) > 0) and (LastDelimiter('.', AFile) > 0) do begin + Result := '.' + ProcessPart(Copy(WildStr, LastDelimiter('.', WildStr) + 1, Length(WildStr) - LastDelimiter('.', WildStr)), + Copy(AFile, LastDelimiter('.', AFile) + 1, Length(AFile) - LastDelimiter('.', AFile))) + Result; + Delete(WildStr, LastDelimiter('.', WildStr), Length(WildStr) - LastDelimiter('.', WildStr) + 1); + Delete(AFile, LastDelimiter('.', AFile), Length(AFile) - LastDelimiter('.', AFile) + 1); + end; + if WildStr <> '' then Result := ProcessPart(WildStr, AFile) + Result; + if DotFile then Result := '.' + Result; + end; + // Trim unwanted characters + if Length(Result) > 0 then + for i := 1 to Length(Result) do + if Result[i] in ['*', '?', '/'] then Result[i] := '_'; + end; + + function FindInCache: integer; + var i: integer; + begin + Result := -1; + if LengtH(PatternCache) > 0 then + for i := 0 to Length(PatternCache) - 1 do + if (PatternCache[i].Pattern = Pattern) and (PatternCache[i].APath = APath) and (Pos(PatternCache[i].FileName, FileName) = 1) then + begin + Result := i; + Break; + end; + end; + + function CaseDirExists(DPath, DFileName: string): boolean; + begin + if (AnsiCompareStr(Pattern, FileName) <> 0) and (AnsiCompareText(Pattern, FileName) = 0) and Directory and + Engine.TwoSameFiles(DPath + Pattern, DPath + FileName) + then Result := False + else Result := Engine.DirectoryExists(DPath + DFileName); + end; + + + + +var s: string; + x: integer; +begin + Result := ''; + if Pattern = '' then Exit; + // Select basic directory + case Pattern[1] of + '/' : begin + Path := '/'; + if Length(Pattern) > 1 then Delete(Pattern, 1, 1); + end; + '~' : begin + Path := IncludeTrailingPathDelimiter(GetHomePath); + Delete(Pattern, 1, 1); + end; + else Path := IncludeTrailingPathDelimiter(APath); + end; + // Process directories in pattern + while Pos('/', Pattern) > 0 do begin + s := Copy(Pattern, 1, Pos('/', Pattern) - 1); + Delete(Pattern, 1, Pos('/', Pattern)); + ProcessParam(s); + end; + // Add rest of pattern parts + if (Pos('?', Pattern) = 0) and (Pos('*', Pattern) = 0) then begin + if (Pattern <> '.') and (Pattern <> '..') and (not CaseDirExists(IncludeTrailingPathDelimiter(Path), Pattern)) then begin + if Directory then Path := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(Path) + Pattern) + else Path := ExcludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(Path) + Pattern); + SetLength(PatternCache, Length(PatternCache) + 1); + PatternCache[Length(PatternCache) - 1].Pattern := Pattern; + PatternCache[Length(PatternCache) - 1].APath := APath; + PatternCache[Length(PatternCache) - 1].FileName := FileName; + end else begin + if Length(Pattern) > 0 then ProcessParam(Pattern); + x := FindInCache; + if x < 0 then begin + Path := IncludeTrailingPathDelimiter(Path) + FileName; + end else begin + Delete(FileName, 1, Length(IncludeTrailingPathDelimiter(PatternCache[x].FileName))); + Path := IncludeTrailingPathDelimiter(Path) + FileName; + end; + if Directory then Path := IncludeTrailingPathDelimiter(Path) + else Path := ExcludeTrailingPathDelimiter(Path); + end; + end else Path := Path + ProcessWilds(Pattern, FileName); + + Result := Path; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure ShowAbout; +const Authors : array[0..1] of PChar = ('Tomáš Bžatek ', nil); + Translations : PChar = 'Tomáš Bžatek - English, Czech'#10 + + 'Maxim Baranov - Russian'#10 + + 'Sven Laufersweiler - German'#10 + + 'Johan Åkesson - Swedish'#10 + + 'Marie-Agnès Pauchet-Le Héricy - French'#10 + + 'Daniel Areiza - Spanish'#10 + + 'Dominik Zabłotny - Polish'#10 + + 'Serhij Dubyk - Ukrainian'#10 + + 'Bojan Božović - Serbian'#10 + + 'Marián Képesi - Hungarian'#10 + + 'Francesco Turco - Italian'; +var AboutBox: PGtkWidget; +begin + if (libGnomeUI2Handle = nil) or (@gnome_about_new = nil) + then Application.MessageBox(Format(LANGAboutString, [ConstAboutVersion, ConstAboutBuildDate])) + else begin + AboutBox := gnome_about_new('Tux Commander', nil, 'Copyright © 2008 Tomáš Bžatek', + PChar(Format(LANGAboutStringGnome, [ConstAboutVersion, ConstAboutBuildDate])), + @Authors, nil, Translations, nil); + gtk_window_set_transient_for(GTK_WINDOW(AboutBox), GTK_WINDOW(FMain.FWidget)); + gtk_dialog_run(GTK_DIALOG(AboutBox)); + end; +end; + +(********************************************************************************************************************************) +procedure TrimCRLFESC(var s: string); +begin + while (Length(s) > 0) and (s[1] in [#13, #10, #27]) do Delete(s, 1, 1); + while (Length(s) > 0) and (s[Length(s)] in [#13, #10, #27]) do Delete(s, Length(s), 1); +end; + +(********************************************************************************************************************************) +procedure TrimQuotes(var s: string); +begin + while (Length(s) > 0) and (s[1] in ['"', '''']) do Delete(s, 1, 1); + while (Length(s) > 0) and (s[Length(s)] in ['"', '''']) do Delete(s, Length(s), 1); +end; + +(********************************************************************************************************************************) +function QuoteStr(const Str: string): string; +var i: integer; +begin + Result := ''; + if Length(Str) > 0 then + for i := 1 to Length(Str) do begin + if Str[i] in ConstQuotationCharacters then Result := Result + '\'; + Result := Result + Str[i]; + end; +end; + +(********************************************************************************************************************************) +function QuotePercentStr(const Str: string): string; +var i: integer; +begin + Result := ''; + if Length(Str) > 0 then + for i := 1 to Length(Str) do begin + if Str[i] = '%' then Result := Result + '%'; + Result := Result + Str[i]; + end; +end; + +(********************************************************************************************************************************) +function QuoteMarkupStr(const Str: string): string; +var i: integer; +begin + Result := ''; + if Length(Str) > 0 then + for i := 1 to Length(Str) do begin + if Str[i] = '<' then Result := Result + '<' else + if Str[i] = '>' then Result := Result + '>' else + if Str[i] = '&' then Result := Result + '&' else +// if Str[i] = '_' then Result := Result + '__' else + Result := Result + Str[i]; + end; +end; + +(********************************************************************************************************************************) +function RemoveQuotation(const Str: string): string; +var b: boolean; + i: integer; +begin + Result := Str; + if Length(Result) < 2 then Exit; + b := True; + for i := 2 to Length(Result) do + if (Result[i] in ConstQuotationCharacters) and (Result[i - 1] <> '\') then b := False; + if b then for i := Length(Result) downto 2 do + if (Result[i] in ConstQuotationCharacters) and (Result[i - 1] = '\') then Delete(Result, i - 1, 1); +end; + +(********************************************************************************************************************************) +function ReplaceStr(const S, Srch, Replace: string): string; +var + I: Integer; + Source: string; +begin + Source := S; + Result := ''; + repeat + I := Pos(Srch, Source); + if I > 0 then begin + Result := Result + Copy(Source, 1, I - 1) + Replace; + Source := Copy(Source, I + Length(Srch), MaxInt); + end + else Result := Result + Source; + until I <= 0; +end; + +(********************************************************************************************************************************) +function NumCountChars(const Char: char; const S: string): integer; +var i: integer; +begin + Result := 0; + if Length(S) > 0 then + for i := 1 to Length(S) do + if S[i] = Char then Inc(Result); +end; + +(********************************************************************************************************************************) +procedure ParseString(const Str, Separator: string; var SubStrings: TOpenStringArray); +var s: string; + i: integer; +begin + s := Str; + while Pos(Separator, s) > 0 do begin + i := Pos(Separator, s); + SetLength(SubStrings, Length(SubStrings) + 1); + SubStrings[Length(SubStrings) - 1] := Copy(s, 1, i - 1); + Delete(s, 1, i); + end; + if Length(s) > 0 then begin // Add the last element + SetLength(SubStrings, Length(SubStrings) + 1); + SubStrings[Length(SubStrings) - 1] := s; + end; +end; + +(********************************************************************************************************************************) +function GetStrSize(s: string): Int64; +var i: integer; + x: Double; + b: boolean; +begin + Result := 0; + x := 0; + s := AnsiUpperCase(Trim(s)); + if Length(s) = 0 then Exit; + for i := Length(s) downto 1 do + if s[i] in [#32, ThousandSeparator] then Delete(s, i, 1); + b := False; + for i := 2 to Length(s) do + if not (s[i] in ['0', '1'..'9', DecimalSeparator]) then + begin + x := StrToFloatDef(Copy(s, 1, i - 1), 0); + case s[i] of + 'G': x := x * 1000 * 1000 * 1000; + 'M': x := x * 1000 * 1000; + 'K': x := x * 1024; + end; + b := True; + Break; + end; + if not b then x := StrToInt64Def(s, Trunc(x)); + Result := Trunc(x); +end; + +(********************************************************************************************************************************) +function ConstructURI(HidePasswd: boolean; Protocol, Server, Username, Password, Dir: string): string; +begin + Result := Protocol + '://'; + if Length(Username) > 0 then begin + Result := Result + Username; + if Length(Password) > 0 then + if HidePasswd then Result := Result + ':' + StringOfChar('*', Length(Password)) + else Result := Result + ':' + Password; + Result := Result + '@'; + end; + Result := Result + Server; + if Length(Dir) > 0 then begin + if Dir[1] <> '/' then Result := Result + '/'; + Result := Result + Dir; + end; +end; + +(********************************************************************************************************************************) +function URIHidePassword(const SrcURI: string): string; +var i: integer; + InPasswd, BeforeServer: boolean; +begin + Result := SrcURI; + InPasswd := False; + BeforeServer := True; + if Length(SrcURI) > 0 then + if Pos('://', SrcURI) > 0 then + for i := Pos('://', SrcURI) + 2 to Length(SrcURI) do begin + if SrcURI[i] = '@' then begin + InPasswd := False; + BeforeServer := False; + end; + if (not InPasswd) or (not BeforeServer) + then InPasswd := BeforeServer and (SrcURI[i] = ':') + else Result[i] := '*'; + end; +end; + +(********************************************************************************************************************************) +procedure DebugMsg(Params: array of const); +var + I: Integer; +begin + if ParamDebug then begin + for I := 0 to High(Params) do + with Params[I] do + case VType of + vtInteger: Write(ErrOutput, IntToStr(VInteger)); + vtBoolean: Write(ErrOutput, VBoolean); + vtChar: Write(ErrOutput, VChar); + vtExtended: Write(ErrOutput, FloatToStr(VExtended^)); + vtString: Write(ErrOutput, VString^); + vtPChar: Write(ErrOutput, VPChar); + vtObject: Write(ErrOutput, VObject.ClassName); + vtClass: Write(ErrOutput, VClass.ClassName); + vtAnsiString: Write(ErrOutput, string(VAnsiString)); + vtCurrency: Write(ErrOutput, CurrToStr(VCurrency^)); + vtVariant: Write(ErrOutput, string(VVariant^)); + vtInt64: Write(ErrOutput, IntToStr(VInt64^)); + end; + WriteLn(ErrOutput); + end; +end; + +(********************************************************************************************************************************) +function SpawnProcess(const AppPath: string; var Running: boolean; const Parameters: array of string): Cardinal; +var child_pid: __pid_t; + args_list: System.PPChar; + i: integer; + Temp: string; + sv: sigval_t; +begin + Result := 0; + Running := False; + ChildExitStatus := -1; + + // Make the args_list array + args_list := nil; + if Length(Parameters) > 0 then begin + args_list := Libc.malloc((Length(Parameters) + 1) * SizeOf(PChar)); + Libc.memset(args_list, 0, (Length(Parameters) + 1) * SizeOf(PChar)); + for I := 0 to Length(Parameters) - 1 do + begin + Temp := Parameters[i]; + {$R-} +// PCharArray(args_list^)[I] := Libc.malloc(Length(Temp)+1); +// Libc.memset(PCharArray(args_list^)[I], 0, Length(Temp)+1); +// StrCopy(PCharArray(args_list^)[I], PChar(Temp)); + PCharArray(args_list^)[I] := strdup(PChar(Temp)); + {$R+} + end; + {$R-} + PCharArray(args_list^)[Length(Parameters)] := nil; + {$R+} + end; + + // Duplicate this process + child_pid := fork; + if child_pid <> 0 then begin + Result := child_pid; + Sleep(100); + Application.ProcessMessages; + Running := ChildExitStatus < 0; + if not Running then Result := 0; + if not WIFEXITED(ChildExitStatus) then Result := WTERMSIG(ChildExitStatus); + end else begin + // Now execute AppPath, searching for it in the path + execvp(PChar(AppPath), args_list); + // The execvp function returns only if an error occurs + sigqueue(getppid, SIGUSR1, sv); + Halt(ConstERRSpawn); + end; + ChildExitStatus := -1; +end; + +(********************************************************************************************************************************) +procedure SplitArgs(var Args: TOpenStringArray; CMDLine: string); +var InQuotes: boolean; + i, Start: integer; + QuoteChar: char; + s: string; +begin + SetLength(Args, 0); + InQuotes := False; + CMDLine := Trim(CMDLine); + if Length(CMDLine) = 0 then Exit; + Start := 1; + QuoteChar := #0; + for i := 1 to Length(CMDLine) do + case CMDLine[i] of + ' ': if (not InQuotes) and ((i = 1) or (CMDLine[i - 1] <> '\')) then begin + s := Trim(Copy(CMDLine, Start, i - Start)); + TrimQuotes(s); + Start := i; + if s = '' then Continue; + SetLength(Args, Length(Args) + 1); + Args[Length(Args) - 1] := s; + end; + '"', '''': if (i = 1) or (CMDLine[i - 1] <> '\') then + if not InQuotes then begin + InQuotes := True; + QuoteChar := CMDLine[i]; +// Start := i; + end else + if CMDLine[i] = QuoteChar then begin + InQuotes := False; + s := Trim(Copy(CMDLine, Start, i + 1 - Start)); + TrimQuotes(s); + Start := i; + if s = '' then Continue; + if (Pos('"', s) > 1) and (Pos('"', s) < Length(s)) and (NumCountChars('"', s) mod 2 = 1) then s := s + '"'; +// if (Pos('''', s) > 1) and (Pos('''', s) < Length(s)) and (NumCountChars('''', s) mod 2 = 1) then s := s + ''''; + SetLength(Args, Length(Args) + 1); + Args[Length(Args) - 1] := s; + end; + end; + if (Start <> Length(CMDLine)) or (Start = 1) then begin + SetLength(Args, Length(Args) + 1); + Args[Length(Args) - 1] := Trim(Copy(CMDLine, Start, Length(CMDLine) + 1 - Start)); + TrimQuotes(Args[Length(Args) - 1]); + end; +end; + +function ExecuteProgram(const AppCMDLine, CWD: string; const AutodetectGUI, RunInTerminal: boolean; var ErrorSignal: integer): boolean; +var Args: TOpenStringArray; + s, s2: string; + Running, Term: boolean; + x: integer; +begin + Result := False; + try + DebugMsg(['*** Running ExecuteProgram begin']); + s := Trim(AppCMDLine); + ErrorSignal := 0; + Term := RunInTerminal; + SplitArgs(Args, s); + + if AutodetectGUI then + if Length(Trim(Args[0])) > 0 then Term := not IsItX11App(Trim(Args[0])); + + if Term then begin + x := 1; + while x <= Length(s) do begin + if (s[x] in [{'"',} '''']) and ((x = 1) or (s[x - 1] <> '\')) then + Insert('\', s, x); + Inc(x); + end; + s2 := ReplaceStr(ConfTerminalCommand, '%cwd', QuoteStr(CWD)); + s := Format(s2, [s]); + SplitArgs(Args, s); + end; + + if ConfUseLibcSystem then begin + s := s + ' &'; + DebugMsg([s]); + DebugMsg(['**** Running libc.system']); + x := Libc.system(PChar(s)); + Result := x <> -1; // -1 means fork failed + DebugMsg(['**** Running libc.system = ', x, ' --- done']); + end else begin + if Length(Args) = 0 then Exit; + for x := 0 to Length(Args) - 1 do Args[x] := RemoveQuotation(Args[x]); + DebugMsg(['**** Running spawn']); + x := SpawnProcess(Args[0], Running, Args); + DebugMsg(['**** Running spawn -- done']); + Result := Running; + if not Running then ErrorSignal := x; + end; + + except + end; + DebugMsg(['*** Running ExecuteProgram end']); +end; + +(********************************************************************************************************************************) +function IsItX11App(const Application: string): boolean; +const BSize = 32768; + What = 'libX11.so'; +var stream: PIOFile; + Buffer: Pointer; + i: integer; + str: string; +begin + Result := False; + DebugMsg(['***** function IsItX11App(''', Application, ''') begin --']); + + try +// setenv('LD_TRACE_LOADED_OBJECTS', '1', True); + stream := popen(PChar('LD_TRACE_LOADED_OBJECTS=1 ' + Application), 'r'); +// stream := popen(PChar(Application), 'r'); + DebugMsg(['***** IsItX11App: popen OK']); + if Assigned(stream) then begin + Buffer := Libc.malloc(BSize); + if buffer = nil then Writeln('buffer nil: ', integer(errno)); + if stream = nil then Writeln('stream nil'); + Libc.memset(Buffer, 0, BSize); + DebugMsg(['***** IsItX11App: malloc() OK']); + + while feof(stream) = 0 do begin + i := Libc.fread(Buffer, 1, BSize, stream); + if i > 0 then begin + SetLength(str, i); + memcpy(@str[1], Buffer, i); + Result := Result or (Pos(What, str) > 0); + end; + end; + pclose(stream); + end; +// unsetenv('LD_TRACE_LOADED_OBJECTS'); + + except + on E: Exception do DebugMsg(['*** IsItX11App(''', Application, '''):Exception: ', E.Message]); + end; + DebugMsg(['***** function IsItX11App(''', Application, ''') = ', Result]); +end; + +function HandleSystemCommand(const Command, ErrorText: string): boolean; +const BSize = 32768; +var stream: PIOFile; + Buffer: Pointer; + i, NumRead: integer; + child_pid: __pid_t; + fds: array[0..1] of integer; + Parameters: TOpenStringArray; + args_list: System.PPChar; + Temp, s: string; +begin + Result := False; + DebugMsg(['***** function HandleSystemCommand(''', Command, ''') begin --']); + + try + DebugMsg(['***** HandleSystemCommand: before fork']); + pipe(@fds); + child_pid := fork; + DebugMsg(['***** HandleSystemCommand: fork, child_pid = ', child_pid]); + + + // Main application + if child_pid <> 0 then begin + __close(fds[1]); + stream := fdopen(fds[0], 'r'); + Buffer := Libc.malloc(BSize); + DebugMsg(['x0']); + Libc.memset(Buffer, 0, BSize); + DebugMsg(['x1']); + if buffer = nil then Writeln('buffer nil: ', integer(errno)); + if stream = nil then Writeln('stream nil'); + + SetLength(s, 0); + while feof(stream) = 0 do begin + NumRead := fread(Buffer, 1, BSize, stream); + DebugMsg(['***** HandleSystemCommand: NumRead = ', NumRead]); + if NumRead > 0 then begin + SetLength(s, Length(s) + NumRead); + memcpy(@s[Length(s) - NumRead + 1], Buffer, NumRead); + end; + end; + __close(fds[0]); + DebugMsg(['x2']); + TrimCRLFESC(s); + DebugMsg(['x3']); + + Libc.free(Buffer); + DebugMsg(['x4']); + end + + // forked PID + else begin + try + SplitArgs(Parameters, Command); + // Fill the args_list array + args_list := nil; + if Length(Parameters) > 0 then begin + args_list := Libc.malloc((Length(Parameters) + 1) * SizeOf(PChar)); + Libc.memset(args_list, 0, (Length(Parameters) + 1) * SizeOf(PChar)); + for I := 0 to Length(Parameters) - 1 do + begin + Temp := Parameters[i]; + {$R-} +// PCharArray(args_list^)[I] := Libc.malloc(Length(Temp)+1); +// Libc.memset(PCharArray(args_list^)[I], 0, Length(Temp)+1); +// StrCopy(PCharArray(args_list^)[I], PChar(Temp)); + PCharArray(args_list^)[I] := strdup(PChar(Temp)); + {$R+} + end; + {$R-} + PCharArray(args_list^)[Length(Parameters)] := nil; + {$R+} + end; + except + on E: Exception do DebugMsg(['*** forked ** function HandleSystemCommand(''', Command, '''):Exception: ', E.Message]); + end; + + __close(fds[0]); // Close copy of reader file descriptor + dup2(fds[1], STDERR_FILENO); + execvp(PChar(Parameters[0]), args_list); + DebugMsg(['***** HandleSystemCommand: failed execvp: something went wrong...']); + WriteLn(erroutput, 'Error executing command'); + Halt(ConstERRSpawn); + end; + + Result := Length(s) = 0; + if not Result then Application.MessageBox(Format('%s%s', [ErrorText, ANSIToUTF8(s)]), [mbOK], mbError, mbOK, mbOK); + except + on E: Exception do DebugMsg(['***** function HandleSystemCommand(''', Command, '''):Exception: ', E.Message]); + end; + DebugMsg(['***** finished function HandleSystemCommand(''', Command, ''') = ', Result]); +end; + + +(********************************************************************************************************************************) +function CompareTextsEx(S1, S2: PChar): integer; +const PriorityChars = '.[]_0123456789'; +var i, j, k, l1, l2 : integer; + Str1, Str2: string; +begin + Result := -2; + Str1 := UpperCase(String(S1)); + Str2 := UpperCase(String(S2)); + l1 := Length(Str1); + l2 := Length(Str2); + if (l1 > 0) and (l2 > 0) then begin + if (Str1[1] = '.') and (Str2[1] <> '.') then Result := -1 else // Priority for dot files + if (Str2[1] = '.') and (Str1[1] <> '.') then Result := 1 else + for i := 1 to l1 do + if l2 >= i then + if Str1[i] <> Str2[i] then begin + j := Pos(Str1[i], PriorityChars); + k := Pos(Str2[i], PriorityChars); + if (j > 0) and (k > 0) then begin + if j < k then Result := -1 else + if j > k then Result := 1; + end else + if j > 0 then Result := -1 else + if k > 0 then Result := 1; + Break; + end; + if Result = -2 then Result := CompareText(Str1, Str2); + end else Result := CompareText(Str1, Str2); +end; + +(********************************************************************************************************************************) +function LVCompareItems(Data1, Data2: PDataItem; const Ascending: boolean; const SortColumnID: integer): integer; +var mp: integer; + s1, s2, s3, s4: string; +begin + if Ascending then mp := 1 else mp := -1; + if Data1^.UpDir then Result := -1*mp else + if Data2^.UpDir then Result := 1*mp else + if Data1^.IsDir and (not Data2^.IsDir) then Result := -1*mp else + if Data2^.IsDir and (not Data1^.IsDir) then Result := 1*mp else + case SortColumnID of + 1, 2 : begin + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + if Data1^.IsDir and Data2^.IsDir then Result := Result * mp; + end; + 3 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else begin + SeparateExt(String(Data1^.AName), s1, s2); + SeparateExt(String(Data2^.AName), s3, s4); + if ANSIUpperCase(s2) <> ANSIUpperCase(s4) + then Result := CompareTextsEx(PChar(s2), PChar(s4)) + else Result := CompareTextsEx(PChar(s1), PChar(s3)); + end; + 4 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else + if Data1^.Size > Data2^.Size then Result := -1 else + if Data1^.Size < Data2^.Size then Result := 1 else + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + 5, 6 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else + if Data1^.ModifyTime > Data2^.ModifyTime then Result := -1 else + if Data1^.ModifyTime < Data2^.ModifyTime then Result := 1 else + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + 7 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else + if Frac(Data1^.ModifyTime) > Frac(Data2^.ModifyTime) then Result := -1 else + if Frac(Data1^.ModifyTime) < Frac(Data2^.ModifyTime) then Result := 1 else + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + 8 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else + if Data1^.UID > Data2^.UID then Result := -1 else + if Data1^.UID < Data2^.UID then Result := 1 else + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + 9 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else + if Data1^.GID > Data2^.GID then Result := -1 else + if Data1^.GID < Data2^.GID then Result := 1 else + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + 10 : if Data1^.IsDir and Data2^.IsDir then Result := CompareTextsEx(Data1^.AName, Data2^.AName)*mp else + if Data1^.Mode > Data2^.Mode then Result := -1 else + if Data1^.Mode < Data2^.Mode then Result := 1 else + Result := CompareTextsEx(Data1^.AName, Data2^.AName); + else Result := 0; + end; +end; + +(********************************************************************************************************************************) +procedure SortDataList(var List: TList; const Ascending: boolean; const SortColumnID: integer); +var AscCorr: integer; + + procedure QuickSort(iLo, iHi: Integer); + var Lo, Hi : Integer; + Mid, x: Pointer; + begin + Lo := iLo; + Hi := iHi; + Mid := List[(Lo + Hi) div 2]; + repeat + while LVCompareItems(List[Lo], Mid, Ascending, SortColumnID)*AscCorr < 0 do Inc(Lo); + while LVCompareItems(List[Hi], Mid, Ascending, SortColumnID)*AscCorr > 0 do Dec(Hi); + if Lo <= Hi then begin + x := List[Lo]; + List[Lo] := List[Hi]; + List[Hi] := x; + Inc(Lo); + Dec(Hi); + end; + until Lo > Hi; + if Hi > iLo then QuickSort(iLo, Hi); + if Lo < iHi then QuickSort(Lo, iHi); + end; + +begin + AscCorr := 2*Ord(Ascending) - 1; + QuickSort(0, List.Count - 1); +end; + +(********************************************************************************************************************************) +{$IFDEF CPU64} +function CRC32(CRC: LongWord; Data: Pointer; DataSize: LongWord): LongWord; +begin + Result := 0; +end; +{$ELSE} +function CRC32(CRC: LongWord; Data: Pointer; DataSize: LongWord): LongWord; assembler; +asm + AND EDX,EDX + JZ @Exit + AND ECX,ECX + JLE @Exit + PUSH EBX + PUSH EDI + XOR EBX,EBX + LEA EDI,CS:[OFFSET @CRC32] +@Start: MOV BL,AL + SHR EAX,8 + XOR BL,[EDX] + XOR EAX,[EDI + EBX * 4] + INC EDX + DEC ECX + JNZ @Start + POP EDI + POP EBX +@Exit: RET + DB 0, 0, 0, 0, 0 // Align Table +@CRC32: DD 000000000h, 077073096h, 0EE0E612Ch, 0990951BAh + DD 0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h + DD 00EDB8832h, 079DCB8A4h, 0E0D5E91Eh, 097D2D988h + DD 009B64C2Bh, 07EB17CBDh, 0E7B82D07h, 090BF1D91h + DD 01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh + DD 01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h + DD 0136C9856h, 0646BA8C0h, 0FD62F97Ah, 08A65C9ECh + DD 014015C4Fh, 063066CD9h, 0FA0F3D63h, 08D080DF5h + DD 03B6E20C8h, 04C69105Eh, 0D56041E4h, 0A2677172h + DD 03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh + DD 035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h + DD 032D86CE3h, 045DF5C75h, 0DCD60DCFh, 0ABD13D59h + DD 026D930ACh, 051DE003Ah, 0C8D75180h, 0BFD06116h + DD 021B4F4B5h, 056B3C423h, 0CFBA9599h, 0B8BDA50Fh + DD 02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h + DD 02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh + DD 076DC4190h, 001DB7106h, 098D220BCh, 0EFD5102Ah + DD 071B18589h, 006B6B51Fh, 09FBFE4A5h, 0E8B8D433h + DD 07807C9A2h, 00F00F934h, 09609A88Eh, 0E10E9818h + DD 07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h + DD 06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh + DD 06C0695EDh, 01B01A57Bh, 08208F4C1h, 0F50FC457h + DD 065B0D9C6h, 012B7E950h, 08BBEB8EAh, 0FCB9887Ch + DD 062DD1DDFh, 015DA2D49h, 08CD37CF3h, 0FBD44C65h + DD 04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h + DD 04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh + DD 04369E96Ah, 0346ED9FCh, 0AD678846h, 0DA60B8D0h + DD 044042D73h, 033031DE5h, 0AA0A4C5Fh, 0DD0D7CC9h + DD 05005713Ch, 0270241AAh, 0BE0B1010h, 0C90C2086h + DD 05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh + DD 05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h + DD 059B33D17h, 02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh + DD 0EDB88320h, 09ABFB3B6h, 003B6E20Ch, 074B1D29Ah + DD 0EAD54739h, 09DD277AFh, 004DB2615h, 073DC1683h + DD 0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h + DD 0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h + DD 0F00F9344h, 08708A3D2h, 01E01F268h, 06906C2FEh + DD 0F762575Dh, 0806567CBh, 0196C3671h, 06E6B06E7h + DD 0FED41B76h, 089D32BE0h, 010DA7A5Ah, 067DD4ACCh + DD 0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h + DD 0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h + DD 0D1BB67F1h, 0A6BC5767h, 03FB506DDh, 048B2364Bh + DD 0D80D2BDAh, 0AF0A1B4Ch, 036034AF6h, 041047A60h + DD 0DF60EFC3h, 0A867DF55h, 0316E8EEFh, 04669BE79h + DD 0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h + DD 0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh + DD 0C5BA3BBEh, 0B2BD0B28h, 02BB45A92h, 05CB36A04h + DD 0C2D7FFA7h, 0B5D0CF31h, 02CD99E8Bh, 05BDEAE1Dh + DD 09B64C2B0h, 0EC63F226h, 0756AA39Ch, 0026D930Ah + DD 09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h + DD 095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h + DD 092D28E9Bh, 0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h + DD 086D3D2D4h, 0F1D4E242h, 068DDB3F8h, 01FDA836Eh + DD 081BE16CDh, 0F6B9265Bh, 06FB077E1h, 018B74777h + DD 088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch + DD 08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h + DD 0A00AE278h, 0D70DD2EEh, 04E048354h, 03903B3C2h + DD 0A7672661h, 0D06016F7h, 04969474Dh, 03E6E77DBh + DD 0AED16A4Ah, 0D9D65ADCh, 040DF0B66h, 037D83BF0h + DD 0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h + DD 0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h + DD 0BAD03605h, 0CDD70693h, 054DE5729h, 023D967BFh + DD 0B3667A2Eh, 0C4614AB8h, 05D681B02h, 02A6F2B94h + DD 0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh, 02D02EF8Dh + DD 074726F50h, 0736E6F69h, 0706F4320h, 067697279h + DD 028207468h, 031202963h, 020393939h, 048207962h + DD 06E656761h, 064655220h, 06E616D64h, 06FBBA36Eh +end; +{$ENDIF} +(********************************************************************************************************************************) +constructor THash_MD5.Create; +begin + Init; +end; + +function THash_MD5.DigestKey: string; +type TCharArray = array[1..40] of char; + PCharArray = ^TCharArray; +begin + Result := Copy(PCharArray(@FDigest)^, 1, 16); +end; + +procedure THash_MD5.Init; +begin + FillChar(FBuffer, SizeOf(FBuffer), 0); + FDigest[0] := $67452301; + FDigest[1] := $EFCDAB89; + FDigest[2] := $98BADCFE; + FDigest[3] := $10325476; + FDigest[4] := $C3D2E1F0; + FCount := 0; +end; + +{$R-} +procedure THash_MD5.Done; +var + I: Integer; + S: Int64; +begin + try + I := FCount and $3F; + FBuffer[I] := $80; + Inc(I); + if I > 64 - 8 then + begin + FillChar(FBuffer[I], 64 - I, 0); + Transform(@FBuffer); + I := 0; + end; + FillChar(FBuffer[I], 64 - I, 0); + S := Int64(FCount) * 8; + Move(S, FBuffer[64 - 8], SizeOf(S)); + Transform(@FBuffer); + FillChar(FBuffer, SizeOf(FBuffer), 0); + except + end; +end; + +procedure THash_MD5.Calc(const Data; DataSize: Integer); +var + Index: Integer; + P: PChar; +begin + if DataSize <= 0 then Exit; + Index := FCount and $3F; + Inc(FCount, DataSize); + if Index > 0 then + begin + if DataSize < 64 - Index then + begin + Move(Data, FBuffer[Index], DataSize); + Exit; + end; + Move(Data, FBuffer[Index], 64 - Index); + Transform(@FBuffer); + Index := 64 - Index; + Dec(DataSize, Index); + end; + P := @TByteArray(Data)[Index]; + Inc(Index, DataSize and not $3F); + while DataSize >= 64 do + begin + Transform(Pointer(P)); + Inc(P, 64); + Dec(DataSize, 64); + end; + Move(TByteArray(Data)[Index], FBuffer, DataSize); +end; +{$R+} + +function THash_MD5.GetKeyStrH: string; +const HexTable = '0123456789ABCDEF'; +var i: integer; + Value: string; +begin + Result := ''; + Value := DigestKey; + if Value = '' then Exit; + for i := 1 to Length(Value) do + Result := Result + HexTable[Byte(Value[i]) shr 4 + 1] + HexTable[Byte(Value[i]) and $F + 1]; +end; + +{$IFDEF CPU64} +function THash_MD5.TestVector: Pointer; +begin + Result := nil; +end; +{$ELSE} +function THash_MD5.TestVector: Pointer; +asm + MOV EAX,OFFSET @Vector + RET +@Vector: DB 03Eh,0D8h,034h,08Ch,0D2h,0A4h,045h,0D6h + DB 075h,05Dh,04Bh,0C9h,0FEh,0DCh,0C2h,0C6h +end; +{$ENDIF} + +{$Q-} +procedure THash_MD5.Transform(Buffer: PIntArray); +var + A, B, C, D: LongWord; +begin + A := FDigest[0]; + B := FDigest[1]; + C := FDigest[2]; + D := FDigest[3]; + + Inc(A, Buffer[ 0] + $D76AA478 + (D xor (B and (C xor D)))); A := A shl 7 or A shr 25 + B; + Inc(D, Buffer[ 1] + $E8C7B756 + (C xor (A and (B xor C)))); D := D shl 12 or D shr 20 + A; + Inc(C, Buffer[ 2] + $242070DB + (B xor (D and (A xor B)))); C := C shl 17 or C shr 15 + D; + Inc(B, Buffer[ 3] + $C1BDCEEE + (A xor (C and (D xor A)))); B := B shl 22 or B shr 10 + C; + Inc(A, Buffer[ 4] + $F57C0FAF + (D xor (B and (C xor D)))); A := A shl 7 or A shr 25 + B; + Inc(D, Buffer[ 5] + $4787C62A + (C xor (A and (B xor C)))); D := D shl 12 or D shr 20 + A; + Inc(C, Buffer[ 6] + $A8304613 + (B xor (D and (A xor B)))); C := C shl 17 or C shr 15 + D; + Inc(B, Buffer[ 7] + $FD469501 + (A xor (C and (D xor A)))); B := B shl 22 or B shr 10 + C; + Inc(A, Buffer[ 8] + $698098D8 + (D xor (B and (C xor D)))); A := A shl 7 or A shr 25 + B; + Inc(D, Buffer[ 9] + $8B44F7AF + (C xor (A and (B xor C)))); D := D shl 12 or D shr 20 + A; + Inc(C, Buffer[10] + $FFFF5BB1 + (B xor (D and (A xor B)))); C := C shl 17 or C shr 15 + D; + Inc(B, Buffer[11] + $895CD7BE + (A xor (C and (D xor A)))); B := B shl 22 or B shr 10 + C; + Inc(A, Buffer[12] + $6B901122 + (D xor (B and (C xor D)))); A := A shl 7 or A shr 25 + B; + Inc(D, Buffer[13] + $FD987193 + (C xor (A and (B xor C)))); D := D shl 12 or D shr 20 + A; + Inc(C, Buffer[14] + $A679438E + (B xor (D and (A xor B)))); C := C shl 17 or C shr 15 + D; + Inc(B, Buffer[15] + $49B40821 + (A xor (C and (D xor A)))); B := B shl 22 or B shr 10 + C; + + Inc(A, Buffer[ 1] + $F61E2562 + (C xor (D and (B xor C)))); A := A shl 5 or A shr 27 + B; + Inc(D, Buffer[ 6] + $C040B340 + (B xor (C and (A xor B)))); D := D shl 9 or D shr 23 + A; + Inc(C, Buffer[11] + $265E5A51 + (A xor (B and (D xor A)))); C := C shl 14 or C shr 18 + D; + Inc(B, Buffer[ 0] + $E9B6C7AA + (D xor (A and (C xor D)))); B := B shl 20 or B shr 12 + C; + Inc(A, Buffer[ 5] + $D62F105D + (C xor (D and (B xor C)))); A := A shl 5 or A shr 27 + B; + Inc(D, Buffer[10] + $02441453 + (B xor (C and (A xor B)))); D := D shl 9 or D shr 23 + A; + Inc(C, Buffer[15] + $D8A1E681 + (A xor (B and (D xor A)))); C := C shl 14 or C shr 18 + D; + Inc(B, Buffer[ 4] + $E7D3FBC8 + (D xor (A and (C xor D)))); B := B shl 20 or B shr 12 + C; + Inc(A, Buffer[ 9] + $21E1CDE6 + (C xor (D and (B xor C)))); A := A shl 5 or A shr 27 + B; + Inc(D, Buffer[14] + $C33707D6 + (B xor (C and (A xor B)))); D := D shl 9 or D shr 23 + A; + Inc(C, Buffer[ 3] + $F4D50D87 + (A xor (B and (D xor A)))); C := C shl 14 or C shr 18 + D; + Inc(B, Buffer[ 8] + $455A14ED + (D xor (A and (C xor D)))); B := B shl 20 or B shr 12 + C; + Inc(A, Buffer[13] + $A9E3E905 + (C xor (D and (B xor C)))); A := A shl 5 or A shr 27 + B; + Inc(D, Buffer[ 2] + $FCEFA3F8 + (B xor (C and (A xor B)))); D := D shl 9 or D shr 23 + A; + Inc(C, Buffer[ 7] + $676F02D9 + (A xor (B and (D xor A)))); C := C shl 14 or C shr 18 + D; + Inc(B, Buffer[12] + $8D2A4C8A + (D xor (A and (C xor D)))); B := B shl 20 or B shr 12 + C; + + Inc(A, Buffer[ 5] + $FFFA3942 + (B xor C xor D)); A := A shl 4 or A shr 28 + B; + Inc(D, Buffer[ 8] + $8771F681 + (A xor B xor C)); D := D shl 11 or D shr 21 + A; + Inc(C, Buffer[11] + $6D9D6122 + (D xor A xor B)); C := C shl 16 or C shr 16 + D; + Inc(B, Buffer[14] + $FDE5380C + (C xor D xor A)); B := B shl 23 or B shr 9 + C; + Inc(A, Buffer[ 1] + $A4BEEA44 + (B xor C xor D)); A := A shl 4 or A shr 28 + B; + Inc(D, Buffer[ 4] + $4BDECFA9 + (A xor B xor C)); D := D shl 11 or D shr 21 + A; + Inc(C, Buffer[ 7] + $F6BB4B60 + (D xor A xor B)); C := C shl 16 or C shr 16 + D; + Inc(B, Buffer[10] + $BEBFBC70 + (C xor D xor A)); B := B shl 23 or B shr 9 + C; + Inc(A, Buffer[13] + $289B7EC6 + (B xor C xor D)); A := A shl 4 or A shr 28 + B; + Inc(D, Buffer[ 0] + $EAA127FA + (A xor B xor C)); D := D shl 11 or D shr 21 + A; + Inc(C, Buffer[ 3] + $D4EF3085 + (D xor A xor B)); C := C shl 16 or C shr 16 + D; + Inc(B, Buffer[ 6] + $04881D05 + (C xor D xor A)); B := B shl 23 or B shr 9 + C; + Inc(A, Buffer[ 9] + $D9D4D039 + (B xor C xor D)); A := A shl 4 or A shr 28 + B; + Inc(D, Buffer[12] + $E6DB99E5 + (A xor B xor C)); D := D shl 11 or D shr 21 + A; + Inc(C, Buffer[15] + $1FA27CF8 + (D xor A xor B)); C := C shl 16 or C shr 16 + D; + Inc(B, Buffer[ 2] + $C4AC5665 + (C xor D xor A)); B := B shl 23 or B shr 9 + C; + + Inc(A, Buffer[ 0] + $F4292244 + (C xor (B or not D))); A := A shl 6 or A shr 26 + B; + Inc(D, Buffer[ 7] + $432AFF97 + (B xor (A or not C))); D := D shl 10 or D shr 22 + A; + Inc(C, Buffer[14] + $AB9423A7 + (A xor (D or not B))); C := C shl 15 or C shr 17 + D; + Inc(B, Buffer[ 5] + $FC93A039 + (D xor (C or not A))); B := B shl 21 or B shr 11 + C; + Inc(A, Buffer[12] + $655B59C3 + (C xor (B or not D))); A := A shl 6 or A shr 26 + B; + Inc(D, Buffer[ 3] + $8F0CCC92 + (B xor (A or not C))); D := D shl 10 or D shr 22 + A; + Inc(C, Buffer[10] + $FFEFF47D + (A xor (D or not B))); C := C shl 15 or C shr 17 + D; + Inc(B, Buffer[ 1] + $85845DD1 + (D xor (C or not A))); B := B shl 21 or B shr 11 + C; + Inc(A, Buffer[ 8] + $6FA87E4F + (C xor (B or not D))); A := A shl 6 or A shr 26 + B; + Inc(D, Buffer[15] + $FE2CE6E0 + (B xor (A or not C))); D := D shl 10 or D shr 22 + A; + Inc(C, Buffer[ 6] + $A3014314 + (A xor (D or not B))); C := C shl 15 or C shr 17 + D; + Inc(B, Buffer[13] + $4E0811A1 + (D xor (C or not A))); B := B shl 21 or B shr 11 + C; + Inc(A, Buffer[ 4] + $F7537E82 + (C xor (B or not D))); A := A shl 6 or A shr 26 + B; + Inc(D, Buffer[11] + $BD3AF235 + (B xor (A or not C))); D := D shl 10 or D shr 22 + A; + Inc(C, Buffer[ 2] + $2AD7D2BB + (A xor (D or not B))); C := C shl 15 or C shr 17 + D; + Inc(B, Buffer[ 9] + $EB86D391 + (D xor (C or not A))); B := B shl 21 or B shr 11 + C; + + Inc(FDigest[0], A); + Inc(FDigest[1], B); + Inc(FDigest[2], C); + Inc(FDigest[3], D); +end; +{$Q+} +(********************************************************************************************************************************) + +procedure signal_proc(signal_number: integer); cdecl; +var pid, status: integer; +begin +// !!!!!!!!!! Warning +// There should be no debug outputs in this function because it probably cause program freezes after fork +// I mean REALLY NO outputs to console + +// DebugMsg(['SIGCHLD signal received']); +// DebugMsg(['Signal received: ', signal_number]); +// DebugMsg(['*** Signal received: ', signal_number, ' = ', GetSignalString(signal_number)]); + case signal_number of +{ SIGUSR1: begin + DebugMsg(['begin wait']); + wait(@status); + DebugMsg(['end wait']); + ChildExitStatus := status; + end;} + SIGCHLD, SIGUSR1: begin +// DebugMsg(['begin wait']); +// wait(@status); + pid := waitpid(-1, @status, WNOHANG); +// DebugMsg(['**** waitpid result: pid = ', pid, ', status = ', status]); +// DebugMsg(['end wait']); + if signal_number = SIGUSR1 then ChildExitStatus := status; + end; + end; +end; + +procedure SetupSignals; +var sigchld_action: __sigaction; +begin + Libc.memset(@sigchld_action, 0, SizeOf(__sigaction)); + sigchld_action.__sigaction_handler := @signal_proc; + sigaction(SIGUSR1, @sigchld_action, nil); + sigaction(SIGCHLD, @sigchld_action, nil); +end; + +procedure SetupColors; +var Color: TGDKColor; + LocalListView: TGTKListView; +begin + LocalListView := TGTKListView.Create(Application); + try + if ConfNormalItemDefaultColors then begin + NormalItemGDKColor := GetDefaultTextColor(LocalListView, GTK_STATE_NORMAL); + NormalItemGDKBackground := GetDefaultBaseColor(LocalListView, GTK_STATE_NORMAL); + end else begin + StringToGDKColor(ConfNormalItemFGColor, Color); + NormalItemGDKColor := GDKColorToPGdkColor(Color); + StringToGDKColor(ConfNormalItemBGColor, Color); + NormalItemGDKBackground := GDKColorToPGdkColor(Color); + end; + if ConfCursorDefaultColors then begin + ActiveItemGDKColor := GetDefaultTextColor(LocalListView, GTK_STATE_SELECTED); + ActiveItemGDKBackground := GetDefaultBaseColor(LocalListView, GTK_STATE_SELECTED); + end else begin + StringToGDKColor(ConfActiveItemFGColor, Color); + ActiveItemGDKColor := GDKColorToPGdkColor(Color); + StringToGDKColor(ConfActiveItemBGColor, Color); + ActiveItemGDKBackground := GDKColorToPGdkColor(Color); + end; + if ConfInactiveItemDefaultColors then begin + InactiveItemGDKColor := GetDefaultTextColor(LocalListView, GTK_STATE_ACTIVE); + InactiveItemGDKBackground := GetDefaultBaseColor(LocalListView, GTK_STATE_ACTIVE); + end else begin + StringToGDKColor(ConfInactiveItemFGColor, Color); + InactiveItemGDKColor := GDKColorToPGdkColor(Color); + StringToGDKColor(ConfInactiveItemBGColor, Color); + InactiveItemGDKBackground := GDKColorToPGdkColor(Color); + end; + StringToGDKColor(ConfSelectedItemFGColor, Color); + SelectedItemGDKColor := GDKColorToPGdkColor(Color); + StringToGDKColor(ConfDotFileItemFGColor, Color); + DotFileItemGDKColor := GDKColorToPGdkColor(Color); + StringToGDKColor(ConfLinkItemFGColor, Color); + LinkItemGDKColor := GDKColorToPGdkColor(Color); + try + InactiveItemBGColorNum := $FF + (InactiveItemGDKBackground^.red div 256) shl 24 + + (InactiveItemGDKBackground^.green div 256) shl 16 + + (InactiveItemGDKBackground^.blue div 256) shl 8; + except InactiveItemBGColorNum := $D0D0D0FF; end; + finally + LocalListView.Free; + end; +end; + +procedure ReportGTKVersion; +begin + if Application.GTKVersion_2_8_0_Up then DebugMsg(['Using GTK+ version >= 2.8.0']) else + if Application.GTKVersion_2_6_0_Up then DebugMsg(['Using GTK+ version >= 2.6.0']) else + if Application.GTKVersion_2_4_0_Up then DebugMsg(['Using GTK+ version >= 2.4.0']) else + if Application.GTKVersion_2_2_0_Up then DebugMsg(['Using GTK+ version >= 2.2.0']) else + if Application.GTKVersion_2_0_5_Up then DebugMsg(['Using GTK+ version >= 2.0.5']) else + DebugMsg(['Using GTK+ version < 2.0.5']); +end; + + +(********************************************************************************************************************************) +var InternalLockVar: integer; +procedure InternalLock; +begin + Inc(InternalLockVar); + DebugMsg(['Lock']); +end; + +procedure InternalUnLock; +begin + Dec(InternalLockVar); + if InternalLockVar < 0 then InternalLockVar := 0; + DebugMsg(['Unlock']); +end; + +function InternalLockUnlocked: boolean; +begin + Result := InternalLockVar = 0; +end; + +procedure InternalLockInit(Locked: boolean); +begin + InternalLockVar := Ord(Locked); +end; + + +(********************************************************************************************************************************) +procedure GetFirstLastPanelColumn(var FirstColumn, LastColumn: integer); +var i: integer; +begin + FirstColumn := 1; + LastColumn := ConstNumPanelColumns; + for i := 1 to ConstNumPanelColumns do + if ConfColumnVisible[i] then begin + FirstColumn := i; + Break; + end; + for i := ConstNumPanelColumns downto 1 do + if ConfColumnVisible[i] then begin + LastColumn := i; + Break; + end; +end; + +(********************************************************************************************************************************) + + + + +(********************************************************************************************************************************) +{$IFDEF __FPC__} +function StrToDateDef(const S: string; const Default: TDateTime): TDateTime; +begin + try + Result := StrToDate(S); + except + Result := Default; + end; +end; + + +function UnixToDateTime(const AValue: Int64): TDateTime; +begin + Result := AValue / SecsPerDay + UnixDateDelta; +end; +{$ENDIF} + +(********************************************************************************************************************************) +procedure SaveItemToHistory(s: string; History: TStringList); +var i: integer; +begin + s:= Trim(s); + if Length(s) > 0 then begin + if History.IndexOf(s) > -1 then + History.Delete(History.IndexOf(s)); + History.Insert(0, s); + if History.Count > ConfNumHistoryItems then + for i := History.Count downto ConfNumHistoryItems do + History.Delete(i - 1); + end; +end; + + +(********************************************************************************************************************************) + + + + + + + + + + +initialization + InternalLockInit(True); + SetupSignals; + AppPath := IncludeTrailingPathDelimiter(GetHomePath); + IconPath := IncludeTrailingPathDelimiter(GetHomePath); +end. diff --git a/UDirDelete.pas b/UDirDelete.pas new file mode 100644 index 0000000..0b9bf0a --- /dev/null +++ b/UDirDelete.pas @@ -0,0 +1,100 @@ +(* + Tux Commander - UDirDelete - Question dialog and related funcions + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UDirDelete; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFDirDelete = class(TGTKDialog) + Label1, Label2, Label3: TGTKLabel; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + public + procedure AddButtons(Sel: integer); + end; + +var + FDirDelete: TFDirDelete; + +implementation + +uses ULocale; + + +procedure TFDirDelete.FormCreate(Sender: TObject); +begin + WindowPosition := wpCenter; + Caption := LANGRemoveDirectory; + Label1 := TGTKLabel.Create(Self); + Label1.Caption := 'The directory /tmp is not empty!'; + Label2 := TGTKLabel.Create(Self); + Label2.Caption := LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + Label3 := TGTKLabel.Create(Self); + Label3.Visible := False; + ClientArea.AddControlEx(Label1, True, True, 0); + ClientArea.AddControlEx(Label2, True, True, 0); + ClientArea.AddControlEx(Label3, True, True, 0); + OnKeyDown := FormKeyDown; +end; + +procedure TFDirDelete.AddButtons(Sel: integer); +begin + case Sel of + 1 : begin + AddButton(LANGSkipButton_Caption, 1); + AddButton(LANGSkipAllButton_Caption, 3); + AddButton(LANGRetry, 2); + AddButton(LANGCancel, 0); + end; + 2 : begin + AddButton(LANGRetry, 1); + AddButton(LANGCancel, 0); + end; + 3 : begin + AddButton(LANGSkipButton_Caption, 1); + AddButton(LANGSkipAllButton_Caption, 3); + AddButton(LANGIgnoreButton_Caption, 2); + AddButton(LANGCancel, 0); + end; + 4 : begin + AddButton(LANGDeleteButton_Caption, 1); + AddButton(LANGAll, 2); + AddButton(LANGSkipButton_Caption, 3); + AddButton(LANGCancel, 0); + end; + end; +end; + +procedure TFDirDelete.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_ESCAPE: ModalResult := TMessageButton(255); + end; +end; + + + + +end. + + diff --git a/UEngines.pas b/UEngines.pas new file mode 100644 index 0000000..0541316 --- /dev/null +++ b/UEngines.pas @@ -0,0 +1,1140 @@ +(* + Tux Commander - UEngines - Basic engines (abstract, local) + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UEngines; + +interface + +uses glib2, gdk2, Classes, Libc; + + +const ERRException = -1; + ERRNoAccess = -2; + ERRCreateLink = -3; + ERRCopyMove = -4; + ERRRemove = -5; + ERRMkDIr = -6; + + omRead = 0; + omWrite = 1; + omAppend = 2; + + ConfDefaultDirCreationMask = 755; + +type + PDataItem = ^TDataItem; + TDataItem = record + AName, LnkPointTo: PChar; + ColumnData: array[0..9] of PChar; + Size: Int64; + UpDir: boolean; + Mode, UID, GID: Cardinal; + IsDir, IsLnk, IsBlk, IsChr, IsFIFO, IsSock, Selected, IsDotFile: boolean; + ModifyTime: TDateTime; + Icon: Pointer; + ItemColor: PGdkColor; + end; + + PDataItemSL = ^TDataItemSL; + TDataItemSL = record + Stage1: boolean; + AName, LnkPointTo, ADestination: PChar; + Size: Int64; + Mode, UID, GID: Cardinal; + IsDir, IsLnk, ForceMove, IsOnRO, IsExecutable: boolean; + ModifyTime: TDateTime; + Level: word; + atime, mtime: Int64; + end; + + TEngineProgressFunc = function (Sender: Pointer; BytesDone: Int64): boolean; cdecl; // Return False to break the copy process + TEngineErrorFunc = function (Sender: Pointer; ErrorType, ErrorNum: integer; FileName: string): boolean; cdecl; // Return + TEngineFileDes = pointer; + + TPanelEngine = class + private + BreakProcessingType: integer; + public + ParentEngine: TPanelEngine; + LastHighlightItem, SavePath: string; + constructor Create; + destructor Destroy; override; +// function GetListing(var List: PGSList): integer; virtual; abstract; // Returns errorcode + function GetListing(var List: TList; const AddDotFiles: boolean): integer; overload; virtual; abstract; // Returns errorcode + function GetListing(var List: TList; const AddDotFiles: boolean; APath: string): integer; overload; virtual; abstract; // Returns errorcode + function ChangeDir(const NewPath: string; const ShowProgress: boolean = True): integer; virtual; abstract; // Returns errorcode + function ExplicitChDir(const NewPath: string): integer; virtual; abstract; // Returns errorcode + function GetFileSystemSize: Int64; overload; virtual; abstract; + function GetFileSystemSize(const APath: string): Int64; overload; virtual; abstract; + function GetFileSystemFree: Int64; overload; virtual; abstract; + function GetFileSystemFree(const APath: string): Int64; overload; virtual; abstract; + function MakeDir(const NewDir: string): integer; virtual; abstract; // Returns errorcode + function GetDirSize(APath: string): Int64; virtual; abstract; // Returns size or 0 if fails + function Remove(APath: string): integer; virtual; abstract; // Returns errorcode + procedure FillDirFiles(APath: string; List: TList; ALevel: word); virtual; abstract; + function GetFileInfoSL(APath: string): PDataItemSL; virtual; abstract; + function FileExists(const FileName: string; const Use_lstat: boolean = False): Boolean; virtual; abstract; + function DirectoryExists(const FileName: string; const Use_lstat: boolean = False): Boolean; virtual; abstract; + function MakeSymLink(const NewFileName, PointTo: string): integer; virtual; abstract; // Returns errorcode + function Chmod(const FileName: string; const Mode: integer): integer; virtual; abstract; // Returns errorcode + function Chown(const FileName: string; const UID, GID: integer): integer; virtual; abstract; // Returns errorcode + procedure BreakProcessing(ProcessingKind: integer); virtual; abstract; // 1 = GetDirSize, 2 = GetListing + function RenameFile(SourceFile, DestFile: string): integer; virtual; abstract; // Returns errorcode + function ChangeTimes(APath: string; mtime, atime: Int64): integer; virtual; abstract; // Returns errorcode + procedure GetFileSystemInfo(const APath: string; var FSSize, FSFree: Int64; var FSName: string); virtual; abstract; + function OpenFile(const APath: string; Mode: integer; var Error: integer): TEngineFileDes; virtual; abstract; // Returns filedescriptor + function ReadFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; ABlockSize: integer; var Error: integer): integer; virtual; abstract; // Returns number of bytes read + function WriteFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; BytesCount: integer; var Error: integer): integer; virtual; abstract; // Returns number of bytes written + function CloseFile(const FileDescriptor: TEngineFileDes): integer; virtual; abstract; // Returns errorcode + function FileSeek(const FileDescriptor: TEngineFileDes; const AbsoluteOffset: Int64; var Error: integer): Int64; virtual; abstract; // Returns errorcode + function IsOnROMedium(const FileName: string): boolean; virtual; abstract; + function FileCanRun(const FileName: string): boolean; virtual; abstract; + function GetPath: string; virtual; abstract; + procedure SetPath(Value: string); virtual; abstract; + function GetPrefix: string; virtual; abstract; + function Login(Username, Password: string): integer; virtual; abstract; + + // Copy-related routines + function GetBlockSize: guint32; virtual; abstract; + procedure SetBlockSize(Value: guint32); virtual; abstract; + function CopyFileIn(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; virtual; abstract; // returns True if file is successfully copied + function CopyFileOut(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; virtual; abstract; // returns True if file is successfully copied + function IsOnSameFS(const Path1, Path2: string): boolean; virtual; abstract; + function TwoSameFiles(const Path1, Path2: string): boolean; virtual; abstract; + published + property Path: string read GetPath write SetPath; + property BlockSize: guint32 read GetBlockSize write SetBlockSize; + end; + + TLocalTreeEngine = class(TPanelEngine) + private + FPath: string; + FBlockSize: guint32; + public + constructor Create; + destructor Destroy; override; +// function GetListing(var List: PGSList): integer; override; + function GetListing(var List: TList; const AddDotFiles: boolean): integer; override; + function GetListing(var List: TList; const AddDotFiles: boolean; APath: string): integer; override; + function ChangeDir(const NewPath: string; const ShowProgress: boolean = True): integer; override; + function ExplicitChDir(const NewPath: string): integer; override; + function GetFileSystemSize: Int64; override; + function GetFileSystemSize(const APath: string): Int64; override; + function GetFileSystemFree: Int64; override; + function GetFileSystemFree(const APath: string): Int64; override; + function MakeDir(const NewDir: string): integer; override; + function GetDirSize(APath: string): Int64; override; + function Remove(APath: string): integer; override; + procedure FillDirFiles(APath: string; List: TList; ALevel: word); override; + function GetFileInfoSL(APath: string): PDataItemSL; override; + function FileExists(const FileName: string; const Use_lstat: boolean = False): Boolean; override; + function DirectoryExists(const FileName: string; const Use_lstat: boolean = False): Boolean; override; + function MakeSymLink(const NewFileName, PointTo: string): integer; override; + function Chmod(const FileName: string; const Mode: integer): integer; override; + function Chown(const FileName: string; const UID, GID: integer): integer; override; + procedure BreakProcessing(ProcessingKind: integer); override; + function RenameFile(SourceFile, DestFile: string): integer; override; + function ChangeTimes(APath: string; mtime, atime: Int64): integer; override; + procedure GetFileSystemInfo(const APath: string; var FSSize, FSFree: Int64; var FSName: string); override; + function OpenFile(const APath: string; Mode: integer; var Error: integer): TEngineFileDes; override; + function ReadFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; ABlockSize: integer; var Error: integer): integer; override; + function WriteFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; BytesCount: integer; var Error: integer): integer; override; + function CloseFile(const FileDescriptor: TEngineFileDes): integer; override; + function FileSeek(const FileDescriptor: TEngineFileDes; const AbsoluteOffset: Int64; var Error: integer): Int64; override; + function IsOnROMedium(const FileName: string): boolean; override; + function FileCanRun(const FileName: string): boolean; override; + function GetPath: string; override; + procedure SetPath(Value: string); override; + function GetPrefix: string; override; + function Login(Username, Password: string): integer; override; + + function GetBlockSize: guint32; override; + procedure SetBlockSize(Value: guint32); override; + function CopyFileIn(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; override; + function CopyFileOut(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; override; + function CopyFile(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; + function IsOnSameFS(const Path1, Path2: string): boolean; override; + function TwoSameFiles(const Path1, Path2: string): boolean; override; + published + property Path; + property BlockSize; + end; + + +procedure FreeDataItem(DataItem: PDataItemSL); overload; +procedure FreeDataItem(DataItem: PDataItem); overload; + + +implementation + +uses SysUtils, UCoreUtils, UConfig, UGlibC_compat; + +(********************************************************************************************************************************) +constructor TPanelEngine.Create; +begin + inherited Create; + BreakProcessingType := 0; + ParentEngine := nil; // By default it is a top-level engine (local) + LastHighlightItem := ''; +end; + +destructor TPanelEngine.Destroy; +begin + inherited Destroy; +end; + +(********************************************************************************************************************************) +constructor TLocalTreeEngine.Create; +begin + inherited Create; + FPath := '/'; + FBlockSize := 65536; +end; + +destructor TLocalTreeEngine.Destroy; +begin + inherited Destroy; +end; + +function TLocalTreeEngine.GetPath: string; +begin + Result := FPath; +end; + +procedure TLocalTreeEngine.SetPath(Value: string); +begin + if Value <> FPath then begin + FPath := Value; + end; +end; + +function TLocalTreeEngine.GetBlockSize: guint32; +begin + Result := FBlockSize; +end; + +procedure TLocalTreeEngine.SetBlockSize(Value: guint32); +begin + if Value <> FBlockSize then begin + FBlockSize := Value; + end; +end; + +function TLocalTreeEngine.GetListing(var List: TList; const AddDotFiles: boolean; APath: string): integer; +var Item : PDataItem; + Handle : PDirectoryStream; + DirEnt : PDirent64; + Buf : PChar; +// StatBuf : TStatBuf64; + StatBuf : PGlibc_stat64; + i: integer; + LnkBuf : array[0..1000] of char; +begin + Result := 0; + try + APath := IncludeTrailingPathDelimiter(APath); + if Libc.__chdir(PChar(APath)) <> 0 then begin + Result := errno; + DebugMsg(['*** TLocalTreeEngine.GetListing(APath=', APath, '): chdir error: ', strerror(Result)]); + Exit; + end; + Handle := Libc.opendir(PChar(APath)); + if not Assigned(Handle) then begin + DebugMsg(['*** TLocalTreeEngine.GetListing(APath=', APath, '): opendir() handle == NULL: ', strerror(errno)]); + Result := ERRNoAccess; + Exit; + end; + repeat +// DebugMsg(['x1']); + DirEnt := readdir64(Handle); +// DebugMsg(['x2']); + if Assigned(DirEnt) and Assigned(PChar(@DirEnt^.d_name[0])) then begin +// DebugMsg(['x3']); + Buf := Pchar(@DirEnt^.d_name[0]); +// DebugMsg(['x4']); + if (Buf <> '.') and (Buf <> '..') and (DirEnt^.d_name[0] <> #0) and + (AddDotFiles or (Length(Buf) = 1) or ((Length(Buf) > 1) and (not ((Buf[0] = '.') and (Buf[1] <> '.'))))) then + begin + Item := nil; +// DebugMsg(['x5']); + Item := Libc.malloc(SizeOf(TDataItem)); +// DebugMsg(['x6']); + Libc.memset(Item, 0, SizeOf(TDataItem)); +// DebugMsg(['x7']); + with Item^ do begin +// DebugMsg(['x8']); + AName := nil; + LnkPointTo := nil; + for i := 0 to Length(ColumnData) - 1 do ColumnData[i] := nil; + AName := strdup(Buf); +// DebugMsg(['x']); + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); +// DebugMsg(['(II) TLocalTreeEngine.GetListing(APath=', APath, '): lstat(Buf = ', Buf, ')']); + if glibc_lstat64(Buf, StatBuf) <> 0 then begin + DebugMsg(['*** TLocalTreeEngine.GetListing(APath=', APath, '): Error reading file via lstat64: ', strerror(errno)]); + Continue; + end; + Mode := StatBuf^.st_mode; + IsDotFile := (Length(Buf) > 1) and (Buf[0] = '.') and (Buf[1] <> '.'); + IsDir := __S_ISTYPE(StatBuf^.st_mode, __S_IFDIR); + IsLnk := __S_ISTYPE(StatBuf^.st_mode, __S_IFLNK); + IsBlk := __S_ISTYPE(StatBuf^.st_mode, __S_IFBLK); + IsChr := __S_ISTYPE(StatBuf^.st_mode, __S_IFCHR); + IsFIFO := __S_ISTYPE(StatBuf^.st_mode, __S_IFIFO); + IsSock := __S_ISTYPE(StatBuf^.st_mode, __S_IFSOCK); +{$IFDEF KYLIX} + ModifyTime := UnixTimeToTDateTime(StatBuf^.st_mtime); +{$ELSE} + ModifyTime := UnixTimeToTDateTime(StatBuf^.st_mtim.tv_sec); +{$ENDIF} + if StatBuf^.st_uid = 4294967295 then UID := getuid + else UID := StatBuf^.st_uid; + if StatBuf^.st_gid = 4294967295 then GID := getgid + else GID := StatBuf^.st_gid; + UpDir := False; + Selected := False; +// DebugMsg(['(II) TLocalTreeEngine.GetListing(APath=', APath, '): freeing StatBuf...']); + Libc.free(StatBuf); +// DebugMsg([' done.']); + if IsLnk then begin +// DebugMsg(['aaaax']); + i := readlink(PChar(APath + String(Buf)), LnkBuf, SizeOf(LnkBuf)); + if i > 0 then begin + LnkBuf[i] := #0; + LnkPointTo := Libc.malloc(i + 1); + Libc.memset(LnkPointTo, 0, i + 1); + LnkPointTo := Libc.strncpy(LnkPointTo, @LnkBuf[0], i); + end; + + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); + if glibc_stat64(Buf, StatBuf) = 0 then begin + IsDir := __S_ISTYPE(StatBuf^.st_mode, __S_IFDIR); + Mode := StatBuf^.st_mode; + end; +// DebugMsg(['(II) TLocalTreeEngine.GetListing(APath=', APath, '): freeing StatBuf...']); + Libc.free(StatBuf); +// DebugMsg([' done.']); + end; +// DebugMsg(['xdffffffff']); + if not IsDir then Size := StatBuf^.st_size + else Size := -1; +// DebugMsg(['xxsdfsf']); + List.Add(Item); +// DebugMsg(['x1123']); + end; + end; + end; + until DirEnt = nil; + closedir(Handle); + except + on E: Exception do begin + Result := ERRException; + DebugMsg(['*** TLocalTreeEngine.GetListing(APath=', APath, ') -Exception: ', E.Message]); + Exit; + end; + end; +end; + +function TLocalTreeEngine.GetListing(var List: TList; const AddDotFiles: boolean): integer; +begin + Result := GetListing(List, AddDotFiles, FPath); +end; + +function TLocalTreeEngine.ChangeDir(const NewPath: string; const ShowProgress: boolean = True): integer; +var APath: string; + Handle : PDirectoryStream; +begin + try + APath := IncludeTrailingPathDelimiter(NewPath); + if __chdir(PChar(APath)) <> 0 then begin + Result := errno; + Exit; + end; + Handle := opendir(PChar(APath)); + if not Assigned(Handle) then begin + Result := ERRNoAccess; + Exit; + end; +{ if not Assigned(readdir(Handle)) then begin + Result := ERRNoAccess; + Exit; + end; } + if closedir(Handle) <> 0 then begin + Result := ERRNoAccess; + Exit; + end; + Result := 0; + except + on E: Exception do begin + Result := ERRException; + DebugMsg(['*** TLocalTreeEngine.ChangeDir(APath=', APath, ') -Exception: ', E.Message]); + Exit; + end; + end; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.ExplicitChDir(const NewPath: string): integer; +begin + Result := __chdir(PChar(NewPath)); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.GetFileSystemSize(const APath: string): Int64; +var Stat: PGlibc_statfs64; +begin + Result := 0; + try + Stat := Libc.malloc(sizeof(TGlibc_statfs64)); + Libc.memset(Stat, 0, sizeof(TGlibc_statfs64)); + if glibc_statfs64(PChar(APath), Stat) <> 0 then Exit; + Result := Stat^.f_bsize * Stat^.f_blocks; + Libc.free(Stat); + except + on E: Exception do DebugMsg(['*** TLocalTreeEngine.GetFileSystemSize(APath=', APath, ') -Exception: ', E.Message]); + end; +end; + +function TLocalTreeEngine.GetFileSystemSize: Int64; +begin + Result := GetFileSystemSize(FPath); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.GetFileSystemFree(const APath: string): Int64; +var Stat: PGlibc_statfs64; +begin + Result := 0; + try + Stat := Libc.malloc(sizeof(TGlibc_statfs64)); + Libc.memset(Stat, 0, sizeof(TGlibc_statfs64)); + if glibc_statfs64(PChar(APath), Stat) <> 0 then Exit; + Result := Stat^.f_bsize * Stat^.f_bavail; + Libc.free(Stat); + except + on E: Exception do DebugMsg(['*** TLocalTreeEngine.GetFileSystemFree(APath=', APath, ') -Exception: ', E.Message]); + end; +end; + +function TLocalTreeEngine.GetFileSystemFree: Int64; +begin + Result := GetFileSystemFree(FPath); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.MakeDir(const NewDir: string): integer; +begin + DebugMsg(['(II) TLocalTreeEngine.MakeDir: begin']); + Result := __mkdir(PChar(NewDir), OctalToAttr(ConfDefaultDirCreationMask)); + DebugMsg(['(II) TLocalTreeEngine.MakeDir: Result = ', Result]); + if Result <> 0 then Result := errno; +(* + if Result <> 0 then try + if Self.DirectoryExists(NewDir) { or (not g_mkdir_with_parents(dd))} {ForceDirectories(NewDir))} then Result := errno; + except + Result := -1; + DebugMsg(['(II) TLocalTreeEngine.MakeDir: Exception']); + end; +*) + DebugMsg(['(II) TLocalTreeEngine.MakeDir: end']); +end; + +(********************************************************************************************************************************) + +function TLocalTreeEngine.GetDirSize(APath: string): Int64; + + function InternalGetDirSize(APath: string): Int64; + var Handle : PDirectoryStream; + DirEnt : PDirent64; + StatBuf : PGlibc_stat64; + begin + Result := 0; + try + if BreakProcessingType = 1 then Exit; + APath := IncludeTrailingPathDelimiter(APath); + if __chdir(PChar(APath)) <> 0 then begin + Result := 0; + Exit; + end; + Handle := OpenDir(PChar(APath)); + if not Assigned(Handle) then begin + Result := 0; + Exit; + end; + repeat + DirEnt := readdir64(Handle); + if Assigned(DirEnt) and Assigned(PChar(@DirEnt^.d_name[0])) and (PChar(@DirEnt^.d_name[0]) <> '.') and + (PChar(@DirEnt^.d_name[0]) <> '..') and (DirEnt^.d_name[0] <> #0) then + begin + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(@DirEnt^.d_name[0]), StatBuf) <> 0 then Continue; + if __S_ISTYPE(StatBuf^.st_mode, __S_IFDIR) then begin + Inc(Result, InternalGetDirSize(APath + String(PChar(@DirEnt^.d_name[0])))); + __chdir(PChar(APath)); + end else Inc(Result, StatBuf^.st_size); + Libc.free(StatBuf); + end; + until DirEnt = nil; + closedir(Handle); + except + on E: Exception do begin + Result := 0; + DebugMsg(['*** TLocalTreeEngine.GetDirSize(APath=', APath, ') -Exception: ', E.Message]); + end; + end; + end; + +begin + try + BreakProcessingType := 0; + Result := InternalGetDirSize(APath); + finally + BreakProcessingType := 0; + end; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.Remove(APath: string): integer; +begin + APath := ExcludeTrailingPathDelimiter(APath); + Result := Libc.remove(PChar(APath)); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +procedure TLocalTreeEngine.FillDirFiles(APath: string; List: TList; ALevel: word); +var Handle : PDirectoryStream; + DirEnt : PDirent64; + StatBuf_global : PGlibc_stat64; + Item: PDataItemSL; + i: integer; + LnkBuf : array[0..1000] of char; + FilesList: TList; + + + procedure AddEntry(FPath: string; AddCurrDirStage, AStage1: boolean); + var StatBuf_local : PGlibc_stat64; + begin + FPath := ExcludeTrailingPathDelimiter(FPath); + StatBuf_local := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf_local, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(FPath), StatBuf_local) <> 0 then begin + DebugMsg(['*** Error reading file stat AddEntry(lstat): ', strerror(errno)]); + Exit; + end; + Item := Libc.malloc(SizeOf(TDataItemSL)); + Libc.memset(Item, 0, SizeOf(TDataItemSL)); + with Item^ do begin + AName := nil; + LnkPointTo := nil; + ADestination := nil; + Stage1 := AStage1; + AName := strdup(PChar(FPath)); + Size := StatBuf_local^.st_size; + Mode := StatBuf_local^.st_mode; + IsDir := __S_ISTYPE(StatBuf_local^.st_mode, __S_IFDIR); + IsLnk := __S_ISTYPE(StatBuf_local^.st_mode, __S_IFLNK); + IsExecutable := AddCurrDirStage or (StatBuf_local^.st_mode and S_IXUSR = S_IXUSR); + IsOnRO := IsOnROMedium(FPath); + ForceMove := False; + if StatBuf_local^.st_uid = 4294967295 then UID := getuid + else UID := StatBuf_local^.st_uid; + if StatBuf_local^.st_gid = 4294967295 then GID := getgid + else GID := StatBuf_local^.st_gid; +{$IFDEF KYLIX} + atime := StatBuf_local^.st_atime; + mtime := StatBuf_local^.st_mtime; +{$ELSE} + atime := StatBuf_local^.st_atim.tv_sec; + mtime := StatBuf_local^.st_mtim.tv_sec; +{$ENDIF} + if IsLnk and AddCurrDirStage then DebugMsg(['*** Assertion failed AddEntry: Item^.IsLnk = True']); + if IsLnk and (not AddCurrDirStage) then begin + i := readlink(PChar(APath + String(PChar(@DirEnt^.d_name[0]))), LnkBuf, SizeOf(LnkBuf)); + if i > 0 then begin + LnkBuf[i] := #0; + LnkPointTo := Libc.malloc(i + 1); + Libc.memset(LnkPointTo, 0, i + 1); + LnkPointTo := Libc.strncpy(LnkPointTo, @LnkBuf[0], i); +// StrLCopy(LnkPointTo, @LnkBuf[0], i); + end; + end; +{$IFDEF KYLIX} + ModifyTime := UnixTimeToTDateTime(StatBuf_local^.st_mtime); +{$ELSE} + ModifyTime := UnixTimeToTDateTime(StatBuf_local^.st_mtim.tv_sec); +{$ENDIF} +// DebugMsg([FormatDateTime('c', ModifyTime)]); + Level := ALevel + Ord(not AddCurrDirStage); + Libc.free(StatBuf_local); + end; + if AddCurrDirStage then List.Add(Item) + else FilesList.Add(Item); + end; + +begin + if not Assigned(List) then Exit; + try + AddEntry(APath, True, True); + FilesList := TList.Create; + APath := IncludeTrailingPathDelimiter(APath); + if __chdir(PChar(APath)) <> 0 then Exit; + Handle := OpenDir(PChar(APath)); + if Assigned(Handle) then + repeat + DirEnt := readdir64(Handle); + if Assigned(DirEnt) and Assigned(PChar(@DirEnt^.d_name[0])) and (PChar(@DirEnt^.d_name[0]) <> '.') and (PChar(@DirEnt^.d_name[0]) <> '..') then begin + StatBuf_global := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf_global, 0, sizeof(TGlibc_stat64)); + if glibc_stat64(PChar(@DirEnt^.d_name[0]), StatBuf_global) <> 0 then Continue; + if __S_ISTYPE(StatBuf_global^.st_mode, __S_IFDIR) then begin + FillDirFiles(APath + String(PChar(@DirEnt^.d_name[0])), List, ALevel + 1); + __chdir(PChar(APath)); + end else AddEntry(APath + String(PChar(@DirEnt^.d_name[0])), False, True); + Libc.free(StatBuf_global); + end; + until DirEnt = nil; + CloseDir(Handle); + if FilesList.Count > 0 then + for i := 0 to FilesList.Count - 1 do + List.Add(FilesList[i]); + FilesList.Free; + AddEntry(APath, True, False); + except + on E: Exception do DebugMsg(['*** TLocalTreeEngine.FillDirFiles(APath=', APath, ', Level=', ALevel, ') -Exception: ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.GetFileInfoSL(APath: string): PDataItemSL; +var StatBuf : PGlibc_stat64; + i : integer; + LnkBuf : array[0..1000] of char; +begin + Result := nil; + try + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(APath), StatBuf) <> 0 then begin + DebugMsg(['*** Error reading file stat GetFileInfoSL(lstat): ', strerror(errno)]); + Exit; + end; +// DebugMsg(['x1']); + Result := Libc.malloc(SizeOf(TDataItemSL)); + Libc.memset(Result, 0, SizeOf(TDataItemSL)); +// DebugMsg(['x1']); + with Result^ do begin + AName := nil; + LnkPointTo := nil; + ADestination := nil; + Stage1 := True; +// DebugMsg(['x1']); + AName := strdup(PChar(APath)); + Size := StatBuf^.st_size; + Mode := StatBuf^.st_mode; + IsDir := __S_ISTYPE(StatBuf^.st_mode, __S_IFDIR); + IsLnk := __S_ISTYPE(StatBuf^.st_mode, __S_IFLNK); +// DebugMsg(['x1']); + IsExecutable := StatBuf^.st_mode and S_IXUSR = S_IXUSR; +// DebugMsg(['x2']); + IsOnRO := IsOnROMedium(APath); +// DebugMsg(['x2']); + ForceMove := False; +// DebugMsg(['x2']); +{$IFDEF KYLIX} + ModifyTime := UnixTimeToTDateTime(StatBuf^.st_mtime); +{$ELSE} + ModifyTime := UnixTimeToTDateTime(StatBuf^.st_mtim.tv_sec); +{$ENDIF} +// DebugMsg(['x2']); + if StatBuf^.st_uid = 4294967295 then UID := getuid + else UID := StatBuf^.st_uid; + if StatBuf^.st_gid = 4294967295 then GID := getgid + else GID := StatBuf^.st_gid; +{$IFDEF KYLIX} + atime := StatBuf^.st_atime; + mtime := StatBuf^.st_mtime; +{$ELSE} + atime := StatBuf^.st_atim.tv_sec; + mtime := StatBuf^.st_mtim.tv_sec; +{$ENDIF} +// DebugMsg(['x1']); + Libc.free(StatBuf); +// DebugMsg(['x1']); + Level := 1; +// DebugMsg(['x1']); + if IsLnk then begin + i := readlink(PChar(APath), LnkBuf, SizeOf(LnkBuf)); + if i > 0 then begin + LnkBuf[i] := #0; + LnkPointTo := Libc.malloc(i + 1); + Libc.memset(LnkPointTo, 0, i + 1); +// StrLCopy(LnkPointTo, @LnkBuf[0], i); + LnkPointTo := Libc.strncpy(LnkPointTo, @LnkBuf[0], i); + end; + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); + if glibc_stat64(PChar(APath), StatBuf) = 0 then begin + IsDir := __S_ISTYPE(StatBuf^.st_mode, __S_IFDIR); + Mode := StatBuf^.st_mode; + end; + Libc.free(StatBuf); + end; + end; +// DebugMsg(['x1']); + except + on E: Exception do DebugMsg(['*** TLocalTreeEngine.GetFileInfoSL(APath=', APath, ') -Exception: ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.CopyFileIn(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; +begin + Result := CopyFile(Sender, SourceFile, DestFile, ProgressFunc, ErrorFunc, Append); +end; + +function TLocalTreeEngine.CopyFileOut(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; +begin + Result := CopyFile(Sender, SourceFile, DestFile, ProgressFunc, ErrorFunc, Append); +end; + +function TLocalTreeEngine.CopyFile(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; +var fsrc, fdest: PIOFile; + BytesDone, BytesRead: Int64; + offset: off_t; + + + // Used due to sendfile bug while copying from NTFS and some 2.6.x kernels + function OldCopyRoutine: boolean; + var Buffer: Pointer; + BytesWritten: Int64; + Res: boolean; + begin + try + Result := False; + Res := True; + DebugMsg(['*** Using old copy function due to bug in sendfile']); +// WriteLn('x1'); + Buffer := Libc.malloc(FBlockSize); +// WriteLn('x2'); + if Buffer = nil then begin + ErrorFunc(Sender, 1, errno, SourceFile); // Memory allocation failed +// Libc.free(Buffer); + Exit; + end; + Libc.memset(Buffer, 0, FBlockSize); + +// WriteLn('x3'); + while feof(fsrc) = 0 do begin +// WriteLn('x4'); + BytesRead := fread(Buffer, 1, FBlockSize, fsrc); + if (BytesRead < FBlockSize) and (feof(fsrc) = 0) then begin + Res := ErrorFunc(Sender, 6, errno, SourceFile); // Cannot read from source file + Break; + end; +// WriteLn('x5'); + BytesWritten := fwrite(Buffer, 1, BytesRead, fdest); + if BytesWritten < BytesRead then begin + Res := ErrorFunc(Sender, 7, ferror(fdest), DestFile); // Cannot write to source file + Break; + end; + Inc(BytesDone, BytesRead); +// WriteLn('x6'); + try + if Assigned(ProgressFunc) and (not ProgressFunc(Sender, BytesDone)) then begin + Res := False; + Break; + end; + except + on E: Exception do DebugMsg(['*** ProgressFunc ! Exception raised in TLocalTreeEngine.CopyFile.OldCopyRoutine(Sender=', DWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + end; +// WriteLn('x7'); + end; +// WriteLn('x8'); + Libc.free(Buffer); +// WriteLn('x9'); + Result := Res; + except + on E: Exception do DebugMsg(['*** Exception raised in TLocalTreeEngine.CopyFile.OldCopyRoutine(Sender=', DWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + end; + end; + + function NewCopyRoutine: boolean; + var Res: boolean; + StatBuf: PGlibc_stat64; + begin + try + Res := True; + repeat + DebugMsg(['Copy(sendfile): offset = ', offset, ', BytesDone = ', BytesDone, ', ftell(fsrc) = ', ftell(fsrc)]); + BytesRead := Libc.sendfile(glibc_fileno(fdest), glibc_fileno(fsrc), offset, FBlockSize); + if BytesRead = -1 then begin + if errno = EINVAL then begin + Result := OldCopyRoutine; + Exit; + end else Res := ErrorFunc(Sender, 6, errno, SourceFile); // Cannot read from source file + Break; + end; + Inc(BytesDone, BytesRead); + if Assigned(ProgressFunc) and (not ProgressFunc(Sender, BytesDone)) then begin + Res := False; + Break; + end; + until BytesRead < FBlockSize; + + StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(SourceFile), StatBuf) <> 0 then begin + DebugMsg(['*** TLocalTreeEngine.CopyFile.NewCopyRoutine(Sender=', DWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): Error reading file via lstat64: ', strerror(errno)]); + Res := ErrorFunc(Sender, 6, errno, SourceFile); + end else + if (BytesDone < StatBuf^.st_size) and Res then + Res := ErrorFunc(Sender, 6, errno, SourceFile); + Libc.free(StatBuf); + Result := Res; + except + on E: Exception do DebugMsg(['*** Exception raised in TLocalTreeEngine.CopyFile.NewCopyRoutine(Sender=', DWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + end; + end; + +begin + Result := False; + try + fsrc := fopen64(PChar(SourceFile), 'r'); + if fsrc = nil then begin + ErrorFunc(Sender, 2, errno, SourceFile); // Cannot open source file + Exit; + end; + if Append then fdest := fopen64(PChar(DestFile), 'a') + else fdest := fopen64(PChar(DestFile), 'w'); + if fdest = nil then begin + fclose(fsrc); + ErrorFunc(Sender, 3, errno, DestFile); // Cannot open target file + Exit; + end; + + BytesDone := 0; + offset := 0; + + Result := NewCopyRoutine; + + if fclose(fdest) <> 0 then begin + fclose(fsrc); + ErrorFunc(Sender, 4, errno, DestFile); // Cannot close target file + Exit; + end; + if fclose(fsrc) <> 0 then begin + ErrorFunc(Sender, 5, errno, SourceFile); // Cannot close source file + Exit; + end; + except + on E: Exception do DebugMsg(['*** Exception raised in TLocalTreeEngine.CopyFile(Sender=', DWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + end; + DebugMsg(['(II) TLocalTreeEngine.CopyFile: finished']); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.FileExists(const FileName: string; const Use_lstat: boolean = False): Boolean; +var st: PGlibc_stat64; +begin + st := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(st, 0, sizeof(TGlibc_stat64)); + if Use_lstat then Result := glibc_lstat64(PChar(FileName), st) = 0 + else Result := glibc_stat64(PChar(FileName), st) = 0; + Libc.free(st); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.DirectoryExists(const FileName: string; const Use_lstat: boolean = False): Boolean; +var st: PGlibc_stat64; +begin + st := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(st, 0, sizeof(TGlibc_stat64)); + if Use_lstat then Result := glibc_lstat64(PChar(FileName), st) = 0 else + if glibc_stat64(PChar(FileName), st) = 0 + then Result := S_ISDIR(st^.st_mode) + else Result := False; + Libc.free(st); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.MakeSymLink(const NewFileName, PointTo: string): integer; +begin + Result := Libc.symlink(PChar(PointTo), PChar(NewFileName)); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.Chmod(const FileName: string; const Mode: integer): integer; +begin + Result := Libc.chmod(PChar(FileName), Mode); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.Chown(const FileName: string; const UID, GID: integer): integer; +begin + Result := Libc.chown(PChar(FileName), UID, GID); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +procedure TLocalTreeEngine.BreakProcessing(ProcessingKind: integer); +begin + BreakProcessingType := ProcessingKind; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.IsOnSameFS(const Path1, Path2: string): boolean; +var FStat1, FStat2: PGlibc_stat64; +begin + DebugMsg(['** TLocalTreeEngine.IsOnSameFS("', Path1, '", "', Path2, '")']); + Result := False; // Default fallback result (forces copy + delete) + FStat1 := Libc.malloc(sizeof(TGlibc_stat64)); + FStat2 := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(FStat1, 0, sizeof(TGlibc_stat64)); + Libc.memset(FStat2, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(Path1), FStat1) <> 0 then begin + DebugMsg(['** TLocalTreeEngine.IsOnSameFS: Libc.stat(', Path1, ') error: ', strerror(errno)]); + Exit; + end; + if glibc_lstat64(PChar(Path2), FStat2) <> 0 then begin + DebugMsg(['** TLocalTreeEngine.IsOnSameFS: Libc.stat(', Path2, ') error: ', strerror(errno)]); + Exit; + end; + Result := FStat1^.st_dev = FStat2^.st_dev; + Libc.free(FStat1); + Libc.free(FStat2); + DebugMsg(['** TLocalTreeEngine.IsOnSameFS("', Path1, '", "', Path2, '") Result = ', Result]); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.RenameFile(SourceFile, DestFile: string): integer; +begin + Result := Libc.__rename(PChar(SourceFile), PChar(DestFile)); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.ChangeTimes(APath: string; mtime, atime: Int64): integer; +var timebuf: PGlibc_utimbuf; +begin + Result := errno; + try + timebuf := Libc.malloc(sizeof(TGlibc_utimbuf)); + Libc.memset(timebuf, 0, sizeof(TGlibc_utimbuf)); + timebuf^.actime := atime; + timebuf^.modtime := mtime; + Result := glibc_utime(PChar(APath), timebuf); + if Result <> 0 then Result := errno; + Libc.free(timebuf); + except + on E: Exception do DebugMsg(['*** Exception raised in TLocalTreeEngine.ChangeTimes(APath=', APath, '): (', E.ClassName, '): ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +procedure TLocalTreeEngine.GetFileSystemInfo(const APath: string; var FSSize, FSFree: Int64; var FSName: string); +var Stat: PGlibc_statfs64; + fd: PIOFile; + mntent: PMountEntry; + mntdev: PChar; + FoundLength: integer; + Buffer: array[0..31] of char; +begin + FSSize := 0; + FSFree := 0; + FSName := ''; + try + Stat := Libc.malloc(sizeof(TGlibc_statfs64)); + Libc.memset(Stat, 0, sizeof(TGlibc_statfs64)); + if glibc_statfs64(PChar(APath), Stat) <> 0 then Exit; + FSSize := Stat^.f_bsize * Stat^.f_blocks; + FSFree := Stat^.f_bsize * Stat^.f_bavail; + fd := setmntent(_PATH_MOUNTED, 'r'); + if fd = nil then Exit; + // Get mount name + FoundLength := 0; + mntdev := nil; + mntent := getmntent(fd); + while mntent <> nil do begin + if (Pos(mntent^.mnt_dir, APath) = 1) and (Length(String(mntent^.mnt_dir)) > FoundLength) then begin + FoundLength := Length(String(mntent^.mnt_dir)); + FSName := String(mntent^.mnt_dir); + mntdev := mntent^.mnt_fsname; + end; + mntent := getmntent(fd); + end; + endmntent(fd); + // if it is CD-ROM, read ISO9660 label + if Stat^.f_type = $9660 then begin { ISOFS_SUPER_MAGIC } + if Assigned(mntdev) and (mntdev <> '') then begin + fd := fopen(mntdev, 'r'); + if fd = nil then Exit; + if fseek(fd, 32808, SEEK_SET) <> 0 then Exit; + if fread(@Buffer[0], 1, 32, fd) <> 0 then FSName := Trim(String(Buffer)); + fclose(fd); + end; + end; + Libc.free(Stat); + except + on E: Exception do DebugMsg(['*** Exception raised in TLocalTreeEngine.GetFileSystemInfo(APath=', APath, '): (', E.ClassName, '): ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.OpenFile(const APath: string; Mode: integer; var Error: integer): TEngineFileDes; +var m: PChar; +begin + Error := 0; + case Mode of + omRead: m := 'r'; + omWrite: m := 'w'; + omAppend: m := 'a'; + else m := 'r'; + end; + Result := Libc.fopen64(PChar(APath), m); + if Result = nil then Error := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.ReadFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; ABlockSize: integer; var Error: integer): integer; +begin + Error := 0; + Result := Libc.fread(Buffer, 1, ABlockSize, FileDescriptor); + if (Result = 0) and (feof(FileDescriptor) = 0) then Error := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.WriteFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; BytesCount: integer; var Error: integer): integer; +begin + Error := 0; +{ Result := Libc.__write(fileno(FileDescriptor), Buffer^, BytesCount); + if Result < BytesCount then Error := errno; } + Result := Libc.fwrite(Buffer, 1, BytesCount, FileDescriptor); + if Result < BytesCount then Error := ferror(FileDescriptor); +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.CloseFile(const FileDescriptor: TEngineFileDes): integer; +begin + Result := Libc.fclose(FileDescriptor); + if Result <> 0 then Result := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.FileSeek(const FileDescriptor: TEngineFileDes; const AbsoluteOffset: Int64; var Error: integer): Int64; +begin + Error := 0; + Result := Libc.fseeko64(FileDescriptor, AbsoluteOffset, SEEK_SET); + if Result = -1 then Error := errno; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.IsOnROMedium(const FileName: string): boolean; +var Stat: PGlibc_statfs64; +begin + Result := False; + try + Stat := Libc.malloc(sizeof(TGlibc_statfs64)); + Libc.memset(Stat, 0, sizeof(TGlibc_statfs64)); + if glibc_statfs64(PChar(FileName), Stat) <> 0 then Exit; + Result := (Stat^.f_type = $9660); { ISOFS_SUPER_MAGIC } + Libc.free(Stat); + except + on E: Exception do DebugMsg(['*** TLocalTreeEngine.IsOnROMedium(FileName=', FileName, ') -Exception: ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.FileCanRun(const FileName: string): boolean; +begin + Result := Libc.access(PChar(FileName), R_OK or X_OK) = 0; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.GetPrefix: string; +begin + Result := ''; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.Login(Username, Password: string): integer; +begin + Result := 0; +end; + +(********************************************************************************************************************************) +function TLocalTreeEngine.TwoSameFiles(const Path1, Path2: string): boolean; +var st1, st2: PGlibc_stat64; +begin + Result := False; + st1 := Libc.malloc(sizeof(TGlibc_stat64)); + st2 := Libc.malloc(sizeof(TGlibc_stat64)); + Libc.memset(st1, 0, sizeof(TGlibc_stat64)); + Libc.memset(st2, 0, sizeof(TGlibc_stat64)); + if glibc_lstat64(PChar(Path1), st1) <> 0 then Exit; + if glibc_lstat64(PChar(Path2), st2) <> 0 then Exit; + DebugMsg(['*** TLocalTreeEngine.TwoSameFiles: ', st1^.st_ino, ' ', st2^.st_ino]); + Result := st1^.st_ino = st2^.st_ino; + Libc.free(st1); + Libc.free(st2); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure FreeDataItem(DataItem: PDataItemSL); +begin + try + if Assigned(DataItem) then begin + with DataItem^ do begin + if AName <> nil then Libc.free(AName); +// if Assigned(ADestination) then Dispose(ADestination); + if LnkPointTo <> nil then Libc.free(LnkPointTo); + end; + Libc.free(DataItem); + end; + except + end; +end; + +procedure FreeDataItem(DataItem: PDataItem); +var i : integer; +begin + try + if Assigned(DataItem) then begin + with DataItem^ do begin + if AName <> nil then Libc.free(AName); + if LnkPointTo <> nil then Libc.free(LnkPointTo); + for i := 0 to Length(ColumnData) - 1 do + if ColumnData[i] <> nil then Libc.free(ColumnData[i]); + end; + Libc.free(DataItem); + end; + except + end; +end; + +end. + diff --git a/UFileAssoc.pas b/UFileAssoc.pas new file mode 100644 index 0000000..2764df8 --- /dev/null +++ b/UFileAssoc.pas @@ -0,0 +1,358 @@ +(* + Tux Commander - UFileAssoc - File Association system objects and functions + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UFileAssoc; + +interface + +uses Classes, SysUtils, GTKPixbuf, GTKClasses, GTKUtils, UEngines; + +type TAssocAction = class + ActionName, ActionCommand: string; + AutodetectGUI, RunInTerminal: boolean; + constructor Create; + end; + + TFileAssoc = class + Extensions, FileTypeName, FileTypeIcon, ColorString: string; + DefaultAction: integer; + ActionList: TList; + Pixmap, LnkPixmap: TGDKPixbuf; + constructor Create; + destructor Destroy; override; + end; + +const ConstFTAMetaDirectory = ''; + ConstFTAMetaFile = ''; + +{$I 'pixmaps/emblem_symbolic_link_png.inc'} +{$I 'pixmaps/gnome_dev_cdrom_16_png.inc'} +{$I 'pixmaps/gnome_dev_floppy_16_png.inc'} +{$I 'pixmaps/gnome_dev_harddisk_16_png.inc'} +{$I 'pixmaps/gnome_dev_removable_usb_16_png.inc'} +{$I 'pixmaps/gnome_mime_application_zip_16_png.inc'} +{$I 'pixmaps/gnome_mime_x_directory_smb_share_16_png.inc'} +{$I 'pixmaps/stock_folder_16_png.inc'} +{$I 'pixmaps/stock_lock_16_png.inc'} +{$I 'pixmaps/stock_lock_48_png.inc'} +{$I 'pixmaps/stock_new_16_png.inc'} +{$I 'pixmaps/stock_up_one_dir_16_png.inc'} + + + + + +var FolderIcon, FileIcon, UpDirIcon, SymLinkEmblem, FolderIconLnk, FileIconLnk, + FolderIconCached, FileIconCached, FolderIconLnkCached, FileIconLnkCached: TGDKPixbuf; + MounterHDD, MounterRemovable, MounterFloppy, MounterCD, MounterNetwork: TGDKPixbuf; + StockLock16, StockLock48: TGDKPixbuf; + ArchiveIcon, ArchiveIconLnk: TGDKPixbuf; + + +procedure LoadIcons; +procedure AddFileTypeIcon(Item: PDataItem); +procedure RecreateIcons(List: TList; const FreePixmaps: boolean = True); +procedure RemoveIconRefs(List: TList; FreeIt: boolean); +procedure AddDefaultItems(List: TList); + +implementation + +uses GTKForms, UConfig, UCore, UCoreUtils, UVFSCore; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TFileAssoc.Create; +begin + ActionList := TList.Create; + DefaultAction := 0; + FileTypeIcon := ''; + Extensions := ''; + FileTypeName := ''; + ColorString := ''; + Pixmap := TGDKPixbuf.Create(nil); +end; + +destructor TFileAssoc.Destroy; +var i: integer; +begin + try + if Assigned(ActionList) and (ActionList.Count > 0) then + for i := ActionList.Count - 1 downto 0 do + TAssocAction(ActionList[i]).Free; + ActionList.Clear; + ActionList.Free; +// Pixmap.Free; + except + end; +end; + +(********************************************************************************************************************************) +constructor TAssocAction.Create; +begin + RunInTerminal := False; + AutodetectGUI := True; +end; + +(********************************************************************************************************************************) +procedure LoadIcons; +begin + FolderIcon := TGDKPixbuf.Create(Application); + FolderIcon.LoadFromInline(@stock_folder_16_png[1]); + FolderIcon.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + FileIcon := TGDKPixbuf.Create(Application); + FileIcon.LoadFromInline(@stock_new_16_png[1]); + FileIcon.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + UpDirIcon := TGDKPixbuf.Create(Application); + UpDirIcon.LoadFromInline(@stock_up_one_dir_16_png[1]); + UpDirIcon.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + SymLinkEmblem := TGDKPixbuf.Create(Application); + SymLinkEmblem.LoadFromInline(@emblem_symbolic_link_png[1]); + FolderIconLnk := TGDKPixbuf.Create(Application); + FolderIconLnk.FPixbuf := FolderIcon.Copy; + FolderIconLnk.CopyArea(SymLinkEmblem, 0, 0, SymLinkEmblem.Width, SymLinkEmblem.Height, FolderIconLnk.Width - SymLinkEmblem.Width, FolderIconLnk.Height - SymLinkEmblem.Height); + FileIconLnk := TGDKPixbuf.Create(Application); + FileIconLnk.FPixbuf := FileIcon.Copy; + FileIconLnk.CopyArea(SymLinkEmblem, 0, 0, SymLinkEmblem.Width, SymLinkEmblem.Height, FileIconLnk.Width - SymLinkEmblem.Width, FileIconLnk.Height - SymLinkEmblem.Height); + FolderIconCached := FolderIcon; + FileIconCached := FileIcon; + FolderIconLnkCached := FolderIconLnk; + FileIconLnkCached := FileIconLnk; + MounterHDD := TGDKPixbuf.Create(Application); + MounterHDD.LoadFromInline(@gnome_dev_harddisk_16_png[1]); + MounterRemovable := TGDKPixbuf.Create(Application); + MounterRemovable.LoadFromInline(@gnome_dev_removable_usb_16_png[1]); + MounterFloppy := TGDKPixbuf.Create(Application); + MounterFloppy.LoadFromInline(@gnome_dev_floppy_16_png[1]); + MounterCD := TGDKPixbuf.Create(Application); + MounterCD.LoadFromInline(@gnome_dev_cdrom_16_png[1]); + MounterNetwork := TGDKPixbuf.Create(Application); + MounterNetwork.LoadFromInline(@gnome_mime_x_directory_smb_share_16_png[1]); + StockLock16 := TGDKPixbuf.Create(Application); + StockLock16.LoadFromInline(@stock_lock_16_png[1]); + StockLock48 := TGDKPixbuf.Create(Application); + StockLock48.LoadFromInline(@stock_lock_48_png[1]); + ArchiveIcon := TGDKPixbuf.Create(Application); + ArchiveIcon.LoadFromInline(@gnome_mime_application_zip_16_png[1]); + ArchiveIcon.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + ArchiveIconLnk := TGDKPixbuf.Create(Application); + ArchiveIconLnk.FPixbuf := ArchiveIcon.Copy; + ArchiveIconLnk.CopyArea(SymLinkEmblem, 0, 0, SymLinkEmblem.Width, SymLinkEmblem.Height, FolderIconLnk.Width - SymLinkEmblem.Width, FolderIconLnk.Height - SymLinkEmblem.Height); +end; + +(********************************************************************************************************************************) +procedure AddFileTypeIcon(Item: PDataItem); +var Ext: string; + b: boolean; + i, j, Last: integer; + AColor: TGDKColor; + Plugin: TVFSPlugin; +begin + with Item^ do begin + ItemColor := nil; + if IsLnk and (not ConfLinkItemDefaultColors) then ItemColor := LinkItemGDKColor else + if IsDotFile and (not ConfDotFileItemDefaultColors) then ItemColor := DotFileItemGDKColor; + if IsDir then begin + if IsLnk then Icon := FolderIconLnkCached.FPixbuf + else Icon := FolderIconCached.FPixbuf; + end else + begin + if not IsLnk then Icon := FileIconCached.FPixbuf + else Icon := FileIconLnkCached.FPixbuf; + if (Pos('.', AName) > 1) and (LastDelimiter('.', AName) < Length(AName)) then begin + Ext := ANSIUpperCase(Trim(Copy(AName, LastDelimiter('.', AName) + 1, Length(AName) - LastDelimiter('.', AName)))); + + // Try to find a plugin which can handle this archive type + b := False; + Plugin := nil; + if PluginList.Count > 0 then + for i := 0 to PluginList.Count - 1 do begin + Plugin := TVFSPlugin(PluginList[i]); + if Length(Plugin.Extensions) > 0 then + for j := 0 to Length(Plugin.Extensions) - 1 do begin + if AnsiCompareText(Plugin.Extensions[j], Ext) = 0 then begin + b := True; + if IsLnk then Icon := ArchiveIconLnk.FPixbuf + else Icon := ArchiveIcon.FPixbuf; + Break; + end; + end; + if b then Break; + end; + + // Try to find an association + if (not b) and (AssocList.Count > 0) then + for i := 0 to AssocList.Count - 1 do + with TFileAssoc(AssocList[i]) do + if Length(Trim(Extensions)) > 0 then begin + b := False; + if Pos(';', Extensions) = 0 then b := ANSIUpperCase(Trim(Extensions)) = Ext else begin + Last := 0; + for j := 1 to Length(Extensions) do + if Extensions[j] = ';' then begin + if ANSIUpperCase(Trim(Copy(Extensions, Last + 1, j - Last - 1))) = Ext then begin + b := True; + Break; + end; + Last := j; + end; + if not b then b := ANSIUpperCase(Trim(Copy(Extensions, LastDelimiter(';', Extensions) + 1, Length(Extensions) - LastDelimiter(';', Extensions)))) = Ext; + end; + if b then begin + if Assigned(Pixmap) then + if IsLnk and Assigned(LnkPixmap) and Assigned(LnkPixmap.FPixbuf) + then Icon := LnkPixmap.FPixbuf + else Icon := Pixmap.FPixbuf; + if ItemColor = nil then + if (ColorString = '') or (not StringToGDKColor(ColorString, AColor)) + then ItemColor := NormalItemGDKColor + else ItemColor := GDKColorToPGdkColor(AColor); + end; + end; + + end; + end; + end; +end; + +(********************************************************************************************************************************) +procedure RecreateIcons(List: TList; const FreePixmaps: boolean = True); +var i: integer; + b: boolean; +begin + if Assigned(List) and (List.Count > 0) then + for i := 0 to List.Count - 1 do + if Assigned(List[i]) and (TObject(List[i]) is TFileAssoc) then + with TFileAssoc(List[i]) do begin + // Destroy old objects + if (Pixmap <> FileIcon) and (Pixmap <> FileIconLnk) and (Pixmap <> UpDirIcon) and (Pixmap <> FolderIcon) and + (Pixmap <> FileIconCached) and (Pixmap <> FileIconLnkCached) and (Pixmap <> FolderIconCached) and (Pixmap <> FolderIconLnkCached) and + (Pixmap <> FolderIconLnk) and Assigned(Pixmap) and Assigned(Pixmap.FPixbuf) then + begin + if FreePixmaps then Pixmap.Free; + Pixmap := nil; + end; + if (LnkPixmap <> FileIcon) and (LnkPixmap <> FileIconLnk) and (LnkPixmap <> UpDirIcon) and (LnkPixmap <> FolderIcon) and + (Pixmap <> FileIconCached) and (Pixmap <> FileIconLnkCached) and (Pixmap <> FolderIconCached) and (Pixmap <> FolderIconLnkCached) and + (LnkPixmap <> FolderIconLnk) and Assigned(LnkPixmap) and Assigned(LnkPixmap.FPixbuf) then + begin + if FreePixmaps then LnkPixmap.Free; + LnkPixmap := nil; + end; + // Load / Assign icon + b := FileExists(FileTypeIcon); + if b then begin + if not Assigned(Pixmap) then Pixmap := TGDKPixbuf.Create(nil); + b := Pixmap.LoadFromFile(FileTypeIcon); + if b then Pixmap.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + end; + if not b then + if FileTypeName = ConstFTAMetaDirectory then Pixmap := FolderIcon else + if FileTypeName = ConstFTAMetaFile then Pixmap := FileIcon + else Pixmap := FileIconCached; + // Create Link overelay + if Assigned(Pixmap) and Assigned(Pixmap.FPixbuf) and Assigned(SymLinkEmblem) then begin + LnkPixmap := TGDKPixbuf.Create(nil); + LnkPixmap.FPixbuf := Pixmap.Copy; + LnkPixmap.CopyArea(SymLinkEmblem, 0, 0, SymLinkEmblem.Width, SymLinkEmblem.Height, LnkPixmap.Width - SymLinkEmblem.Width, LnkPixmap.Height - SymLinkEmblem.Height); + end else LnkPixmap := Pixmap; + + if FileTypeName = ConstFTAMetaDirectory then begin + FolderIconCached := Pixmap; + FolderIconLnkCached := LnkPixmap; + end; + if FileTypeName = ConstFTAMetaFile then begin + FileIconCached := Pixmap; + FileIconLnkCached := LnkPixmap; + end; + end; +end; + +(********************************************************************************************************************************) +procedure RemoveIconRefs(List: TList; FreeIt: boolean); +var i: integer; +begin + if Assigned(List) and (List.Count > 0) then + for i := 0 to List.Count - 1 do + if Assigned(List[i]) and (TObject(List[i]) is TFileAssoc) then + with TFileAssoc(List[i]) do begin + if FreeIt and Assigned(Pixmap) then Pixmap.Free; + Pixmap := nil; + if FreeIt and Assigned(LnkPixmap) then LnkPixmap.Free; + LnkPixmap := nil; + end; +end; + +(********************************************************************************************************************************) +procedure AddDefaultItems(List: TList); +var Item: TFileAssoc; + i: integer; + Found: boolean; +begin + // Add default directory item + try + Found := False; + if List.Count > 0 then + for i := 0 to List.Count - 1 do + if TFileAssoc(List[i]).FileTypeName = ConstFTAMetaDirectory then begin + Found := True; + Break; + end; + if not Found then begin + Item := TFileAssoc.Create; + Item.FileTypeName := ConstFTAMetaDirectory; + Item.Extensions := ''; + Item.FileTypeIcon := ''; + Item.ColorString := ''; + Item.DefaultAction := 0; + Item.ActionList := TList.Create; + Item.Pixmap := nil; + Item.LnkPixmap := nil; + List.Insert(0, Item); + end; + except end; + + // Add default file item + try + Found := False; + if List.Count > 0 then + for i := 0 to List.Count - 1 do + if TFileAssoc(List[i]).FileTypeName = ConstFTAMetaFile then begin + Found := True; + Break; + end; + if not Found then begin + Item := TFileAssoc.Create; + Item.FileTypeName := ConstFTAMetaFile; + Item.Extensions := ''; + Item.FileTypeIcon := ''; + Item.ColorString := ''; + Item.DefaultAction := 0; + Item.ActionList := TList.Create; + Item.Pixmap := nil; + Item.LnkPixmap := nil; + List.Insert(0, Item); + end; + except end; +end; + +(********************************************************************************************************************************) + +end. diff --git a/UFileTypeSettings.pas b/UFileTypeSettings.pas new file mode 100644 index 0000000..3917e43 --- /dev/null +++ b/UFileTypeSettings.pas @@ -0,0 +1,901 @@ +(* + Tux Commander - UFileTypeSettings - The filetype settings dialog + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UFileTypeSettings; + +interface + +uses + gtk2, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, GTKUtils, GTKDialogs, + GTKPixbuf, GTKClasses, + UCoreClasses, UGnome; + +type + TFFileTypeSettings = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + ListView, FNameExtListView, ActionsListView: TGTKListView; + ListViewScrolledWindow, FNameExtListViewScrolledWindow, ActionsListViewScrolledWindow: TGTKScrolledWindow; + AssocListFrame, IconFrame: TGTKFrame; + FNameExtLabel, CommandLabel, DescriptionLabel, AssocDescriptionLabel, IconLabel, ColorLabel: TGTKLabel; + AssocListButtonBox, FNameExtButtonBox, ActionsButtonBox, ActionsButtonBox2: TGTKHButtonBox; + AssocListVBox, FNameExtVBox, FNameExtVBox2, FNameExtVBox3, ActionsVBox: TGTKVBox; + AssocListHBox, FNameExtHBox, FNameExtHBox2, ActionsHBox, ActionsHBox2, AssocDescriptionHBox, ColorHBox: TGTKHBox; + AddFiletypeButton, RemoveFiletypeButton, AddExtButton, RemoveExtButton, AddActionButton, RemoveActionButton, + SetDefaultActionButton, BrowseButton, BrowseIconButton: TGTKButton; + ColorButton: TGnomeColorButton; + FNameExtEntry, CommandEntry, DescriptionEntry, AssocDescriptionEntry, IconEntry: TGTKEntry; + RunInTerminalCheckBox, AutodetectCheckBox, DefaultColorCheckBox: TGTKCheckButton; + Notebook: TGTKNotebook; + Table, Table2: TGTKTable; + Icon: TGTKImage; + GnomeIconButton: TGnomeIconEntry; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure AddFiletypeButtonClick(Sender: TObject); + procedure RemoveFiletypeButtonClick(Sender: TObject); + procedure ListViewSelectionChanged(Sender: TObject); + procedure AddExtButtonClick(Sender: TObject); + procedure RemoveExtButtonClick(Sender: TObject); + procedure FNameExtEntryKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FNameExtListViewSelectionChanged(Sender: TObject); + procedure AssocDescriptionEntryChanged(Sender: TObject); + procedure ActionsListViewSelectionChanged(Sender: TObject); + procedure AddActionButtonClick(Sender: TObject); + procedure RemoveActionButtonClick(Sender: TObject); + procedure DescriptionEntryChanged(Sender: TObject); + procedure CommandEntryChanged(Sender: TObject); + procedure RunInTerminalCheckBoxToggled(Sender: TObject); + procedure AutodetectCheckBoxToggled(Sender: TObject); + procedure SetDefaultActionButtonClick(Sender: TObject); + procedure BrowseButtonClick(Sender: TObject); + procedure IconEntryChanged(Sender: TObject); + procedure BrowseIconButtonClick(Sender: TObject); + procedure ColorButtonColorChanged(Sender: TObject); + procedure DefaultColorCheckBoxToggled(Sender: TObject); + procedure ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); + procedure ActionsListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); + procedure GnomeIconButtonIconChanged(Sender: TObject); + public + IntAssocList: TList; + procedure AssignAssocList(List: TList); + procedure FillList; + procedure CleanItems; + private + FUseGnomeIconEntry: boolean; + end; + +var + FFileTypeSettings: TFFileTypeSettings; + +implementation + +uses glib2, ULocale, UFileAssoc, UCoreUtils, UConfig; + + +procedure TFFileTypeSettings.FormCreate(Sender: TObject); +var Column: TGTKTreeViewColumn; + l: TGTKLabel; +begin + FUseGnomeIconEntry := Assigned(gnome_icon_entry_new) and Assigned(gnome_icon_entry_get_filename) and Assigned(gnome_icon_entry_set_filename); + SetDefaultSize(450, 620); + Caption := LANGEditFileTypesCaption; + Buttons := [mbOK, mbCancel]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := LANGTitleLabel_Caption; + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-copy', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + ListView := TGTKListView.CreateTyped(Self, Application.GTKVersion_2_0_5_Up, [lcText, lcText, lcPointer, lcPixbuf]); + ListView.RulesHint := True; + Column := ListView.Columns.AddTyped(ctImageText);; + Column.Caption := LANGExtensionsColumn; + Column.AddImageAttribute('pixbuf', 3); + Column.AddAttribute('text', 0); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 0; + Column.Resizable := True; + g_object_set(G_OBJECT(Column.FColumn), 'sizing', 2, 'fixed-width', 150, nil); +{ Column.FixedWidth := 300; + Column.SizingMode := smFixed; } + if Application.GTKVersion_2_6_0_Up then Column.SetProperty('ellipsize', 3); + Column := ListView.Columns.Add; + Column.Caption := LANGDescriptionColumn; + Column.AddAttribute('text', 1); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 1; + Column.Resizable := True; + ListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ListViewScrolledWindow.AddControl(ListView); + ListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.ShadowType := stShadowIn; + AssocListHBox := TGTKHBox.Create(Self); + AssocListVBox := TGTKVBox.Create(Self); + AssocListVBox.AddControlEx(ListViewScrolledWindow, True, True, 4); + AssocListButtonBox := TGTKHButtonBox.Create(Self); + AssocListButtonBox.Layout := blEnd; + AssocListButtonBox.Spacing := 2; + AddFiletypeButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveFiletypeButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + AssocListButtonBox.AddControlEx(AddFiletypeButton, False, False, 0); + AssocListButtonBox.AddControlEx(RemoveFiletypeButton, False, False, 0); + AssocListVBox.AddControlEx(AssocListButtonBox, False, False, 5); + AssocListFrame := TGTKFrame.Create(Self); + AssocListFrame.Caption := LANGFileTypesList; + AssocListHBox.AddControlEx(AssocListVBox, True, True, 10); + AssocListFrame.AddControl(AssocListHBox); + AssocListFrame.BorderWidth := 7; + ClientArea.AddControlEx(AssocListFrame, True, True, 0); + + Notebook := TGTKNotebook.Create(Self); + Notebook.BorderWidth := 8; + ClientArea.AddControlEx(Notebook, False, False, 0); + + ActionsListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ActionsListView := TGTKListView.CreateTyped(Self, Application.GTKVersion_2_0_5_Up, [lcText, lcText, lcPointer]); + ActionsListView.RulesHint := True; + Column := ActionsListView.Columns.Add; + Column.Caption := LANGActionName; + Column.AddAttribute('text', 0); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 0; + Column.Resizable := True; + Column.FixedWidth := 180; + Column.SizingMode := smFixed; + Column := ActionsListView.Columns.Add; + Column.Caption := LANGCommand; + Column.AddAttribute('text', 1); + if Application.GTKVersion_2_0_5_Up then Column.SortID := 1; + Column.Resizable := True; + ActionsListViewScrolledWindow.AddControl(ActionsListView); + ActionsListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ActionsListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ActionsListViewScrolledWindow.ShadowType := stShadowIn; + ActionsListViewScrolledWindow.SetSizeRequest(-1, 95); + ActionsVBox := TGTKVBox.Create(Self); + ActionsButtonBox := TGTKHButtonBox.Create(Self); + ActionsButtonBox.Spacing := 2; + ActionsButtonBox.Layout := blEnd; + ActionsButtonBox2 := TGTKHButtonBox.Create(Self); + ActionsButtonBox2.Layout := blStart; + ActionsHBox := TGTKHBox.Create(Self); + ActionsHBox2 := TGTKHBox.Create(Self); + AddActionButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveActionButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + SetDefaultActionButton := TGTKButton.Create(Self); + SetDefaultActionButton.Caption := LANGSetDefaultActionButton_Caption; + RunInTerminalCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGRunInTerminalCheckBox_Caption); + RunInTerminalCheckBox.Enabled := False; + AutodetectCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGAutodetectCheckBox_Caption); + AutodetectCheckBox.Checked := True; + ActionsButtonBox.AddControl(AddActionButton); + ActionsButtonBox.AddControl(RemoveActionButton); + ActionsButtonBox2.AddControl(SetDefaultActionButton); + ActionsHBox.AddControlEx(ActionsButtonBox2, True, True, 5); + ActionsHBox.AddControlEx(ActionsButtonBox, True, True, 0); + ActionsVBox.AddControlEx(ActionsListViewScrolledWindow, True, True, 3); + CommandEntry := TGTKEntry.Create(Self); + CommandEntry.Tooltip := LANGCommandEntry_Tooltip; + DescriptionEntry := TGTKEntry.Create(Self); + BrowseButton := TGTKButton.Create(Self); + BrowseButton.Caption := LANGBrowseButton_Caption; + CommandLabel := TGTKLabel.Create(Self); + CommandLabel.Caption := LANGCommandLabel_Caption; + CommandLabel.XAlign := 0; + CommandLabel.FocusControl := CommandEntry; + CommandLabel.UseUnderline := True; + DescriptionLabel := TGTKLabel.Create(Self); + DescriptionLabel.Caption := LANGDescriptionLabel_Caption; + DescriptionLabel.XAlign := 0; + DescriptionLabel.FocusControl := DescriptionEntry; + DescriptionLabel.UseUnderline := True; + Table := TGTKTable.Create(Self); + Table.SetRowColCount(4, 2); + Table.Homogeneous := False; + Table.RowSpacing := 1; + Table.AddControl(0, 0, 1, 1, DescriptionLabel, 0, 0); + Table.AddControl(1, 0, 3, 1, DescriptionEntry, 0, 0); + Table.AddControl(0, 1, 1, 1, CommandLabel, 0, 0); + Table.AddControl(1, 1, 3, 1, CommandEntry, 0, 0); + ActionsHBox2.Homogeneous := False; + ActionsHBox2.AddControlEx(AutodetectCheckBox, True, True, 5); + ActionsHBox2.AddControlEx(RunInTerminalCheckBox, True, True, 5); + ActionsHBox2.AddControlEx(BrowseButton, False, False, 0); + ActionsVBox.AddControlEx(Table, False, False, 1); + ActionsVBox.AddControlEx(ActionsHBox2, False, False, 0); + l := TGTKLabel.Create(Self); + l.SetSizeRequest(0, 4); + ActionsVBox.AddControlEx(l, False, False, 0); + ActionsVBox.AddControlEx(ActionsHBox, False, False, 0); + ActionsVBox.BorderWidth := 8; + + AssocDescriptionLabel := TGTKLabel.Create(Self); + AssocDescriptionLabel.Caption := LANGDescriptionLabel_Caption; + AssocDescriptionEntry := TGTKEntry.Create(Self); + AssocDescriptionLabel.FocusControl := AssocDescriptionEntry; + AssocDescriptionLabel.UseUnderline := True; + AssocDescriptionHBox := TGTKHBox.Create(Self); + AssocDescriptionHBox.Homogeneous := False; + AssocDescriptionHBox.AddControlEx(AssocDescriptionLabel, False, False, 10); + AssocDescriptionHBox.AddControlEx(AssocDescriptionEntry, True, True, 10); + FNameExtListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + FNameExtListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + FNameExtListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + FNameExtListViewScrolledWindow.ShadowType := stShadowIn; + FNameExtListView := TGTKListView.CreateTyped(Self, False, [lcText]); + FNameExtListView.ShowHeaders := False; + Column := FNameExtListView.Columns.Add; + Column.AddAttribute('text', 0); + FNameExtListViewScrolledWindow.AddControl(FNameExtListView); + FNameExtVBox2 := TGTKVBox.Create(Self); + FNameExtVBox2.AddControlEx(FNameExtListViewScrolledWindow, True, True, 4); + FNameExtHBox := TGTKHBox.Create(Self); + FNameExtVBox := TGTKVBox.Create(Self); + FNameExtLabel := TGTKLabel.Create(Self); + FNameExtLabel.Caption := LANGFNameExtLabel_Caption; + AddExtButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveExtButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + FNameExtEntry := TGTKEntry.Create(Self); + FNameExtEntry.SetSizeRequest(0, -1); + FNameExtLabel.FocusControl := FNameExtEntry; + FNameExtLabel.UseUnderline := True; + FNameExtHBox.AddControlEx(FNameExtVBox, True, True, 5); + FNameExtHBox.AddControlEx(FNameExtVBox2, True, True, 10); + FNameExtHBox2 := TGTKHBox.Create(Self); + FNameExtHBox2.Homogeneous := False; + FNameExtHBox2.AddControlEx(FNameExtLabel, False, False, 4); + FNameExtHBox2.AddControlEx(FNameExtEntry, True, True, 1); + FNameExtHBox2.BorderWidth := 2; + FNameExtButtonBox := TGTKHButtonBox.Create(Self); + FNameExtButtonBox.Layout := blEnd; + FNameExtButtonBox.AddControl(AddExtButton); + FNameExtButtonBox.AddControl(RemoveExtButton); + FNameExtButtonBox.BorderWidth := 3; + FNameExtVBox.AddControlEx(FNameExtHBox2, False, False, 2); + FNameExtVBox.AddControlEx(FNameExtButtonBox, False, False, 2); + FNameExtVBox.AddControlEx(TGTKHSeparator.Create(Self), False, False, 2); + ColorHBox := TGTKHBox.Create(Self); + ColorHBox.Homogeneous := False; + ColorHBox.BorderWidth := 2; + ColorLabel := TGTKLabel.Create(Self); + ColorLabel.Caption := LANGColor; + ColorLabel.UseUnderline := True; + ColorButton := TGnomeColorButton.Create(Self); + ColorButton.SetSizeRequest(40, -1); + ColorButton.OnColorChanged := ColorButtonColorChanged; + ColorLabel.FocusControl := ColorButton; + DefaultColorCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGDefaultColor); + DefaultColorCheckBox.OnToggled := DefaultColorCheckBoxToggled; + ColorHBox.AddControlEx(ColorLabel, False, False, 4); + ColorHBox.AddControlEx(ColorButton, False, False, 5); + ColorHBox.AddControlEx(DefaultColorCheckBox, False, False, 5); + FNameExtVBox.AddControlEx(ColorHBox, False, False, 2); + FNameExtVBox.AddControlEx(TGTKLabel.Create(Self), True, True, 0); + IconLabel := TGTKLabel.Create(Self); + IconLabel.Caption := LANGIcon; + IconLabel.UseUnderline := True; + IconEntry := TGTKEntry.Create(Self); + IconEntry.OnChanged := IconEntryChanged; + IconLabel.FocusControl := IconEntry; + BrowseIconButton := TGTKButton.Create(Self); + BrowseIconButton.Caption := LANGBrowseButton_Caption; + BrowseIconButton.OnClick := BrowseIconButtonClick; + Icon := TGTKImage.Create(Self); + Icon.SetSizeRequest(24, 24); + IconFrame := TGTKFrame.CreateWithoutLabel(Self); + IconFrame.ShadowType := stEtchedIn; + IconFrame.AddControl(Icon); + if FUseGnomeIconEntry then begin + GnomeIconButton := TGnomeIconEntry.Create(Self); + GnomeIconButton.OnIconChanged := GnomeIconButtonIconChanged; + end; + + Table2 := TGTKTable.Create(Self); + Table2.SetRowColCount(8, 3); + Table2.AddControl(0, 1, 1, 1, IconLabel, 10, 0); + if FUseGnomeIconEntry then Table2.AddControl(1, 0, 1, 3, GnomeIconButton, 0, 0); + Table2.AddControl(2, 1, 1, 1, IconFrame, 10, 0); + Table2.AddControl(3, 1, 4, 1, IconEntry, 0, 0); + Table2.AddControl(7, 1, 1, 1, BrowseIconButton, 10, 0); + if FUseGnomeIconEntry then begin + Table2.AddControl(2, 0, 6, 1, TGTKLabel.Create(Self), 0, 0); + Table2.AddControl(2, 2, 6, 1, TGTKLabel.Create(Self), 0, 0); + end; + FNameExtVBox3 := TGTKVBox.Create(Self); + FNameExtVBox3.BorderWidth := 10; + FNameExtVBox3.AddControlEx(AssocDescriptionHBox, False, False, 5); + FNameExtVBox3.AddControlEx(TGTKHSeparator.Create(Self), False, False, 3); + FNameExtVBox3.AddControlEx(Table2, False, False, 1); + FNameExtVBox3.AddControlEx(TGTKHSeparator.Create(Self), False, False, 3); + FNameExtVBox3.AddControlEx(FNameExtHBox, True, True, 5); + Notebook.AppendPage(FNameExtVBox3, LANGNotebookPageExtensions); + Notebook.AppendPage(ActionsVBox, LANGNotebookPageActions); + + OnKeyDown := FormKeyDown; + OnDestroy := FormDestroy; + AddFiletypeButton.OnClick := AddFiletypeButtonClick; + RemoveFiletypeButton.OnClick := RemoveFiletypeButtonClick; + ListView.OnSelectionChanged := ListViewSelectionChanged; + AddExtButton.OnClick := AddExtButtonClick; + RemoveExtButton.OnClick := RemoveExtButtonClick; + FNameExtEntry.OnKeyDown := FNameExtEntryKeyDown; + FNameExtListView.OnSelectionChanged := FNameExtListViewSelectionChanged; + AssocDescriptionEntry.OnChanged := AssocDescriptionEntryChanged; + ActionsListView.OnSelectionChanged := ActionsListViewSelectionChanged; + AddActionButton.OnClick := AddActionButtonClick; + RemoveActionButton.OnClick := RemoveActionButtonClick; + DescriptionEntry.OnChanged := DescriptionEntryChanged; + CommandEntry.OnChanged := CommandEntryChanged; + RunInTerminalCheckBox.OnToggled := RunInTerminalCheckBoxToggled; + AutodetectCheckBox.OnToggled := AutodetectCheckBoxToggled; + SetDefaultActionButton.OnClick := SetDefaultActionButtonClick; + BrowseButton.OnClick := BrowseButtonClick; + + ListView.CellDataFunc := ListViewCellDataFunc; + ActionsListView.CellDataFunc := ActionsListViewCellDataFunc; + ListViewSelectionChanged(Self); + ListView.SetFocus; +end; + +procedure TFFileTypeSettings.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin +// if Key = GDK_ESCAPE then ModalResult := mbCancel; +end; + +procedure TFFileTypeSettings.FormDestroy(Sender: TObject); +var i: integer; +begin + if Assigned(IntAssocList) then begin + if IntAssocList.Count > 0 then + for i := 0 to IntAssocList.Count - 1 do + if Assigned(IntAssocList[i]) then TFileAssoc(IntAssocList[i]).Free; + IntAssocList.Clear; + IntAssocList.Free; + end; +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.AssignAssocList(List: TList); +var i, j: integer; + Item: TFileAssoc; + Action: TAssocAction; +begin + IntAssocList := TList.Create; + if List.Count > 0 then + for i := 0 to List.Count - 1 do begin + Item := TFileAssoc.Create; + with Item do begin + Extensions := TFileAssoc(List[i]).Extensions; + FileTypeName := TFileAssoc(List[i]).FileTypeName; + DefaultAction := TFileAssoc(List[i]).DefaultAction; + FileTypeIcon := TFileAssoc(List[i]).FileTypeIcon; + ColorString := TFileAssoc(List[i]).ColorString; + Pixmap := TGDKPixbuf.Create(Self); + Pixmap.FPixbuf := TFileAssoc(List[i]).Pixmap.Copy; + if TFileAssoc(List[i]).ActionList.Count > 0 then + for j := 0 to TFileAssoc(List[i]).ActionList.Count - 1 do begin + Action := TAssocAction.Create; + with Action do begin + ActionName := TAssocAction(TFileAssoc(List[i]).ActionList[j]).ActionName; + ActionCommand := TAssocAction(TFileAssoc(List[i]).ActionList[j]).ActionCommand; + RunInTerminal := TAssocAction(TFileAssoc(List[i]).ActionList[j]).RunInTerminal; + AutodetectGUI := TAssocAction(TFileAssoc(List[i]).ActionList[j]).AutodetectGUI; + end; + Item.ActionList.Add(Action) + end; + end; + IntAssocList.Add(Item); + end; +end; + +procedure TFFileTypeSettings.FillList; + + procedure InternalAddItem(index: integer); + var ListItem: TGTKListItem; + begin + with TFileAssoc(IntAssocList[index]) do begin + ListItem := ListView.Items.Add; + if FileTypeName = ConstFTAMetaDirectory then ListItem.SetValue(0, LANGFileTypeDirectory) else + if FileTypeName = ConstFTAMetaFile then ListItem.SetValue(0, LANGFileTypeFile) else + ListItem.SetValue(0, Extensions); + if (FileTypeName = ConstFTAMetaDirectory) or (FileTypeName = ConstFTAMetaFile) + then ListItem.SetValue(1, LANGFileTypeMetafile) + else ListItem.SetValue(1, FileTypeName); + ListItem.SetValue(2, IntAssocList[index]); + ListItem.SetValue(3, Pixmap.FPixbuf); + end; + end; + +var i: integer; +begin + if Assigned(IntAssocList) and (IntAssocList.Count > 0) then begin + // Directory metaitem first + for i := 0 to IntAssocList.Count - 1 do + if TFileAssoc(IntAssocList[i]).FileTypeName = ConstFTAMetaDirectory then begin + InternalAddItem(i); + Break; + end; + // Then the file metaitem + for i := 0 to IntAssocList.Count - 1 do + if TFileAssoc(IntAssocList[i]).FileTypeName = ConstFTAMetaFile then begin + InternalAddItem(i); + Break; + end; + // ... and the rest + for i := 0 to IntAssocList.Count - 1 do + if (TFileAssoc(IntAssocList[i]).FileTypeName <> ConstFTAMetaDirectory) and + (TFileAssoc(IntAssocList[i]).FileTypeName <> ConstFTAMetaFile) + then InternalAddItem(i); + end; +end; + +procedure TFFileTypeSettings.CleanItems; +var i: integer; +begin + try + if IntAssocList.Count > 0 then + for i := IntAssocList.Count - 1 downto 0 do + with TFileAssoc(IntAssocList[i]) do begin +{ if Length(Trim(Extensions)) = 0 then begin + TFileAssoc(IntAssocList[i]).Free; + IntAssocList.Delete(i); + Continue; + end; + if ActionList.Count > 0 then + for j := ActionList.Count - 1 downto 0 do + if Length(Trim(TAssocAction(ActionList[j]).ActionCommand)) = 0 then begin + TAssocAction(ActionList[j]).Free; + ActionList.Delete(j); + if DefaultAction = j then DefaultAction := 0; + if DefaultAction > j then Dec(DefaultAction); + end; } + if DefaultAction > ActionList.Count - 1 then DefaultAction := 0; + end; + except end; +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.AddFiletypeButtonClick(Sender: TObject); +var Item: TFileAssoc; + ListItem: TGTKListItem; +begin + Notebook.PageIndex := 0; + Item := TFileAssoc.Create; + IntAssocList.Add(Item); + ListItem := ListView.Items.Add; + ListItem.SetValue(2, Item); + ListItem.Selected := True; + ListItem.SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + ListViewSelectionChanged(Self); + AssocDescriptionEntry.SetFocus; +end; + +procedure TFFileTypeSettings.RemoveFiletypeButtonClick(Sender: TObject); +var Item: TFileAssoc; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) then begin + Item := ListView.Selected.AsPointer(2); + Item.Free; + IntAssocList.Remove(Item); + ListView.Items.Delete(ListView.Selected.Index); + end; +end; + +procedure TFFileTypeSettings.ListViewSelectionChanged(Sender: TObject); +var b: boolean; + Item: TFileAssoc; + s: string; + i: integer; + ListItem: TGTKListItem; + Color: TGDKColor; +begin + b := Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)); + RemoveFiletypeButton.Enabled := b and (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaDirectory) and + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaFile); + AssocDescriptionEntry.Enabled := RemoveFiletypeButton.Enabled; + FNameExtEntry.Enabled := RemoveFiletypeButton.Enabled; + FNameExtListView.Enabled := RemoveFiletypeButton.Enabled; + AddExtButton.Enabled := RemoveFiletypeButton.Enabled; + RemoveExtButton.Enabled := RemoveFiletypeButton.Enabled; + FNameExtLabel.Enabled := RemoveFiletypeButton.Enabled; + ColorButton.Enabled := RemoveFiletypeButton.Enabled; + DefaultColorCheckBox.Enabled := RemoveFiletypeButton.Enabled; + ColorLabel.Enabled := RemoveFiletypeButton.Enabled; + FNameExtVBox3.Enabled := b; + ActionsVBox.Enabled := b; + if not b then begin + // Visually clean all the fields + DescriptionEntry.Text := ''; + CommandEntry.Text := ''; + AssocDescriptionEntry.Text := ''; + FNameExtListView.Items.Clear; + FNameExtEntry.Text := ''; + IconEntry.Text := ''; + ActionsListView.Items.Clear; + ColorButton.SetDefaultColor; + ColorButton.Color := PGdkColorToGDKColor(GetDefaultBackgroundColor(0)); + DefaultColorCheckBox.Checked := True; + Exit; + end; + Item := ListView.Selected.AsPointer(2); + FNameExtListView.Items.Clear; + if Length(Item.Extensions) > 0 then begin + s := Item.Extensions; + while Pos(';', s) > 0 do begin + FNameExtListView.Items.Add.SetValue(0, Trim(Copy(s, 1, Pos(';', s) - 1))); + Delete(s, 1, Pos(';', s)); + end; + if Length(Trim(s)) > 0 then FNameExtListView.Items.Add.SetValue(0, Trim(s)); + end; + IconEntry.Text := Item.FileTypeIcon; + IconEntryChanged(Self); + if (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName = ConstFTAMetaDirectory) or + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName = ConstFTAMetaFile) + then AssocDescriptionEntry.Text := ListView.Selected.AsString(0) + else AssocDescriptionEntry.Text := ListView.Selected.AsString(1); + DefaultColorCheckBox.Checked := not StringToGDKColor(Item.ColorString, Color); + if DefaultColorCheckBox.Checked then ColorButton.SetDefaultColor + else begin + ColorButton.UnsetDefaultColor; + ColorButton.Color := Color; + end; + // Actions + ActionsListView.Items.Clear; + if Item.ActionList.Count > 0 then + for i := 0 to Item.ActionList.Count - 1 do + with TAssocAction(Item.ActionList[i]) do begin + ListItem := ActionsListView.Items.Add; + if Item.DefaultAction = i + then begin + ListItem.SetValue(0, ActionName + LANGDefault); + ListItem.SetValue(1, ActionCommand); + end else begin + ListItem.SetValue(0, ActionName); + ListItem.SetValue(1, ActionCommand); + end; + ListItem.SetValue(2, Item.ActionList[i]); + end; + if ActionsListView.Items.Count > 0 then ActionsListView.Items[0].Selected := True; + ActionsListViewSelectionChanged(Sender); +end; + +procedure TFFileTypeSettings.AddExtButtonClick(Sender: TObject); +var i: integer; + s, sx: string; +begin + if Length(Trim(FNameExtEntry.Text)) = 0 then Exit; + if FNameExtListView.Items.Count > 0 then + for i := 0 to FNameExtListView.Items.Count - 1 do + if ANSIUpperCase(FNameExtListView.Items[i].AsString(0)) = ANSIUpperCase(Trim(FNameExtEntry.Text)) then Exit; + sx := ANSILowerCase(Trim(FNameExtEntry.Text)); + if sx[1] = '.' then Delete(sx, 1, 1); + FNameExtListView.Items.Add.SetValue(0, sx); + s := TFileAssoc(ListView.Selected.AsPointer(2)).Extensions; + if Length(s) > 0 then s := s + ';'; + s := s + sx; + ListView.Selected.SetValue(0, s); + TFileAssoc(ListView.Selected.AsPointer(2)).Extensions := s; + FNameExtEntry.Text := ''; +end; + +procedure TFFileTypeSettings.RemoveExtButtonClick(Sender: TObject); +var s: string; + i: integer; +begin + try + if (FNameExtListView.Items.Count = 0) or (not Assigned(FNameExtListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + s := TFileAssoc(ListView.Selected.AsPointer(2)).Extensions; + i := Pos(FNameExtListView.Selected.AsString(0), s); + if i = 0 then Exit; + Delete(s, i, Length(FNameExtListView.Selected.AsString(0))); + if s = ';' then s := '' else + if (Length(s) >= i) and (s[i] = ';') then Delete(s, i, 1) else + if (Length(s) >= i - 1) and (i > 1) and (s[i - 1] = ';') then Delete(s, i - 1, 1); + ListView.Selected.SetValue(0, s); + TFileAssoc(ListView.Selected.AsPointer(2)).Extensions := s; + FNameExtListView.Items.Delete(FNameExtListView.Selected.Index); + except end; +end; + +procedure TFFileTypeSettings.FNameExtEntryKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + if (Key = GDK_RETURN) or (Key = GDK_KP_ENTER) then AddExtButtonClick(Sender); +end; + +procedure TFFileTypeSettings.FNameExtListViewSelectionChanged(Sender: TObject); +begin + RemoveExtButton.Enabled := (FNameExtListView.Items.Count > 0) and Assigned(FNameExtListView.Selected); +end; + +procedure TFFileTypeSettings.AssocDescriptionEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaDirectory) and + (TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName <> ConstFTAMetaFile) then + begin + TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName := AssocDescriptionEntry.Text; + ListView.Selected.SetValue(1, AssocDescriptionEntry.Text); + end; +end; + +procedure TFFileTypeSettings.ActionsListViewSelectionChanged(Sender: TObject); +var b: boolean; + Action: TAssocAction; +begin + b := (ActionsListView.Items.Count > 0) and Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)); + RemoveActionButton.Enabled := b; + SetDefaultActionButton.Enabled := b; + Table.Enabled := b; + BrowseButton.Enabled := b; + RunInTerminalCheckBox.Enabled := b; + AutodetectCheckBox.Enabled := b; + if not b then begin + // Visually clean all the fields + DescriptionEntry.Text := ''; + CommandEntry.Text := ''; + Exit; + end; + Action := ActionsListView.Selected.AsPointer(2); + DescriptionEntry.Text := Action.ActionName; + CommandEntry.Text := Action.ActionCommand; + RunInTerminalCheckBox.Checked := Action.RunInTerminal; + AutodetectCheckBox.Checked := Action.AutodetectGUI; + RunInTerminalCheckBox.Enabled := not AutodetectCheckBox.Checked; +end; + +procedure TFFileTypeSettings.AddActionButtonClick(Sender: TObject); +var Action: TAssocAction; + ListItem: TGTKListItem; +begin + if (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Action := TAssocAction.Create; + TFileAssoc(ListView.Selected.AsPointer(2)).ActionList.Add(Action); + ListItem := ActionsListView.Items.Add; + ListItem.SetValue(2, Action); + ListItem.Selected := True; + ActionsListViewSelectionChanged(Self); + DescriptionEntry.SetFocus; +end; + +procedure TFFileTypeSettings.RemoveActionButtonClick(Sender: TObject); +var Action: TAssocAction; + Item: TFileAssoc; +begin + try + if (ActionsListView.Items.Count = 0) or (not Assigned(ActionsListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Item := ListView.Selected.AsPointer(2); + Action := ActionsListView.Selected.AsPointer(2); + if (Item.DefaultAction > Item.ActionList.Count - 1) or (Item.ActionList[Item.DefaultAction] = Action) + then Item.DefaultAction := 0; + if Item.DefaultAction > ActionsListView.Selected.Index then Dec(Item.DefaultAction); + Action.Free; + Item.ActionList.Remove(Action); + ActionsListView.Items.Delete(ActionsListView.Selected.Index); + ListViewSelectionChanged(Sender); + except end; +end; + +procedure TFFileTypeSettings.DescriptionEntryChanged(Sender: TObject); +var Item: TFileAssoc; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) then + begin + TAssocAction(ActionsListView.Selected.AsPointer(2)).ActionName := DescriptionEntry.Text; + Item := ListView.Selected.AsPointer(2); + if (Item.ActionList.Count - 1 >= Item.DefaultAction) and (ActionsListView.Selected.AsPointer(2) = Item.ActionList[Item.DefaultAction]) + then ActionsListView.Selected.SetValue(0, DescriptionEntry.Text + LANGDefault) + else ActionsListView.Selected.SetValue(0, DescriptionEntry.Text); + end; +end; + +procedure TFFileTypeSettings.CommandEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) then + begin + TAssocAction(ActionsListView.Selected.AsPointer(2)).ActionCommand := CommandEntry.Text; + ActionsListView.Selected.SetValue(1, CommandEntry.Text); + end; +end; + +procedure TFFileTypeSettings.RunInTerminalCheckBoxToggled(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) + then TAssocAction(ActionsListView.Selected.AsPointer(2)).RunInTerminal := RunInTerminalCheckBox.Checked; +end; + +procedure TFFileTypeSettings.AutodetectCheckBoxToggled(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) and + Assigned(ActionsListView.Selected) and Assigned(ActionsListView.Selected.AsPointer(2)) then + begin + TAssocAction(ActionsListView.Selected.AsPointer(2)).AutodetectGUI := AutodetectCheckBox.Checked; + RunInTerminalCheckBox.Enabled := not AutodetectCheckBox.Checked; + end; +end; + +procedure TFFileTypeSettings.SetDefaultActionButtonClick(Sender: TObject); +var SelIdx: integer; +begin + if (ActionsListView.Items.Count = 0) or (not Assigned(ActionsListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + SelIdx := ActionsListView.Selected.Index; + TFileAssoc(ListView.Selected.AsPointer(2)).DefaultAction := SelIdx; + ListViewSelectionChanged(Sender); + ActionsListView.Items[SelIdx].Selected := True; +end; + +procedure TFFileTypeSettings.BrowseButtonClick(Sender: TObject); +var Dialog: TGTKFileSelectionDialog; +begin + if (ActionsListView.Items.Count = 0) or (not Assigned(ActionsListView.Selected)) or + (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Dialog := TGTKFileSelectionDialog.Create(Self); + try + Dialog.ShowFileOpButtons := False; + Dialog.FileName := AppPath; + if Byte(Dialog.Run) = 251 then CommandEntry.Text := Dialog.FileName; + AppPath := IncludeTrailingPathDelimiter(ExtractFilePath(Dialog.FileName)); + finally + Dialog.Free; + end; +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.IconEntryChanged(Sender: TObject); +var Pixmap, DefIcon: TGDKPixbuf; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) then begin + if TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeName = ConstFTAMetaDirectory + then DefIcon := FolderIconCached + else DefIcon := FileIconCached; + TFileAssoc(ListView.Selected.AsPointer(2)).FileTypeIcon := IconEntry.Text; + if not FileExists(UTF8ToANSI(IconEntry.Text)) then Icon.CopyFromPixbuf(DefIcon) else + begin + Pixmap := TGDKPixbuf.Create(Self); + Pixmap.LoadFromFile(UTF8ToANSI(IconEntry.Text)); + if Pixmap.FPixbuf <> nil then begin + Pixmap.ScaleSimple(ConfRowHeightReal, ConfRowHeightReal); + Icon.SetFromPixbuf(Pixmap); + end else Icon.CopyFromPixbuf(DefIcon); + Pixmap.FPixbuf := nil; + Pixmap.Free; + end; + ListView.Selected.SetValue(3, Icon.GetPixbuf); + if FUseGnomeIconEntry then + if FileExists(UTF8ToANSI(IconEntry.Text)) then GnomeIconButton.Filename := UTF8ToANSI(IconEntry.Text) + else GnomeIconButton.Filename := ''; + end; +end; + +procedure TFFileTypeSettings.BrowseIconButtonClick(Sender: TObject); +var Dialog: TGTKFileSelectionDialog; +begin + if (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(2))) then Exit; + Dialog := TGTKFileSelectionDialog.CreateWithTitle(Self, LANGBrowseForIcon); + try + Dialog.ShowFileOpButtons := False; + if FileExists(UTF8ToANSI(IconEntry.Text)) then Dialog.FileName := IconEntry.Text + else Dialog.FileName := IconPath; + if Byte(Dialog.Run) = 251 then IconEntry.Text := Dialog.FileName; + IconPath := IncludeTrailingPathDelimiter(ExtractFilePath(Dialog.FileName)); + finally + Dialog.Free; + end; +end; + +procedure TFFileTypeSettings.ColorButtonColorChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) then + TFileAssoc(ListView.Selected.AsPointer(2)).ColorString := GDKColorToString(ColorButton.Color); +end; + +procedure TFFileTypeSettings.DefaultColorCheckBoxToggled(Sender: TObject); +begin + if DefaultColorCheckBox.Checked then ColorButton.SetDefaultColor + else ColorButton.UnsetDefaultColor; + if DefaultColorCheckBox.Checked and Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(2)) + then TFileAssoc(ListView.Selected.AsPointer(2)).ColorString := ''; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFFileTypeSettings.ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); +var ColumnID: integer; + ImageCol: boolean; + Data: TFileAssoc; + s: Pointer; +begin + if not Application.GTKVersion_2_0_5_Up then Exit; + ColumnID := gtk_tree_view_column_get_sort_column_id(tree_column); + ImageCol := False; + if ColumnID = 0 then ImageCol := GTK_IS_CELL_RENDERER_PIXBUF(cell); + if ImageCol then Exit; + Data := nil; + gtk_tree_model_get(tree_model, iter, 2, @Data, -1); + gtk_tree_model_get(tree_model, iter, ColumnID, @s, -1); + + if Assigned(Data) and (Data is TFileAssoc) and ((Data.FileTypeName = ConstFTAMetaDirectory) or (Data.FileTypeName = ConstFTAMetaFile)) + then + case ColumnID of + 0: g_object_set(cell, 'markup', g_strconcat('', s, '', nil), nil); + 1: g_object_set(cell, 'markup', g_strconcat('', s, '', nil), nil); + end + else g_object_set(cell, 'markup', s, nil); +end; + + +procedure TFFileTypeSettings.ActionsListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); +var ColumnID: integer; + ImageCol: boolean; + Data: TAssocAction; + s: Pointer; + Item: TFileAssoc; +begin + if not Application.GTKVersion_2_0_5_Up then Exit; + ColumnID := gtk_tree_view_column_get_sort_column_id(tree_column); + ImageCol := False; + if ColumnID = 0 then ImageCol := GTK_IS_CELL_RENDERER_PIXBUF(cell); + if ImageCol then Exit; + Item := ListView.Selected.AsPointer(2); + if Item = nil then Exit; + Data := nil; + gtk_tree_model_get(tree_model, iter, 2, @Data, -1); + gtk_tree_model_get(tree_model, iter, ColumnID, @s, -1); + + if Assigned(Data) and (Data is TAssocAction) and (Item.ActionList.IndexOf(Data) = Item.DefaultAction) + then g_object_set(cell, 'markup', g_strconcat('', s, '', nil), nil) + else g_object_set(cell, 'markup', s, nil); +end; + +(********************************************************************************************************************************) +procedure TFFileTypeSettings.GnomeIconButtonIconChanged(Sender: TObject); +begin + IconEntry.Text := GnomeIconButton.Filename; +end; + + + + +end. + diff --git a/UGTKLoader.pas b/UGTKLoader.pas new file mode 100644 index 0000000..b135f6b --- /dev/null +++ b/UGTKLoader.pas @@ -0,0 +1,62 @@ +(* + UGTKLoader - Special unit, which has to be loaded before gtk_init in GTKForms + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) + +unit UGTKLoader; + +interface + +implementation + +uses glib2, gtk2, Classes, SysUtils; + +const ConfDefaultSettingsDir = '.tuxcmd'; + + +procedure WriteGTKRCTreeViewFix; +var s, s2: string; + StringList: TStringList; +begin + s := IncludeTrailingPathDelimiter(g_get_home_dir) + ConfDefaultSettingsDir; + s2 := IncludeTrailingPathDelimiter(s) + 'gtkrc'; + if not FileExists(s2) then begin + StringList := TStringList.Create; + StringList.Add('style "treeview-style" {'); + StringList.Add(' GtkTreeView::horizontal_separator = 0'); + StringList.Add(' GtkTreeView::vertical_separator = 0'); + StringList.Add('}'); + StringList.Add('class "GtkTreeView" style "treeview-style"'); + try + if not DirectoryExists(s) then + if not ForceDirectories(s) then begin + WriteLn('*** Error: Cannot make homedir'); + Exit; + end; + StringList.SaveToFile(s2); + StringList.Free; + except + on E: Exception do WriteLn('*** Error: Cannot save .gtkrc in your home (', E.ClassName, '): ', E.Message); + end; + end; + if gtk_check_version(2, 4, 0) = nil then gtk_rc_add_default_file(PChar(s2)); +end; + +initialization + WriteGTKRCTreeViewFix; +end. diff --git a/UGlibC_compat.pas b/UGlibC_compat.pas new file mode 100644 index 0000000..342ab2d --- /dev/null +++ b/UGlibC_compat.pas @@ -0,0 +1,256 @@ +(* + Tux Commander - UGlibC_compat - glibc compatibility for 32- and 64-bit platforms + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UGlibC_compat; + +interface +uses Classes, SysUtils {$IFNDEF CPU64}, Libc{$ENDIF}; + + +const GLIBC_LIB = 'libc.so.6'; + +type + PGlibc_IOFile = pointer; + + TGlibc_timespec = packed record +{$IFNDEF CPU64} // 32-bit platform + tv_sec: longint; // Seconds. + tv_nsec: longint; // Nanoseconds. +{$ELSE} // 64-bit platform + tv_sec: Int64; // Seconds. + tv_nsec: Int64; // Nanoseconds. +{$ENDIF} + end; + + PGlibc_stat = ^TGlibc_stat; +{$IFDEF KYLIX} + TGlibc_stat = TStatBuf; +{$ELSE} +{$IFNDEF CPU64} // 32-bit platform + TGlibc_stat = packed record + st_dev : __dev_t; + __pad1 : word; + __align_pad1 : word; + st_ino : __ino_t; + st_mode : __mode_t; + st_nlink : __nlink_t; + st_uid : __uid_t; + st_gid : __gid_t; + st_rdev : __dev_t; + __pad2 : word; + __align_pad2 : word; + st_size : __off_t; + st_blksize : __blksize_t; + st_blocks : __blkcnt_t; + + st_atim : TGlibc_timespec; + st_mtim : TGlibc_timespec; + st_ctim : TGlibc_timespec; + +{ st_atime : __time_t; + __unused1 : dword; + st_mtime : __time_t; + __unused2 : dword; + st_ctime : __time_t; + __unused3 : dword; } + + __unused4 : dword; + __unused5 : dword; + end; +{$ELSE} // 64-bit platform + TGlibc_stat = packed record + st_dev : QWORD; + st_ino : Int64; + st_nlink : QWORD; + st_mode : DWORD; + st_uid : DWORD; + st_gid : DWORD; + pad0 : DWORD; + st_rdev : QWORD; + st_size : Int64; + st_blksize : Int64; + st_blocks : Int64; + st_atim : TGlibc_timespec; + st_mtim : TGlibc_timespec; + st_ctim : TGlibc_timespec; + __unused : array[1..3] of QWORD; + end; +{$ENDIF} +{$ENDIF} + + PGlibc_stat64 = ^TGlibc_stat64; +{$IFDEF KYLIX} + TGlibc_stat64 = TStatBuf64; +{$ELSE} + TGlibc_stat64 = packed record +{$IFNDEF CPU64} // 32-bit platform + st_dev : __dev_t; + __pad1 : dword; + __st_ino : __ino_t; + st_mode : __mode_t; + st_nlink : __nlink_t; + st_uid : __uid_t; + st_gid : __gid_t; + st_rdev : __dev_t; + __pad2 : dword; + st_size : __off64_t; + st_blksize : __blksize_t; + st_blocks : __blkcnt64_t; + + st_atim : TGlibc_timespec; + st_mtim : TGlibc_timespec; + st_ctim : TGlibc_timespec; + +{ st_atime : __time_t; + __unused1 : dword; + st_mtime : __time_t; + __unused2 : dword; + st_ctime : __time_t; + __unused3 : dword; } + + st_ino : __ino64_t; +{$ELSE} // 64-bit platform + st_dev : QWORD; + st_ino : Int64; + st_nlink : QWORD; + st_mode : DWORD; + st_uid : DWORD; + st_gid : DWORD; + pad0 : DWORD; + st_rdev : QWORD; + st_size : Int64; + st_blksize : Int64; + st_blocks : Int64; + st_atim : TGlibc_timespec; + st_mtim : TGlibc_timespec; + st_ctim : TGlibc_timespec; + __unused : array[1..3] of QWORD; +{$ENDIF} + end; +{$ENDIF} + + + TGlibc_fsid_t = packed record + __val : array[0..1] of longint; + end; + + PGlibc_statfs64 = ^TGlibc_statfs64; + TGlibc_statfs64 = packed record +{$IFNDEF CPU64} // 32-bit platform + f_type : longint; + f_bsize : longint; + f_blocks : __fsblkcnt64_t; + f_bfree : __fsblkcnt64_t; + f_bavail : __fsblkcnt64_t; + f_files : __fsfilcnt64_t; + f_ffree : __fsfilcnt64_t; + f_fsid : __fsid_t; + f_namelen : longint; + f_spare : array[0..5] of longint; +{$ELSE} // 64-bit platform + f_type : Int64; + f_bsize : Int64; + f_blocks : QWORD; + f_bfree : QWORD; + f_bavail : QWORD; + f_files : QWORD; + f_ffree : QWORD; + f_fsid : TGlibc_fsid_t; + f_namelen : Int64; + f_spare : array[0..5] of Int64; +{$ENDIF} + end; + + PGlibc_utimbuf = ^TGlibc_utimbuf; + TGlibc_utimbuf = packed record +{$IFNDEF CPU64} // 32-bit platform + actime : __time_t; + modtime : __time_t; +{$ELSE} // 64-bit platform + actime : Int64; + modtime : Int64; +{$ENDIF} + end; + + PGlibc_mntent = ^TGlibc_mntent; + TGlibc_mntent = packed record +{$IFNDEF CPU64} // 32-bit platform + mnt_fsname : Pchar; + mnt_dir : Pchar; + mnt_type : Pchar; + mnt_opts : Pchar; + mnt_freq : longint; + mnt_passno : longint; +{$ELSE} // 64-bit platform + mnt_fsname : Pchar; + mnt_dir : Pchar; + mnt_type : Pchar; + mnt_opts : Pchar; + mnt_freq : Longint; + mnt_passno : Longint; +{$ENDIF} + end; + +{$IFDEF KYLIX} + QWORD = Int64; +{$ENDIF} + + + + +{$IFNDEF KYLIX} +function glibc_stat64(const afile: PChar; buf: PGlibc_stat64): longint; cdecl; external GLIBC_LIB name 'stat64'; +function glibc_lstat64(const path: PChar; buf: PGlibc_stat64): longint; cdecl; external GLIBC_LIB name 'lstat64'; +{$ELSE} +function glibc_stat64(const afile: PChar; buf: PGlibc_stat64): longint; +function glibc_lstat64(const path: PChar; buf: PGlibc_stat64): longint; +{$ENDIF} + + +function glibc_statfs64(const path: PChar; buf: PGlibc_statfs64): longint; cdecl; external GLIBC_LIB name 'statfs64'; + +function glibc_fileno(stream: PGlibc_IOFile): integer; cdecl; external GLIBC_LIB name 'fileno'; + +function glibc_utime(const afile: Pchar; buf: PGlibc_utimbuf): Longint; cdecl; external GLIBC_LIB name 'utime'; + + +function glibc_setmntent(const afile: Pchar; mode: Pchar): PGlibc_IOFile; cdecl; external GLIBC_LIB name 'setmntent'; +function glibc_getmntent(stream: PGlibc_IOFile): PGlibc_mntent; cdecl; external GLIBC_LIB name 'getmntent'; +function glibc_endmntent(stream: PGlibc_IOFile): Longint; cdecl; external GLIBC_LIB name 'endmntent'; + + +implementation + +{$IFDEF KYLIX} +function glibc__xstat64(ver: integer; const afile: PChar; buf: PGlibc_stat64): longint; cdecl; external GLIBC_LIB name '__xstat64'; +function glibc__lxstat64(ver: integer; const path: PChar; buf: PGlibc_stat64): longint; cdecl; external GLIBC_LIB name '__lxstat64'; + +function glibc_stat64(const afile: PChar; buf: PGlibc_stat64): longint; +begin + Result := glibc__xstat64(_STAT_VER, afile, buf); +end; + +function glibc_lstat64(const path: PChar; buf: PGlibc_stat64): longint; +begin + Result := glibc__lxstat64(_STAT_VER, path, buf); +end; +{$ENDIF} + +end. + diff --git a/UGlibThreads.pas b/UGlibThreads.pas new file mode 100644 index 0000000..3d24afd --- /dev/null +++ b/UGlibThreads.pas @@ -0,0 +1,111 @@ +(* + Tux Commander - UGlibThreads - Threading support through the GLIB library + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UGlibThreads; + +interface + +uses glib2; + +// function xg_thread_supported(): gboolean; cdecl; external 'libgthread-2.0.so' name 'g_thread_supported'; +// function xg_thread_create(func: TGThreadFunc; data: gpointer; joinable: gboolean; error: PPGError): PGThread; external 'libgthread-2.0.so' name 'g_thread_create'; + + +type + TGlibThreadMethod = procedure of object; + + TGlibThread = class + private + FHandle: PGThread; + FCreateSuspended: Boolean; + FTerminated: Boolean; + FSuspended: Boolean; +// FFreeOnTerminate: Boolean; +// FFinished: Boolean; +// procedure SetSuspended(Value: Boolean); + protected +// procedure DoTerminate; virtual; + procedure Execute; virtual; abstract; + property Terminated: Boolean read FTerminated; + public + constructor Create(CreateSuspended: Boolean); + destructor Destroy; override; +// procedure AfterConstruction; override; + procedure Resume; +{ procedure Suspend; + procedure Terminate; + function WaitFor: LongWord; + property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate; + property Suspended: Boolean read FSuspended write SetSuspended; } + end; + + +implementation + +uses Classes, SysUtils, UCoreUtils; + +function xg_thread_func(data: gpointer): gpointer; cdecl; +begin + DebugMsg(['(II) TGlibThread.g_thread_func']); + try +{ if Assigned(data) and (TObject(data) is TGlibThread) + then TGlibThread(data).Execute + else DebugMsg(['(EE) TGlibThread.g_thread_func: wrong data argument']); } + except + on E: Exception do + DebugMsg(['(EE) TGlibThread.g_thread_func: Exception ', E.ClassName, ': ', E.Message]); + end; + Result := data; +end; + +constructor TGlibThread.Create(CreateSuspended: Boolean); +begin + DebugMsg(['(II) TGlibThread.Create']); + inherited Create; + FSuspended := CreateSuspended; + FCreateSuspended := CreateSuspended; + FHandle := nil; +end; + +destructor TGlibThread.Destroy; +begin + DebugMsg(['(II) TGlibThread.Destroy']); +{ if (FHandle <> nil) and not FFinished then + begin + Terminate; + if FCreateSuspended then + Resume; + WaitFor; + end; } + inherited Destroy; +end; + +procedure TGlibThread.Resume; +var err: PGError; +begin + DebugMsg(['(II) TGlibThread.Resume']); + err := nil; + FHandle := g_thread_create_full(@xg_thread_func, Self, 0, False, False, G_THREAD_PRIORITY_NORMAL, @err); + if FHandle = nil then DebugMsg(['(EE) TGlibThread.Resume: Error creating new thread: ', err.message]); +end; + + + +end. + diff --git a/UGnome.pas b/UGnome.pas new file mode 100644 index 0000000..f90886b --- /dev/null +++ b/UGnome.pas @@ -0,0 +1,1274 @@ +(* + Tux Commander - UGnome - libgnome and libgnomeui related functions and classes + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UGnome; + +interface + +uses glib2, gdk2, gdk2pixbuf, gtk2, pango, Classes, Libc, + GTKForms, GTKControls, GTKStdCtrls, GTKExtCtrls, GTKClasses, GTKDialogs, GTKUtils, GTKConsts; + +type TGnomeColorButton = class(TGTKButton) + private + FUseGnomeUI: boolean; + FColor: TGDKColor; + FColorChanged: TNotifyEvent; + function GetColor: TGDKColor; + procedure SetColor(Value: TGDKColor); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure SetDefaultColor; + procedure UnsetDefaultColor; + property Color: GTKClasses.TGDKColor read GetColor write SetColor; + published + property OnColorChanged: TNotifyEvent read FColorChanged write FColorChanged; + end; + + TGnomeIconEntry = class(TGTKVBox) + private + FIconChanged: TNotifyEvent; + function GetFilename: string; + procedure SetFilename(Value: string); + procedure SetPixmapSubdir(Value: string); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Filename: string read GetFilename write SetFilename; + property PixpamSubdir: string write SetPixmapSubdir; + property OnIconChanged: TNotifyEvent read FIconChanged write FIconChanged; + end; + + TGnomeDateEdit = class(TGTKHBox) + private + function GetTime: TDateTime; + procedure SetTime(Value: TDateTime); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Time: TDateTime read GetTime write SetTime; + end; + + TEphyNotebook = class; + + TEphyNotebookReorderedEvent = procedure (Sender: TObject; const Source, Dest: integer) of object; + TEphyNotebookTabCloseEvent = procedure (Sender: TObject; const TabNum: integer; var CanClose: boolean) of object; + TEphyNotebookTabDoubleClickEvent = procedure (Sender: TObject; const TabNum: integer) of object; + TEphyNotebookFindNotebookAtPointerEvent = function (Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook of object; + TEphyNotebookMoveTabToAnotherNotebookEvent = function (Sender: TObject; Destination: TEphyNotebook; const SourceTabNo, DestTabNo: integer): boolean of object; + TEphyNotebookTabSwitchedEvent = procedure (Sender: TObject; const NewTabNum: integer; const ShouldFocus: boolean) of object; + TEphyNotebookTabFocusOnlyEvent = procedure (Sender: TObject; const NewTabNum: integer) of object; + // Extended capatibilities notebook (icons, close buttons, reordering by drag&drop) + TEphyNotebook = class(TGTKNotebook) + private + FShowCloseButtons: boolean; + FShowTooltips: boolean; + FAllowDragDrop: boolean; + FAllowDragOutside: boolean; + FTooltips: PGtkTooltips; + FOnNotebookReordered: TEphyNotebookReorderedEvent; + FOnTabClose: TEphyNotebookTabCloseEvent; + FOnTabDoubleClick: TEphyNotebookTabDoubleClickEvent; + FOnFindNotebookAtPointer: TEphyNotebookFindNotebookAtPointerEvent; + FOnMoveTabToAnotherNotebook: TEphyNotebookMoveTabToAnotherNotebookEvent; + FOnTabSwitchedEvent: TEphyNotebookTabSwitchedEvent; + FOnTabFocusOnlyEvent: TEphyNotebookTabFocusOnlyEvent; + + // Notebook private + motion_notify_handler_id, grab_notify_handler_id, toplevel_grab_broken_handler_id, toplevel_motion_notify_handler_id, + toplevel_button_release_handler_id: gulong; + x_start, y_start, drag_start_idx: gint; + drag_in_progress: gboolean; + cursor: PGdkCursor; + + FBusy: boolean; + + procedure SetShowCloseButtons(Value: boolean); + procedure SetShowTooltips(Value: boolean); + procedure SetAllowDragDrop(Value: boolean); + procedure SetAllowDragOutside(Value: boolean); + + function find_tab_num_at_pos(abs_x, abs_y: integer): integer; + function find_notebook_at_pointer(abs_x, abs_y: integer): TEphyNotebook; + function is_in_notebook_window(notebook: TEphyNotebook; abs_x, abs_y: integer): boolean; + function drag_start(time: guint32): gboolean; + procedure drag_stop(time: guint32); + procedure move_tab(dest_position: integer); + procedure move_tab_to_another_notebook(dest: TEphyNotebook; event: PGdkEventMotion); + + function GetPageIndex: integer; + procedure SetPageIndex(Value: integer); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function AppendPage(Child: TGTKControl; Caption: string): integer; + function InsertPage(Position: integer; Child: TGTKControl; Caption: string): integer; + procedure RemovePage(PageNo: integer); + function GetTabCaption(PageNo: integer): string; + procedure SetTabCaption(PageNo: integer; Caption: string); + procedure SetTabTooltip(PageNo: integer; Tooltip: string); + published + property PageIndex: integer read GetPageIndex write SetPageIndex; + property ShowCloseButtons: boolean read FShowCloseButtons write SetShowCloseButtons default False; + property ShowTooltips: boolean read FShowTooltips write SetShowTooltips default False; + property AllowDragDrop: boolean read FAllowDragDrop write SetAllowDragDrop default False; + property AllowDragOutside: boolean read FAllowDragOutside write SetAllowDragOutside default False; + property OnNotebookReordered: TEphyNotebookReorderedEvent read FOnNotebookReordered write FOnNotebookReordered; + property OnTabClose: TEphyNotebookTabCloseEvent read FOnTabClose write FOnTabClose; + property OnTabDoubleClick: TEphyNotebookTabDoubleClickEvent read FOnTabDoubleClick write FOnTabDoubleClick; + property OnFindNotebookAtPointer: TEphyNotebookFindNotebookAtPointerEvent read FOnFindNotebookAtPointer write FOnFindNotebookAtPointer; + property OnMoveTabToAnotherNotebook: TEphyNotebookMoveTabToAnotherNotebookEvent read FOnMoveTabToAnotherNotebook write FOnMoveTabToAnotherNotebook; + property OnTabSwitched: TEphyNotebookTabSwitchedEvent read FOnTabSwitchedEvent write FOnTabSwitchedEvent; + property OnTabFocusOnlyEvent: TEphyNotebookTabFocusOnlyEvent read FOnTabFocusOnlyEvent write FOnTabFocusOnlyEvent; + end; + + + + +function MessageBoxShowOnce(const Text: string; const DontShowAgainText: string; var DontShowAgainChecked: boolean; + Buttons: TMessageButtons = [mbOK]; Style: TMessageStyle = mbInfo; + Default: TMessageButton = mbNone; Escape: TMessageButton = mbNone): TMessageButton; + + + +type PGnomeColorPicker = PGtkWidget; + PGnomeIconEntry = PGtkWidget; + PGnomeDateEdit = PGtkWidget; + +const AFTER_ALL_TABS = -1; + NOT_IN_APP_WINDOWS = -2; + +var libGnomeUI2Handle, libGnome2Handle, libGtk2Handle: Pointer; + gnome_about_new: function (const name, version, copyright, comments: Pchar; const authors, documenters: PPchar; + const translator_credits: Pchar; logo_pixbuf: PGdkPixbuf): PGtkWidget; cdecl; +{$IFDEF KYLIX} + gnome_program_init: function (const app_id, app_version: PChar; const module_info: Pointer; argc: longint; argv: PPChar; + const first_property_name: PChar; const first_property_value: Int64; const second_property_name: PChar): Pointer; cdecl; +{$ELSE} + gnome_program_init: function (const app_id, app_version: PChar; const module_info: Pointer; argc: integer; argv: PPChar): Pointer; varargs; cdecl; +{$ENDIF} + libgnome_module_info_get: function: Pointer; cdecl; + libgnomeui_module_info_get: function: Pointer; cdecl; + gnome_color_picker_new: function: PGnomeColorPicker; cdecl; + gnome_color_picker_get_i16: procedure (cp: PGnomeColorPicker; R, G, B, A: Pword); cdecl; + gnome_color_picker_set_i16: procedure (cp: PGnomeColorPicker; R, G, B, A: word); cdecl; + gnome_icon_entry_new: function (const history_id, browse_dialog_title: Pchar): PGtkWidget; cdecl; + gnome_icon_entry_set_pixmap_subdir: procedure (ientry: PGnomeIconEntry; const subdir: Pgchar); cdecl; + gnome_icon_entry_get_filename: function (ientry: PGnomeIconEntry): Pgchar; cdecl; + gnome_icon_entry_set_filename: function (ientry: PGnomeIconEntry; const filename: Pgchar): gboolean; cdecl; + gnome_date_edit_new: function (the_time: __time_t; show_time, use_24_format: gboolean): PGtkWidget; cdecl; + gnome_date_edit_set_time: procedure (gde: PGnomeDateEdit; the_time: time_t); cdecl; + gnome_date_edit_get_time: function (gde: PGnomeDateEdit): time_t; cdecl; + gtk_event_box_set_visible_window: procedure (event_box: PGtkEventBox; visible_window: gboolean); cdecl; + gtk_icon_size_lookup_for_settings: function (settings: PGtkSettings; size: TGtkIconSize; width, height: Pgint): gboolean; cdecl; + + + +procedure LoadGnomeLibs; + +implementation + +uses SysUtils, DateUtils, UConfig, UCoreUtils, ULocale; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGnomeColorButton_OnClick(button: PGtkButton; user_data: Pgpointer); cdecl; +var Dialog: TGTKColorSelectionDialog; + i: integer; +begin + if Assigned(user_data) then + with TGnomeColorButton(user_data) do begin + Dialog := TGTKColorSelectionDialog.CreateWithTitle(Parent, LANGSelectFileTypeColor); + try + Dialog.ShowPalette := True; + Dialog.Color := Color; + if Byte(Dialog.Run) = 251 then begin + for i := 0 to 4 do SetBackgroundColor(i, GDKColorToPGdkColor(Dialog.Color)); + FColor := Dialog.Color; + if Assigned(FColorChanged) then FColorChanged(TGnomeColorButton(user_data)); + end; + finally + Dialog.Free; + end; + end; +end; + +procedure TGnomeColorButton_color_set(colorpicker: PGnomeColorPicker; arg1, arg2, arg3, arg4: Word; user_data: Pointer); cdecl; +begin + if Assigned(user_data) and Assigned(TGnomeColorButton(user_data).FColorChanged) then + with TGnomeColorButton(user_data) do begin + FColorChanged(TGnomeColorButton(user_data)); + FColor := Color; + end; +end; + +constructor TGnomeColorButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FUseGnomeUI := Assigned(gnome_color_picker_new) and Assigned(gnome_color_picker_get_i16) and Assigned(gnome_color_picker_set_i16); + if FUseGnomeUI then begin + FWidget := gnome_color_picker_new; + g_signal_connect(PGtkObject(FWidget), 'color-set', G_CALLBACK(@TGnomeColorButton_color_set), Self); + end else begin + FWidget := gtk_button_new_with_label(''); // This should be here due to height-related troubles + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGnomeColorButton_OnClick), Self); + BorderStyle := bsHalf; + end; + Show; + FColorChanged := nil; +end; + +destructor TGnomeColorButton.Destroy; +begin + inherited Destroy; +end; + +function TGnomeColorButton.GetColor: TGDKColor; +var R, G, B, A: word; +begin + if FUseGnomeUI then begin + if Enabled then begin + gnome_color_picker_get_i16(FWidget, @R, @G, @B, @A); + Result := PGdkColorToGDKColor(AllocateColor(nil, R, G, B)); + end else Result := FColor; + end else Result := FColor; +end; + +procedure TGnomeColorButton.SetColor(Value: TGDKColor); +var i: integer; +begin + FColor := Value; + if FUseGnomeUI then gnome_color_picker_set_i16(FWidget, Value.red, Value.green, Value.blue, 0) + else for i := 0 to 4 do SetBackgroundColor(i, GDKColorToPGdkColor(Value)); +end; + +procedure TGnomeColorButton.SetDefaultColor; +var i: integer; +begin + if not Enabled then Exit; + gtk_widget_set_sensitive(PGtkWidget(FWidget), False); + if FUseGnomeUI then begin + FColor := GetColor; + gnome_color_picker_set_i16(FWidget, 0, 0, 0, 0) +// SetColor(PGdkColorToGDKColor(AllocateColor(FWidget, 0, 0, 0){GetDefaultBackgroundColor(1)})); + end else for i := 0 to 4 do SetBackgroundColor(i, GetDefaultBackgroundColor(i)); +end; + +procedure TGnomeColorButton.UnsetDefaultColor; +var i: integer; +begin + if Enabled then Exit; + gtk_widget_set_sensitive(PGtkWidget(FWidget), True); + if FUseGnomeUI then SetColor(FColor) else + for i := 0 to 4 do SetBackgroundColor(i, GDKColorToPGdkColor(FColor)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGnomeIconEntry_changed(iconentry: PGnomeIconEntry; user_data: gpointer); cdecl; +begin + if Assigned(user_data) and Assigned(TGnomeIconEntry(user_data).FIconChanged) then + TGnomeIconEntry(user_data).FIconChanged(TGnomeIconEntry(user_data)); +end; + +constructor TGnomeIconEntry.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FIconChanged := nil; + FWidget := gnome_icon_entry_new('History', 'Browse'); + g_signal_connect(PGtkObject(FWidget), 'changed', G_CALLBACK(@TGnomeIconEntry_changed), Self); + Show; +end; + +destructor TGnomeIconEntry.Destroy; +begin + inherited Destroy; +end; + +function TGnomeIconEntry.GetFilename: string; +begin + Result := gnome_icon_entry_get_filename(FWidget); +end; + +procedure TGnomeIconEntry.SetFilename(Value: string); +begin + gnome_icon_entry_set_filename(FWidget, PChar(Value)); +end; + +procedure TGnomeIconEntry.SetPixmapSubdir(Value: string); +begin + gnome_icon_entry_set_pixmap_subdir(FWidget, PChar(Value)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGnomeDateEdit.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gnome_date_edit_new(0, False, True); + Show; +end; + +destructor TGnomeDateEdit.Destroy; +begin + inherited Destroy; +end; + +function TGnomeDateEdit.GetTime: TDateTime; +begin + Result := UnixToDateTime(gnome_date_edit_get_time(FWidget)); +end; + +procedure TGnomeDateEdit.SetTime(Value: TDateTime); +begin + gnome_date_edit_set_time(FWidget, DateTimeToUnix(Value)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + +function button_press_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; forward; +function button_release_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; forward; +function scroll_event_callback(widget: PGtkWidget; event: PGdkEventScroll; user_data: gpointer): gboolean; cdecl; forward; + +constructor TEphyNotebook.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FTooltips := gtk_tooltips_new; + gtk_tooltips_disable(FTooltips); + cursor := nil; + FShowCloseButtons := False; + FShowTooltips := False; + FAllowDragDrop := False; + FAllowDragOutside := False; + FOnNotebookReordered := nil; + FOnTabClose := nil; + FOnTabDoubleClick := nil; + FOnFindNotebookAtPointer := nil; + FOnMoveTabToAnotherNotebook := nil; + FOnTabFocusOnlyEvent := nil; + FBusy := False; + + // Set up drag-and-drop + g_signal_connect(FWidget, 'button-press-event', G_CALLBACK(@button_press_cb), Self); + g_signal_connect(FWidget, 'button-release-event', G_CALLBACK(@button_release_cb), Self); + g_signal_connect(FWidget, 'scroll-event', G_CALLBACK(@scroll_event_callback), Self); + gtk_widget_add_events(FWidget, GDK_BUTTON1_MOTION_MASK); + + Show; +end; + +destructor TEphyNotebook.Destroy; +begin + inherited Destroy; +end; + +procedure TEphyNotebook.SetShowCloseButtons(Value: boolean); +begin + FShowCloseButtons := Value; + + // Apply settings here +end; + + +procedure TEphyNotebook.SetShowTooltips(Value: boolean); +begin + FShowTooltips := Value; + if Value then gtk_tooltips_enable(FTooltips) + else gtk_tooltips_disable(FTooltips); +end; + +procedure TEphyNotebook.SetAllowDragDrop(Value: boolean); +begin + FAllowDragDrop := Value; + if (not Value) and drag_in_progress then drag_stop(GDK_CURRENT_TIME (* FIXME? *)); +end; + +procedure TEphyNotebook.SetAllowDragOutside(Value: boolean); +begin + FAllowDragOutside := Value; + if (not Value) and drag_in_progress then drag_stop(GDK_CURRENT_TIME (* FIXME? *)); +end; + +// Following code is inspired by ephy-notebook.c from Epiphany 2.14.1 +procedure tab_label_style_set_cb(hbox: PGtkWidget; previous_style: PGtkStyle; user_data: gpointer); cdecl; +var button: PGtkWidget; +{ metrics: PPangoFontMetrics; + context: PPangoContext; + char_width, }h, w: integer; +begin +{ context := gtk_widget_get_pango_context(hbox); + metrics := pango_context_get_metrics(context, hbox^.style^.font_desc, pango_context_get_language(context)); + + char_width := pango_font_metrics_get_approximate_digit_width(metrics); + pango_font_metrics_unref(metrics); } + + if @gtk_icon_size_lookup_for_settings <> nil + then gtk_icon_size_lookup_for_settings(gtk_widget_get_settings(hbox), GTK_ICON_SIZE_MENU, @w, @h) + else begin w := 16; h := 16; end; + +// gtk_widget_set_size_request(hbox, TAB_WIDTH_N_CHARS * PANGO_PIXELS(char_width) + 2 * w, -1); + + button := g_object_get_data(G_OBJECT(hbox), 'close-button'); + gtk_widget_set_size_request(button, w + 2, h + 2); +end; + +procedure close_button_clicked_cb(widget: PGtkWidget; data: pointer); cdecl; +var tab: PGtkWidget; + ntb: TEphyNotebook; + position: integer; + CanClose: boolean; +begin + tab := g_object_get_data(G_OBJECT(widget), 'child'); + ntb := TEphyNotebook(data); + + position := gtk_notebook_page_num(GTK_NOTEBOOK(ntb.FWidget), GTK_WIDGET(tab)); +// DebugMsg(['@******* close_button_clicked_cb: Position = ', position, ', data = 0x', IntToHex(Integer(data), 8), ', widget = 0x', IntToHex(Integer(widget), 8)]); + + CanClose := True; + + if @ntb.FOnTabClose <> nil then ntb.FOnTabClose(ntb, position, CanClose); + + if CanClose then gtk_notebook_remove_page(GTK_NOTEBOOK(ntb.FWidget), position); +end; + +function label_ebox_button_pressed(widget: PGtkWidget; event: PGdkEventButton; data: pointer): gboolean; cdecl; +var tab: PGtkWidget; + ntb: TEphyNotebook; + position: integer; +begin + Result := False; + ntb := TEphyNotebook(data); + tab := g_object_get_data(G_OBJECT(widget), 'child'); + position := gtk_notebook_page_num(GTK_NOTEBOOK(ntb.FWidget), GTK_WIDGET(tab)); +// DebugMsg(['@******* label_ebox_button_pressed, button = ', event^.button, ', Position = ', position, ', data = 0x', IntToHex(Integer(data), 8), ', widget = 0x', IntToHex(Integer(widget), 8)]); + + if (((event^.button = 2) and (event^._type = GDK_BUTTON_PRESS)) or // Middle-click + ((event^.button = 1) and (event^._type = GDK_2BUTTON_PRESS))) and // Double-click + Assigned(ntb.FOnTabDoubleClick) then + begin + ntb.FOnTabDoubleClick(ntb, position); + Result := True; + ntb.x_start := -1; + ntb.y_start := -1; + end; +end; + + +function TEphyNotebook.AppendPage(Child: TGTKControl; Caption: string): integer; +begin + Result := InsertPage(ChildrenCount, Child, Caption); +end; + +function TEphyNotebook.InsertPage(Position: integer; Child: TGTKControl; Caption: string): integer; +var hbox, label_hbox, label_ebox, _label, close_button, image, icon: PGtkWidget; + rcstyle: PGtkRcStyle; +begin + // set hbox spacing and label padding (see below) so that there's an equal amount of space around the label + hbox := gtk_hbox_new(FALSE, 0); + + label_ebox := gtk_event_box_new(); + if @gtk_event_box_set_visible_window <> nil then gtk_event_box_set_visible_window(GTK_EVENT_BOX (label_ebox), FALSE); + gtk_box_pack_start(GTK_BOX (hbox), label_ebox, TRUE, TRUE, 0); + g_signal_connect(G_OBJECT(label_ebox), 'button-press-event', G_CALLBACK(@label_ebox_button_pressed), Self); + g_object_set_data(G_OBJECT(label_ebox), 'child', Child.FWidget); + + label_hbox := gtk_hbox_new (FALSE, 0); + gtk_container_add(GTK_CONTAINER (label_ebox), label_hbox); + + // setup close button + close_button := gtk_button_new (); + gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE); + // don't allow focus on the close button + g_object_set(G_OBJECT(close_button), 'can-focus', gboolean(FALSE), nil); + gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE); + + rcstyle := gtk_rc_style_new (); + rcstyle^.xthickness := Ord(rcstyle^.ythickness = 0); + gtk_widget_modify_style (close_button, rcstyle); + gtk_rc_style_unref (rcstyle); + + image := gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); + gtk_container_add (GTK_CONTAINER (close_button), image); + gtk_box_pack_start (GTK_BOX (hbox), close_button, FALSE, FALSE, 0); + + gtk_tooltips_set_tip(FTooltips, close_button, 'Close tab', nil); + g_object_set_data(G_OBJECT(close_button), 'tab', hbox); + g_object_set_data(G_OBJECT(close_button), 'child', Child.FWidget); + g_signal_connect(G_OBJECT(close_button), 'clicked', G_CALLBACK(@close_button_clicked_cb), Self); + + // setup site icon, empty by default + icon := gtk_image_new (); + gtk_box_pack_start (GTK_BOX (label_hbox), icon, FALSE, FALSE, 0); + + // setup label + _label := gtk_label_new(PChar(Caption)); +// gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); +// gtk_label_set_single_line_mode (GTK_LABEL (label), TRUE); + gtk_misc_set_alignment (GTK_MISC(_label), 0.0, 0.5); + gtk_misc_set_padding (GTK_MISC(_label), 2, 0); + gtk_box_pack_start (GTK_BOX(label_hbox), _label, TRUE, TRUE, 0); + + // Set minimal size + g_signal_connect(hbox, 'style-set', G_CALLBACK(@tab_label_style_set_cb), nil); + + + gtk_widget_show (hbox); + gtk_widget_show (label_ebox); + gtk_widget_show (label_hbox); + gtk_widget_show (_label); + gtk_widget_show (image); + if FShowCloseButtons then gtk_widget_show (close_button); + + g_object_set_data (G_OBJECT (hbox), 'label', _label); + g_object_set_data (G_OBJECT (hbox), 'label-ebox', label_ebox); + g_object_set_data (G_OBJECT (hbox), 'icon', icon); + g_object_set_data (G_OBJECT (hbox), 'close-button', close_button); + g_object_set_data (G_OBJECT (hbox), 'tooltips', FTooltips); + + Result := gtk_notebook_insert_page(PGtkNotebook(FWidget), Child.FWidget, hbox, Position); +end; + +procedure TEphyNotebook.RemovePage(PageNo: integer); +begin + gtk_notebook_remove_page(PGtkNotebook(FWidget), PageNo); +end; + +function TEphyNotebook.GetTabCaption(PageNo: integer): string; +var wid, lab: PGtkWidget; +begin + wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo)); + lab := g_object_get_data (G_OBJECT(wid), 'label'); + Result := PgcharToString(gtk_label_get_text(GTK_LABEL(lab))); +end; + +procedure TEphyNotebook.SetTabCaption(PageNo: integer; Caption: string); +var wid, lab: PGtkWidget; +begin + wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo)); + lab := g_object_get_data (G_OBJECT(wid), 'label'); + gtk_label_set_text(GTK_LABEL(lab), StringToPgchar(Caption)); +end; + +procedure TEphyNotebook.SetTabTooltip(PageNo: integer; Tooltip: string); +var wid, lab: PGtkWidget; +begin + wid := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo)); + lab := g_object_get_data (G_OBJECT(wid), 'label-ebox'); + gtk_tooltips_set_tip(FTooltips, lab, StringToPgchar(Tooltip), nil); +end; + +function TEphyNotebook.GetPageIndex: integer; +begin + Result := gtk_notebook_get_current_page(PGtkNotebook(FWidget)); +end; + +procedure TEphyNotebook.SetPageIndex(Value: integer); +begin + DebugMsg(['SetPageIndex(Value = ', Value, ')']); + if (GetPageIndex <> Value) and (Value >= 0) then begin + gtk_notebook_set_page(PGtkNotebook(FWidget), Value); + if Assigned(FOnTabSwitchedEvent) then FOnTabSwitchedEvent(Self, Value, True); + end; +end; + + +function TEphyNotebook.find_tab_num_at_pos(abs_x, abs_y: integer): integer; +var tab_pos: TGtkPositionType; + page_num: integer; + page, tab: PGtkWidget; + max_x, max_y, x_root, y_root: integer; +begin + page_num := 0; + tab_pos := gtk_notebook_get_tab_pos(PGtkNotebook(FWidget)); + + if PGtkNotebook(FWidget)^.first_tab = nil then begin + DebugMsg(['@***************** first_tab = nil']); + Result := AFTER_ALL_TABS; +// DebugMsg(['@******* find_tab_num_at_pos(abs_x = ', abs_x, ', abs_y = ', abs_y, ', Result = ', Result, ')']); + Exit; + end; + + // For some reason unfullscreen + quick click can cause a wrong click event to be reported to the tab + if not is_in_notebook_window(Self, abs_x, abs_y) then begin + Result := NOT_IN_APP_WINDOWS; +// DebugMsg(['@******* find_tab_num_at_pos(abs_x = ', abs_x, ', abs_y = ', abs_y, ', Result = ', Result, ')']); + Exit; + end; + + while gtk_notebook_get_nth_page(PGtkNotebook(FWidget), page_num) <> nil do + begin + page := gtk_notebook_get_nth_page(PGtkNotebook(FWidget), page_num); + tab := gtk_notebook_get_tab_label(PGtkNotebook(FWidget), page); + if tab = nil then begin + Result := AFTER_ALL_TABS; +// DebugMsg(['@******* find_tab_num_at_pos(abs_x = ', abs_x, ', abs_y = ', abs_y, ', Result = ', Result, ')']); + Exit; + end; + + if (not GTK_WIDGET_MAPPED(GTK_WIDGET(tab))) then begin + Inc(page_num); + Continue; + end; + + gdk_window_get_origin(GDK_WINDOW(tab^.window), @x_root, @y_root); + + max_x := x_root + tab^.allocation.x + tab^.allocation.width; + max_y := y_root + tab^.allocation.y + tab^.allocation.height; + + if (((tab_pos = GTK_POS_TOP) or (tab_pos = GTK_POS_BOTTOM)) and (abs_x <= max_x)) or + ((tab_pos = GTK_POS_LEFT) or (tab_pos = GTK_POS_RIGHT)) and (abs_y <= max_y) then + begin + Result := page_num; +// DebugMsg(['@******* find_tab_num_at_pos(abs_x = ', abs_x, ', abs_y = ', abs_y, ', Result = ', Result, ')']); + Exit; + end; + + Inc(page_num); + end; + Result := AFTER_ALL_TABS; +// DebugMsg(['@******* find_tab_num_at_pos(abs_x = ', abs_x, ', abs_y = ', abs_y, ', Result = ', Result, ')']); +end; + +function TEphyNotebook.find_notebook_at_pointer(abs_x, abs_y: integer): TEphyNotebook; +(* var win_at_pointer{, toplevel_win}: PGdkWindow; + x, y: integer; +// toplevel: pointer; *) +begin + Result := nil; + if Assigned(FOnFindNotebookAtPointer) then Result := FOnFindNotebookAtPointer(Self, abs_x, abs_y); + + +// toplevel := NULL; +{ + // FIXME multi-head + win_at_pointer := gdk_window_at_pointer(@x, @y); + if win_at_pointer = nil then begin + // We are outside all windows containing a notebook + Result := nil; + Exit; + end; +} + +(* toplevel_win := gdk_window_get_toplevel(win_at_pointer); + + // get the GtkWidget which owns the toplevel GdkWindow + gdk_window_get_user_data(toplevel_win, @toplevel); + + // toplevel should be an EphyWindow +{@@@} if (toplevel <> nil) and GTK_IS_WINDOW toplevel) then + begin + Result := EPHY_NOTEBOOK(ephy_window_get_notebook(EPHY_WINDOW (toplevel))); + Exit; + end; + *) +{ Result := nil;} +end; + +function TEphyNotebook.is_in_notebook_window(notebook: TEphyNotebook; abs_x, abs_y: integer): boolean; +begin + Result := find_notebook_at_pointer(abs_x, abs_y) <> nil; +// Result := notebook = find_notebook_at_pointer(abs_x, abs_y); +// Result := True; +end; + + + + +(* +void +terminal_notebook_move_tab (TerminalNotebook *src, + TerminalNotebook *dest, + TerminalScreen *screen, + int dest_position) +{ + if (dest == NULL || src == dest) + { + gtk_notebook_reorder_child + (GTK_NOTEBOOK (src), GTK_WIDGET (screen), dest_position); + + if (src->priv->drag_in_progress == FALSE) + { + g_signal_emit (G_OBJECT (src), signals[TABS_REORDERED], 0); + } + } + else + { + GtkWidget *toplevel; + + /* make sure the screen isn't destroyed while we move it */ + g_object_ref (screen); + + terminal_notebook_remove_tab (src, screen); + + /* Set new window for screen so TerminalScreen widget realize function + * works. + */ + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (dest)); + + g_assert (GTK_WIDGET_TOPLEVEL (toplevel)); + g_assert (TERMINAL_IS_WINDOW (toplevel)); + + terminal_screen_set_window (screen, TERMINAL_WINDOW(toplevel)); + + terminal_notebook_add_tab (dest, screen, dest_position, TRUE); + g_object_unref (screen); + } +} *) + +procedure TEphyNotebook.drag_stop(time: guint32); +var toplevel, child: PGtkWidget; + drag_stop_idx: integer; +begin + DebugMsg(['@######## drag_stop']); + + toplevel := gtk_widget_get_toplevel(FWidget); + if not GTK_WIDGET_TOPLEVEL(toplevel) then begin + DebugMsg(['@######## drag_stop: GTK_WIDGET_TOPLEVEL(toplevel) = False']); + Exit; + end; +{ child := gtk_bin_get_child(GTK_BIN(toplevel)); + if child = nil then begin + DebugMsg(['@######## drag_stop: child = nil']); + Exit; + end; } + + // disconnect the signals before ungrabbing! + if toplevel_grab_broken_handler_id <> 0 then begin + g_signal_handler_disconnect(toplevel, toplevel_grab_broken_handler_id); + toplevel_grab_broken_handler_id := 0; + end; + if grab_notify_handler_id <> 0 then begin + g_signal_handler_disconnect(FWidget, grab_notify_handler_id); + grab_notify_handler_id := 0; + end; + if toplevel_motion_notify_handler_id <> 0 then begin + g_signal_handler_disconnect(toplevel, toplevel_motion_notify_handler_id); + toplevel_motion_notify_handler_id := 0; + end; + if toplevel_button_release_handler_id <> 0 then begin + g_signal_handler_disconnect(toplevel, toplevel_button_release_handler_id); + toplevel_button_release_handler_id := 0; + end; + if motion_notify_handler_id <> 0 then begin + g_signal_handler_disconnect(FWidget, motion_notify_handler_id); + motion_notify_handler_id := 0; + end; + + // ungrab the pointer if it's grabbed + // FIXME multihead + if gdk_pointer_is_grabbed() then gdk_pointer_ungrab(time); + gtk_grab_remove(toplevel); + + if drag_in_progress then begin + if FBusy then Exit; + drag_stop_idx := gtk_notebook_get_current_page(GTK_NOTEBOOK(FWidget)); + DebugMsg(['@######## drag_stop: final move: ', drag_start_idx, ' --> ', drag_stop_idx]); + + // The two indexes are equal when moving tab to another notebook + if (@FOnNotebookReordered <> nil) and (drag_start_idx <> drag_stop_idx) then begin + FBusy := True; + FOnNotebookReordered(Self, drag_start_idx, drag_stop_idx); + Application.ProcessMessages; + FBusy := False; + end; + end; + + drag_in_progress := False; + x_start := -1; + y_start := -1; +end; + +function grab_broken_event_cb(widget: PGtkWidget; event: PGdkEvent; data: gpointer): gboolean; cdecl; +begin + if data <> nil then TEphyNotebook(data).drag_stop(GDK_CURRENT_TIME (* FIXME? *)); + Result := False; +end; + +procedure grab_notify_cb(widget: PGtkWidget; was_grabbed: gboolean; data: gpointer); cdecl; +begin + if data <> nil then TEphyNotebook(data).drag_stop(GDK_CURRENT_TIME (* FIXME? *)); +end; + +function toplevel_motion_notify_cb(widget: PGtkWidget; event: PGdkEventMotion; data: gpointer): gboolean; cdecl; +var ntb, dest: TEphyNotebook; + page_num: integer; +begin +// DebugMsg(['@######## toplevel_motion_notify_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']); + Result := False; + ntb := TEphyNotebook(data); + if ntb.FBusy then Exit; + + page_num := ntb.find_tab_num_at_pos(Trunc(event^.x_root), Trunc(event^.y_root)); +// if page_num >= -1 then ntb.move_tab(page_num); + dest := ntb.find_notebook_at_pointer(Trunc(event^.x_root), Trunc(event^.y_root)); + +// DebugMsg(['@######## toplevel_motion_notify_cb: page_num = ', page_num, ', dest = 0x', IntToHex(Integer(dest), 8), ')']); + + if (page_num <> NOT_IN_APP_WINDOWS) and (dest <> nil) then begin + if (dest <> ntb) and ntb.FAllowDragOutside then ntb.move_tab_to_another_notebook(dest, event) else + if page_num >= 0 then ntb.move_tab(page_num) // Same notebook + else {DebugMsg(['@######## toplevel_motion_notify_cb: Assertion failed: page_num >= 0'])}; + end; + + +(* TerminalNotebook *dest = NULL; + int page_num, result; + + result = find_notebook_and_tab_at_pos ((gint)event->x_root, + (gint)event->y_root, + &dest, &page_num); + + if (result != NOT_IN_APP_WINDOWS) + { + if (dest != notebook) + { + move_tab_to_another_notebook (notebook, dest, + event, page_num); + } + else + { + g_assert (page_num >= -1); + move_tab (notebook, page_num); + } + } + *) +end; + +function toplevel_button_release_cb(widget: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; +var ntb: TEphyNotebook; + cur_page_num: integer; + cur_page: PGtkWidget; +begin + DebugMsg(['@######## toplevel_button_release_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']); + ntb := TEphyNotebook(data); + + if ntb.drag_in_progress then begin + cur_page_num := gtk_notebook_get_current_page(GTK_NOTEBOOK(ntb.FWidget)); + cur_page := gtk_notebook_get_nth_page(GTK_NOTEBOOK(ntb.FWidget), cur_page_num); + +(* if (!is_in_notebook_window (notebook, event->x_root, event->y_root) + && gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) > 1) + { + /* Tab was detached */ + g_signal_emit (G_OBJECT (notebook), + signals[TAB_DETACHED], 0, cur_page); + } *) + end; + + // This must be called even if a drag isn't happening + ntb.drag_stop(event^.time); + Result := False; +end; + +function TEphyNotebook.drag_start(time: guint32): gboolean; +var toplevel, child: PGtkWidget; +begin + DebugMsg(['@######## drag_start']); + Result := False; + // FIXME multihead + if drag_in_progress or gdk_pointer_is_grabbed() then Exit; + if not FAllowDragDrop then Exit; + if FBusy then Exit; + + drag_in_progress := True; + + // get a new cursor, if necessary + // FIXME multi-head + if cursor = nil then cursor := gdk_cursor_new(GDK_FLEUR); + + toplevel := gtk_widget_get_toplevel(FWidget); + if not GTK_WIDGET_TOPLEVEL(toplevel) then begin + DebugMsg(['@######## drag_start: GTK_WIDGET_TOPLEVEL(toplevel) = False']); + Result := False; + Exit; + end; + + child := gtk_bin_get_child(GTK_BIN(toplevel)); + if child = nil then begin + DebugMsg(['@######## drag_start: child = nil']); + Result := False; + Exit; + end; + + // grab the pointer + gtk_grab_add(toplevel); + + // FIXME multi-head + if gdk_pointer_grab(toplevel^.window, False, GDK_BUTTON1_MOTION_MASK or GDK_BUTTON_RELEASE_MASK, nil, + cursor, time) <> GDK_GRAB_SUCCESS then + begin + DebugMsg(['@######## drag_start: gdk_pointer_grab <> GDK_GRAB_SUCCESS']); + drag_stop(time); + Result := False; + Exit; + end; + + if (toplevel_grab_broken_handler_id = 0) and (toplevel_motion_notify_handler_id = 0) and + (toplevel_button_release_handler_id = 0) and (grab_notify_handler_id = 0) then + begin + toplevel_grab_broken_handler_id := g_signal_connect(toplevel, 'grab-broken-event', G_CALLBACK(@grab_broken_event_cb), Self); + toplevel_motion_notify_handler_id := g_signal_connect(toplevel, 'motion-notify-event', G_CALLBACK(@toplevel_motion_notify_cb), Self); + toplevel_button_release_handler_id := g_signal_connect(toplevel, 'button-release-event', G_CALLBACK(@toplevel_button_release_cb), Self); + grab_notify_handler_id := g_signal_connect(FWidget, 'grab-notify', G_CALLBACK(@grab_notify_cb), Self); + + drag_start_idx := gtk_notebook_get_current_page(GTK_NOTEBOOK(FWidget)); + Result := True; + end else begin + DebugMsg(['@######## drag_start: some handlers are non-null']); + Result := False; + end; +end; + +// this function is only called during dnd, we don't need to emit TABS_REORDERED here, instead we do it on drag_stop +procedure TEphyNotebook.move_tab(dest_position: integer); +var cur_page_num: integer; + cur_tab: PGtkWidget; +begin + cur_page_num := gtk_notebook_get_current_page(GTK_NOTEBOOK(FWidget)); +// DebugMsg(['@######## move_tab(dest_position = ', dest_position, ', cur_page_num = ', cur_page_num]); + if (dest_position <> cur_page_num) and (dest_position >= 0) then begin + cur_tab := gtk_notebook_get_nth_page(GTK_NOTEBOOK(FWidget), cur_page_num); + gtk_notebook_reorder_child(GTK_NOTEBOOK(FWidget), cur_tab, dest_position); + +{ terminal_notebook_move_tab (TERMINAL_NOTEBOOK (notebook), NULL, + TERMINAL_SCREEN (cur_tab), + dest_position); } + end; +end; + +function motion_notify_cb(notebook: PGtkWidget; event: PGdkEventMotion; data: gpointer): gboolean; cdecl; +var ntb: TEphyNotebook; +begin +// DebugMsg(['@######## motion_notify_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']); + ntb := TEphyNotebook(data); + Result := False; + + if (not ntb.drag_in_progress) and (ntb.x_start >= 0) and (ntb.y_start >= 0) and + gtk_drag_check_threshold(GTK_WIDGET(notebook), ntb.x_start, ntb.y_start, + Trunc(event^.x_root), Trunc(event^.y_root)) + then Result := ntb.drag_start(event^.time); +end; + +procedure TEphyNotebook.move_tab_to_another_notebook(dest: TEphyNotebook; event: PGdkEventMotion); +var cur_page, dest_page_num: integer; +begin + // This is getting tricky, the screen was dragged in a notebook in another window of the same app, we move the screen + // to that new notebook, and let this notebook handle the drag + + DebugMsg(['@######## move_tab_to_another_notebook(dest = 0x', IntToHex(Integer(pointer(dest)), 8), ')']); + if not (dest is TEphyNotebook) then begin + DebugMsg(['@######## move_tab_to_another_notebook: dest(', dest.ClassName, ') is not TEphyNotebook']); + Exit; + end; + + if Self = dest then begin + DebugMsg(['@######## move_tab_to_another_notebook: dest = Self']); + Exit; + end; + + if not Assigned(@FOnMoveTabToAnotherNotebook) then begin + DebugMsg(['@######## move_tab_to_another_notebook: FOnMoveTabToAnotherNotebook not handled, giving up.']); + Exit; + end; + + cur_page := gtk_notebook_get_current_page(GTK_NOTEBOOK(FWidget)); + + // stop drag in origin window + // ungrab the pointer if it's grabbed + drag_stop(event^.time); + +{ if gdk_pointer_is_grabbed() then gdk_pointer_ungrab(event^.time); + gtk_grab_remove(FWidget); } + + +(* g_assert (TERMINAL_IS_NOTEBOOK (dest)); + g_assert (dest != src); + + cur_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (src)); + screen = gtk_notebook_get_nth_page (GTK_NOTEBOOK (src), cur_page); + + /* stop drag in origin window */ + /* ungrab the pointer if it's grabbed */ + drag_stop (src, event->time); + if (gdk_pointer_is_grabbed ()) + { + gdk_pointer_ungrab (event->time); + } + gtk_grab_remove (GTK_WIDGET (src)); + + terminal_notebook_move_tab (src, dest, TERMINAL_SCREEN (screen), + dest_position); + + /* start drag handling in dest notebook */ + + dest->priv->motion_notify_handler_id = + g_signal_connect (G_OBJECT (dest), + "motion-notify-event", + G_CALLBACK (motion_notify_cb), + NULL); + *) + + dest_page_num := dest.find_tab_num_at_pos(Trunc(event^.x_root), Trunc(event^.y_root)); + if FOnMoveTabToAnotherNotebook(Self, dest, cur_page, dest_page_num) then begin + // move newly created tab in dest notebook to position of mouse cursor +// toplevel_motion_notify_cb(dest.FWidget, event, dest); + + Application.ProcessMessages; + + // start drag handling in dest notebook + dest.x_start := Trunc(event^.x_root); + dest.y_start := Trunc(event^.y_root); + dest.motion_notify_handler_id := g_signal_connect(G_OBJECT(dest.FWidget), 'motion-notify-event', G_CALLBACK(@motion_notify_cb), dest); + dest.drag_start(event^.time); + + +{ dest.motion_notify_handler_id := g_signal_connect(G_OBJECT(dest.FWidget), 'motion-notify-event', G_CALLBACK(@motion_notify_cb), nil); + dest.drag_start(event^.time); } + end; +end; + +function button_release_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; +var ntb: TEphyNotebook; +begin + ntb := TEphyNotebook(data); + DebugMsg(['@######## button_release_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']); + + // This must be called even if a drag isn't happening + ntb.drag_stop(event^.time); + Result := False; +end; + +function button_press_cb(notebook: PGtkWidget; event: PGdkEventButton; data: gpointer): gboolean; cdecl; +var tab_clicked: integer; + ntb: TEphyNotebook; +begin + ntb := TEphyNotebook(data); + if ntb.FBusy then Exit; + Result := False; + + DebugMsg(['@######## button_press_cb(..., data = 0x', IntToHex(Integer(data), 8), ')']); + tab_clicked := ntb.find_tab_num_at_pos(Trunc(event^.x_root), Trunc(event^.y_root)); + DebugMsg(['@################# tab_clicked = ', tab_clicked]); + + if ntb.drag_in_progress then begin + DebugMsg(['drag_in_progress, exiting.']); + Result := True; + Exit; + end; + + if (event^.button = 1) and (event^._type = GDK_BUTTON_PRESS) and (tab_clicked >= 0) then + begin + ntb.x_start := Trunc(event^.x_root); + ntb.y_start := Trunc(event^.y_root); + DebugMsg(['@################# x_start = ', ntb.x_start, ', y_start = ', ntb.y_start]); + ntb.motion_notify_handler_id := g_signal_connect(G_OBJECT(notebook), 'motion-notify-event', G_CALLBACK(@motion_notify_cb), data); + + if tab_clicked >= 0 then begin + if tab_clicked <> gtk_notebook_get_current_page(PGtkNotebook(ntb.FWidget)) then begin + ntb.FBusy := True; + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), tab_clicked); + if Assigned(ntb.FOnTabSwitchedEvent) then ntb.FOnTabSwitchedEvent(ntb, tab_clicked, True); + Application.ProcessMessages; + ntb.FBusy := False; + end else begin + if Assigned(ntb.FOnTabFocusOnlyEvent) then ntb.FOnTabFocusOnlyEvent(ntb, tab_clicked); + end; + end; + Result := True; + end else + if (GDK_BUTTON_PRESS = event^._type) and (event^.button = 3) then begin + if tab_clicked = -1 then begin + // consume event, so that we don't pop up the context menu when the mouse if not over a screen label + Result := True; + end else + // switch to the page the mouse is over, but don't consume the event + if (tab_clicked >= 0) then gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), tab_clicked); + end; +end; + +function scroll_event_callback(widget: PGtkWidget; event: PGdkEventScroll; user_data: gpointer): gboolean; cdecl; +var ntb: TEphyNotebook; + page: integer; + child: PGtkWidget; + px, py: gint; +begin + Result := True; + ntb := TEphyNotebook(user_data); + if ntb.FBusy then Exit; + + child := gtk_notebook_get_nth_page(GTK_NOTEBOOK(ntb.FWidget), gtk_notebook_get_current_page(PGtkNotebook(ntb.FWidget))); + if (child <> nil) then begin +// DebugMsg(['scroll_event_callback: x = ', event^.x, ', y = ', event^.y]); + px := 0; + py := 0; + gtk_widget_get_pointer(child, @px, @py); +// DebugMsg(['scroll_event_callback: px = ', px, ', py = ', py]); + if (px >= 0) and (py >= 0) then Exit; + end; + + page := gtk_notebook_get_current_page(PGtkNotebook(ntb.FWidget)) + - Ord(event^.direction = GDK_SCROLL_UP) + Ord(event^.direction = GDK_SCROLL_DOWN); + if (page < 0) or (page > ntb.ChildrenCount - 1) then Exit; + + ntb.FBusy := True; + gtk_notebook_set_current_page(PGtkNotebook(ntb.FWidget), page); + if Assigned(ntb.FOnTabSwitchedEvent) then ntb.FOnTabSwitchedEvent(ntb, page, False); + Application.ProcessMessages; + ntb.FBusy := False; +end; + + + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function Gnome_MessageBox_key_press_event(widget: PGtkWidget; event: PGdkEventKey; user_data : gpointer): gboolean; cdecl; +begin + Result := False; + if event^.keyval = GDK_ESCAPE then begin + gtk_dialog_response(PGtkDialog(widget), integer(user_data)); +// Beep; + Result := True; + end; +end; + +function MessageBoxShowOnce(const Text: string; const DontShowAgainText: string; var DontShowAgainChecked: boolean; + Buttons: TMessageButtons = [mbOK]; Style: TMessageStyle = mbInfo; + Default: TMessageButton = mbNone; Escape: TMessageButton = mbNone): TMessageButton; +const TMessageStyleID : array[0..3] of TGtkMessageType = (GTK_MESSAGE_ERROR, GTK_MESSAGE_INFO, GTK_MESSAGE_QUESTION, GTK_MESSAGE_WARNING); +var Dialog: PGtkWidget; + DialogParent: PGtkWindow; + CheckBox: PGtkCheckButton; + i: integer; +begin + if Application.Terminated then + begin + Result := Escape; + Exit; + end; + if Screen.FormCount > 0 + then DialogParent := PGtkWindow(Screen.Forms[0].FWidget) + else DialogParent := nil; + Dialog := gtk_message_dialog_new(DialogParent, GTK_DIALOG_MODAL or GTK_DIALOG_DESTROY_WITH_PARENT, TMessageStyleID[Integer(Style)], + GTK_BUTTONS_NONE, StringToPgchar(Text)); + CheckBox := PGtkCheckButton(gtk_check_button_new_with_mnemonic(StringToPgchar(DontShowAgainText))); + gtk_widget_show(PGtkWidget(CheckBox)); + gtk_box_pack_end(GTK_BOX(GTK_DIALOG(Dialog).vbox), PGtkWidget(CheckBox), False, False, 12); + for i := 1 to NumMessageButtons do + if TMessageButton(i - 1) in Buttons + then gtk_dialog_add_button(PGtkDialog(Dialog), MessageButtonID[i], i); + if Escape <> mbNone then g_signal_connect(PGtkObject(Dialog), 'key-press-event', G_CALLBACK(@Gnome_MessageBox_key_press_event), + Pointer(Ord(Escape) + 1{MessageButtonID[Ord(Escape)]})); + if Default <> mbNone then gtk_dialog_set_default_response(PGtkDialog(Dialog), Ord(Default)); + Result := TMessageButton(gtk_dialog_run(PGtkDialog(Dialog)) - 1); + DontShowAgainChecked := gtk_toggle_button_get_active(PGtkToggleButton(CheckBox)); + gtk_widget_destroy(Dialog); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) + +procedure SetupGnomeLibs; +var g: Pointer; +begin + try + if Assigned(gnome_program_init) and Assigned(libgnomeui_module_info_get) and Assigned(libgnome_module_info_get) then begin + DebugMsg(['Initializing Gnome...']); + g := gnome_program_init('TuxCommander', PChar(ConstAboutVersion), libgnomeui_module_info_get, GTKForms.argc, GTKForms.argv, + 'show-crash-dialog', 0, nil); + DebugMsg([' *GnomeProgram = 0x', IntToHex(QWORD(g), 8)]); + + end; + except end; +end; + +procedure LoadGnomeLibs; +begin + // Set default values + @gnome_about_new := nil; + @gnome_color_picker_new := nil; + @gnome_color_picker_get_i16 := nil; + @gnome_color_picker_set_i16 := nil; + @libgnomeui_module_info_get := nil; + @gnome_program_init := nil; + @libgnome_module_info_get := nil; + @gnome_icon_entry_new := nil; + @gnome_icon_entry_set_pixmap_subdir := nil; + @gnome_icon_entry_get_filename := nil; + @gnome_icon_entry_set_filename := nil; + @gtk_event_box_set_visible_window := nil; + + // Dynamic loading + libGnome2Handle := dlopen('libgnome-2.so.0', RTLD_LAZY); + if libGnome2Handle = nil then libGnome2Handle := dlopen('libgnome-2.so', RTLD_LAZY); + if libGnome2Handle <> nil then begin + @gnome_program_init := dlsym(libGnome2Handle, 'gnome_program_init'); + @libgnome_module_info_get := dlsym(libGnome2Handle, 'libgnome_module_info_get'); + DebugMsg(['libgnome-2.so loaded, @gnome_program_init = 0x', IntToHex(QWORD(@gnome_program_init), 8), ', @libgnome_module_info_get = 0x', IntToHex(QWORD(@libgnome_module_info_get), 8)]); + end; + libGnomeUI2Handle := dlopen('libgnomeui-2.so.0', RTLD_LAZY); + if libGnomeUI2Handle = nil then libGnomeUI2Handle := dlopen('libgnomeui-2.so', RTLD_LAZY); + if libGnomeUI2Handle <> nil then begin + @gnome_about_new := dlsym(libGnomeUI2Handle, 'gnome_about_new'); + @gnome_color_picker_new := dlsym(libGnomeUI2Handle, 'gnome_color_picker_new'); + @gnome_color_picker_get_i16 := dlsym(libGnomeUI2Handle, 'gnome_color_picker_get_i16'); + @gnome_color_picker_set_i16 := dlsym(libGnomeUI2Handle, 'gnome_color_picker_set_i16'); + @libgnomeui_module_info_get := dlsym(libGnomeUI2Handle, 'libgnomeui_module_info_get'); + @gnome_icon_entry_new := dlsym(libGnomeUI2Handle, 'gnome_icon_entry_new'); + @gnome_icon_entry_set_pixmap_subdir := dlsym(libGnomeUI2Handle, 'gnome_icon_entry_set_pixmap_subdir'); + @gnome_icon_entry_get_filename := dlsym(libGnomeUI2Handle, 'gnome_icon_entry_get_filename'); + @gnome_icon_entry_set_filename := dlsym(libGnomeUI2Handle, 'gnome_icon_entry_set_filename'); + @gnome_date_edit_new := dlsym(libGnomeUI2Handle, 'gnome_date_edit_new'); + @gnome_date_edit_set_time := dlsym(libGnomeUI2Handle, 'gnome_date_edit_set_time'); + @gnome_date_edit_get_time := dlsym(libGnomeUI2Handle, 'gnome_date_edit_get_time'); + DebugMsg(['libgnomeui-2.so loaded, @gnome_about_new = 0x', IntToHex(QWORD(@gnome_about_new), 8), ', @gnome_color_picker_new = 0x', IntToHex(QWORD(@gnome_color_picker_new), 8), + ', @gnome_icon_entry_new = 0x', IntToHex(QWORD(@gnome_icon_entry_new), 8), ', @gnome_date_edit_new = 0x', IntToHex(QWORD(@gnome_date_edit_new), 8), + ', @libgnomeui_module_info_get = 0x', IntToHex(QWORD(@libgnomeui_module_info_get), 8)]); + end; + libGtk2Handle := dlopen('libgtk-x11-2.0.so.0', RTLD_LAZY); + if libGtk2Handle = nil then libGtk2Handle := dlopen('libgtk-x11-2.0.so.0', RTLD_LAZY); + if libGtk2Handle <> nil then begin + @gtk_event_box_set_visible_window := dlsym(libGtk2Handle, 'gtk_event_box_set_visible_window'); + @gtk_icon_size_lookup_for_settings := dlsym(libGtk2Handle, 'gtk_icon_size_lookup_for_settings'); + DebugMsg(['libgtk-x11-2.0.so loaded, @gtk_event_box_set_visible_window = 0x', IntToHex(QWORD(@gtk_event_box_set_visible_window), 8), + ', @gtk_icon_size_lookup_for_settings = 0x', IntToHex(QWORD(@gtk_icon_size_lookup_for_settings), 8)]); + end; + SetupGnomeLibs; +end; + + +initialization +finalization +// if libGnomeUI2Handle <> 0 then FreeLibrary(libGnomeUI2Handle); +// if libGnome2Handle <> 0 then FreeLibrary(libGnome2Handle); +end. + diff --git a/ULocale.pas b/ULocale.pas new file mode 100644 index 0000000..6b9cb1b --- /dev/null +++ b/ULocale.pas @@ -0,0 +1,297 @@ +(* + Tux Commander - ULocale - Localization core + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +{$J+} +unit ULocale; + +interface + +var LANGF2Button_Caption, LANGF3Button_Caption, LANGF4Button_Caption, LANGF5Button_Caption, LANGF6Button_Caption, + LANGF7Button_Caption, LANGF8Button_Caption: string; + LANGmnuFile_Caption, LANGmnuMark_Caption, LANGmnuCommands_Caption, LANGmnuHelp_Caption, LANGmiExit_Caption, + LANGmiSelectGroup_Caption, LANGmiUnselectGroup_Caption, LANGmiSelectAll_Caption, LANGmiUnselectAll_Caption, + LANGmiInvertSelection_Caption, LANGmiRefresh_Caption, LANGmiAbout_Caption: string; + LANGColumn1_Caption, LANGColumn2_Caption, LANGColumn3_Caption, LANGColumn4_Caption, LANGColumn5_Caption: string; + LANGExpandSelection, LANGShrinkSelection, LANGNoMatchesFound, LANGNoFilesSelected, LANGSelectedFilesDirectories, + LANGDirectoryS, LANGFileS, LANGDoYouReallyWantToDeleteTheS, LANGDoYouReallyWantToDeleteTheSS, LANGCopyFiles, + LANGMoveRenameFiles, LANGCopyDFileDirectoriesTo, LANGMoveRenameDFileDirectoriesTo, LANGCopySC, LANGMoveRenameSC: string; + LANGQuickFind: string; + + LANGAboutString, LANGAboutStringGnome, LANGDiskStatFmt, LANGDiskStatVolNameFmt, LANGStatusLineFmt: string; + LANGPanelStrings : array[boolean] of string; + + LANGDIR, LANGErrorGettingListingForSPanel, LANGErrorGettingListingForSPanelNoPath, LANGErrorCreatingNewDirectorySInSPanel, + LANGErrorCreatingNewDirectorySInSPanelNoPath, LANGTheFileDirectory, LANGCouldNotBeDeleted, LANGCouldNotBeDeletedS, + LANGUserCancelled, LANGTheDirectorySIsNotEmpty, LANGCannotCopyFile, LANGCopyError, LANGMoveError, LANGOverwriteS, + LANGWithFileS, LANGOvewriteSBytesS, LANGTheFile, LANGCopy, LANGMove, LANGTheDirectory, LANGTheSymbolicLink, + LANGCannotMoveFile, LANGCouldNotBeCreated, LANGCouldNotBeCreatedS, LANGFromS, LANGToS, LANGCannotCopyFileToItself, + LANGMemoryAllocationFailed, LANGCannotOpenSourceFile, LANGCannotOpenDestinationFile, LANGCannotCloseDestinationFile, + LANGCannotCloseSourceFile, LANGCannotReadFromSourceFile, LANGCannotWriteToDestinationFile: string; + + LANGUnknownException, LANGNoAccess, LANGUnknownError: string; + + LANGCreateANewDirectory, LANGEnterDirectoryName: string; + + LANGOverwriteQuestion, LANGOverwriteButton_Caption, LANGOverwriteAllButton_Caption, LANGSkipButton_Caption, + LANGOverwriteAllOlderButton_Caption, LANGSkipAllButton_Caption, LANGRenameButton_Caption, LANGAppendButton_Caption, + LANGRename, LANGRenameFile, LANGIgnoreButton_Caption: string; + + LANGProgress, LANGCancel, LANGDelete: string; + + LANGSpecifyFileType: string; + + LANGRemoveDirectory, LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories, LANGRetry, LANGDeleteButton_Caption, + LANGAll: string; + + LANGCopyFilesSC, LANGAppendQuestion, LANGPreparingList: string; + + LANGYouMustSelectAValidFile, LANGmiVerifyChecksums, LANGVerifyChecksumsCaption, LANGCheckButtonCaptionCheck, + LANGCheckButtonCaptionStop, LANGFileListTooltip, LANGFilenameColumnCaption, LANGTheFileSYouAreTryingToOpenIsQuiteBig, + LANGAnErrorOccuredWhileInitializingMemoryBlock, LANGAnErrorOccuredWhileOpeningFileSS, LANGAnErrorOccuredWhileReadingFileSS : string; + LANGChecksumNotChecked, LANGChecksumChecking, LANGChecksumInterrupted, LANGChecksumDOK: string; + + LANGmiCreateChecksumsCaption, LANGYouMustSelectAtLeastOneFileToCalculateChecksum, LANGCreateChecksumsCaption, + LANGCCHKSUMPage1Text, LANGCCHKSUMPage4Text, LANGCCHKSUMPage6Text, LANGCCHKSUMPage7Text, LANGCCHKSUMPage1Title, + LANGCCHKSUMPage2Title, LANGCCHKSUMPage3Title, LANGCCHKSUMPage4Title, LANGCCHKSUMPage5Title, LANGCCHKSUMPage6Title, + LANGCCHKSUMPage7Title, LANGCCHKSUMSFVFile, LANGCCHKSUMMD5sumFile, LANGCCHKSUMFileName, LANGCCHKSUMCreateSeparateChecksumFiles, + LANGCCHKSUMNowProcessingFileS, LANGCCHKSUMFinishCaption, LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing, + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS, LANGCCHKSUMAnErrorOccuredWhileReadingFileSS, + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS: string; + + LANGAnErrorOccuredWhileWritingFileSS, LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt, LANGTheTargetFileSCannotBeRemovedS, + LANGMergeCaption, LANGPleaseInsertNextDiskOrGiveDifferentLocation, LANGMergeOfSSucceeded, LANGWarningCreatedFileFailsCRCCheck, + LANGMergeOfSSucceeded_NoCRCFileAvailable, LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory, LANGMergeSC, + LANGmiSplitFileCaption, LANGmiMergeFilesCaption: string; + + LANGSplitTheFileSToDirectory, LANGSplitSC, LANGSplitFile, LANGBytesPerFile, LANGAutomatic, LANGDeleteFilesOnTargetDisk, + LANGSplitCaption, LANGCannotOpenFileS, LANGCannotSplitTheFileToMoreThan999Parts, + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem, LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem, + LANGAnErrorOccuredWhileOperationS, LANGSplitOfSSucceeded, LANGSplitOfSFailed: string; + + LANGmnuShow_Caption, LANGmiShowDotFiles_Caption, LANGTheFileYouAreTryingToOpenIsQuiteBig, + LANGCannotExecuteSPleaseCheckTheConfiguration, LANGEdit, LANGEnterFilenameToEdit: string; + + LANGmnuSettings_Caption, LANGmiFileTypes_Caption, LANGThereIsNoApplicationAssociatedWithS, LANGErrorExecutingCommand, + LANGEditFileTypesCaption, LANGTitleLabel_Caption, LANGExtensionsColumn, LANGDescriptionColumn, LANGFileTypesList, + LANGActionName, LANGCommand, LANGSetDefaultActionButton_Caption, LANGRunInTerminalCheckBox_Caption, + LANGAutodetectCheckBox_Caption, LANGBrowseButton_Caption, LANGCommandLabel_Caption, LANGDescriptionLabel_Caption, + LANGFNameExtLabel_Caption, LANGNotebookPageExtensions, LANGNotebookPageActions, LANGDefault, + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess: string; + + LANGDefaultColor, LANGIcon, LANGBrowseForIcon, LANGSelectFileTypeColor, LANGColor: string; + + LANGmiChangePermissions_Caption, LANGmiChangeOwner_Caption, LANGmiCreateSymlink_Caption, LANGmiEditSymlink_Caption, + LANGChmodProgress, LANGChownProgress, LANGYouMustSelectAValidSymbolicLink, LANGPopupRunS, LANGPopupOpenS, LANGPopupGoUp, + LANGPopupOpenWithS, LANGPopupDefault, LANGPopupOpenWith, LANGPopupViewFile, LANGPopupEditFile, LANGPopupMakeSymlink, + LANGPopupRename, LANGPopupDelete, LANGDialogChangePermissions, LANGCouldNotBeChmoddedS, LANGDialogChangeOwner, + LANGCouldNotBeChownedS, LANGDialogMakeSymlink, LANGDialogEditSymlink, LANGFEditSymlink_Caption, + LANGFEditSymlink_SymbolicLinkFilename, LANGFEditSymlink_SymbolicLinkPointsTo: string; + + LANGFChmod_Caption, LANGFChmod_PermissionFrame, LANGFChmod_FileFrame, LANGFChmod_ApplyRecursivelyFor, LANGFChmod_miAllFiles, + LANGFChmod_miDirectories, LANGFChmod_OctalLabel, LANGFChmod_SUID, LANGFChmod_SGID, LANGFChmod_Sticky, LANGFChmod_RUSR, + LANGFChmod_WUSR, LANGFChmod_XUSR, LANGFChmod_RGRP, LANGFChmod_WGRP, LANGFChmod_XGRP, LANGFChmod_ROTH, LANGFChmod_WOTH, + LANGFChmod_XOTH, LANGFChmod_TextLabel, LANGFChmod_FileLabel, LANGFChown_Caption, LANGFChown_OwnerFrame, LANGFChown_GroupFrame, + LANGFChown_FileFrame, LANGFChown_ApplyRecursively, LANGFSymlink_Caption, LANGFSymlink_ExistingFilename, + LANGFSymlink_SymlinkFilename: string; + + LANGmnuBookmarks_Caption, LANGmiAddBookmark_Caption, LANGmiEditBookmarks_Caption, LANGBookmarkPopupDelete_Caption, + LANGmiPreferences_Caption, LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList, LANGSomeOtherInstanceChanged, + LANGPreferences_Caption, LANGPreferences_TitleLabel_Caption, LANGPreferences_GeneralPage, LANGPreferences_FontsPage, + LANGPreferences_ColorsPage, LANGPreferences_RowHeight, LANGPreferences_NumHistoryItems, LANGPreferences_Default, + LANGPreferences_ClearReadonlyAttribute, LANGPreferences_DisableMouseRenaming, LANGPreferences_ShowFiletypeIconsInList, + LANGPreferences_ExternalAppsLabel, LANGPreferences_Viewer, LANGPreferences_Editor, LANGPreferences_Terminal, + LANGPreferences_ListFont, LANGPreferences_Change, LANGPreferences_UseDefaultFont, LANGPreferences_Foreground, + LANGPreferences_Background, LANGPreferences_NormalItem, LANGPreferences_SetToDefaultToUseGTKThemeColors, + LANGPreferences_Cursor, LANGPreferences_InactiveItem, LANGPreferences_SelectedItem, LANGPreferences_LinkItem, + LANGPreferences_LinkItemHint, LANGPreferences_DotFileItem, LANGPreferences_DotFileItemHint, + LANGPreferences_BrowseForApplication, LANGPreferences_DefaultS, LANGPreferences_SelectFont: string; + + LANGBookmarkButton_Tooltip, LANGUpButton_Tooltip, LANGRootButton_Tooltip, LANGHomeButton_Tooltip, LANGLeftEqualButton_Tooltip, + LANGRightEqualButton_Tooltip, LANGmiShowDirectorySizes_Caption, LANGmiTargetSource_Caption, LANGFileTypeDirectory, + LANGFileTypeFile, LANGFileTypeMetafile, LANGPreferencesPanelsPage, LANGPreferencesApplicationsPage, + LANGPreferencesExperimentalPage, LANGPreferencesSelectAllDirectoriesCheckBox_Caption, + LANGPreferencesNewStyleAltOCheckBox_Caption, LANGPreferencesNewStyleAltOCheckBox_Tooltip, + LANGPreferencesShowFuncButtonsCheckBox_Caption, LANGPreferencesSizeFormatLabel_Caption, LANGPreferencesmiSizeFormat1, + LANGPreferencesmiSizeFormat6, LANGPreferencesAutodetectXApp, LANGPreferencesAlwaysRunInTerminal, + LANGPreferencesNeverRunInTerminal, LANGPreferencesCmdLineBehaviourLabel_Caption, LANGPreferencesFeatures, + LANGPreferencesDisableMouseRename_Tooltip, LANGPreferencesDisableFileTipsCheckBox_Caption, + LANGPreferencesDisableFileTipsCheckBox_Tooltip, LANGPreferencesShow, LANGPreferencesDirsInBoldCheckBox_Caption, + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption, LANGPreferencesOctalPermissionsCheckBox_Caption, + LANGPreferencesOctalPermissionsCheckBox_Tooltip, LANGPreferencesMovement, LANGPreferencesLynxLikeMotionCheckBox_Caption, + LANGPreferencesInsertMovesDownCheckBox_Caption, LANGPreferencesSpaceMovesDownCheckBox_Caption, LANGPreferencesViewer, + LANGPreferencesCommandSC, LANGPreferencesUseInternalViewer, LANGPreferencesEditor, LANGPreferencesTerminal, + LANGPreferencesExperimentalFeatures, LANGPreferencesExperimentalWarningLabel_Caption, + LANGPreferencesFocusRefreshCheckBox_Caption, LANGPreferencesFocusRefreshCheckBox_Tooltip, + LANGPreferencesWMCompatModeCheckBox_Caption, LANGPreferencesWMCompatModeCheckBox_Tooltip, + LANGPreferencesCompatUseLibcSystemCheckBox_Caption, LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip: string; + + LANGmiSearchCaption2, LANGmiNoMounterBarCaption, LANGmiShowOneMounterBarCaption, LANGmiShowTwoMounterBarCaption, + LANGmnuNetworkCaption, LANGmiConnectionsCaption, LANGmiOpenConnectionCaption, LANGmiQuickConnectCaption, LANGmnuPluginsCaption, + LANGmiTestPluginCaption, LANGmiMounterSettingsCaption, LANGmiColumnsCaption, LANGmiSavePositionCaption, LANGmiMountCaption, + LANGmiUmountCaption, LANGmiEjectCaption, LANGmiDuplicateTabCaption, LANGmiCloseTabCaption, LANGmiCloseAllTabsCaption, + LANGCannotDetermineDestinationEngine, LANGCannotLoadFile, LANGMountPointDevice, LANGMountSC, LANGNoPluginsFound, + LANGPluginAbout, LANGCouldntOpenURI, LANGPluginAboutInside, LANGAreYouSureCloseAllTabs, LANGCouldntOpenURIArchive, + LANGThereIsNoModuleAvailable, LANGIgnoreError, LANGErrorMount, LANGErrorUmount, LANGErrorEject: string; + + LANGMounterPrefs_Caption, LANGMounterPrefs_TitleLabelCaption, LANGMounterPrefs_ListViewFrameCaption, + LANGMounterPrefs_MountName, LANGMounterPrefs_MountPoint, LANGMounterPrefs_Device, LANGMounterPrefs_MoveUpButtonTooltip, + LANGMounterPrefs_MoveDownButtonTooltip, LANGMounterPrefs_UseFSTabDefaultsCheckBox, + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip, LANGMounterPrefs_ToggleModeCheckBox, + LANGMounterPrefs_ToggleModeCheckBoxTooltip, LANGMounterPrefs_PropertiesFrameCaption, LANGMounterPrefs_DisplayTextLabelCaption, + LANGMounterPrefs_MountPointLabelCaption, LANGMounterPrefs_MountDeviceLabelCaption, LANGMounterPrefs_DeviceTypeLabelCaption, + LANGMounterPrefs_miLocalDiskCaption, LANGMounterPrefs_miRemovableCaption, LANGMounterPrefs_miCDCaption, + LANGMounterPrefs_miFloppyCaption, LANGMounterPrefs_miNetworkCaption, LANGMounterPrefs_MountCommandLabelCaption, + LANGMounterPrefs_UmountCommandLabelCaption, LANGMounterPrefs_MountCommandEntryTooltip, + LANGMounterPrefs_UmountCommandEntryTooltip, LANGMounterPrefs_IconLabelCaption: string; + + LANGConnMgr_Caption, LANGConnMgr_ConnectButton, LANGConnMgr_OpenConnection, LANGConnMgr_NameColumn, LANGConnMgr_URIColumn, + LANGConnMgr_AddConnectionButtonCaption, LANGConnMgr_AddConnectionButtonTooltip, LANGConnMgr_EditButtonCaption, + LANGConnMgr_EditButtonTooltip, LANGConnMgr_RemoveButtonCaption, LANGConnMgr_RemoveButtonTooltip, + LANGConnMgr_DoYouWantDelete: string; + + LANGConnProp_FTP, LANGConnProp_SFTP, LANGConnProp_SMB, LANGConnProp_HTTP, LANGConnProp_HTTPS, LANGConnProp_Other, + LANGConnProp_Caption, LANGConnProp_VFSModule, LANGConnProp_URI, LANGConnProp_URIEntryTooltip, + LANGConnProp_DetailedInformations, LANGConnProp_Name, LANGConnProp_Server, LANGConnProp_Username, + LANGConnProp_UserNameEntryTooltip, LANGConnProp_Password, LANGConnProp_TargetDirectory, LANGConnProp_ServiceType, + LANGConnProp_MaskPassword, LANGConnProp_MenuItemCaption: string; + + LANGConnLogin_Caption, LANGConnLogin_Login, LANGConnLogin_ExperimentalWarningLabelCaption, LANGConnLogin_Username, + LANGConnLogin_Password, LANGConnLogin_AnonymousCheckButton: string; + + LANGColumns_Caption, LANGColumns_Title, LANGColumns_MoveUpButtonTooltip, LANGColumns_MoveDownButtonTooltip, + LANGColumns_TitlesLongName, LANGColumns_TitlesLongNameExt, LANGColumns_TitlesLongExt, LANGColumns_TitlesLongSize, + LANGColumns_TitlesLongDateTime, LANGColumns_TitlesLongDate, LANGColumns_TitlesLongTime, LANGColumns_TitlesLongUser, + LANGColumns_TitlesLongGroup, LANGColumns_TitlesLongAttr, LANGColumns_TitlesShortName, LANGColumns_TitlesShortNameExt, + LANGColumns_TitlesShortExt, LANGColumns_TitlesShortSize, LANGColumns_TitlesShortDateTime, LANGColumns_TitlesShortDate, + LANGColumns_TitlesShortTime, LANGColumns_TitlesShortUser, LANGColumns_TitlesShortGroup, + LANGColumns_TitlesShortAttr: string; + + LANGTestPlugin_Caption, LANGTestPlugin_Title, LANGTestPlugin_ExperimentalWarningLabelCaption, LANGTestPlugin_Plugin, + LANGTestPlugin_Command, LANGTestPlugin_Username, LANGTestPlugin_Password, LANGTestPlugin_AnonymousCheckButton, + LANGTestPlugin_NoPluginsFound: string; + + LANGRemoteWait_Caption, LANGRemoteWait_OperationInProgress, LANGRemoteWait_ItemsFound: string; + + LANGSearch_Bytes, LANGSearch_kB, LANGSearch_MB, LANGSearch_days, LANGSearch_weeks, LANGSearch_months, LANGSearch_years, + LANGSearch_Caption, LANGSearch_General, LANGSearch_Advanced, LANGSearch_SearchResults, LANGSearch_SearchFor, + LANGSearch_FileMaskEntryTooltip, LANGSearch_SearchIn, LANGSearch_SearchArchivesCheckButton, LANGSearch_FindText, + LANGSearch_FindTextEntryTooltip, LANGSearch_CaseSensitiveCheckButton, LANGSearch_StayCurrentFSCheckButton, + LANGSearch_CaseSensitiveMatchCheckButton, LANGSearch_Size, LANGSearch_Date, LANGSearch_BiggerThan, LANGSearch_SmallerThan, + LANGSearch_ModifiedBetweenRadioButton, LANGSearch_NotModifiedAfterRadioButton, LANGSearch_ModifiedLastRadioButton, + LANGSearch_ModifiedNotLastRadionButton, LANGSearch_ModifiedBetweenEntry1, LANGSearch_ViewButtonCaption, + LANGSearch_NewSearchButtonCaption, LANGSearch_GoToFileButtonCaption, LANGSearch_FeedToListboxButtonCaption, + LANGSearch_StatusSC, LANGSearch_Ready, LANGSearch_PreparingToSearch, LANGSearch_SearchInProgress, LANGSearch_UserCancelled, + LANGSearch_SearchFinished, LANGSearch_FilesFound, LANGSearch_And: string; + + LANGCloseOpenConnection, LANGDuplicateTabWarning, LANGDontShowAgain, LANGSwitchOtherPanelWarning, LANGOpenConnectionsWarning, + LANGmiDisconnect_Caption, LANGDisconnectButton_Tooltip, LANGLeaveArchiveButton_Tooltip, LANGOpenTerminalButton_Tooltip, + LANGOpenTerminalButton_Caption, LANGShowTextUIDsCheckBox_Caption, LANGShowTextUIDsCheckBox_Tooltip: string; + + LANGmiNewTab_Caption, LANGFilePopupMenu_Properties, LANGCommandEntry_Tooltip, LANGmiFiles_Caption: string; + + LANGPasswordButton_Tooltip, LANGHandleRunFromArchive_Bytes, LANGHandleRunFromArchive_FileTypeDesc_Unknown, + LANGHandleRunFromArchive_NotAssociated, LANGHandleRunFromArchive_SelfExecutable, + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory, LANGFRunFromVFS_Caption, LANGFRunFromVFS_TitleLabel, + LANGFRunFromVFS_FileNameLabel, LANGFRunFromVFS_FileTypeLabel, LANGFRunFromVFS_SizeLabel, LANGFRunFromVFS_PackedSizeLabel, + LANGFRunFromVFS_DateLabel, LANGFRunFromVFS_InfoLabel, LANGFRunFromVFS_OpensWithLabel, LANGFRunFromVFS_ExecuteButton, + LANGFRunFromVFS_ExecuteAllButton, LANGFSetPassword_Caption, LANGFSetPassword_Label1_Caption, LANGFSetPassword_Label2_Caption, + LANGFSetPassword_ShowPasswordCheckButton: string; + + + + + + +procedure AddTranslation(Language: string; LangSetProc: pointer); +procedure SetTranslationTexts(ForceLocale: string = ''); + +implementation + +uses SysUtils, UTranslation_EN, UTranslation_CZ, UTranslation_RU, UTranslation_DE, UTranslation_SV, UTranslation_FR, + UTranslation_ES, UTranslation_PL, UTranslation_UA, UTranslation_SR, UTranslation_HU, UTranslation_IT; + + + +const LangTable: array of string = nil; + LangProcTable: array of pointer = nil; + +var Lang: string; + +procedure AddTranslation(Language: string; LangSetProc: pointer); +begin + if not Assigned(LangTable) then SetLength(LangTable, 0); + if not Assigned(LangProcTable) then SetLength(LangProcTable, 0); + SetLength(LangTable, Length(LangTable) + 1); + LangTable[Length(LangTable) - 1] := ANSIUpperCase(Language); + SetLength(LangProcTable, Length(LangProcTable) + 1); + LangProcTable[Length(LangProcTable) - 1] := LangSetProc; +end; + +function LookupLanguages: integer; +var i: integer; +begin + Result := -1; + for i := 0 to Length(LangTable) - 1 do + if LangTable[i] = Lang then begin + Result := i; + Break; + end; +end; + +procedure SetTranslationTexts(ForceLocale: string = ''); +var LangIdx: integer; + SetProc: procedure; +begin + if not (Assigned(LangTable) and (Length(LangTable) > 0)) then begin + WriteLn('**** tuxcmd CRITICAL: No usable translations found. At least one is required. Probably you have compiled the application incorrectly.'); + Halt(1); + end; + // Assign default language - English + try + Lang := 'EN'; + LangIdx := LookupLanguages; + if LangIdx >= 0 then begin + SetProc := LangProcTable[LangIdx]; + SetProc; + end; + except end; + // Assign other languages + if Length(ForceLocale) = 0 then begin + Lang := GetEnvironmentVariable('LC_MESSAGES'); + if Length(Trim(Lang)) = 0 then Lang := GetEnvironmentVariable('LC_ALL'); + if Length(Trim(Lang)) = 0 then Lang := GetEnvironmentVariable('LANGUAGE'); + if Length(Trim(Lang)) = 0 then Lang := GetEnvironmentVariable('LANG'); + if Length(Trim(Lang)) = 0 then Lang := 'en_US'; // Default language + end else Lang := ForceLocale; + if Length(Trim(Lang)) >= 2 then Lang := AnsiUpperCase(Copy(Lang, 1, 2)); + LangIdx := LookupLanguages; + if LangIdx = -1 then begin + Lang := 'EN'; + LangIdx := LookupLanguages; + end; + SetProc := LangProcTable[LangIdx]; + try + SetProc; + except + on E: Exception do WriteLn('*** Exception ', E.ClassName, ' raised in SetProc - language ', LangTable[LangIdx], ', procedure @ ', integer(@SetProc), ': ', E.Message); + end; +end; + + +end. diff --git a/ULogin.pas b/ULogin.pas new file mode 100644 index 0000000..8dbf5bb --- /dev/null +++ b/ULogin.pas @@ -0,0 +1,146 @@ +(* + Tux Commander - ULogin - Login dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit ULogin; + +interface + +uses + glib2, gdk2, gtk2, pango, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, GTKMenus, + UCoreClasses; + +type + TFLogin = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + Table: TGTKTable; + Label3, Label4: TGTKLabel; + UserEntry, PasswordEntry: TGTKEntry; + ExperimentalWarningLabel: TGTKLabel; + ExperimentalWarningIcon: TGTKImage; + AnonymousCheckButton: TGTKCheckButton; + HBox4: TGTKHBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure AnonymousCheckButtonToggled(Sender: TObject); + end; + +var + FLogin: TFLogin; + +implementation + +uses ULocale; + + +procedure TFLogin.FormCreate(Sender: TObject); +begin + SetDefaultSize(200, 150); + Caption := LANGConnLogin_Caption; + Buttons := [mbOK, mbCancel]; + DefaultButton := mbOK; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [LANGConnLogin_Login]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-dialog-authentication', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + HBox4 := TGTKHBox.Create(Self); + HBox4.Homogeneous := False; + ExperimentalWarningLabel := TGTKLabel.Create(Self); + ExperimentalWarningLabel.Caption := LANGConnLogin_ExperimentalWarningLabelCaption; + ExperimentalWarningLabel.UseMarkup := True; + ExperimentalWarningLabel.LineWrap := True; + ExperimentalWarningIcon := TGTKImage.Create(Self); + ExperimentalWarningIcon.SetFromStock('gtk-dialog-authentication', isDialog); + HBox4.AddControlEx(ExperimentalWarningIcon, False, False, 7); + HBox4.AddControlEx(ExperimentalWarningLabel, True, True, 7); + HBox4.AddControlEx(TGTKEventBox.Create(Self), False, False, 8); + + + Table := TGTKTable.Create(Self); + Table.BorderWidth := 20; + ClientArea.AddControlEx(Table, True, True, 0); + Table.AddControlEx(0, 0, 2, 1, HBox4, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + Table.AddControlEx(0, 1, 2, 1, TGTKEventBox.Create(Self), [taoShrink, taoFill], [taoShrink], 5, 10); + Label3 := TGTKLabel.Create(Self); + Label3.XAlign := 1; + Label3.Caption := LANGConnLogin_Username; + UserEntry := TGTKEntry.Create(Self); + Label3.FocusControl := UserEntry; + Label3.UseUnderline := True; + Label4 := TGTKLabel.Create(Self); + Label4.XAlign := 1; + Label4.Caption := LANGConnLogin_Password; + PasswordEntry := TGTKEntry.Create(Self); + PasswordEntry.Visibility := False; + Label4.FocusControl := PasswordEntry; + Label4.UseUnderline := True; + AnonymousCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGConnLogin_AnonymousCheckButton); + AnonymousCheckButton.OnToggled := AnonymousCheckButtonToggled; + AnonymousCheckButton.Checked := False; + Table.AddControlEx(0, 2, 1, 1, Label3, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(1, 2, 1, 1, UserEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table.AddControlEx(0, 3, 1, 1, Label4, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(1, 3, 1, 1, PasswordEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table.AddControlEx(0, 4, 2, 1, AnonymousCheckButton, [taoExpand, taoFill], [taoShrink], 20, 2); + + UserEntry.SetFocus; + OnKeyDown := FormKeyDown; +end; + +procedure TFLogin.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFLogin.AnonymousCheckButtonToggled(Sender: TObject); +begin + Label3.Enabled := not AnonymousCheckButton.Checked; + Label4.Enabled := not AnonymousCheckButton.Checked; + UserEntry.Enabled := not AnonymousCheckButton.Checked; + PasswordEntry.Enabled := not AnonymousCheckButton.Checked; +end; + + +end. + diff --git a/UMain.pas b/UMain.pas new file mode 100644 index 0000000..3fb485a --- /dev/null +++ b/UMain.pas @@ -0,0 +1,6128 @@ +(* + Tux Commander - UMain - Main form and window-related functions + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UMain; + +interface + +uses + gtk2, gdk2, gdk2pixbuf, glib2, pango, StrUtils, SysUtils, Types, Classes, DateUtils, + GTKForms, GTKControls, GTKMenus, GTKStdCtrls, GTKExtCtrls, GTKView, GTKConsts, GTKUtils, + GTKClasses, GTKPixbuf, UEngines, UConfig, UGnome, UVFSCore, UCoreClasses; + +type + TFMain = class(TGTKForm) + MainVBox : TGTKVBox; + MainMenuHandleBox : TGTKHandleBox; + MainMenu : TGTKMenuBar; + LeftPanelBox, RightPanelBox : TGTKVBox; + PanelSeparator : TGTKHPaned; + LeftStatusBox, RightStatusBox, LeftPathLabelHBox, RightPathLabelHBox : TGTKHBox; + LeftPathLabel, RightPathLabel : TGTKLabel; + LeftPathLabelEventBox, RightPathLabelEventBox : TGTKEventBox; + LeftScrolledWindow, RightScrolledWindow : TGTKScrolledWindow; + LeftListView, RightListView: TGTKListView; + LeftStatusLine, RightStatusLine : TGTKLabel; + LeftUpButton, LeftRootButton, LeftHomeButton, RightUpButton, RightRootButton, RightHomeButton, + LeftBookmarkButton, RightBookmarkButton : TGTKButton; + LeftEqualButton, RightEqualButton : TGTKButton; + LeftDiskInfoLabel, RightDiskInfoLabel : TGTKLabel; + ButtonsBox : TGTKTable; + F2Button, F3Button, F4Button, F5Button, F6Button, F7Button, F8Button : TGTKButton; + mnuFile, mnuMark, mnuCommands, mnuShow, mnuSettings, mnuHelp : TGTKMenuItem; + miExit : TGTKMenuItem; + miSelectGroup, miUnselectGroup, miSelectAll, miUnselectAll, miInvertSelection : TGTKMenuItem; + miRefresh : TGTKMenuItem; + miShowDotFiles : TGTKMenuItem; + miFileTypes: TGTKMenuItem; + miAbout : TGTKMenuItem; + miVerifyChecksums, miCreateChecksums : TGTKMenuItem; + miSplitFile, miMergeFiles : TGTKMenuItem; + miChangePermissions, miChangeOwner: TGTKMenuItem; + miCreateSymlink, miEditSymlink: TGTKMenuItem; + LeftQuickFindVBox, RightQuickFindVBox: TGTKVBox; + LeftQuickFindHBox, RightQuickFindHBox: TGTKHBox; + LeftQuickFindLabel, RightQuickFindLabel: TGTKLabel; + LeftQuickFindEntry, RightQuickFindEntry: TGTKEntry; + LeftQuickFindSeparator, RightQuickFindSeparator, ButtonBoxSeparator: TGTKHSeparator; + CommandLineHBox: TGTKHBox; + CommandLineCombo: TGTKCombo; + CommandLineLabel: TGTKLabel; + SplitterPopupMenu: TGTKMenuItem; + FilePopupMenu: TGTKMenuItem; + miPreferences: TGTKMenuItem; + mnuBookmarks, miAddBookmark, miEditBookmarks, BookmarkPopup, BookmarkPopupDelete, miBookmarksSeparator: TGTKMenuItem; + miShowDirectorySizes, miTargetSource: TGTKMenuItem; + ButtonBoxSpace: TGTKEventBox; + MounterBarHandleBox : TGTKHandleBox; + MounterBarTable: TGTKTable; + MounterButtonPopupMenu, miMount, miUmount, miEject: TGTKMenuItem; + miMounterSettings, miNoMounterBar, miShowOneMounterBar, miShowTwoMounterBar: TGTKMenuItem; + LeftMounterTable, RightMounterTable: TGTKTable; + miColumns: TGTKMenuItem; + mnuPlugins, miTestPlugin: TGTKMenuItem; + miSavePosition: TGTKMenuItem; + LeftPanelNotebook, RightPanelNotebook: TEphyNotebook; + LeftListBox, RightListBox: TGTKVBox; + TabPopupMenu, miDuplicateTab, miCloseTab, miCloseAllTabs: TGTKMenuItem; + mnuNetwork, miConnections, miOpenConnection, miQuickConnect, miDisconnect: TGTKMenuItem; + miSearch: TGTKMenuItem; + LeftDisconnectButton, RightDisconnectButton, LeftLeaveArchiveButton, RightLeaveArchiveButton: TGTKButton; + OpenTerminalButton: TGTKButton; + miNewTab: TGTKMenuItem; + LeftPasswordButton, RightPasswordButton: TGTKImageButton; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormResize(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure PanelSeparatorResize(Sender: TObject); + procedure miExitClick(Sender: TObject); + procedure miAboutClick(Sender: TObject); + procedure miRefreshClick(Sender: TObject); + procedure mnuMarkClick(Sender: TObject); + procedure ListViewKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure ListViewEnter(Sender: TObject; var Accept: boolean); + procedure PathLabelMouseDown(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure PathButtonClick(Sender: TObject); + function CompareFunc(Sender: TObject; var model: PGtkTreeModel; var a, b: PGtkTreeIter): integer; + procedure F5ButtonClick(Sender: TObject); + procedure F6ButtonClick(Sender: TObject); + procedure F7ButtonClick(Sender: TObject); + procedure F8ButtonClick(Sender: TObject); + procedure ListViewDblClick(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure ListViewMouseDown(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure ListViewMouseUp(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure InplaceEditTimerTimer(Sender: TObject); + procedure ListViewEdited(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem; var NewText: string; var AllowChange: boolean; var DataColumn: integer); + procedure ListViewSelectionChanged(Sender: TObject); + procedure QuickFindEntryEnter(Sender: TObject; var Accept: boolean); + procedure miVerifyChecksumsClick(Sender: TObject); + procedure miCreateChecksumsClick(Sender: TObject); + procedure miMergeFilesClick(Sender: TObject); + procedure miSplitFileClick(Sender: TObject); + procedure miShowDotFilesClick(Sender: TObject); + procedure F3F4ButtonClick(Sender: TObject); + procedure miFileTypesClick(Sender: TObject); + procedure CommandLineComboKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure InactiveItemsTimerTimer(Sender: TObject); + function OldGTKConvertToSorted(Sender: TObject; const Index: integer): integer; + function OldGTKConvertFromSorted(Sender: TObject; const Index: integer): integer; + procedure SplitterPopupMenuClick(Sender: TObject); + procedure miChangePermissionsClick(Sender: TObject); + procedure miChangeOwnerClick(Sender: TObject); + procedure miCreateSymlinkClick(Sender: TObject); + procedure miEditSymlinkClick(Sender: TObject); + procedure FilePopupMenuPopup(Sender: TObject); + procedure FilePopupMenuItemClick(Sender: TObject); + procedure miPreferencesClick(Sender: TObject); + procedure miAddBookmarkClick(Sender: TObject); + procedure miBookmarkClick(Sender: TObject); + procedure BookmarkPopupDeleteClick(Sender: TObject); + procedure BookmarkItemMouseUp(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure BookmarkButtonClick(Sender: TObject); + procedure mnuBookmarksPopup(Sender: TObject); + procedure miShowDirectorySizesClick(Sender: TObject); + procedure miTargetSourceClick(Sender: TObject); + procedure MounterButtonClick(Sender: TObject); + procedure MounterButtonPopupMenuPopup(Sender: TObject); + procedure MounterButtonMouseDown(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure miMountClick(Sender: TObject); + procedure miUmountClick(Sender: TObject); + procedure miEjectClick(Sender: TObject); + procedure miMounterSettingsClick(Sender: TObject); + procedure miShowMounterBarClick(Sender: TObject); + procedure miColumnsClick(Sender: TObject); + procedure ListViewColumnsChanged(Sender: TObject); + procedure RebuildListViewsTimerTimer(Sender: TObject); + procedure miTestPluginClick(Sender: TObject); + procedure miPluginAboutClick(Sender: TObject); + procedure miSavePositionClick(Sender: TObject); + procedure TabNotebookSwitchPage(Sender: TObject; const NewTabNum: integer; const ShouldFocus: boolean); + procedure miDuplicateTabClick(Sender: TObject); + procedure miCloseTabClick(Sender: TObject); + procedure miCloseAllTabsClick(Sender: TObject); + procedure TabPopupMenuPopup(Sender: TObject); + procedure miOpenConnectionClick(Sender: TObject); + procedure miSearchClick(Sender: TObject); + procedure miDisconnectClick(Sender: TObject); + procedure DisconnectButtonClick(Sender: TObject); + procedure LeaveArchiveButtonClick(Sender: TObject); + procedure OpenTerminalButtonClick(Sender: TObject); + procedure ListViewColumnClicked(Sender: TObject); + procedure NotebookReordered(Sender: TObject; const Source, Dest: integer); + procedure NotebookTabClosed(Sender: TObject; const TabNum: integer; var CanClose: boolean); + procedure NotebookTabDoubleClick(Sender: TObject; const TabNum: integer); + function NotebookFindNotebookAtPointerEvent(Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook; + function NotebookMoveTabToAnotherNotebook(Sender: TObject; Destination: TEphyNotebook; const SourceTabNo, DestTabNo: integer): boolean; + procedure NotebookTabFocusOnlyEvent(Sender: TObject; const TabNum: integer); + procedure miFilePropertiesClick(Sender: TObject); + procedure PasswordButtonClick(Sender: TObject); + private + LeftLastFocused, Editing, QuickFind, RedrawLeftInactive, RedrawRightInactive, StartUp, LeftTabPopup: boolean; + LastWidth, RunningEscSensitive: integer; + InplaceEditTimer, InactiveItemsTimer, RebuildListViewsTimer: TGTKTimer; + InplaceEditItem: TGTKListItem; + SavedCmdLine: string; + LastMounterButton: TGTKButton; + MounterTableList, MounterTableListLeft, MounterTableListRight: TList; + LeftNotebookBoxList, RightNotebookBoxList: TList; + LeftPathsHighlight, RightPathsHighlight: TStringList; + LeftTabEngines, RightTabEngines: TList; + LastUsedFilter: string; + procedure ConstructPanels; + procedure ConstructMenu; + procedure ConstructColumns(ListView: TGTKListView); + procedure AfterStart; + procedure ActivateItem(const ItemIndex: longint; const MouseActivate: boolean); + procedure UpdatePanelInfo; + procedure UpdatePanelInfoDown(LeftPanel: boolean); + procedure UpdateCaption; + procedure ChangingDir(LeftPanel: boolean; NewPath: string; HiliString1: string = ''; HiliString2: string = ''; const PreserveSelection: boolean = False; const AutoFallback: boolean = False; Plugin: TVFSPlugin = nil); + procedure DoSelect(SelectType: integer); + procedure ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); + procedure DoGetDirSize(AllItems: boolean); + procedure DoDelete(LeftPanel: boolean; ListView: TGTKListView; Engine: TPanelEngine; DataList: TList); + procedure DoCopyMove(LeftPanel, CopyMode, ShiftPressed: boolean; ListView: TGTKListView; Engine: TPanelEngine; DataList: TList); + procedure DoRefresh(LeftPanel, StaySame, AutoFallback: boolean); + procedure DoQuickRename(LeftPanel: boolean; ListView: TGTKListView; const CalledFromKey: boolean); + procedure ActivateQuickFind(LeftPanel: boolean); + procedure DeactivateQuickFind(LeftPanel: boolean); + function QuickFindSendKey(LeftPanel: boolean; Key: word): boolean; + procedure ProcessMarkKey(KeyType, Key: integer); + procedure SwitchOtherPanel(LeftPanel, RequestNewAltO: boolean); + procedure EditViewFile(LeftPanel: boolean; AListView: TGTKListView; View, NewFile: boolean); + procedure RunFile(Path: string; Engine: TPanelEngine; CustomAction: integer); + function ActivateCommandLine(Key: word; const ActualPosition: boolean = False): boolean; + procedure ApplySettings(RebuildListViews, RebuildIcons, Startup: boolean); + procedure RefreshBookmarksMenu; + procedure PopupFileMenuPos; + procedure HandleFormFocusIn; + procedure SwitchPanelCtrlLeftRight(LeftPanel, LeftArrowPressed: boolean); + procedure FillMounterBar; + procedure RebuildListViews(DoRefresh: boolean); + procedure FillPluginMenu; + procedure NewTab(LeftPanel: boolean); + procedure SwitchTab(TabNo: integer; LeftPanel, SetFocus: boolean); + procedure CloseTab(TabNo: integer; LeftPanel: boolean); + procedure AddTabs(LeftPanel: boolean; TabList: TStringList; TabSortIDs, TabSortTypes: TList; SetTabActive: integer); + function HandleVFSArchive(const Ext, FullPath, HighlightItem, TargetPath: string): boolean; + procedure CloseVFS(LeftPanel, SurpressRefresh: boolean); + procedure ShowBookmarkQuick(LeftPanel: boolean); + procedure SetTabLabel(Notebook: TEphyNotebook; PageIndex: integer; ALabel, Tooltip: string); + procedure NewTabInternal(LeftPanel: boolean; _Engine: TPanelEngine; _Path: string; NewTabPosition: integer); + procedure CopyFilenamesToClipboard(FullPaths, LeftPanel: boolean); + function HandleRunFromArchive(var APath: string; Engine: TPanelEngine; Command, FileTypeDesc: string; BypassDialog: boolean): boolean; + function HandleSetPassword(Engine: TPanelEngine): boolean; + public + LeftPanelEngine, RightPanelEngine : TPanelEngine; + ColumnSortIDs: array[1..ConstNumPanelColumns] of integer; + LastClick: TDateTime; + procedure EditViewFileInternal(ParentWindow: TGTKControl; Filename: string; Engine: TPanelEngine; View, NewFile: boolean); + end; + +var + FMain: TFMain; + +implementation + +uses Libc, + UCore, USelect, UNewDir, UDirDelete, UProgress, UCopyMove, + UCoreUtils, ULocale, UChecksum, UChecksumDruid, USplitFile, + UFileTypeSettings, UFileAssoc, UChmod, UChown, USymlink, + UPreferences, UViewer, UToolTips, UMounterPrefs, UColumns, + UTestPlugin, UConnectionManager, USearch, UProperties, + URemoteWait, URunFromVFS, USetPassword, uVFSprototypes; + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function form_event_handler(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; forward; + +procedure TFMain.FormCreate(Sender: TObject); +begin + ReportGTKVersion; + StartUp := True; + RunningEscSensitive := 0; + Editing := False; + QuickFind := False; + LeftTabPopup := True; + LastClick := 0; + LastUsedFilter := '*.*'; + RedrawLeftInactive := False; + RedrawRightInactive := False; + MounterTableList := TList.Create; + MounterTableListLeft := TList.Create; + MounterTableListRight := TList.Create; + LeftNotebookBoxList := TList.Create; + RightNotebookBoxList := TList.Create; + LeftPathsHighlight := TStringList.Create; + RightPathsHighlight := TStringList.Create; + LeftTabEngines := TList.Create; + RightTabEngines := TList.Create; + Caption := ConstAppTitle; + WindowPosition := wpCenter; + MainVBox := TGTKVBox.Create(Self); + AddControl(MainVBox); + MainMenuHandleBox := TGTKHandleBox.Create(Self); + MainVBox.AddControlEx(MainMenuHandleBox, False, True, 0); + MainMenu := TGTKMenuBar.Create(Self); + MainMenuHandleBox.AddControl(MainMenu); + ConstructMenu; + InplaceEditTimer := TGTKTimer.Create(Self); + InplaceEditTimer.Enabled := False; + InplaceEditTimer.OnTimer := InplaceEditTimerTimer; + InactiveItemsTimer := TGTKTimer.Create(Self); + InactiveItemsTimer.Enabled := False; + InactiveItemsTimer.Interval := ConfInactiveTimerDelay; + if not Application.GTKVersion_2_6_0_Up then InactiveItemsTimer.OnTimer := InactiveItemsTimerTimer; + RebuildListViewsTimer := TGTKTimer.Create(Self); + RebuildListViewsTimer.Enabled := False; + RebuildListViewsTimer.OnTimer := RebuildListViewsTimerTimer; + MounterBarHandleBox := TGTKHandleBox.Create(Self); + MounterBarHandleBox.SetSizeRequest(10, -1); + MainVBox.AddControlEx(MounterBarHandleBox, False, True, 0); + MounterBarTable := TGTKTable.Create(Self); + MounterBarHandleBox.AddControl(MounterBarTable); + LeftPanelBox := TGTKVBox.Create(Self); + RightPanelBox := TGTKVBox.Create(Self); + PanelSeparator := TGTKHPaned.Create(Self); + MainVBox.AddControlEx(PanelSeparator, True, True, 0); + PanelSeparator.Child1 := LeftPanelBox; + PanelSeparator.Child2 := RightPanelBox; + ConstructPanels; + CommandLineHBox := TGTKHBox.Create(Self); + CommandLineHBox.Homogeneous := False; + CommandLineCombo := TGTKCombo.Create(Self); + CommandLineCombo.DisableActivate; + CommandLineCombo.MatchValue := False; + CommandLineCombo.CaseSensitive := True; +// CommandLineCombo.Entry.OnKeyDown := CommandLineComboKeyDown; + CommandLineLabel := TGTKLabel.Create(Self); + CommandLineLabel.Alignment := taRightJustify; + CommandLineLabel.SetAlignment(1, 0.5); + CommandLineLabel.SetSizeRequest(300, -1); + OpenTerminalButton := TGTKButton.Create(Self); + OpenTerminalButton.Caption := LANGOpenTerminalButton_Caption; + OpenTerminalButton.BorderStyle := bsNone; + OpenTerminalButton.CanFocus := False; + OpenTerminalButton.Tooltip := LANGOpenTerminalButton_Tooltip; + OpenTerminalButton.OnClick := OpenTerminalButtonClick; + CommandLineHBox.AddControlEx(CommandLineLabel, False, False, 0); + CommandLineHBox.AddControlEx(CommandLineCombo, True, True, 5); + CommandLineHBox.AddControlEx(TGTKVSeparator.Create(Self), False, False, 2); + CommandLineHBox.AddControlEx(OpenTerminalButton, False, False, 2); + MainVBox.AddControlEx(TGTKHSeparator.Create(Self), False, False, 2); + MainVBox.AddControlEx(CommandLineHBox, False, False, 0); + ButtonsBox := TGTKTable.Create(Self); + F2Button := TGTKButton.Create(Self); + F3Button := TGTKButton.Create(Self); + F4Button := TGTKButton.Create(Self); + F5Button := TGTKButton.Create(Self); + F6Button := TGTKButton.Create(Self); + F7Button := TGTKButton.Create(Self); + F8Button := TGTKButton.Create(Self); + ButtonsBox.AddControlEx(0, 0, 1, 1, F2Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonsBox.AddControlEx(1, 0, 1, 1, TGTKVSeparator.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 4); + ButtonsBox.AddControlEx(2, 0, 1, 1, F3Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonsBox.AddControlEx(3, 0, 1, 1, TGTKVSeparator.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 4); + ButtonsBox.AddControlEx(4, 0, 1, 1, F4Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonsBox.AddControlEx(5, 0, 1, 1, TGTKVSeparator.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 4); + ButtonsBox.AddControlEx(6, 0, 1, 1, F5Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonsBox.AddControlEx(7, 0, 1, 1, TGTKVSeparator.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 4); + ButtonsBox.AddControlEx(8, 0, 1, 1, F6Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonsBox.AddControlEx(9, 0, 1, 1, TGTKVSeparator.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 4); + ButtonsBox.AddControlEx(10, 0, 1, 1, F7Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonsBox.AddControlEx(11, 0, 1, 1, TGTKVSeparator.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 4); + ButtonsBox.AddControlEx(12, 0, 1, 1, F8Button, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + ButtonBoxSeparator := TGTKHSeparator.Create(Self); + ButtonBoxSpace := TGTKEventBox.Create(Self); + MainVBox.AddControlEx(ButtonBoxSpace, False, False, 2); + MainVBox.AddControlEx(ButtonBoxSeparator, False, False, 2); + MainVBox.AddControlEx(ButtonsBox, False, False, 0); + F2Button.BorderStyle := bsNone; + F3Button.BorderStyle := bsNone; + F4Button.BorderStyle := bsNone; + F5Button.BorderStyle := bsNone; + F6Button.BorderStyle := bsNone; + F7Button.BorderStyle := bsNone; + F8Button.BorderStyle := bsNone; + F2Button.Caption := LANGF2Button_Caption; + F3Button.Caption := LANGF3Button_Caption; + F4Button.Caption := LANGF4Button_Caption; + F5Button.Caption := LANGF5Button_Caption; + F6Button.Caption := LANGF6Button_Caption; + F7Button.Caption := LANGF7Button_Caption; + F8Button.Caption := LANGF8Button_Caption; + F2Button.OnClick := F6ButtonClick; + F3Button.OnClick := F3F4ButtonClick; + F4Button.OnClick := F3F4ButtonClick; + F5Button.OnClick := F5ButtonClick; + F6Button.OnClick := F6ButtonClick; + F7Button.OnClick := F7ButtonClick; + F8Button.OnClick := F8ButtonClick; + F2Button.CanFocus := False; + F3Button.CanFocus := False; + F4Button.CanFocus := False; + F5Button.CanFocus := False; + F6Button.CanFocus := False; + F7Button.CanFocus := False; + F8Button.CanFocus := False; + PanelSeparator.PopupMenu := SplitterPopupMenu; + LeftListView.PopupMenu := FilePopupMenu; + RightListView.PopupMenu := FilePopupMenu; + + // Events + OnResize := FormResize; + OnDestroy := FormDestroy; + OnKeyDown := FormKeyDown; + OnClose := FormClose; + g_signal_connect_after(FWidget, 'event-after', G_CALLBACK(@form_event_handler), nil); + PanelSeparator.OnResize := PanelSeparatorResize; + LeftListView.OnKeyDown := ListViewKeyDown; + RightListView.OnKeyDown := ListViewKeyDown; + LeftListView.OnEnter := ListViewEnter; + RightListView.OnEnter := ListViewEnter; + LeftPathLabelEventBox.OnMouseDown := PathLabelMouseDown; + RightPathLabelEventBox.OnMouseDown := PathLabelMouseDown; + LeftUpButton.OnClick := PathButtonClick; + LeftRootButton.OnClick := PathButtonClick; + LeftHomeButton.OnClick := PathButtonClick; + RightUpButton.OnClick := PathButtonClick; + RightRootButton.OnClick := PathButtonClick; + RightHomeButton.OnClick := PathButtonClick; + LeftEqualButton.OnClick := miTargetSourceClick; + RightEqualButton.OnClick := miTargetSourceClick; + LeftDisconnectButton.OnClick := DisconnectButtonClick; + RightDisconnectButton.OnClick := DisconnectButtonClick; + LeftLeaveArchiveButton.OnClick := LeaveArchiveButtonClick; + RightLeaveArchiveButton.OnClick := LeaveArchiveButtonClick; + LeftListView.CompareFunc := CompareFunc; + RightListView.CompareFunc := CompareFunc; + LeftListView.CellDataFunc := ListViewCellDataFunc; + RightListView.CellDataFunc := ListViewCellDataFunc; + LeftListView.OnMouseDown := ListViewMouseDown; + RightListView.OnMouseDown := ListViewMouseDown; + LeftListView.OnMouseUp := ListViewMouseUp; + RightListView.OnMouseUp := ListViewMouseUp; +{ LeftListView.OnDblClick := ListViewDblClick; + RightListView.OnDblClick := ListViewDblClick;} + LeftListView.OnSelectionChanged := ListViewSelectionChanged; + RightListView.OnSelectionChanged := ListViewSelectionChanged; + LeftQuickFindEntry.OnEnter := QuickFindEntryEnter; + RightQuickFindEntry.OnEnter := QuickFindEntryEnter; + LeftPanelNotebook.OnTabSwitched := TabNotebookSwitchPage; + RightPanelNotebook.OnTabSwitched := TabNotebookSwitchPage; + LeftPanelNotebook.PopupMenu := TabPopupMenu; + RightPanelNotebook.PopupMenu := TabPopupMenu; + AfterStart; +end; + +procedure TFMain.ConstructPanels; +begin + LeftMounterTable := TGTKTable.Create(Self); + LeftMounterTable.SetSizeRequest(10, -1); + RightMounterTable := TGTKTable.Create(Self); + RightMounterTable.SetSizeRequest(10, -1); + LeftMounterTable.BorderWidth := 2; + RightMounterTable.BorderWidth := 2; + LeftPanelBox.AddControlEx(LeftMounterTable, False, False, 0); + RightPanelBox.AddControlEx(RightMounterTable, False, False, 0); + LeftStatusBox := TGTKHBox.Create(Self); + RightStatusBox := TGTKHBox.Create(Self); + LeftStatusBox.Homogeneous := False; + RightStatusBox.Homogeneous := False; + LeftPathLabel := TGTKLabel.Create(Self); + RightPathLabel := TGTKLabel.Create(Self); + LeftPathLabel.SetSizeRequest(10, -1); + RightPathLabel.SetSizeRequest(10, -1); + LeftPathLabelEventBox := TGTKEventBox.Create(Self); + RightPathLabelEventBox := TGTKEventBox.Create(Self); + LeftPathLabelHBox := TGTKHBox.Create(Self); + RightPathLabelHBox := TGTKHBox.Create(Self); + LeftPathLabelHBox.Homogeneous := False; + RightPathLabelHBox.Homogeneous := False; + LeftBookmarkButton := TGTKButton.Create(Self); LeftBookmarkButton.Caption := '❇'; + RightBookmarkButton := TGTKButton.Create(Self); RightBookmarkButton.Caption := '❇'; + LeftPasswordButton := TGTKImageButton.Create(Self); LeftPasswordButton.Icon := StockLock16; + RightPasswordButton := TGTKImageButton.Create(Self); RightPasswordButton.Icon := StockLock16; + LeftPasswordButton.BorderStyle := bsNone; + RightPasswordButton.BorderStyle := bsNone; + LeftBookmarkButton.SetSizeRequest(22, 22); LeftBookmarkButton.Tooltip := LANGBookmarkButton_Tooltip; + RightBookmarkButton.SetSizeRequest(22, 22); RightBookmarkButton.Tooltip := LANGBookmarkButton_Tooltip; + LeftPasswordButton.SetSizeRequest(28, 22); LeftPasswordButton.Tooltip := LANGPasswordButton_Tooltip; + RightPasswordButton.SetSizeRequest(28, 22); RightPasswordButton.Tooltip := LANGPasswordButton_Tooltip; + LeftPasswordButton.Visible := False; + RightPasswordButton.Visible := False; + LeftBookmarkButton.CanFocus := False; + RightBookmarkButton.CanFocus := False; + LeftPasswordButton.CanFocus := False; + RightPasswordButton.CanFocus := False; + LeftBookmarkButton.OnClick := BookmarkButtonClick; + RightBookmarkButton.OnClick := BookmarkButtonClick; + LeftPasswordButton.OnClick := PasswordButtonClick; + RightPasswordButton.OnClick := PasswordButtonClick; + LeftScrolledWindow := TGTKScrolledWindow.Create(Self); + RightScrolledWindow := TGTKScrolledWindow.Create(Self); + LeftListView := TGTKListView.CreateTyped(Self, True, [lcPointer]); + RightListView := TGTKListView.CreateTyped(Self, True, [lcPointer]); + if not Application.GTKVersion_2_0_5_Up then begin + LeftListView.FromSortedCoversionFunc := OldGTKConvertFromSorted; + LeftListView.ToSortedCoversionFunc := OldGTKConvertToSorted; + RightListView.FromSortedCoversionFunc := OldGTKConvertFromSorted; + RightListView.ToSortedCoversionFunc := OldGTKConvertToSorted; + end; + LeftStatusLine := TGTKLabel.Create(Self); + RightStatusLine := TGTKLabel.Create(Self); + LeftQuickFindVBox := TGTKVBox.Create(Self); + LeftQuickFindHBox := TGTKHBox.Create(Self); + LeftQuickFindLabel := TGTKLabel.Create(Self); + LeftQuickFindEntry := TGTKEntry.Create(Self); + LeftQuickFindEntry.CanFocus := False; + LeftQuickFindSeparator := TGTKHSeparator.Create(Self); + LeftQuickFindHBox.AddControlEx(LeftQuickFindLabel, False, False, 0); + LeftQuickFindHBox.AddControlEx(LeftQuickFindEntry, True, True, 5); + LeftQuickFindHBox.Homogeneous := False; + LeftQuickFindVBox.AddControlEx(LeftQuickFindHBox, False, False, 5); + LeftQuickFindVBox.AddControlEx(LeftQuickFindSeparator, False, False, 0); + LeftQuickFindLabel.Caption := LANGQuickFind; + LeftQuickFindVBox.Hide; + RightQuickFindVBox := TGTKVBox.Create(Self); + RightQuickFindHBox := TGTKHBox.Create(Self); + RightQuickFindLabel := TGTKLabel.Create(Self); + RightQuickFindEntry := TGTKEntry.Create(Self); + RightQuickFindEntry.CanFocus := False; + RightQuickFindSeparator := TGTKHSeparator.Create(Self); + RightQuickFindHBox.AddControlEx(RightQuickFindLabel, False, False, 0); + RightQuickFindHBox.AddControlEx(RightQuickFindEntry, True, True, 5); + RightQuickFindHBox.Homogeneous := False; + RightQuickFindVBox.AddControlEx(RightQuickFindHBox, False, False, 5); + RightQuickFindVBox.AddControlEx(RightQuickFindSeparator, False, False, 0); + RightQuickFindLabel.Caption := LANGQuickFind; + RightQuickFindVBox.Hide; + LeftDisconnectButton := TGTKButton.Create(Self); + LeftDisconnectButton.Caption := '✖'; + LeftDisconnectButton.CanFocus := False; + LeftDisconnectButton.SetSizeRequest(22, 22); + LeftDisconnectButton.Tooltip := LANGDisconnectButton_Tooltip; + LeftDisconnectButton.Visible := False; + RightDisconnectButton := TGTKButton.Create(Self); + RightDisconnectButton.Caption := '✖'; + RightDisconnectButton.CanFocus := False; + RightDisconnectButton.SetSizeRequest(22, 22); + RightDisconnectButton.Tooltip := LANGDisconnectButton_Tooltip; + RightDisconnectButton.Visible := False; + LeftLeaveArchiveButton := TGTKButton.Create(Self); + LeftLeaveArchiveButton.Caption := '⇚'; + LeftLeaveArchiveButton.CanFocus := False; + LeftLeaveArchiveButton.SetSizeRequest(22, 22); + LeftLeaveArchiveButton.Tooltip := LANGLeaveArchiveButton_Tooltip; + LeftLeaveArchiveButton.Visible := False; + RightLeaveArchiveButton := TGTKButton.Create(Self); + RightLeaveArchiveButton.Caption := '⇚'; + RightLeaveArchiveButton.CanFocus := False; + RightLeaveArchiveButton.SetSizeRequest(22, 22); + RightLeaveArchiveButton.Tooltip := LANGLeaveArchiveButton_Tooltip; + RightLeaveArchiveButton.Visible := False; + LeftPathLabelHBox.AddControlEx(LeftPathLabelEventBox, True, True, 0); + LeftPathLabelHBox.AddControlEx(LeftPasswordButton, False, False, 0); + LeftPathLabelHBox.AddControlEx(LeftDisconnectButton, False, True, 0); + LeftPathLabelHBox.AddControlEx(LeftLeaveArchiveButton, False, True, 0); + LeftPathLabelHBox.AddControlEx(LeftBookmarkButton, False, False, 0); + RightPathLabelHBox.AddControlEx(RightPathLabelEventBox, True, True, 0); + RightPathLabelHBox.AddControlEx(RightPasswordButton, False, False, 0); + RightPathLabelHBox.AddControlEx(RightDisconnectButton, False, True, 0); + RightPathLabelHBox.AddControlEx(RightLeaveArchiveButton, False, True, 0); + RightPathLabelHBox.AddControlEx(RightBookmarkButton, False, False, 0); + LeftPathLabelEventBox.AddControl(LeftPathLabel); + RightPathLabelEventBox.AddControl(RightPathLabel); + LeftPanelNotebook := TEphyNotebook.Create(Self); + LeftPanelNotebook.Visible := False; + LeftPanelNotebook.SetSizeRequest(10, -1); + LeftPanelNotebook.Scrollable := True; + LeftPanelNotebook.ShowBorder := False; + LeftPanelNotebook.CanFocus := False; // Notebook should be focusable to allow scrolling when many tabs -- temporarily disabled + LeftPanelNotebook.ShowCloseButtons := True; + LeftPanelNotebook.AllowDragDrop := True; + LeftPanelNotebook.AllowDragOutside := True; + LeftPanelNotebook.ShowTooltips := True; + LeftPanelNotebook.OnNotebookReordered := NotebookReordered; + LeftPanelNotebook.OnTabClose := NotebookTabClosed; + LeftPanelNotebook.OnTabDoubleClick := NotebookTabDoubleClick; + LeftPanelNotebook.OnFindNotebookAtPointer := NotebookFindNotebookAtPointerEvent; + LeftPanelNotebook.OnMoveTabToAnotherNotebook := NotebookMoveTabToAnotherNotebook; + LeftPanelNotebook.OnTabFocusOnlyEvent := NotebookTabFocusOnlyEvent; + RightPanelNotebook := TEphyNotebook.Create(Self); + RightPanelNotebook.Visible := False; + RightPanelNotebook.SetSizeRequest(10, -1); + RightPanelNotebook.Scrollable := True; + RightPanelNotebook.ShowBorder := False; + RightPanelNotebook.CanFocus := False; + RightPanelNotebook.ShowCloseButtons := True; + RightPanelNotebook.AllowDragDrop := True; + RightPanelNotebook.AllowDragOutside := True; + RightPanelNotebook.ShowTooltips := True; + RightPanelNotebook.OnNotebookReordered := NotebookReordered; + RightPanelNotebook.OnTabClose := NotebookTabClosed; + RightPanelNotebook.OnTabDoubleClick := NotebookTabDoubleClick; + RightPanelNotebook.OnFindNotebookAtPointer := NotebookFindNotebookAtPointerEvent; + RightPanelNotebook.OnMoveTabToAnotherNotebook := NotebookMoveTabToAnotherNotebook; + RightPanelNotebook.OnTabFocusOnlyEvent := NotebookTabFocusOnlyEvent; + LeftListBox := TGTKVBox.Create(Self); + LeftListBox.AddControlEx(LeftScrolledWindow, True, True, 0); + RightListBox := TGTKVBox.Create(Self); + RightListBox.AddControlEx(RightScrolledWindow, True, True, 0); + LeftPanelBox.AddControlEx(LeftStatusBox, False, True, 0); + RightPanelBox.AddControlEx(RightStatusBox, False, True, 0); + LeftPanelBox.AddControlEx(LeftPathLabelHBox, False, False, 1); + RightPanelBox.AddControlEx(RightPathLabelHBox, False, False, 1); + LeftPanelBox.AddControlEx(LeftPanelNotebook, True, True, 0); + RightPanelBox.AddControlEx(RightPanelNotebook, True, True, 0); + LeftPanelBox.AddControlEx(LeftListBox, True, True, 0); + RightPanelBox.AddControlEx(RightListBox, True, True, 0); + LeftPanelBox.AddControlEx(LeftQuickFindVBox, False, True, 0); + RightPanelBox.AddControlEx(RightQuickFindVBox, False, True, 0); + LeftPanelBox.AddControlEx(LeftStatusLine, False, True, 0); + RightPanelBox.AddControlEx(RightStatusLine, False, True, 0); + LeftScrolledWindow.AddControl(LeftListView); + RightScrolledWindow.AddControl(RightListView); + LeftScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + RightScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + LeftScrolledWindow.VertScrollBarPolicy := sbAutomatic; + RightScrolledWindow.VertScrollBarPolicy := sbAutomatic; + LeftScrolledWindow.ShadowType := stShadowIn; + RightScrolledWindow.ShadowType := stShadowIn; + LeftUpButton := TGTKButton.Create(Self); LeftUpButton.Caption := '..'; + LeftRootButton := TGTKButton.Create(Self); LeftRootButton.Caption := '/'; + LeftHomeButton := TGTKButton.Create(Self); LeftHomeButton.Caption := '~'; + LeftEqualButton := TGTKButton.Create(Self); LeftEqualButton.Caption := '='; + LeftUpButton.SetSizeRequest(22, 22); LeftUpButton.Tooltip := LANGUpButton_Tooltip; + LeftRootButton.SetSizeRequest(22, 22); LeftRootButton.Tooltip := LANGRootButton_Tooltip; + LeftHomeButton.SetSizeRequest(22, 22); LeftHomeButton.Tooltip := LANGHomeButton_Tooltip; + LeftEqualButton.SetSizeRequest(22, 22); LeftEqualButton.Tooltip := LANGLeftEqualButton_Tooltip; + LeftDiskInfoLabel := TGTKLabel.Create(Self); + LeftStatusBox.AddControlEx(LeftDiskInfoLabel, True, True, 0); + LeftStatusBox.AddControlEndEx(LeftUpButton, False, False, 0); + LeftStatusBox.AddControlEndEx(LeftRootButton, False, False, 0); + LeftStatusBox.AddControlEndEx(LeftHomeButton, False, False, 0); + LeftStatusBox.AddControlEndEx(LeftEqualButton, False, False, 0); + RightUpButton := TGTKButton.Create(Self); RightUpButton.Caption := '..'; + RightRootButton := TGTKButton.Create(Self); RightRootButton.Caption := '/'; + RightHomeButton := TGTKButton.Create(Self); RightHomeButton.Caption := '~'; + RightEqualButton := TGTKButton.Create(Self); RightEqualButton.Caption := '='; + RightUpButton.SetSizeRequest(22, 22); RightUpButton.Tooltip := LANGUpButton_Tooltip; + RightRootButton.SetSizeRequest(22, 22); RightRootButton.Tooltip := LANGRootButton_Tooltip; + RightHomeButton.SetSizeRequest(22, 22); RightHomeButton.Tooltip := LANGHomeButton_Tooltip; + RightEqualButton.SetSizeRequest(22, 22); RightEqualButton.Tooltip := LANGRightEqualButton_Tooltip; + LeftUpButton.CanFocus := False; + LeftRootButton.CanFocus := False; + LeftHomeButton.CanFocus := False; + LeftEqualButton.CanFocus := False; + RightUpButton.CanFocus := False; + RightRootButton.CanFocus := False; + RightHomeButton.CanFocus := False; + RightEqualButton.CanFocus := False; + RightDiskInfoLabel := TGTKLabel.Create(Self); + RightStatusBox.AddControlEx(RightDiskInfoLabel, True, True, 0); + RightStatusBox.AddControlEndEx(RightUpButton, False, False, 0); + RightStatusBox.AddControlEndEx(RightRootButton, False, False, 0); + RightStatusBox.AddControlEndEx(RightHomeButton, False, False, 0); + RightStatusBox.AddControlEndEx(RightEqualButton, False, False, 0); + ConstructColumns(LeftListView); + ConstructColumns(RightListView); + LeftPathLabel.XAlign := 0; + LeftPathLabel.XPadding := 5; + LeftPathLabel.YPadding := 1; + RightPathLabel.XAlign := 0; + RightPathLabel.XPadding := 5; + RightPathLabel.YPadding := 1; + LeftDiskInfoLabel.XAlign := 0; + LeftDiskInfoLabel.XPadding := 5; + LeftDiskInfoLabel.YAlign := 0.5; + RightDiskInfoLabel.XAlign := 0; + RightDiskInfoLabel.XPadding := 5; + RightDiskInfoLabel.YAlign := 0.5; + LeftStatusLine.XAlign := 0; + LeftStatusLine.XPadding := 5; + LeftStatusLine.YAlign := 0.5; + RightStatusLine.XAlign := 0; + RightStatusLine.XPadding := 5; + RightStatusLine.YAlign := 0.5; +{ LeftStatusBox.SetSizeRequest(1, 18); + RightStatusBox.SetSizeRequest(1, 18); } + LeftStatusLine.SetSizeRequest(1, 18); + RightStatusLine.SetSizeRequest(1, 18); + LeftDiskInfoLabel.SetSizeRequest(1, -1); + RightDiskInfoLabel.SetSizeRequest(1, -1); + LeftQuickFindVBox.SetSizeRequest(1, -1); + RightQuickFindVBox.SetSizeRequest(1, -1); +end; + +procedure TFMain.ConstructMenu; +const ShowDotFilesShortcut: TGDKShortCut = ( Key: 46; Locked: False; ModAlt: False; ModShift: False; ModCtrl: True); +var i: integer; + Item: TGTKMenuItem; + Group: TGTKMenuItemGroup; +begin + mnuFile := TGTKMenuItem.Create(Self); + mnuFile.Caption := LANGmnuFile_Caption; + MainMenu.Items.Add(mnuFile); +// mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miChangePermissions := TGTKMenuItem.CreateTyped(Self, itImageText); + miChangePermissions.Caption := LANGmiChangePermissions_Caption; + miChangePermissions.StockIcon := 'gtk-convert'; + miChangePermissions.OnClick := miChangePermissionsClick; + mnuFile.Add(miChangePermissions); + miChangeOwner := TGTKMenuItem.Create(Self); + miChangeOwner.Caption := LANGmiChangeOwner_Caption; + miChangeOwner.OnClick := miChangeOwnerClick; + mnuFile.Add(miChangeOwner); + mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miCreateSymlink := TGTKMenuItem.CreateTyped(Self, itImageText); + miCreateSymlink.Caption := LANGmiCreateSymlink_Caption; + miCreateSymlink.StockIcon := 'gtk-jump-to'; + miCreateSymlink.OnClick := miCreateSymlinkClick; + mnuFile.Add(miCreateSymlink); + miEditSymlink := TGTKMenuItem.Create(Self); + miEditSymlink.Caption := LANGmiEditSymlink_Caption; + miEditSymlink.OnClick := miEditSymlinkClick; + mnuFile.Add(miEditSymlink); + mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miSplitFile := TGTKMenuItem.Create(Self); + miSplitFile.Caption := LANGmiSplitFileCaption; + miSplitFile.OnClick := miSplitFileClick; + mnuFile.Add(miSplitFile); + miMergeFiles := TGTKMenuItem.Create(Self); + miMergeFiles.Caption := LANGmiMergeFilesCaption; + miMergeFiles.OnClick := miMergeFilesClick; + mnuFile.Add(miMergeFiles); + mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miVerifyChecksums := TGTKMenuItem.Create(Self); + miVerifyChecksums.Caption := LANGmiVerifyChecksums; + miVerifyChecksums.OnClick := miVerifyChecksumsClick; + mnuFile.Add(miVerifyChecksums); + miCreateChecksums := TGTKMenuItem.Create(Self); + miCreateChecksums.Caption := LANGmiCreateChecksumsCaption; + miCreateChecksums.OnClick := miCreateChecksumsClick; + mnuFile.Add(miCreateChecksums); + mnuFile.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miExit := TGTKMenuItem.CreateTyped(Self, itImageText); + miExit.Caption := LANGmiExit_Caption; + miExit.StockIcon := 'gtk-quit'; + miExit.OnClick := miExitClick; + mnuFile.Add(miExit); + + mnuMark := TGTKMenuItem.Create(Self); + mnuMark.Caption := LANGmnuMark_Caption; + MainMenu.Items.Add(mnuMark); +// mnuMark.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miSelectGroup := TGTKMenuItem.CreateTyped(Self, itImageText); + miSelectGroup.Caption := LANGmiSelectGroup_Caption; + miSelectGroup.ShortCuts.Add(MakeGDKShortCut(GDK_KP_PLUS, False, False, False, False)); + miSelectGroup.StockIcon := 'gtk-add'; + miSelectGroup.OnClick := mnuMarkClick; + mnuMark.Add(miSelectGroup); + miUnselectGroup := TGTKMenuItem.CreateTyped(Self, itImageText); + miUnselectGroup.Caption := LANGmiUnselectGroup_Caption; + miUnselectGroup.ShortCuts.Add(MakeGDKShortCut(GDK_KP_MINUS, False, False, False, False)); + miUnselectGroup.StockIcon := 'gtk-remove'; + miUnselectGroup.OnClick := mnuMarkClick; + mnuMark.Add(miUnselectGroup); + miSelectAll := TGTKMenuItem.Create(Self); + miSelectAll.Caption := LANGmiSelectAll_Caption; + miSelectAll.ShortCuts.Add(MakeGDKShortCut(GDK_KP_PLUS, False, False, False, True)); + miSelectAll.OnClick := mnuMarkClick; + mnuMark.Add(miSelectAll); + miUnselectAll := TGTKMenuItem.Create(Self); + miUnselectAll.Caption := LANGmiUnselectAll_Caption; + miUnselectAll.ShortCuts.Add(MakeGDKShortCut(GDK_KP_MINUS, False, False, False, True)); + miUnselectAll.OnClick := mnuMarkClick; + mnuMark.Add(miUnselectAll); + miInvertSelection := TGTKMenuItem.Create(Self); + miInvertSelection.Caption := LANGmiInvertSelection_Caption; + miInvertSelection.ShortCuts.Add(MakeGDKShortCut(GDK_KP_ASTERISK, False, False, False, False)); + miInvertSelection.OnClick := mnuMarkClick; + mnuMark.Add(miInvertSelection); + + mnuCommands := TGTKMenuItem.Create(Self); + mnuCommands.Caption := LANGmnuCommands_Caption; + MainMenu.Items.Add(mnuCommands); +// mnuCommands.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miSearch := TGTKMenuItem.CreateTyped(Self, itImageText); + miSearch.StockIcon := 'gtk-find'; + miSearch.Caption := LANGmiSearchCaption2; + miSearch.ShortCuts.AddName('F7'); + miSearch.OnClick := miSearchClick; + mnuCommands.Add(miSearch); + mnuCommands.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miRefresh := TGTKMenuItem.CreateTyped(Self, itImageText); + miRefresh.Caption := LANGmiRefresh_Caption; + miRefresh.StockIcon := 'gtk-refresh'; + miRefresh.ShortCuts.AddName('R'); + miRefresh.OnClick := miRefreshClick; + mnuCommands.Add(miRefresh); + miShowDirectorySizes := TGTKMenuItem.CreateTyped(Self, itImageText); + miShowDirectorySizes.Caption := LANGmiShowDirectorySizes_Caption; + miShowDirectorySizes.OnClick := miShowDirectorySizesClick; + mnuCommands.Add(miShowDirectorySizes); + mnuCommands.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miNewTab := TGTKMenuItem.CreateTyped(Self, itImageText); + miNewTab.Caption := LANGmiNewTab_Caption; + miNewTab.ShortCuts.AddName('T'); + miNewTab.OnClick := miDuplicateTabClick; + miNewTab.StockIcon := 'gtk-index'; + mnuCommands.Add(miNewTab); + mnuCommands.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miTargetSource := TGTKMenuItem.CreateTyped(Self, itImageText); + miTargetSource.Caption := LANGmiTargetSource_Caption; +// miTargetSource.ShortCuts.AddName('O'); + miTargetSource.OnClick := miTargetSourceClick; + mnuCommands.Add(miTargetSource); + + mnuShow := TGTKMenuItem.Create(Self); + mnuShow.Caption := LANGmnuShow_Caption; + MainMenu.Items.Add(mnuShow); +// mnuShow.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miShowDotFiles := TGTKMenuItem.CreateTyped(Self, itCheck); + miShowDotFiles.Caption := LANGmiShowDotFiles_Caption; + miShowDotFiles.Checked := ConfShowDotFiles; + miShowDotFiles.OnClick := miShowDotFilesClick; + miShowDotFiles.ShortCuts.Add(ShowDotFilesShortcut); + mnuShow.Add(miShowDotFiles); + mnuShow.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miNoMounterBar := TGTKMenuItem.CreateTyped(Self, itRadio, nil); + miNoMounterBar.Caption := LANGmiNoMounterBarCaption; + miNoMounterBar.Checked := ConfShowMounterBar = 0; + Group := miNoMounterBar.Group; + mnuShow.Add(miNoMounterBar); + miShowOneMounterBar := TGTKMenuItem.CreateTyped(Self, itRadio, Group); + miShowOneMounterBar.Caption := LANGmiShowOneMounterBarCaption; + miShowOneMounterBar.Checked := ConfShowMounterBar = 1; + Group := miShowOneMounterBar.Group; + mnuShow.Add(miShowOneMounterBar); + miShowTwoMounterBar := TGTKMenuItem.CreateTyped(Self, itRadio, Group); + miShowTwoMounterBar.Caption := LANGmiShowTwoMounterBarCaption; + miShowTwoMounterBar.Checked := ConfShowMounterBar = 2; + mnuShow.Add(miShowTwoMounterBar); + // Assign of the events has to be done after all radio items are created + miNoMounterBar.OnClick := miShowMounterBarClick; + miShowOneMounterBar.OnClick := miShowMounterBarClick; + miShowTwoMounterBar.OnClick := miShowMounterBarClick; + + mnuBookmarks := TGTKMenuItem.Create(Self); + mnuBookmarks.Caption := LANGmnuBookmarks_Caption; + mnuBookmarks.OnPopup := mnuBookmarksPopup; + mnuBookmarks.OnClick := mnuBookmarksPopup; + MainMenu.Items.Add(mnuBookmarks); +// mnuBookmarks.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miAddBookmark := TGTKMenuItem.CreateTyped(Self, itImageText); + miAddBookmark.Caption := LANGmiAddBookmark_Caption; + miAddBookmark.StockIcon := 'gtk-add'; + miAddBookmark.OnClick := miAddBookmarkClick; + mnuBookmarks.Add(miAddBookmark); + miEditBookmarks := TGTKMenuItem.CreateTyped(Self, itImageText); + miEditBookmarks.Caption := LANGmiEditBookmarks_Caption; + miEditBookmarks.Enabled := False; + miEditBookmarks.Visible := False; + miEditBookmarks.Tooltip := 'Currently not implemented - use the popup menu'; + mnuBookmarks.Add(miEditBookmarks); + miBookmarksSeparator := TGTKMenuItem.CreateTyped(Self, itSeparator); + mnuBookmarks.Add(miBookmarksSeparator); + + BookmarkPopup := TGTKMenuItem.Create(Self); + BookmarkPopupDelete := TGTKMenuItem.Create(Self); + BookmarkPopupDelete.Caption := LANGBookmarkPopupDelete_Caption; + BookmarkPopupDelete.OnClick := BookmarkPopupDeleteClick; + BookmarkPopup.Add(BookmarkPopupDelete); + + mnuNetwork := TGTKMenuItem.Create(Self); + mnuNetwork.Caption := LANGmnuNetworkCaption; + MainMenu.Items.Add(mnuNetwork); +// mnuNetwork.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miConnections := TGTKMenuItem.CreateTyped(Self, itImageText); + miConnections.Caption := LANGmiConnectionsCaption; + miConnections.StockIcon := 'gtk-network'; + miConnections.Enabled := False; + mnuNetwork.Add(miConnections); + mnuNetwork.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miOpenConnection := TGTKMenuItem.CreateTyped(Self, itImageText); + miOpenConnection.Caption := LANGmiOpenConnectionCaption; + miOpenConnection.OnClick := miOpenConnectionClick; + miOpenConnection.StockIcon := 'gtk-connect'; + miOpenConnection.ShortCuts.AddName('F'); + mnuNetwork.Add(miOpenConnection); + miQuickConnect := TGTKMenuItem.CreateTyped(Self, itImageText); + miQuickConnect.Caption := LANGmiQuickConnectCaption; + miQuickConnect.Enabled := False; + miQuickConnect.ShortCuts.AddName('N'); + mnuNetwork.Add(miQuickConnect); + mnuNetwork.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miDisconnect := TGTKMenuItem.CreateTyped(Self, itImageText); + miDisconnect.Caption := LANGmiDisconnect_Caption; + miDisconnect.Enabled := False; + miDisconnect.ShortCuts.AddName('D'); + miDisconnect.StockIcon := 'gtk-disconnect'; + miDisconnect.OnClick := miDisconnectClick; + mnuNetwork.Add(miDisconnect); + + mnuPlugins := TGTKMenuItem.Create(Self); + mnuPlugins.Caption := LANGmnuPluginsCaption; + MainMenu.Items.Add(mnuPlugins); +// mnuPlugins.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miTestPlugin := TGTKMenuItem.CreateTyped(Self, itImageText); + miTestPlugin.Caption := LANGmiTestPluginCaption; + miTestPlugin.OnClick := miTestPluginClick; + mnuPlugins.Add(miTestPlugin); + mnuPlugins.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + + mnuSettings := TGTKMenuItem.Create(Self); + mnuSettings.Caption := LANGmnuSettings_Caption; + MainMenu.Items.Add(mnuSettings); +// mnuSettings.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miPreferences := TGTKMenuItem.CreateTyped(Self, itImageText); + miPreferences.Caption := LANGmiPreferences_Caption; + miPreferences.StockIcon := 'gtk-preferences'; + miPreferences.OnClick := miPreferencesClick; + mnuSettings.Add(miPreferences); + miFileTypes := TGTKMenuItem.CreateTyped(Self, itImageText); + miFileTypes.Caption := LANGmiFileTypes_Caption; + miFileTypes.OnClick := miFileTypesClick; + mnuSettings.Add(miFileTypes); + miMounterSettings := TGTKMenuItem.CreateTyped(Self, itImageText); + miMounterSettings.Caption := LANGmiMounterSettingsCaption; + miMounterSettings.OnClick := miMounterSettingsClick; + mnuSettings.Add(miMounterSettings); + miColumns := TGTKMenuItem.CreateTyped(Self, itImageText); + miColumns.Caption := LANGmiColumnsCaption; + miColumns.OnClick := miColumnsClick; + mnuSettings.Add(miColumns); + mnuSettings.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miSavePosition := TGTKMenuItem.CreateTyped(Self, itImageText); + miSavePosition.Caption := LANGmiSavePositionCaption; + miSavePosition.OnClick := miSavePositionClick; + mnuSettings.Add(miSavePosition); + + mnuHelp := TGTKMenuItem.Create(Self); + mnuHelp.Caption := LANGmnuHelp_Caption; + MainMenu.Items.Add(mnuHelp); +// mnuHelp.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + miAbout := TGTKMenuItem.CreateTyped(Self, itImageText); + miAbout.Caption := LANGmiAbout_Caption; + miAbout.StockIcon := 'gtk-about'; + miAbout.OnClick := miAboutClick; + mnuHelp.Add(miAbout); + + // Splitter popup menu + SplitterPopupMenu := TGTKMenuItem.Create(Self); +// SplitterPopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itTearOff)); + for i := 2 to 8 do begin + Item := TGTKMenuItem.Create(Self); + Item.Caption := Format('%d - %d', [i * 10, (10 - i) * 10]); + Item.Data := Pointer(i * 10); + Item.OnClick := SplitterPopupMenuClick; + SplitterPopupMenu.Add(Item); + end; + + // Files popup menu + FilePopupMenu := TGTKMenuItem.Create(Self); + FilePopupMenu.OnPopup := FilePopupMenuPopup; + + // Mounter popup menu + MounterButtonPopupMenu := TGTKMenuItem.Create(Self); + MounterButtonPopupMenu.OnPopup := MounterButtonPopupMenuPopup; + miMount := TGTKMenuItem.CreateTyped(Self, itImageText); + miMount.Caption := LANGmiMountCaption; + miMount.StockIcon := 'gtk-connect'; + miMount.OnClick := miMountClick; + MounterButtonPopupMenu.Add(miMount); + miUmount := TGTKMenuItem.CreateTyped(Self, itImageText); + miUmount.Caption := LANGmiUmountCaption; + miUmount.StockIcon := 'gtk-disconnect'; + miUmount.OnClick := miUmountClick; + MounterButtonPopupMenu.Add(miUmount); + miEject := TGTKMenuItem.CreateTyped(Self, itImageText); + miEject.Caption := LANGmiEjectCaption; +// miEject.StockIcon := 'gtk-cdrom'; + miEject.OnClick := miEjectClick; + MounterButtonPopupMenu.Add(miEject); + + // Tab popup menu + TabPopupMenu := TGTKMenuItem.Create(Self); + TabPopupMenu.OnPopup := TabPopupMenuPopup; + miDuplicateTab := TGTKMenuItem.CreateTyped(Self, itImageText); + miDuplicateTab.Caption := LANGmiDuplicateTabCaption; + miDuplicateTab.ShortCuts.AddName('T'); + miDuplicateTab.OnClick := miDuplicateTabClick; + miDuplicateTab.StockIcon := 'gtk-index'; + TabPopupMenu.Add(miDuplicateTab); + TabPopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + miCloseTab := TGTKMenuItem.CreateTyped(Self, itImageText); + miCloseTab.Caption := LANGmiCloseTabCaption; + miCloseTab.ShortCuts.AddName('W'); + miCloseTab.OnClick := miCloseTabClick; + miCloseTab.StockIcon := 'gtk-close'; + TabPopupMenu.Add(miCloseTab); + miCloseAllTabs := TGTKMenuItem.CreateTyped(Self, itImageText); + miCloseAllTabs.Caption := LANGmiCloseAllTabsCaption; + miCloseAllTabs.OnClick := miCloseAllTabsClick; + TabPopupMenu.Add(miCloseAllTabs); +end; + +procedure TFMain.ConstructColumns(ListView: TGTKListView); +var i, FirstColumn, LastColumn: integer; + Column: TGTKTreeViewColumn; + FontDesc: PPangoFontDescription; +begin + ListView.SelectionMode := smBrowse; + GetFirstLastPanelColumn(FirstColumn, LastColumn); + + for i := 1 to ConstNumPanelColumns do + if ConfColumnVisible[i] then begin + + // First column should have filetype icon + if (i = FirstColumn) and ConfUseFileTypeIcons then begin + Column := ListView.Columns.AddTyped(ctImageText); + Column.SetImageProperty('ypad', 0); + Column.SetImageProperty('yalign', 0.5); + Column.SetImageProperty('xpad', 0); + Column.SetImageProperty('xalign', 0.5); + if (ConfRowHeight > 0) and ConfUseFileTypeIcons then begin + Column.SetImageProperty('width', ConfRowHeight); + Column.SetImageProperty('height', ConfRowHeight); + end; + end else Column := ListView.Columns.Add; + + + Column.Caption := ConfColumnTitlesShort[ConfColumnIDs[i]]; + + if (i < LastColumn){ or Application.GTKVersion_2_4_0_Up} then begin +{ Column.MinWidth := 10; + Column.MaxWidth := 500; } +{ Column.SizingMode := smFixed; + Column.FixedWidth := ConfColumnSizes[i]; } + g_object_set(G_OBJECT(Column.FColumn), 'sizing', 2, 'fixed-width', ConfColumnSizes[i], nil); + end else g_object_set(G_OBJECT(Column.FColumn), 'sizing', 0, nil); + // Column.SizingMode := smFixed; // smAutoSize; + + gtk_tree_view_column_set_spacing(Column.FColumn, 1); // Bug with column spacing? + + Column.Resizable := True; + Column.Reorderable := True; +// if not ConfUseSystemFont then ListView.Columns[i - 1].SetProperty('font', ConfPanelFont); + Column.SetProperty('ypad', 0); + Column.SetProperty('yalign', 0.5); + Column.Tag := i; + g_object_set_data(G_OBJECT(Column.FColumn), 'Column_ID', Pointer(i)); + if ConfRowHeight > 0 then Column.SetProperty('height', ConfRowHeight); + Column.SortID := ListView.Columns.Count - 1; + ColumnSortIDs[Column.SortID + 1] := ConfColumnIDs[i]; + if ConfRowHeight < 0 then gtk_cell_renderer_text_set_fixed_height_from_font(PGtkCellRendererText(Column.FRenderer), 1); +{ gtk_cell_renderer_text_set_fixed_height_from_font(PGtkCellRendererText(Column.FRenderer), 1); + gtk_cell_renderer_set_fixed_size(PGtkCellRenderer(Column.FRenderer), ConfColumnSizes[i], ConfRowHeight); } + if ConfColumnIDs[i] < 3 then begin // Filename column + Column.OnEdited := ListViewEdited; + if Application.GTKVersion_2_6_0_Up then Column.SetProperty('ellipsize', 3); + end; + if ConfColumnIDs[i] in [4, 8, 9] then begin + Column.SetProperty('xalign', 1); + Column.Alignment := 1; + end; + if Application.GTKVersion_2_4_0_Up then Column.SetProperty('single-paragraph-mode', 1); + Column.OnClicked := ListViewColumnClicked; + + end; + + // Set the list font + if not ConfUseSystemFont then begin + FontDesc := pango_font_description_from_string(PChar(ConfPanelFont)); + gtk_widget_modify_font(ListView.FWidget, FontDesc); + end else gtk_widget_modify_font(ListView.FWidget, nil); + + // Set the fixed row height - temporarily disabled due to bug in custom drawing +// if Application.GTKVersion_2_4_0_Up then g_object_set(ListView.FWidget, 'fixed_height_mode', integer(True), nil); +end; + +procedure TFMain.FormDestroy(Sender: TObject); +begin + LeftNotebookBoxList.Free; + RightNotebookBoxList.Free; +end; + +procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction); + + function InternalCloseEngine(Engine, FallbackEngine: TPanelEngine): TPanelEngine; + begin + Result := FallbackEngine; + if not Assigned(Engine.ParentEngine) or (not (Engine is TVFSEngine)) then Exit; + Result := Engine.ParentEngine; +// if not TVFSEngine(Engine).VFSClose then DebugMsg(['Error closing the engine...']); +// Engine.Free; + end; + +var i: integer; + b, DontShowAgain: boolean; + res: TMessageButton; +begin + // Find all opened connections and warn user + b := False; + if LeftPanelNotebook.Visible and Assigned(LeftTabEngines) and (LeftTabEngines.Count > 0) then + for i := 0 to LeftTabEngines.Count - 1 do + if TPanelEngine(LeftTabEngines[i]) is TVFSEngine then begin + b := True; + Break; + end; + if (not b) or (RightPanelNotebook.Visible and Assigned(RightTabEngines) and (RightTabEngines.Count > 0)) then + for i := 0 to RightTabEngines.Count - 1 do + if TPanelEngine(RightTabEngines[i]) is TVFSEngine then begin + b := True; + Break; + end; + b := b or (LeftPanelEngine is TVFSEngine) or (RightPanelEngine is TVFSEngine); + if b and ConfOpenConnectionsWarning then begin + res := MessageBoxShowOnce(LANGOpenConnectionsWarning, LANGDontShowAgain, DontShowAgain, [mbYes, mbNo], mbWarning, mbYes, mbNo); + if DontShowAgain then begin + ConfOpenConnectionsWarning := False; + WriteMainGUISettings; + end; + if res = mbNo then begin + Action := caNone; + Exit; + end; + end; + + // Close all active connections + if b then begin + if (not LeftPanelNotebook.Visible) and (LeftPanelEngine is TVFSEngine) then CloseVFS(True, True) + else + for i := 0 to LeftTabEngines.Count - 1 do try + if LeftPanelNotebook.PageIndex = i then CloseVFS(True, True) else + if Assigned(LeftTabEngines[i]) and (TPanelEngine(LeftTabEngines[i]) is TVFSEngine) then begin + LeftPanelTabs[i] := TPanelEngine(LeftTabEngines[i]).SavePath; + LeftTabEngines[i] := InternalCloseEngine(LeftTabEngines[i], LeftLocalEngine); + end; + except end; + if (not RightPanelNotebook.Visible) and (RightPanelEngine is TVFSEngine) then CloseVFS(False, True) + else + for i := 0 to RightTabEngines.Count - 1 do try + if RightPanelNotebook.PageIndex = i then CloseVFS(False, True) else + if TPanelEngine(RightTabEngines[i]) is TVFSEngine then begin + RightPanelTabs[i] := TPanelEngine(RightTabEngines[i]).SavePath; + RightTabEngines[i] := InternalCloseEngine(RightTabEngines[i], RightLocalEngine); + end; + except end; + end; + + // Unset the columns changed signal because it is called on window close + LeftListView.OnColumnsChanged := nil; + RightListView.OnColumnsChanged := nil; + + ConfMainWindowState := Integer(WindowState); + if ConfMainWindowState <> 0 then begin + ConfMainWindowPosLeft := TGTKControl(Self).Left; + ConfMainWindowPosTop := TGTKControl(Self).Top; + ConfMainWindowWidth := TGTKControl(Self).Width; + ConfMainWindowHeight := TGTKControl(Self).Height; + end else begin + ConfMainWindowPosLeft := Left; + ConfMainWindowPosTop := Top; + ConfMainWindowWidth := Width; + ConfMainWindowHeight := Height; + end; + for i := 0 to LeftListView.Columns.Count - 1 do + ConfColumnSizes[LeftListView.Columns[i].Tag] := LeftListView.Columns[i].Width; + ConfMainWindowLeftSortColumn := LeftListView.SortColumnID; + ConfMainWindowLeftSortType := Integer(LeftListView.SortOrder); + ConfMainWindowRightSortColumn := RightListView.SortColumnID; + ConfMainWindowRightSortType := Integer(RightListView.SortOrder); + + ConfLeftTabBarTabIndex := LeftPanelNotebook.PageIndex; + ConfRightTabBarTabIndex := RightPanelNotebook.PageIndex; +end; + + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.AfterStart; +var i: integer; + TmpList: TStringList; + TmpList2, TmpList3: TList; +begin + LeftPanelEngine := LeftLocalEngine; + RightPanelEngine := RightLocalEngine; + + // Apply the settings + ApplySettings(False, False, True); + + MounterBarHandleBox.Visible := ConfShowMounterBar = 1; + LeftMounterTable.Visible := ConfShowMounterBar = 2; + RightMounterTable.Visible := ConfShowMounterBar = 2; + FillMounterBar; + + LeftListView.SetFocus; + if CommandLineHistory.Count > 0 then + for i := 0 to CommandLineHistory.Count - 1 do + CommandLineCombo.Items.Append(CommandLineHistory[i]); + CommandLineCombo.Entry.Text := ''; + + RefreshBookmarksMenu; + + ButtonsBox.Visible := ConfShowFuncButtons; + ButtonBoxSeparator.Visible := ConfShowFuncButtons; + ButtonBoxSpace.Visible := not ConfShowFuncButtons; + + FillPluginMenu; + + FileListTipsInstall(PGtkTreeView(LeftListView.FWidget)); + FileListTipsInstall(PGtkTreeView(RightListView.FWidget)); + FileListTipsEnable; + + // Load and restore panel tabs + if ConfSavePanelTabs then try + TmpList := TStringList.Create; + TmpList2 := TList.Create; + TmpList3 := TList.Create; + ReadTabs(True, TmpList, TmpList2, TmpList3); + if (TmpList.Count > 0) and (TmpList2.Count > 0) and (TmpList3.Count > 0) then + AddTabs(True, TmpList, TmpList2, TmpList3, ConfLeftTabBarTabIndex); + TmpList.Clear; + TmpList2.Clear; + TmpList3.Clear; + ReadTabs(False, TmpList, TmpList2, TmpList3); + if (TmpList.Count > 0) and (TmpList2.Count > 0) and (TmpList3.Count > 0) then + AddTabs(False, TmpList, TmpList2, TmpList3, ConfRightTabBarTabIndex); + TmpList.Free; + TmpList2.Free; + TmpList3.Free; + except + on E: Exception do DebugMsg(['*** Exception raised in TFMain.AfterStart, loading tabs: (', E.ClassName, '): ', E.Message]); + end; + + // Refresh the lists + ChangingDir(True, ConfLeftPath, '', '', False, True); // AutoFallback + ChangingDir(False, ConfRightPath, '', '', False, True); + LeftListView.SetSortInfo(ConfMainWindowLeftSortColumn, TGTKTreeViewSortOrder(ConfMainWindowLeftSortType)); + RightListView.SetSortInfo(ConfMainWindowRightSortColumn, TGTKTreeViewSortOrder(ConfMainWindowRightSortType)); + + // Set window position and size + SetDefaultSize(ConfMainWindowWidth, ConfMainWindowHeight); + if (ConfMainWindowPosLeft > -1) and (ConfMainWindowPosTop > -1) + then WindowMove(ConfMainWindowPosLeft, ConfMainWindowPosTop); + if ConfWMCompatMode then Show; + case integer(ConfMainWindowState) of + Ord(wsMaximized) : Maximize; + Ord(wsMinimized) : Minimize; + end; + if not ConfWMCompatMode then Show; + + // Other things + StartUp := False; // Set the flag to process Splitter repositioning + PanelSeparator.Position := Round(Width * (ConfPanelSep / 100)); + + Application.ProcessMessages; // Need to process all messages before unlocking + InternalLockInit(False); + + LeftListView.OnColumnsChanged := ListViewColumnsChanged; + RightListView.OnColumnsChanged := ListViewColumnsChanged; + LeftListView.SetFocus; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.PanelSeparatorResize(Sender: TObject); +begin + if not StartUp then ConfPanelSep := Round((PanelSeparator.Position / Width) * 100); +end; + +procedure TFMain.miExitClick(Sender: TObject); +begin + Close; +end; + +procedure TFMain.miAboutClick(Sender: TObject); +begin + InternalLock; + ShowAbout; + Application.ProcessMessages; + InternalLockInit(False); +end; + +procedure TFMain.ListViewKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var AListView: TGTKListView; + ANotebook: TEphyNotebook; + LeftPanel: boolean; + vadj, hadj: PGtkAdjustment; + x: integer; +begin + if not Assigned(Sender) or not (Sender is TGTKListView) then DebugMsg(['**** ListViewKeyDown: Sender is not TGTKListView or not valid']); + AListView := Sender as TGTKListView; + if LeftListView.Focused then LeftPanel := True + else if RightListView.Focused then LeftPanel := False + else LeftPanel := LeftLastFocused; + if LeftPanel then begin + ANotebook := LeftPanelNotebook; + vadj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(LeftScrolledWindow.FWidget)); + hadj := gtk_scrolled_window_get_hadjustment(PGtkScrolledWindow(LeftScrolledWindow.FWidget)); + end else begin + ANotebook := RightPanelNotebook; + vadj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(RightScrolledWindow.FWidget)); + hadj := gtk_scrolled_window_get_hadjustment(PGtkScrolledWindow(RightScrolledWindow.FWidget)); + end; + FileListTipsHide; + case Key of + GDK_TAB, 65056 : if (ssCtrl in Shift) and ANotebook.Visible then begin + Accept := False; + x := (ANotebook.PageIndex + 1 - 2*Ord(ssShift in Shift)) mod ANotebook.ChildrenCount; + if x < 0 then x := ANotebook.ChildrenCount - 1; + ANotebook.PageIndex := x; + end else begin + Accept := False; + DeactivateQuickFind(LeftPanel); + Application.ProcessMessages; + if InternalLockUnlocked then // prevent changing focus when busy + if LeftPanel then RightListView.SetFocus + else LeftListView.SetFocus; + end; + GDK_RETURN, GDK_KP_ENTER : if (Key = GDK_RETURN) and (Shift = [ssAlt, ssShift]) then DoGetDirSize(True) else + if ([ssAlt] = Shift) or ([ssCtrl] = Shift) then begin + CommandLineComboKeyDown(Sender, Key, Shift, Accept); + Accept := False; + CommandLineCombo.Entry.SetFocus; + CommandLineCombo.Entry.SelectRegion(Length(CommandLineCombo.Entry.Text), Length(CommandLineCombo.Entry.Text)); + end else + if Length(Trim(CommandLineCombo.Entry.Text)) > 0 then CommandLineComboKeyDown(Sender, Key, Shift, Accept) + else if Assigned(AListView.Selected) then ActivateItem(AListView.Selected.Index, False); + GDK_BACKSPACE : if QuickFind then begin Accept := False; QuickFindSendKey(LeftPanel, Key); end + else if LeftPanel then PathButtonClick(LeftUpButton) + else PathButtonClick(RightUpButton); + GDK_Right : begin + if [ssCtrl] = Shift then SwitchPanelCtrlLeftRight(LeftPanel, False) else + if ConfLynxLikeMotion then begin + if Assigned(AListView.Selected) then ActivateItem(AListView.Selected.Index, False); + end; + Accept := False; + end; + GDK_Left : begin + if [ssCtrl] = Shift then SwitchPanelCtrlLeftRight(LeftPanel, True) else + if ConfLynxLikeMotion then + if LeftPanel then PathButtonClick(LeftUpButton) + else PathButtonClick(RightUpButton); + Accept := False; + end; + GDK_INSERT : DoSelect(5); + GDK_SPACE : begin + Accept := False; + if QuickFind then QuickFindSendKey(LeftPanel, Key) + else if Length(CommandLineCombo.Entry.Text) > 0 then ActivateCommandLine(Key) + else begin + if not PDataItem(AListView.Selected.Data)^.Selected then DoGetDirSize(False); + DoSelect(8); + end; + end; + GDK_F1 : if Shift = [ssAlt] then begin + ShowBookmarkQuick(True); + Accept := False; + end; + GDK_F2 : if Shift = [ssAlt] then begin + ShowBookmarkQuick(False); + Accept := False; + end else + if (Shift = [ssShift]) or (Shift = [ssCtrl]) then begin + CopyFilenamesToClipboard(Shift = [ssCtrl], LeftPanel); + end else begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + F6ButtonClick(nil); + end; + GDK_F3 : begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + F3F4ButtonClick(F3Button); + end; + GDK_F4 : begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + if ssShift in Shift then EditViewFile(LeftPanel, AListView, False, True) + else F3F4ButtonClick(F4Button); + end; + GDK_F5 : begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + if ssShift in Shift then F5ButtonClick(nil) + else F5ButtonClick(Sender); + end; + GDK_F6 : begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + if ssShift in Shift then begin + if not Assigned(AListView.Columns[0].FColumn^.editable_widget) then Editing := False; + DoQuickRename(Sender = LeftListView, AListView, True) + end else F6ButtonClick(Sender); + end; + GDK_F7 : begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + if ssAlt in Shift then miSearchClick(Sender) + else F7ButtonClick(Sender); + end; + GDK_F8, GDK_Delete_Key : begin + DeactivateQuickFind(LeftPanel); + Accept:= False; + F8ButtonClick(Sender); + end; + GDK_ESCAPE : begin + if not QuickFind then CommandLineCombo.Entry.Text := ''; + DeactivateQuickFind(LeftPanel); + if RunningEscSensitive > 0 then FMainEscPressed := True; + end; + GDK_S, GDK_Capital_S : if (ssAlt in Shift) or (ssCtrl in Shift) + then ActivateQuickFind(Sender = LeftListView) + else begin + Accept := False; + if QuickFind then QuickFindSendKey(LeftPanel, Key) + else ActivateCommandLine(Key); + end; + GDK_O, GDK_Capital_O : if ssAlt in Shift then SwitchOtherPanel(LeftPanel, False) + else begin + Accept := False; + if QuickFind then QuickFindSendKey(LeftPanel, Key) + else ActivateCommandLine(Key); + end; + + GDK_P, GDK_Capital_P, GDK_N, GDK_Capital_N: + if ((Shift = [ssAlt]) or (Shift = [ssCtrl]) or ((Shift = []) and (not QuickFind))) { and (CommandLineHistory.Count > 0) } + then CommandLineComboKeyDown(Sender, Key, Shift, Accept) + else if QuickFind then QuickFindSendKey(LeftPanel, Key); + GDK_A, GDK_Capital_A: if (Shift = [ssAlt]) or (Shift = [ssCtrl]) or ((Shift = []) and (not QuickFind)) + then CommandLineComboKeyDown(Sender, Key, Shift, Accept) + else if QuickFind then QuickFindSendKey(LeftPanel, Key); + GDK_WIN_POPUP : begin + Accept := False; + PopupFileMenuPos; + end; + GDK_HOME: if Shift = [ssCtrl] then begin + if LeftPanel then PathButtonClick(LeftHomeButton) + else PathButtonClick(RightHomeButton); + Accept := False; + end else if Assigned(AListView.Selected) and (AListView.ConvertToSorted(AListView.Selected.Index) = 0) then Accept := False; + GDK_END: if Assigned(AListView.Selected) and (AListView.ConvertToSorted(AListView.Selected.Index) = AListView.Items.Count - 1) then Accept := False; + GDK_SLASH, GDK_KP_SLASH: if Shift = [ssCtrl] then begin + if LeftPanel then PathButtonClick(LeftRootButton) + else PathButtonClick(RightRootButton); + Accept := False; + end; +{ GDK_0..GDK_9: if ConfBookmarkQuickJump and (Shift = [ssAlt]) then QuickJumpToBookmark(LeftPanel, Key - GDK_1) + else begin + Accept := False; + if QuickFind then QuickFindSendKey(LeftPanel, Key) + else ActivateCommandLine(Key); + end; } + GDK_Down : if [ssCtrl] = Shift then begin + Accept := False; + CommandLineCombo.Entry.SetFocus; + CommandLineCombo.Entry.SelectAll; + end else begin + if QuickFind then QuickFindSendKey(LeftPanel, Key) + else if Assigned(AListView.Selected) and (AListView.ConvertToSorted(AListView.Selected.Index) = AListView.Items.Count - 1) then Accept := False; + end; + GDK_Up : if Assigned(AListView.Selected) and (AListView.ConvertToSorted(AListView.Selected.Index) = 0) then Accept := False; + + GDK_Page_Up, GDK_Page_Down: if (Shift = [ssCtrl]) and ANotebook.Visible then + begin + Accept := False; + x := (ANotebook.PageIndex + 1 - 2*Ord(Key = GDK_Page_Up)) mod ANotebook.ChildrenCount; + if x < 0 then x := ANotebook.ChildrenCount - 1; + ANotebook.PageIndex := x; + end else begin + if Assigned(AListView.Selected) and + (((Key = GDK_Page_Up) and (AListView.ConvertToSorted(AListView.Selected.Index) = 0)) or + ((Key = GDK_Page_Down) and (AListView.ConvertToSorted(AListView.Selected.Index) = AListView.Items.Count - 1))) + then Accept := False; + end; + + else if QuickFind then Accept := not QuickFindSendKey(LeftPanel, Key) + else Accept := not ActivateCommandLine(Key); + end; +end; + +procedure TFMain.ListViewEnter(Sender: TObject; var Accept: boolean); +var s: string; +begin + LeftLastFocused := Sender = LeftListView; + if LeftLastFocused then begin + LeftPathLabelEventBox.ControlState := csSelected; + RightPathLabelEventBox.ControlState := csActive; + s := LeftPathLabel.Caption; + end else begin + LeftPathLabelEventBox.ControlState := csActive; + RightPathLabelEventBox.ControlState := csSelected; + s := RightPathLabel.Caption; + end; + CommandLineLabel.Caption := Format('%s@%s:%s>', [GetUserName, GetHostName, s]); + UpdateCaption; + miDisconnect.Enabled := (LeftLastFocused and (LeftPanelEngine is TVFSEngine) and (not TVFSEngine(LeftPanelEngine).ArchiveMode)) or + ((not LeftLastFocused) and (RightPanelEngine is TVFSEngine) and (not TVFSEngine(RightPanelEngine).ArchiveMode)); +end; + +procedure TFMain.FormResize(Sender: TObject); +begin + if Width <> LastWidth then begin +// DebugMsg(['FormResize: ', Width, 'x', Height]); + PanelSeparator.Position := Round(Width * (ConfPanelSep / 100)); + CommandLineLabel.SetSizeRequest(Round(Width / 2.5), -1); + LastWidth := Width; + end; +end; + +procedure TFMain.PathLabelMouseDown(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +begin + if Button = mbLeft then + if Sender = LeftPathLabelEventBox then LeftListView.SetFocus + else if Sender = RightPathLabelEventBox then RightListView.SetFocus; +end; + +procedure TFMain.ActivateItem(const ItemIndex: longint; const MouseActivate: boolean); +var Data: PDataItem; + LeftPanel: boolean; + DataList: TList; + Engine: TPanelEngine; + AListView: TGTKListView; + Ext: string; +begin + if LeftListView.Focused then LeftPanel := True + else if RightListView.Focused then LeftPanel := False + else LeftPanel := LeftLastFocused; + if LeftPanel then begin + DataList := LeftPanelData; + Engine := LeftPanelEngine; + AListView := LeftListView; + end else begin + DataList := RightPanelData; + Engine := RightPanelEngine; + AListView := RightListView; + end; + DeactivateQuickFind(LeftPanel); + if Application.GTKVersion_2_0_5_Up then Data := DataList[ItemIndex] + else Data := AListView.Items[ItemIndex].AsPointer(0); + DebugMsg(['Selected:', Data^.AName]); + if not Assigned(Data) then Exit; + if Data^.UpDir then ChangingDir(LeftPanel, '..') else + if Data^.IsDir then begin + if MouseActivate then begin + if AListView.Items.Count > 0 then AListView.Items[0].Selected := True; + Application.ProcessMessages; + end; + ChangingDir(LeftPanel, String(Data^.AName)); + end else begin + Ext := ANSIUpperCase(Trim(Copy(String(Data^.AName), LastDelimiter('.', String(Data^.AName)) + 1, Length(String(Data^.AName)) - LastDelimiter('.', String(Data^.AName))))); + // Test for known internal functions + if (Ext = 'SFV') or (Ext = 'MD5') then miVerifyChecksumsClick(Self) else + if (Ext = 'CRC') or (Ext = '001') then miMergeFilesClick(Self) else + if not ((Engine is TLocalTreeEngine) and HandleVFSArchive(Ext, IncludeTrailingPathDelimiter(Engine.Path) + String(Data^.AName), String(Data^.AName), '/')) then + if (not ConfUseURI) or ((Engine is TVFSEngine) and TVFSEngine(Engine).ArchiveMode) + then RunFile(IncludeTrailingPathDelimiter(Engine.Path) + String(Data^.AName), Engine, -1) + else RunFile(ExcludeTrailingPathDelimiter(Engine.GetPrefix) + IncludeTrailingPathDelimiter(Engine.Path) + String(Data^.AName), Engine, -1); + end; +end; + +procedure TFMain.ChangingDir(LeftPanel: boolean; NewPath: string; HiliString1: string = ''; HiliString2: string = ''; const PreserveSelection: boolean = False; const AutoFallback: boolean = False; Plugin: TVFSPlugin = nil); +var ListView: TGTKListView; + Engine: TPanelEngine; + s, ss: string; + i, Sel, Err: integer; + b, bb: boolean; + tt: TDateTime; + DataList, DirList: TList; + SelectedFiles: TStringList; + ANotebook: TEphyNotebook; + ATabList: TStringList; + TabEngines: TList; + OpenDirThread: TOpenDirThread; + + function LookupItem(const AName: string; const CaseSensitive: boolean): boolean; + var i: integer; + begin + Result := False; + for i := 0 to DataList.Count - 1 do + if (CaseSensitive and (ANSICompareStr(string(PDataItem(DataList[i])^.AName), AName) = 0)) or + ((not CaseSensitive) and (ANSICompareText(string(PDataItem(DataList[i])^.AName), AName) = 0)) then + begin + Sel := i; + Result := True; + Break; + end; + end; + + procedure DoThread; + begin + try + OpenDirThread.AEngine := Engine; + OpenDirThread.APath := NewPath; + OpenDirThread.ASelItem := ''; + OpenDirThread.AAutoFallBack := AutoFallback; + OpenDirThread.ADirList := DirList; + if Plugin <> nil then begin + DebugMsg(['Plugin <> nil']); + OpenDirThread.APlugin := Plugin; + OpenDirThread.AFullPath := HiliString1; + OpenDirThread.AHighlightItem := HiliString2; + end; + DebugMsg(['(II) TFMain.ChangingDir: begin thread']); + OpenDirThread.Resume; + tt := Now; + b := False; + FRemoteWait := nil; + repeat + Sleep(ConstInternalProgressTimer); +// DebugMsg([' (II) TFMain.ChangingDir: sleep.']); + Application.ProcessMessages; + if not b and (MilliSecondsBetween(tt, Now) >= ConstRemoteWaitDialogDelay) then begin + FRemoteWait := TFRemoteWait.Create(Application); + FRemoteWait.ParentForm := FMain; + FRemoteWait.ShowModal; + b := True; + end; + if Assigned(FRemoteWait) then + if FRemoteWait.Cancelled then OpenDirThread.CancelIt := True; + until OpenDirThread.Finished; + if FRemoteWait <> nil then FRemoteWait.Free; + DebugMsg(['(II) TFMain.ChangingDir: end thread, running time = ', OpenDirThread.RunningTime, 'ms']); + except + on E: Exception do DebugMsg(['*** Exception raised in TFMain.ChangingDir:DoThread (', E.ClassName, '): ', E.Message]); + end; + end; + +begin + DebugMsg(['*** Begin changing dir to ', NewPath]); + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + ANotebook := LeftPanelNotebook; + ATabList := LeftPanelTabs; + TabEngines := LeftTabEngines; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + ANotebook := RightPanelNotebook; + ATabList := RightPanelTabs; + TabEngines := RightTabEngines; + end; + try + if (NewPath = '..') and (Engine.ParentEngine <> nil) and (Engine.Path = '/') then begin + CloseVFS(LeftPanel, False); + Exit; + end; + + InternalLock; + FileListTipsDisable; + SelectedFiles := nil; + if PreserveSelection then begin + SelectedFiles := TStringList.Create; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + if PDataItem(DataList[i])^.Selected and (not PDataItem(DataList[i])^.UpDir) + then SelectedFiles.Add(PDataItem(DataList[i])^.AName); + end; + Editing := False; + DeactivateQuickFind(LeftPanel); + DeactivateQuickFind(not LeftPanel); + DirList := TList.Create; + + // Threading... + OpenDirThread := TOpenDirThread.Create; + DebugMsg(['TFMain.ChangingDir: Creating thread...']); + DoThread; + + bb := OpenDirThread.VFSOpenResult = 0; + if OpenDirThread.VFSOpenResult <> 0 then begin + DebugMsg(['(II) TFMain.ChangingDir: OpenDirThread.VFSOpenResult <> 0']); + if OpenDirThread.VFSOpenResult = cVFS_BadPassword then begin + // Handle password + if not HandleSetPassword(OpenDirThread.xEngine) then Exit; + ss := OpenDirThread.xEngine.Password; + if Assigned(OpenDirThread.xEngine) then OpenDirThread.xEngine.Free; + DebugMsg(['TFMain.ChangingDir: Freeing thread...']); + OpenDirThread.Free; + OpenDirThread := TOpenDirThread.Create; + DebugMsg(['TFMain.ChangingDir: Creating thread...']); + OpenDirThread.Password := ss; + DoThread; + bb := OpenDirThread.VFSOpenResult = 0; + end; + end; + if Plugin <> nil then begin + HiliString1 := ''; + HiliString2 := ''; + end; + if not bb then begin + Application.MessageBox(LANGCouldntOpenURIArchive, [mbOK], mbError, mbOK, mbOK); + DebugMsg(['TFMain.ChangingDir: Freeing thread...']); + OpenDirThread.Free; + end else + if OpenDirThread.ChDirResult <> 0 then begin + if OpenDirThread.ChDirResult = 1 then Application.MessageBox(Format(LANGErrorGettingListingForSPanelNoPath, [LANGPanelStrings[LeftPanel], 'Exception']), [mbOK], mbError, mbNone, mbOK) + else Application.MessageBox(Format(LANGErrorGettingListingForSPanel, [LANGPanelStrings[LeftPanel], ANSIToUTF8(GetErrorString(OpenDirThread.ChDirResult)), ANSIToUTF8(NewPath)]), [mbOK], mbError, mbNone, mbOK); + DebugMsg(['TFMain.ChangingDir: Freeing thread...']); + OpenDirThread.Free; + end else begin + if OpenDirThread.ListingResult <> 0 then begin + Application.MessageBox(Format(LANGErrorGettingListingForSPanel, [LANGPanelStrings[LeftPanel], ANSIToUTF8(GetErrorString(OpenDirThread.ListingResult)), Engine.Path]), [mbOK], mbError, mbNone, mbOK); + Exit; + end; + s := OpenDirThread.ASelItem; + Engine := OpenDirThread.AEngine; // set current Engine from the thread (might have been modified due to VFS) + if LeftPanel then LeftPanelEngine := Engine + else RightPanelEngine := Engine; + DebugMsg(['TFMain.ChangingDir: Freeing thread...']); + OpenDirThread.Free; + + FillPanel(DirList, ListView, Engine, LeftPanel); // This is time consuming + DirList.Free; + if DataList.Count > 0 then begin + if PreserveSelection and (SelectedFiles.Count > 0) and (DataList.Count > 0) then + for i := 0 to DataList.Count - 1 do + if (not PDataItem(DataList[i])^.UpDir) and (SelectedFiles.IndexOf(PDataItem(DataList[i])^.AName) >= 0) + then PDataItem(DataList[i])^.Selected := True; + Sel := 0; + b := (NewPath = '..') and (Length(Trim(s)) > 0) and LookupItem(s, True); + if not b then b := (HiliString1 <> '') and LookupItem(HiliString1, True); + if (not b) and (HiliString1 <> '') then LookupItem(HiliString1, False); + if (not b) and (HiliString2 <> '') then LookupItem(HiliString2, True); + if (not b) and (HiliString2 <> '') then LookupItem(HiliString2, False); + if (Engine.Path = '/') and (NewPath = '/') then Sel := ListView.ConvertFromSorted(0); + ListView.Items[Sel].Selected := True; +// Application.ProcessMessages; + ListView.Items[Sel].SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); +// Application.ProcessMessages; + end; + UpdatePanelInfo; + UpdatePanelInfoDown(LeftPanel); + UpdatePanelInfoDown(not LeftPanel); + if ANotebook.Visible then begin + ATabList[ANotebook.PageIndex] := Engine.Path; + TabEngines[ANotebook.PageIndex] := Engine; + s := ExtractFileName(ExcludeTrailingPathDelimiter(Engine.Path)); + if s = '' then s := '/'; + SetTabLabel(ANotebook, ANotebook.PageIndex, ANSIToUTF8(s), ANSIToUTF8(Engine.Path)); + end; + end; // of Chdir, Listing, ... + Engine.ExplicitChDir('/'); + Application.ProcessMessages; + InternalUnLock; + FileListTipsEnable; + except + on E: Exception do DebugMsg(['*** Exception raised in TFMain.ChangingDir (', E.ClassName, '): ', E.Message]); + end; +end; + +procedure TFMain.DoRefresh(LeftPanel, StaySame, AutoFallback: boolean); +var ListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; + s1, s2: string; +begin + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + s1 := ''; s2 := ''; + FindNextSelected(ListView, DataList, s1, s2); + ChangingDir(LeftPanel, Engine.Path, s1, s2, StaySame, AutoFallback); +end; + +procedure TFMain.UpdateCaption; +var LeftPanel: boolean; + s: string; +begin + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + if LeftPanelEngine.GetPrefix <> '' then s := ANSIToUTF8(Format(ConstFullPathFormatStr, [LeftPanelEngine.GetPrefix, LeftPanelEngine.Path])) + else s := ANSIToUTF8(LeftPanelEngine.Path); + end else + if RightPanelEngine.GetPrefix <> '' then s := ANSIToUTF8(Format(ConstFullPathFormatStr, [RightPanelEngine.GetPrefix, RightPanelEngine.Path])) + else s := ANSIToUTF8(RightPanelEngine.Path); + Caption := Format('Tux Commander [%s]', [s]); +end; + +procedure TFMain.UpdatePanelInfo; +var FSFree, FSSize: Int64; + FSName, s: string; + Time1, Time2: TDateTime; +begin + UpdateCaption; + Time1 := Now; + if LeftPanelEngine.GetPrefix <> '' + then LeftPathLabel.Caption := ANSIToUTF8(Format(ConstFullPathFormatStr, [LeftPanelEngine.GetPrefix, LeftPanelEngine.Path])) + else LeftPathLabel.Caption := ANSIToUTF8(LeftPanelEngine.Path); + if RightPanelEngine.GetPrefix <> '' + then RightPathLabel.Caption := ANSIToUTF8(Format(ConstFullPathFormatStr, [RightPanelEngine.GetPrefix, RightPanelEngine.Path])) + else RightPathLabel.Caption := ANSIToUTF8(RightPanelEngine.Path); + LeftPathLabel.UseMarkup := True; + RightPathLabel.UseMarkup := True; + if LeftLastFocused then s := LeftPathLabel.Caption + else s := RightPathLabel.Caption; + CommandLineLabel.Caption := Format('%s@%s:%s>', [GetUserName, GetHostName, s]); + LeftPanelEngine.GetFileSystemInfo(LeftPanelEngine.Path, FSSize, FSFree, FSName); + if FSName <> '' + then LeftDiskInfoLabel.Caption := Format(LANGDiskStatVolNameFmt, [FSName, + ANSIToUTF8(FormatSize(FSFree, 1024)), + ANSIToUTF8(FormatSize(FSSize, 1024))]) + else LeftDiskInfoLabel.Caption := Format(LANGDiskStatFmt, + [ANSIToUTF8(FormatSize(FSFree, 1024)), + ANSIToUTF8(FormatSize(FSSize, 1024))]); + RightPanelEngine.GetFileSystemInfo(RightPanelEngine.Path, FSSize, FSFree, FSName); + if FSName <> '' + then RightDiskInfoLabel.Caption := Format(LANGDiskStatVolNameFmt, [FSName, + ANSIToUTF8(FormatSize(FSFree, 1024)), + ANSIToUTF8(FormatSize(FSSize, 1024))]) + else RightDiskInfoLabel.Caption := Format(LANGDiskStatFmt, + [ANSIToUTF8(FormatSize(FSFree, 1024)), + ANSIToUTF8(FormatSize(FSSize, 1024))]); + LeftDiskInfoLabel.UseMarkup := True; + RightDiskInfoLabel.UseMarkup := True; + + // Update the visibility of VFS buttons + LeftDisconnectButton.Visible := (LeftPanelEngine is TVFSEngine) and (not TVFSEngine(LeftPanelEngine).ArchiveMode); + LeftLeaveArchiveButton.Visible := (LeftPanelEngine is TVFSEngine) and TVFSEngine(LeftPanelEngine).ArchiveMode; + RightDisconnectButton.Visible := (RightPanelEngine is TVFSEngine) and (not TVFSEngine(RightPanelEngine).ArchiveMode); + RightLeaveArchiveButton.Visible := (RightPanelEngine is TVFSEngine) and TVFSEngine(RightPanelEngine).ArchiveMode; + LeftPasswordButton.Visible := (LeftPanelEngine is TVFSEngine) and TVFSEngine(LeftPanelEngine).GetPasswordRequired; + RightPasswordButton.Visible := (RightPanelEngine is TVFSEngine) and TVFSEngine(RightPanelEngine).GetPasswordRequired; + miDisconnect.Enabled := (LeftLastFocused and (LeftPanelEngine is TVFSEngine) and (not TVFSEngine(LeftPanelEngine).ArchiveMode)) or + ((not LeftLastFocused) and (RightPanelEngine is TVFSEngine) and (not TVFSEngine(RightPanelEngine).ArchiveMode)); + Time2 := Now; + DebugMsg(['UpdatePanelInfo: ', SecondOf(Time2 - Time1), ':', MillisecondOf(Time2 - Time1)]); +end; + +procedure TFMain.UpdatePanelInfoDown(LeftPanel: boolean); +var Size, TotalSize: Int64; + NumSel, TotalFiles: longint; + i: integer; + Data: PDataItem; + s: string; + DataList: TList; +begin + if LeftPanel then DataList := LeftPanelData + else DataList := RightPanelData; + Size := 0; + TotalSize := 0; + NumSel := 0; + TotalFiles := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do begin + Data := DataList[i]; + if (not Data^.UpDir) and ((not Data^.IsDir) or (Data^.IsDir and (Data^.Size > -1))) then begin + Inc(TotalSize, Data^.Size); + Inc(TotalFiles); + if Data^.Selected then begin + Inc(NumSel); + Inc(Size, Data^.Size); + end; + end; + end; + s := Format(LANGStatusLineFmt, [ANSIToUTF8(FormatSize(Size, 1024)), + ANSIToUTF8(FormatSize(TotalSize, 1024)), NumSel, TotalFiles]); + if LeftPanel then LeftStatusLine.Caption := s + else RightStatusLine.Caption := s; +end; + +procedure TFMain.PathButtonClick(Sender: TObject); +var NewPath: string; + LeftPanel: boolean; +begin + LeftPanel := (Sender = LeftUpButton) or (Sender = LeftHomeButton) or (Sender = LeftRootButton); + if (Sender = LeftUpButton) or (Sender = RightUpButton) then NewPath := '..' + else if (Sender = LeftRootButton) or (Sender = RightRootButton) then NewPath := '/' + else if (Sender = LeftHomeButton) or (Sender = RightHomeButton) then NewPath := GetHomePath + else Exit; + + // Close VFS connections + if ((Sender = LeftRootButton) or (Sender = LeftHomeButton)) and (not (LeftPanelEngine is TLocalTreeEngine)) then + while (LeftPanelEngine is TVFSEngine) do CloseVFS(LeftPanel, True); + if ((Sender = RightRootButton) or (Sender = RightHomeButton)) and (not (RightPanelEngine is TLocalTreeEngine)) then + while (RightPanelEngine is TVFSEngine) do CloseVFS(LeftPanel, True); + + ChangingDir(LeftPanel, NewPath); + if LeftPanel then LeftListView.SetFocus + else RightListView.SetFocus; +end; + +procedure TFMain.miRefreshClick(Sender: TObject); +begin + DoRefresh(LeftListView.Focused, True, True); +end; + +function TFMain.CompareFunc(Sender: TObject; var model: PGtkTreeModel; var a, b: PGtkTreeIter): integer; +var Data1, Data2: PDataItem; + Path: PGtkTreePath; + DataList: TList; +begin + Result := 0; + if not Application.GTKVersion_2_0_5_Up then begin + gtk_tree_model_get(model, a, 0, @Data1, -1); + gtk_tree_model_get(model, b, 0, @Data2, -1); + end else begin + if Sender = LeftListView then DataList := LeftPanelData + else DataList := RightPanelData; + Path := gtk_tree_model_get_path(model, a); + if not Assigned(Path) then Exit; + Data1 := DataList[gtk_tree_path_get_indices(Path)^]; + gtk_tree_path_free(Path); + Path := gtk_tree_model_get_path(model, b); + if not Assigned(Path) then Exit; + Data2 := DataList[gtk_tree_path_get_indices(Path)^]; + gtk_tree_path_free(Path); + end; + Result := LVCompareItems(Data1, Data2, (Sender as TGTKView).SortOrder = soAscending, FMain.ColumnSortIDs[(Sender as TGTKView).SortColumnID + 1]); +end; + +(********************************************************************************************************************************) +procedure TFMain.DoSelect(SelectType: integer); +var Filter, s: string; + LeftPanel, ExpandSel, b, Found: boolean; + ListView: TGTKListView; + Engine: TPanelEngine; + i, j: integer; + Item: TGTKListItem; + Data: PDataItem; + DataList: TList; + Wilds: array of string; +begin + try + InternalLock; + try + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else Exit; + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + DeactivateQuickFind(LeftPanel); + ExpandSel := False; + if SelectType in [1, 2] then try + FSelect := TFSelect.Create(Self); + case SelectType of + 1 : FSelect.Caption := LANGExpandSelection; + 2 : FSelect.Caption := LANGShrinkSelection; + end; +{ FSelect.TitleLabel.Caption := Format('%s', [FSelect.Caption]); + FSelect.TitleLabel.UseMarkup := True; } + ExpandSel := SelectType = 1; + FSelect.ComboBox.Entry.Text := LastUsedFilter; + FSelect.ComboBox.Entry.SelectAll; + if FSelect.Run = mbOK + then begin + Filter := FSelect.ComboBox.Entry.Text; + LastUsedFilter := Filter; + if FSelect.ComboBox.Entry.Text <> '*.*' then + SaveItemToHistory(FSelect.ComboBox.Entry.Text, SelectHistory); + end else Exit; + finally + FSelect.Free; + end; + + case SelectType of + 1, 2 : if ListView.Items.Count > 1 then begin + SetLength(Wilds, 0); + while LastDelimiter(ConfSelItemsDelim, Filter) > 0 do begin + i := LastDelimiter(ConfSelItemsDelim, Filter); + if i < Length(Filter) then begin + s := Copy(Filter, i + 1, Length(Filter) - i); + Delete(Filter, i, Length(Filter) - i + 1); + SetLength(Wilds, Length(Wilds) + 1); + Wilds[Length(Wilds) - 1] := s; + end; + end; + if Length(Filter) > 0 then begin + SetLength(Wilds, Length(Wilds) + 1); + Wilds[Length(Wilds) - 1] := Filter; + end; + Found := False; + for i := 0 to DataList.Count - 1 do begin + Data := DataList[i]; + if Assigned(Data) and (not Data^.UpDir) and (ConfSelectAllDirs or (not Data^.IsDir)) {and (Data^.Selected <> ExpandSel)} then begin + b := False; + for j := 0 to Length(Wilds) - 1 do + b := b or IsWild(String(Data^.AName), Wilds[j], True); + if b then begin + Data^.Selected := ExpandSel; + Found := True; + end; + end; + end; + SetLength(Wilds, 0); + if not Found then Application.MessageBox(LANGNoMatchesFound, [mbOK], mbWarning, mbNone, mbOK); + end; + 3, 4 : if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + if (not PDataItem(DataList[i])^.UpDir) and (ConfSelectAllDirs or (not PDataItem(DataList[i])^.IsDir)) then + PDataItem(DataList[i])^.Selected := not PDataItem(DataList[i])^.Selected; + 5, 8 : begin + Item := ListView.Selected; + if Assigned(Item) and Assigned(Item.Data) then begin + Data := PDataItem(Item.Data); + if (Engine.Path = '/') or (Item.Index > 0) then Data^.Selected := not Data^.Selected; + if (ListView.ConvertToSorted(Item.Index) < ListView.Items.Count - 1) and + (((SelectType = 5) and ConfInsMoveDown) or ((SelectType = 8) and ConfSpaceMovesDown)) then begin + ListView.Selected := ListView.Items[ListView.ConvertFromSorted(ListView.ConvertToSorted(Item.Index) + 1)]; + ListView.Selected.SetCursor(0, False, False, 0, 0); + end else Item.RedrawRow; // Move to the next item will invalidate it automatically + end; + end; + 6, 7: if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + if (not PDataItem(DataList[i])^.UpDir) and (ConfSelectAllDirs or (not PDataItem(DataList[i])^.IsDir)) then + PDataItem(DataList[i])^.Selected := SelectType = 6; + end; + if SelectType in [1..4, 6..7] then ListView.Invalidate; // Make changes appear + UpdatePanelInfoDown(LeftPanel); + Application.ProcessMessages; + except end; + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.ProcessMarkKey(KeyType, Key: integer); +var LeftPanel: boolean; + ListView: TGTKListView; + Pos: integer; +begin + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then ListView := LeftListView + else ListView := RightListView; + if Editing and Assigned(ListView.Columns[0].FColumn^.editable_widget) then begin + Pos := gtk_editable_get_position(PGtkEditable(ListView.Columns[0].FColumn^.editable_widget)); + gtk_editable_insert_text(PGtkEditable(ListView.Columns[0].FColumn^.editable_widget), PChar(UTF8Encode(WideChar(KeyValToUnicode(Key)))), 1, @Pos); + gtk_editable_set_position(PGtkEditable(ListView.Columns[0].FColumn^.editable_widget), Pos); + end; + if CommandLineCombo.Entry.Focused then ActivateCommandLine(Key, True) else + if QuickFind then QuickFindSendKey(LeftPanel, Key) + else DoSelect(KeyType); +end; + +procedure TFMain.mnuMarkClick(Sender: TObject); +begin + if Sender = miSelectGroup then ProcessMarkKey(1, GDK_KP_PLUS) else + if Sender = miUnselectGroup then ProcessMarkKey(2, GDK_KP_MINUS) else + if Sender = miSelectAll then DoSelect(6) else + if Sender = miUnselectAll then DoSelect(7) else + if Sender = miInvertSelection then ProcessMarkKey(4, GDK_KP_ASTERISK); +end; + +(********************************************************************************************************************************) +procedure TFMain.ListViewCellDataFunc(Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter); +var s: PChar; + Sel, ImageCol: boolean; + Data: PDataItem; + i, ColumnID, ColumnIdx: integer; + DataList: TList; + TreePath: PGtkTreePath; + AFGColor, ABGColor: PGdkColor; +{ Rect, VisibleRect: TGdkRectangle; } +begin + AFGColor := nil; + ABGColor := nil; + if Application.GTKVersion_2_0_5_Up then ColumnIdx := gtk_tree_view_column_get_sort_column_id(tree_column) else + begin + ColumnIdx := 0; + for i := 0 to (Sender as TGTKListView).Columns.Count - 1 do + if (cell = (Sender as TGTKListView).Columns[i].FRenderer) or (cell = (Sender as TGTKListView).Columns[i].FPixbufRenderer) then begin + ColumnIdx := i; + Break; + end; + end; + ColumnID := ColumnSortIDs[ColumnIdx + 1] - 1; + ImageCol := False; + if ColumnIdx = 0 then ImageCol := GTK_IS_CELL_RENDERER_PIXBUF(cell); + Data := nil; + if not Application.GTKVersion_2_0_5_Up then gtk_tree_model_get(tree_model, iter, 0, @Data, -1) + else begin + if Sender = LeftListView then DataList := LeftPanelData + else DataList := RightPanelData; + TreePath := gtk_tree_model_get_path(tree_model, iter); + if not Assigned(TreePath) then Exit; + (Sender as TGTKListView).ConvertPathToChild(TreePath); + Data := DataList[gtk_tree_path_get_indices(TreePath)^]; + gtk_tree_path_free(TreePath); + end; +(* gtk_tree_view_get_cell_area(tree_view, TreePath, nil, @Rect); + gtk_tree_view_get_visible_rect(tree_view, @VisibleRect); + if (Rect.height = 0) or (Rect.height <> ConfRowHeight) or (Rect.y = 0) or (Rect.y > VisibleRect.y + VisibleRect.height) then Exit; *) + +// DebugMsg(['Rendering text ', Data^.ColumnData[ColumnID]]); + + if not Assigned(Data) then Exit; + Sel := gtk_tree_selection_iter_is_selected((Sender as TGTKView).FSelection, iter); + with Data^ do begin + // ################ Prepare colors + if Selected then AFGColor := SelectedItemGDKColor else begin + if Sel then begin + if (Sender as TGTKView).Focused + then AFGColor := ActiveItemGDKColor + else AFGColor := InactiveItemGDKColor; + end else AFGColor := ItemColor; + end; + if not Sel then ABGColor := NormalItemGDKBackground else + if (Sender as TGTKView).Focused then ABGColor := ActiveItemGDKBackground + else ABGColor := InactiveItemGDKBackground; + + + + // ################ Setting the properties + if not ImageCol then begin + if Editing and (InplaceEditItem.Data = Data) and (ColumnID < 3) and ((ColumnID = 0) or (ColumnID = 1) or Assigned(tree_column^.editable_widget)) + then begin + if (ColumnID = 0) or (ColumnID = 1) then s := PChar(ANSIToUTF8(string(AName))) else s := nil; + g_object_set(cell, 'text', s, 'foreground-gdk', AFGColor, nil); + if Application.GTKVersion_2_2_0_Up or (not ConfUseFileTypeIcons) then + g_object_set(cell, 'background-gdk', ABGColor, nil); + end + else begin // not editing + if ConfDirsInBold then begin + if IsDir or UpDir then g_object_set(cell, 'markup', PChar(Format('%s', [QuoteMarkupStr(ColumnData[ColumnID])])), 'foreground-gdk', AFGColor, nil) + else g_object_set(cell, 'markup', PChar(QuoteMarkupStr(ColumnData[ColumnID])), 'foreground-gdk', AFGColor, nil); + end else g_object_set(cell, 'text', ColumnData[ColumnID], 'foreground-gdk', AFGColor, nil); + if Application.GTKVersion_2_2_0_Up or (not ConfUseFileTypeIcons) then + g_object_set(cell, 'background-gdk', ABGColor, nil); // Older versions have bug in color filling + end; + end else // this is the image column + if ConfUseFileTypeIcons then begin // Assign icons + if Application.GTKVersion_2_2_0_Up then + g_object_set(cell, 'cell-background-gdk', ABGColor, nil); // Older versions don't have this property + if Sel and (not (Sender as TGTKView).Focused) and Application.GTKVersion_2_2_0_Up then begin + if InactiveItemsTimer.Enabled then InactiveItemsTimer.Enabled := False; + if Sender = LeftListView then RedrawLeftInactive := True + else RedrawRightInactive := True; + InactiveItemsTimer.Enabled := not Application.GTKVersion_2_6_0_Up; + end; + if Icon <> nil then g_object_set(cell, 'pixbuf', Icon, nil); + end; + end; +end; + +procedure TFMain.F7ButtonClick(Sender: TObject); +var LeftPanel: boolean; + ListView: TGTKListView; + Engine: TPanelEngine; + NewDir: string; +begin + try + InternalLock; + try + if Sender = F7Button then LeftPanel := LeftLastFocused else + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else Exit; + if LeftPanel then ListView := LeftListView + else ListView := RightListView; + if LeftPanel then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + + try + FNewDir := TFNewDir.Create(Self); + if FNewDir.Run = mbOK + then NewDir := Utf8ToAnsi(FNewDir.Entry.Text) + else Exit; + finally + FNewDir.Free; + end; + + if NewDir = '' then Exit; + if not MakeDirectory(ListView, Engine, LeftPanel, NewDir) then Exit; + ChangingDir(LeftPanel, Engine.Path, NewDir); + DoRefresh(not LeftPanel, True, True); + except end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.DoGetDirSize(AllItems: boolean); +var LeftPanel: boolean; + ListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; +begin + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else Exit; + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + RunningEscSensitive := 1; + GetDirSize(ListView, Engine, DataList, AllItems); + FMainEscPressed := False; + RunningEscSensitive := 0; +end; + +procedure TFMain.DoDelete(LeftPanel: boolean; ListView: TGTKListView; Engine: TPanelEngine; DataList: TList); +var i, j : integer; + SelCount: longint; + s, s2, smsg, NextItem1, NextItem2: string; + Data: PDataItem; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; +begin + try + InternalLock; + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + + if (SelCount = 0) and ((not Assigned(ListView.Selected)) or PDataItem(ListView.Selected.Data)^.UpDir) then begin +// WriteLn(integer(mbApply), ', ', integer(Application.MessageBox(LANGNoFilesSelected, [mbOK], mbInfo, mbNone, mbApply))); + Application.MessageBox(LANGNoFilesSelected, [mbOK], mbInfo, mbNone, mbOK); + Exit; + end; + + Data := nil; + if Assigned(ListView.Selected) then Data := ListView.Selected.Data; + if SelCount > 0 then begin + j := 0; + s2 := ''; + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then begin + s2 := s2 + #10 + AName; + Inc(j); + if j = 5 then Break; + end; + if SelCount > j then s2 := s2 + #10 + '...'; + s := Format(LANGSelectedFilesDirectories, [SelCount]); + smsg := Format(LANGDoYouReallyWantToDeleteTheSS, [s, s2]); + end else begin + if Assigned(Data) then + if Data^.IsDir then s := Format(LANGDirectoryS, [ANSIToUTF8(string(Data^.AName))]) + else s := Format(LANGFileS, [ANSIToUTF8(string(Data^.AName))]); + smsg := Format(LANGDoYouReallyWantToDeleteTheS, [s]); + end; + if Application.MessageBox(QuotePercentStr(smsg), [mbYes, mbNo], mbQuestion, mbNone, mbNo) <> mbYes then Exit; + + FindNextSelected(ListView, DataList, NextItem1, NextItem2); + AWorkingThread := TWorkerThread.Create; + DebugMsg(['TFMain.DoDelete: Creating thread...']); + AFProgress := TFProgress.Create(Self); + try + AFProgress.SetNumBars(False); +// AFProgress.ProgressBar.Max := 100; + AFProgress.ProgressBar.Value := 0; + AWorkingThread.ProgressForm := AFProgress; + if Assigned(ListView.Selected) then AWorkingThread.SelectedItem := ListView.Selected.Data; + AWorkingThread.Engine := Engine; + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := DeleteFilesWorker; + AWorkingThread.Resume; + +// AFProgress.Run; + + AFProgress.ParentForm := FMain; + AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + + +{ FProgress.ShowModal; + Application.ProcessMessages; + repeat + Sleep(100); + Application.ProcessMessages; +// FProgress.Run; + until False; } + +{ FProgress.ShowModal; + DeleteFiles(FProgress, ListView, Engine, LeftPanel, DataList); } + + finally + AFProgress.Free; + AWorkingThread.Free; + DebugMsg(['TFMain.DoDelete: Freeing thread...']); + end; + ChangingDir(LeftPanel, Engine.Path, NextItem1, NextItem2); + DoRefresh(not LeftPanel, True, True); + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.F8ButtonClick(Sender: TObject); +var LeftPanel: boolean; + ListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; +begin + try + if (Sender = F8Button) or (Sender is TGTKMenuItem) + then LeftPanel := LeftLastFocused else + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else Exit; + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + DoDelete(LeftPanel, ListView, Engine, DataList); + except end; +end; + +procedure TFMain.F5ButtonClick(Sender: TObject); +var LeftPanel: boolean; + ListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; +begin + try + if Sender = F5Button then LeftPanel := LeftLastFocused else + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else Exit; + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + DoCopyMove(LeftPanel, True, Sender = nil, ListView, Engine, DataList); + except end; +end; + +procedure TFMain.F6ButtonClick(Sender: TObject); +var LeftPanel: boolean; + ListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; +begin + try + if (Sender = F6Button) or (Sender = F2Button) or (Sender is TGTKMenuItem) + then LeftPanel := LeftLastFocused else + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else Exit; + if LeftPanel then begin + ListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + ListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + DoCopyMove(LeftPanel, False, (Sender = nil) or (Sender = F2Button) or (Sender is TGTKMenuItem), ListView, Engine, DataList); + except end; +end; + +procedure TFMain.DoCopyMove(LeftPanel, CopyMode, ShiftPressed: boolean; ListView: TGTKListView; Engine: TPanelEngine; DataList: TList); +var i: integer; + SelCount: longint; + NewPath, SelSingle, NextItem1, NextItem2: string; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; + CurrentEngine, OppositeEngine: TPanelEngine; + s: string; +begin + try + InternalLock; + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + + if (SelCount = 0) and ((not Assigned(ListView.Selected)) or PDataItem(ListView.Selected.Data)^.UpDir) then begin + Application.MessageBox(LANGNoFilesSelected, [mbOK], mbInfo, mbNone, mbOK); + Exit; + end; + + SelSingle := ''; + if SelCount = 0 then begin + SelCount := 1; + SelSingle := PDataItem(ListView.Selected.Data)^.AName; + end; + + if LeftPanel then begin + CurrentEngine := LeftPanelEngine; + OppositeEngine := RightPanelEngine; + end else begin + CurrentEngine := RightPanelEngine; + OppositeEngine := LeftPanelEngine; + end; + + try + FCopyMove := TFCopyMove.Create(Self); + if CopyMode then begin + FCopyMove.Caption := LANGCopyFiles; + FCopyMove.Label1.Caption := Format(LANGCopyDFileDirectoriesTo, [SelCount]); + end else begin + FCopyMove.Caption := LANGMoveRenameFiles; + FCopyMove.Label1.Caption := Format(LANGMoveRenameDFileDirectoriesTo, [SelCount]); + end; + if ShiftPressed then begin + if SelSingle <> '' then FCopyMove.Entry.Text := ANSIToUTF8(SelSingle) + else FCopyMove.Entry.Text := '*.*'; + end else + if OppositeEngine is TLocalTreeEngine then FCopyMove.Entry.Text := ANSIToUTF8(OppositeEngine.Path) + else FCopyMove.Entry.Text := ANSIToUTF8(Format(ConstFullPathFormatStr, [OppositeEngine.GetPrefix, OppositeEngine.Path])); + FCopyMove.Entry.SelectAll; + if FCopyMove.Run <> mbOK then Exit; + NewPath := UTF8ToANSI(FCopyMove.Entry.Text); + finally + FCopyMove.Free; + end; + + // Handle password in archives + if (CurrentEngine is TVFSEngine) and (CurrentEngine as TVFSEngine).GetPasswordRequired and (Length((CurrentEngine as TVFSEngine).Password) < 1) then + if not HandleSetPassword(CurrentEngine) then Exit; + if (OppositeEngine is TVFSEngine) and (OppositeEngine as TVFSEngine).GetPasswordRequired and (Length((OppositeEngine as TVFSEngine).Password) < 1) then + if not HandleSetPassword(OppositeEngine) then Exit; + + FindNextSelected(ListView, DataList, NextItem1, NextItem2); + AWorkingThread := TWorkerThread.Create; + DebugMsg(['TFMain.DoCopyMove: Creating thread...']); + AFProgress := TFProgress.Create(Self); + try + if CopyMode then AFProgress.Label1.Caption := LANGCopySC + else AFProgress.Label1.Caption := LANGMoveRenameSC; + AFProgress.SetNumBars(True); + AFProgress.ProgressBar.Value := 0; + AWorkingThread.ProgressForm := AFProgress; + if Assigned(ListView.Selected) then AWorkingThread.SelectedItem := ListView.Selected.Data; + AWorkingThread.DestEngine := nil; + AWorkingThread.SrcEngine := Engine; + + // Determine on which engine the entered path is + if Pos(ConstPathDelim, NewPath) = 0 then begin + if OppositeEngine is TLocalTreeEngine then AWorkingThread.DestEngine := OppositeEngine else + if CurrentEngine is TLocalTreeEngine then AWorkingThread.DestEngine := CurrentEngine + else begin + Application.MessageBox(LANGCannotDetermineDestinationEngine, [mbOK], mbError, mbOK, mbOK); + Exit; + end; + end else begin + s := Copy(NewPath, 1, Pos(ConstPathDelim, NewPath) - 1); + if s = OppositeEngine.GetPrefix then AWorkingThread.DestEngine := OppositeEngine else + if s = CurrentEngine.GetPrefix then AWorkingThread.DestEngine := CurrentEngine + else begin + Application.MessageBox(LANGCannotDetermineDestinationEngine, [mbOK], mbError, mbOK, mbOK); + Exit; + end; + end; + if AWorkingThread = nil then begin // Something went terribly wrong + Application.MessageBox(LANGCannotDetermineDestinationEngine, [mbOK], mbError, mbOK, mbOK); + Exit; + end; + + // Strip the engine prefix + if Pos(ConstPathDelim, NewPath) > 0 then Delete(NewPath, 1, Pos(ConstPathDelim, NewPath)); + + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := CopyFilesWorker; +// AWorkingThread.WorkerProcedure := DummyThreadWorker; + AWorkingThread.ParamBool3 := CopyMode; + AWorkingThread.ParamBool4 := False; + AWorkingThread.ParamString1 := NewPath; + AWorkingThread.ParamDataItem1 := nil; + + AFProgress.ParentForm := FMain; + AFProgress.ShowModal; + Application.ProcessMessages; + + DebugMsg(['*** Copy: AWorkingThread.Resume']); +// DebugMsg(['*** Copy: xg_thread_supported = ', xg_thread_supported()]); + AWorkingThread.Resume; +// AWorkingThread.WorkerProcedure(AWorkingThread); + DebugMsg(['*** Copy: AWorkingThread.Resumed.']); + ProcessProgressThread(AWorkingThread, AFProgress); +// DebugMsg(['***************************x1']); + AFProgress.Close; +// Beep; + finally +// DebugMsg(['** ddddddddddddddd ???']); + AFProgress.Free; + DebugMsg(['TFMain.DoCopyMove: Freeing thread...']); + AWorkingThread.Free; + end; + ChangingDir(LeftPanel, Engine.Path, NextItem1, NextItem2); + DoRefresh(not LeftPanel, True, False); + finally + DebugMsg(['** TFMain.DoCopyMove finished']); + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.ListViewDblClick(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +begin + DebugMsg(['DblClick']); + Accept := True; // This causes selecting the item if clicked is different than selected + if (Sender as TGTKListView).GetItemAtPos(X, Y) <> (Sender as TGTKListView).Selected then Exit; + Accept := False; + DebugMsg(['DblClick OK']); + if not (Sender as TGTKListView).Focused then (Sender as TGTKListView).SetFocus; + if Assigned((Sender as TGTKListView).Selected) and Assigned((Sender as TGTKListView).Selected.Data) + then ActivateItem((Sender as TGTKListView).Selected.Index, True); +end; + +procedure TFMain.ListViewMouseDown(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +var Item: TGTKListItem; + Click: TDateTime; +begin + try + InternalLock; +// DebugMsg(['ListViewMouseDown, X = ', X, ', Y = ', Y]); + if Button = mbLeft then begin + Click := Now; + if LastClick + ConfDblClickDelay/MSecsPerDay > Click then begin + Accept := False; + InplaceEditTimer.Enabled := False; + LastClick := 0; + ListViewDblClick(Sender, Button, Shift, X, Y, Accept); + Exit; + end; + LastClick := Click; + DebugMsg(['Click, Focus = ', (Sender as TGTKControl).Focused]); + if not (Sender as TGTKListView).Focused then Exit; // (Sender as TGTKListView).SetFocus; + Item := (Sender as TGTKListView).GetItemAtPos(X, Y); + if (Item = (Sender as TGTKListView).Selected) and Assigned(Item) and Assigned((Sender as TGTKListView).Selected) and + Assigned(Item.Data) and (not PDataItem(Item.Data)^.UpDir) and (Sender as TGTKListView).Focused and (not ConfDisableMouseRename) then + begin + DebugMsg(['Quick-Rename']); + InplaceEditTimer.Interval := ConfQuickRenameDelay; + InplaceEditTimer.Enabled := True; + InplaceEditItem := Item; + end; + Accept := True; + end else + if Button = mbRight then begin + if not (Sender as TGTKListView).Focused then (Sender as TGTKListView).SetFocus; + Item := (Sender as TGTKListView).GetItemAtPos(X, Y); + if Assigned(Item) then begin + Item.Selected := True; + Item.SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + end; + end; + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.InplaceEditTimerTimer(Sender: TObject); +var LeftPanel: boolean; + ListView: TGTKListView; +begin + InplaceEditTimer.Enabled := False; + try + LeftPanel := LeftLastFocused; + if LeftPanel then begin + ListView := LeftListView; + end else begin + ListView := RightListView; + end; + if ListView.Selected <> InplaceEditItem then Exit; + DoQuickRename(LeftPanel, ListView, False); + except end; +end; + +procedure TFMain.DoQuickRename(LeftPanel: boolean; ListView: TGTKListView; const CalledFromKey: boolean); +var i: integer; +begin + if (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.Data)) or + PDataItem(ListView.Selected.Data)^.UpDir or Editing then Exit; + Editing := True; + if CalledFromKey then InplaceEditItem := ListView.Selected; + for i := 1 to ConstNumPanelColumns do + if ColumnSortIDs[i] in [1, 2] then begin + ListView.Columns[i - 1].SetProperty('editable', 1); + ListView.StartEditing(i - 1); + Break; + end; +end; + +procedure TFMain.ListViewEdited(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem; var NewText: string; var AllowChange: boolean; var DataColumn: integer); +var AListView: TGTKListView; + DataList: TList; + Engine: TPanelEngine; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; + i: integer; + s1, s2: string; +begin + try + InternalLock; + AListView := (((Sender as TGTKTreeViewColumn).Parent as TGTKTreeViewColumns).Parent as TGTKListView); + for i := 1 to ConstNumPanelColumns do + if ColumnSortIDs[i] in [1, 2] then begin + AListView.Columns[i - 1].SetProperty('editable', 0); + Break; + end; + if AListView = LeftListView then begin + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + Editing := False; + if (AListView.Selected = InplaceEditItem) and (AListView.Selected.Data = InplaceEditItem.Data) and + (String(PDataItem(InplaceEditItem.Data)^.AName) <> NewText) then + begin + AWorkingThread := TWorkerThread.Create; + DebugMsg(['TFMain.ListViewEdited: Creating thread...']); + AFProgress := TFProgress.Create(Self); + try + AFProgress.SetNumBars(True); + AFProgress.ProgressBar.Value := 0; + AFProgress.Label1.Caption := LANGMoveRenameSC; + AWorkingThread.ProgressForm := AFProgress; + if Assigned(AListView.Selected) then AWorkingThread.SelectedItem := AListView.Selected.Data; + AWorkingThread.SrcEngine := Engine; + AWorkingThread.DestEngine := Engine; + AWorkingThread.LeftPanel := AListView = LeftListView; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := CopyFilesWorker; + AWorkingThread.ParamBool3 := False; + AWorkingThread.ParamBool4 := True; + AWorkingThread.ParamString1 := UTF8ToANSI(NewText); + AWorkingThread.ParamDataItem1 := InplaceEditItem.Data; + AWorkingThread.Resume; +// AWorkingThread.WorkerProcedure(AWorkingThread); + AFProgress.ParentForm := FMain; + AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + finally + AFProgress.Free; + DebugMsg(['TFMain.ListViewEdited: Freeing thread...']); + AWorkingThread.Free; + end; + s1 := ''; s2 := ''; + FindNextSelected(AListView, DataList, s1, s2); + ChangingDir(AListView = LeftListView, Engine.Path, {String(PDataItem(InplaceEditItem.Data)^.AName),} NewText, s2); + DoRefresh(AListView <> LeftListView, True, True); + end; + AListView.SetFocus; + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.ListViewSelectionChanged(Sender: TObject); +var i: integer; +// AListView: TGTKListView; +begin + if Editing and ((Sender as TGTKListView).Selected <> InplaceEditItem) then begin + Editing := False; + for i := 1 to ConstNumPanelColumns do + if ColumnSortIDs[i] in [1, 2] then begin + (Sender as TGTKListView).Columns[i - 1].SetProperty('editable', 0); + Break; + end; + end; + if QuickFind then DeactivateQuickFind(Sender = LeftListView); + if Sender = LeftListView then begin + if LeftPanelNotebook.Visible and (LeftPathsHighlight.Count > LeftPanelNotebook.PageIndex) and (LeftPanelNotebook.PageIndex >= 0) and + Assigned(LeftListView.Selected) and Assigned(LeftListView.Selected.Data) + then LeftPathsHighlight[LeftPanelNotebook.PageIndex] := PDataItem(LeftListView.Selected.Data)^.AName; + end else + if RightPanelNotebook.Visible and (RightPathsHighlight.Count > RightPanelNotebook.PageIndex) and (RightPanelNotebook.PageIndex >= 0) and + Assigned(RightListView.Selected) and Assigned(RightListView.Selected.Data) + then RightPathsHighlight[RightPanelNotebook.PageIndex] := PDataItem(RightListView.Selected.Data)^.AName; +{ if Application.GTKVersion_2_6_0_Up then begin + AListView := Sender as TGTKListView; + if Assigned(AListView) and Assigned(AListView.Selected) and Assigned(AListView.Selected.Data) and Assigned(PDataItem(AListView.Selected.Data)^.ItemColor) + then gtk_widget_modify_text(AListView.FWidget, GTK_STATE_SELECTED, PDataItem(AListView.Selected.Data)^.ItemColor); + end; } +end; + +procedure TFMain.ActivateQuickFind(LeftPanel: boolean); +var Entry: TGTKEntry; +begin + QuickFind := True; + if LeftPanel then begin + Entry := LeftQuickFindEntry; + LeftQuickFindVBox.Show; + end else begin + Entry := RightQuickFindEntry; + RightQuickFindVBox.Show; + end; + Entry.Text := ''; +end; + +procedure TFMain.QuickFindEntryEnter(Sender: TObject; var Accept: boolean); +begin + Accept := False; + (Sender as TGTKControl).SetFocus; +end; + +procedure TFMain.DeactivateQuickFind(LeftPanel: boolean); +begin + QuickFind := False; + if LeftPanel then LeftQuickFindVBox.Hide + else RightQuickFindVBox.Hide; +end; + +function TFMain.QuickFindSendKey(LeftPanel: boolean; Key: word): boolean; +var Entry: TGTKEntry; + s, NewText: string; + i: integer; + AListView: TGTKListView; + DataList: TList; + Data: PDataItem; + Found: boolean; + OldSelectionChangedEvent: TNotifyEvent; +begin + Result := False; + if not QuickFind then Exit; + if LeftPanel then begin + Entry := LeftQuickFindEntry; + AListView := LeftListView; + DataList := LeftPanelData; + end else begin + Entry := RightQuickFindEntry; + AListView := RightListView; + DataList := RightPanelData; + end; + if Key = GDK_BACKSPACE then begin + if Length(Entry.Text) > 0 then Entry.Text := AnsiToUTF8(Copy(UTF8ToAnsi(Entry.Text), 1, Length(UTF8ToAnsi(Entry.Text)) - 1)); + NewText := UTF8ToAnsi(Entry.Text); + end else begin + s := UTF8ToANSI(UTF8Encode(WideChar(KeyValToUnicode(Key)))); + if (Length(s) = 0) or (s = #0) then Exit; + NewText := UTF8ToAnsi(Entry.Text) + s; + end; + if (DataList.Count > 0) and (Length(NewText) > 0) then begin + Found := False; + for i := 0 to DataList.Count - 1 do begin + Data := DataList[AListView.ConvertFromSorted(i)]; + if Assigned(Data) and (not Data^.UpDir) and (Pos(AnsiUpperCase(NewText), AnsiUpperCase(Data^.AName)) = 1) then begin + Found := True; + OldSelectionChangedEvent := AListView.OnSelectionChanged; + AListView.OnSelectionChanged := nil; + AListView.Selected := AListView.Items[AListView.ConvertFromSorted(i)]; + AListView.Items[AListView.ConvertFromSorted(i)].SetCursor(0, False, False, 0, 0); + AListView.OnSelectionChanged := OldSelectionChangedEvent; + Break; + end; + end; + if Found then Entry.Text := AnsiToUTF8(NewText) + else Beep; + Result := True; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.miVerifyChecksumsClick(Sender: TObject); +var i, SelCount: integer; + b, LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) and (not IsDir) then Inc(SelCount); + if (SelCount = 0) and ((not Assigned(AListView.Selected)) or PDataItem(AListView.Selected.Data)^.UpDir or PDataItem(AListView.Selected.Data)^.IsDir) then begin + Application.MessageBox(LANGYouMustSelectAValidFile, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + + try + FChecksum := TFChecksum.Create(Self); + FChecksum.Engine := Engine; + FChecksum.DataList := DataList; + FChecksum.AListView := AListView; + if SelCount = 0 then b := FChecksum.ProcessFile(IncludeTrailingPathDelimiter(Engine.Path) + string(PDataItem(AListView.Selected.Data)^.AName)) + else begin + b := False; + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if (not UpDir) and (not IsDir) and Selected then {$B+} + b := b or FChecksum.ProcessFile(IncludeTrailingPathDelimiter(Engine.Path) + string(AName)); + {$B-} + end; + if b and (FChecksum.List.Count > 0) then FChecksum.Run; + finally + FChecksum.Free; + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.miCreateChecksumsClick(Sender: TObject); +var i, SelCount: integer; + LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) and (not IsDir) then Inc(SelCount); + if (SelCount = 0) and ((not Assigned(AListView.Selected)) or PDataItem(AListView.Selected.Data)^.UpDir or PDataItem(AListView.Selected.Data)^.IsDir) then begin + Application.MessageBox(LANGYouMustSelectAtLeastOneFileToCalculateChecksum, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + + try + FChecksumDruid := TFChecksumDruid.Create(Self); + Engine.ExplicitChDir(Engine.Path); + FChecksumDruid.Engine := Engine; + if Engine.Path = '/' then FChecksumDruid.DirName := 'root' + else FChecksumDruid.DirName := ExtractFileName(ExcludeTrailingPathDelimiter(Engine.Path)); + if SelCount = 0 then FChecksumDruid.FileNames.Add(IncludeTrailingPathDelimiter(Engine.Path) + string(PDataItem(AListView.Selected.Data)^.AName)) + else + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if (not UpDir) and (not IsDir) and Selected then + FChecksumDruid.FileNames.Add(IncludeTrailingPathDelimiter(Engine.Path) + string(AName)); + FChecksumDruid.Run; + finally + if FChecksumDruid.SeparateFileCheckBox.Checked + then DoRefresh(AListView = LeftListView, True, True) + else ChangingDir(AListView = LeftListView, Engine.Path, FChecksumDruid.FileNameEntry.Text, PDataItem(AListView.Selected.Data)^.AName); + DoRefresh(AListView <> LeftListView, True, True); + FChecksumDruid.Free; + Engine.ExplicitChDir('/'); + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.miMergeFilesClick(Sender: TObject); +var LeftPanel, HasInitialCRC: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + FilePath, s, TargetName: string; + TargetCRC: LongWord; + TargetSize: Int64; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + end; + + if (not Assigned(AListView.Selected)) or (not Assigned(AListView.Selected.Data)) or PDataItem(AListView.Selected.Data)^.IsDir or + PDataItem(AListView.Selected.Data)^.UpDir then + begin + Application.MessageBox(LANGYouMustSelectAValidFile, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + + FilePath := ''; + try + FNewDir := TFNewDir.Create(Self); + FNewDir.Caption := LANGMergeCaption; + FNewDir.Label1.SetSizeRequest(500, -1); + FNewDir.Label1.Caption := Format(LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory, [ANSIToUTF8(PDataItem(AListView.Selected.Data)^.AName)]); + if LeftPanel then FNewDir.Entry.Text := ANSIToUTF8(RightPanelEngine.Path) + else FNewDir.Entry.Text := ANSIToUTF8(LeftPanelEngine.Path); + FNewDir.Entry.SelectAll; + if FNewDir.Run = mbOK + then FilePath := UTF8ToAnsi(FNewDir.Entry.Text) + else Exit; + finally + FNewDir.Free; + end; + if FilePath = '' then Exit; + + AWorkingThread := TWorkerThread.Create; + DebugMsg(['TFMain.miMergeFilesClick: Creating thread...']); + AFProgress := TFProgress.Create(Self); + try + AWorkingThread.ParamString1 := FilePath; + AWorkingThread.ParamString2 := IncludeTrailingPathDelimiter(Engine.Path) + PDataItem(AListView.Selected.Data)^.AName; + HasInitialCRC := CRCGetInfo(AWorkingThread.ParamString2, Engine, TargetName, TargetCRC, TargetSize); + AWorkingThread.ParamString3 := TargetName; + AWorkingThread.ParamBool1 := HasInitialCRC; + AWorkingThread.ParamLongWord1 := TargetCRC; + AWorkingThread.ParamInt64 := TargetSize; + AFProgress.SetNumBars(HasInitialCRC); + AFProgress.ProgressBar.Value := 0; + AFProgress.Label1.Caption := LANGMergeSC; + AWorkingThread.ProgressForm := AFProgress; + AWorkingThread.Engine := Engine; + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.WorkerProcedure := MergeFilesWorker; + AWorkingThread.Resume; + AFProgress.ParentForm := FMain; + AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + s := AWorkingThread.ParamString3; + finally + AFProgress.Free; + DebugMsg(['TFMain.miMergeFilesClick: Freeing thread...']); + AWorkingThread.Free; + end; + + ChangingDir(LeftPanel, Engine.Path, s, PDataItem(AListView.Selected.Data)^.AName); + DoRefresh(not LeftPanel, True, True); + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.miSplitFileClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + FilePath: string; + DeleteTarget: boolean; + MaxSize: Int64; + i: integer; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + end; + + if (not Assigned(AListView.Selected)) or (not Assigned(AListView.Selected.Data)) or PDataItem(AListView.Selected.Data)^.IsDir or + PDataItem(AListView.Selected.Data)^.UpDir then + begin + Application.MessageBox(LANGYouMustSelectAValidFile, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + + FilePath := ''; + try + FSplitFile := TFSplitFile.Create(Self); + FSplitFile.Label1.Caption := Format(LANGSplitTheFileSToDirectory, [ANSIToUTF8(PDataItem(AListView.Selected.Data)^.AName)]); + FSplitFile.Label1.UseUnderline := True; + if LeftPanel then FSplitFile.Entry.Text := AnsiToUtf8(RightPanelEngine.Path) + else FSplitFile.Entry.Text := AnsiToUtf8(LeftPanelEngine.Path); + FSplitFile.Entry.SelectAll; + if FSplitFile.Run = mbOK + then FilePath := UTF8ToAnsi(FSplitFile.Entry.Text) + else Exit; + DeleteTarget := FSplitFile.DeleteTargetCheckBox.Checked; + MaxSize := 0; + for i := 1 to Length(SplitConsts) do + if Trim(AnsiUpperCase(SplitConsts[i].Title)) = Trim(AnsiUpperCase(FSplitFile.SizeCombo.Entry.Text)) then + begin + MaxSize := SplitConsts[i].PartSize; + Break; + end; + if MaxSize = 0 then MaxSize := GetStrSize(UTF8ToANSI(FSplitFile.SizeCombo.Entry.Text)); + finally + FSplitFile.Free; + end; + if FilePath = '' then Exit; + + AWorkingThread := TWorkerThread.Create; + DebugMsg(['TFMain.miSplitFileClick: Creating thread...']); + AFProgress := TFProgress.Create(Self); + try + AWorkingThread.ParamString1 := IncludeTrailingPathDelimiter(Engine.Path) + PDataItem(AListView.Selected.Data)^.AName; + AWorkingThread.ParamString2 := FilePath; + AWorkingThread.ParamBool1 := DeleteTarget; + AWorkingThread.ParamInt64 := MaxSize; + AFProgress.SetNumBars(MaxSize > 0); + AFProgress.ProgressBar.Value := 0; + AFProgress.Label1.Caption := LANGSplitSC; + AWorkingThread.ProgressForm := AFProgress; + AWorkingThread.Engine := Engine; + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.WorkerProcedure := SplitFilesWorker; + AWorkingThread.Resume; + AFProgress.ParentForm := FMain; + AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + finally + AFProgress.Free; + DebugMsg(['TFMain.miSplitFileClick: Freeing thread...']); + AWorkingThread.Free; + end; + + DoRefresh(LeftPanel, True, True); + DoRefresh(not LeftPanel, True, True); + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.SwitchOtherPanel(LeftPanel, RequestNewAltO: boolean); +var AListView: TGTKListView; + SrcEngine, OrigSrcEngine, TargetEngine: TPanelEngine; + s: string; + DontShowAgain: boolean; +begin + if LeftPanel then begin + AListView := LeftListView; + SrcEngine := LeftPanelEngine; + TargetEngine := RightPanelEngine; + end else begin + AListView := RightListView; + SrcEngine := RightPanelEngine; + TargetEngine := LeftPanelEngine; + end; + OrigSrcEngine := SrcEngine; + + if not (SrcEngine is TLocalTreeEngine) then begin + if ConfSwitchOtherPanelBehaviour < 0 then begin + MessageBoxShowOnce(LANGSwitchOtherPanelWarning, LANGDontShowAgain, DontShowAgain, [mbOK], mbWarning, mbOK, mbOK); + if DontShowAgain then begin + ConfSwitchOtherPanelBehaviour := 1; + WriteMainGUISettings; + end; + end; +// Exit; + end; + + // don't change dir in VFS engines + while not (SrcEngine is TLocalTreeEngine) do SrcEngine := SrcEngine.ParentEngine; + while not (TargetEngine is TLocalTreeEngine) do TargetEngine := TargetEngine.ParentEngine; + + if (not ConfNewStyleAltO) and (not RequestNewAltO) then begin + s := ExcludeTrailingPathDelimiter(SrcEngine.Path); + if OrigSrcEngine = SrcEngine then begin + if (not Assigned(AListView.Selected)) or (not Assigned(AListView.Selected.Data)) or PDataItem(AListView.Selected.Data)^.UpDir or + (not PDataItem(AListView.Selected.Data)^.IsDir) + then begin if Length(s) > 1 then s := IncludeTrailingPathDelimiter(Copy(s, 1, LastDelimiter(PathDelim, s))); end + else s := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(s) + PDataItem(AListView.Selected.Data)^.AName); + end; + if IncludeTrailingPathDelimiter(TargetEngine.Path) <> s then begin + if LeftPanel then RightPanelEngine := TargetEngine + else LeftPanelEngine := TargetEngine; + ChangingDir(not LeftPanel, s); + end; + // Move one item down + if (OrigSrcEngine = SrcEngine) and Assigned(AListView.Selected) and (AListView.ConvertToSorted(AListView.Selected.Index) < AListView.Items.Count - 1) then begin + AListView.Selected := AListView.Items[AListView.ConvertFromSorted(AListView.ConvertToSorted(AListView.Selected.Index) + 1)]; + AListView.Selected.SetCursor(0, False, False, 0, 0); + end; + end else begin + if IncludeTrailingPathDelimiter(TargetEngine.Path) <> IncludeTrailingPathDelimiter(SrcEngine.Path) then begin + if LeftPanel then RightPanelEngine := TargetEngine + else LeftPanelEngine := TargetEngine; + ChangingDir(not LeftPanel, SrcEngine.Path); + end; + end; +end; + +procedure TFMain.miShowDotFilesClick(Sender: TObject); +begin + ConfShowDotFiles := miShowDotFiles.Checked; + DoRefresh(True, True, True); + DoRefresh(False, True, True); +end; + +procedure TFMain.F3F4ButtonClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + end else begin + AListView := RightListView; + end; + if (not Assigned(AListView.Selected)) or (not Assigned(AListView.Selected.Data)) or PDataItem(AListView.Selected.Data)^.IsDir or + PDataItem(AListView.Selected.Data)^.UpDir then + begin + Application.MessageBox(LANGYouMustSelectAValidFile, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + EditViewFile(LeftPanel, AListView, (Sender = F3Button) or ((Sender is TGTKMenuItem) and (Integer((Sender as TGTKMenuItem).Data) = 200)), False); + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.EditViewFile(LeftPanel: boolean; AListView: TGTKListView; View, NewFile: boolean); +var ANewDir: TFNewDir; + Engine: TPanelEngine; + AFile, s: string; + Stat: PDataItemSL; + Error, x: integer; +// AViewer: TViewerThread; + AViewer: TFViewer; +begin + try + InternalLock; + if LeftPanel then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + if NewFile then begin + ANewDir := TFNewDir.Create(Self); + try + ANewDir.Caption := LANGEdit; + ANewDir.Label1.Caption := LANGEnterFilenameToEdit; + ANewDir.Label1.UseUnderline := True; + ANewDir.Label1.FocusControl := ANewDir.Entry; + if Assigned(AListView.Selected) and Assigned(AListView.Selected.Data) and (not PDataItem(AListView.Selected.Data)^.IsDir) and + (not PDataItem(AListView.Selected.Data)^.UpDir) + then ANewDir.Entry.Text := AnsiToUTF8(PDataItem(AListView.Selected.Data)^.AName) + else ANewDir.Entry.Text := ''; + if Length(ANewDir.Entry.Text) > 0 then ANewDir.Entry.SelectAll; + if ANewDir.Run <> mbOK then Exit; + AFile := IncludeTrailingPathDelimiter(Engine.Path) + UTF8ToAnsi(ANewDir.Entry.Text); + finally + ANewDir.Free; + end; + end else AFile := IncludeTrailingPathDelimiter(Engine.Path) + PDataItem(AListView.Selected.Data)^.AName; + + EditViewFileInternal(Self, AFile, Engine, View, NewFile); + + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.EditViewFileInternal(ParentWindow: TGTKControl; Filename: string; Engine: TPanelEngine; View, NewFile: boolean); +var s: string; + Stat: PDataItemSL; + Error, x: integer; +// AViewer: TViewerThread; + AViewer: TFViewer; +begin + Stat := Engine.GetFileInfoSL(Filename); + if Assigned(Stat) and (Stat^.Size > ConfEditViewFileSizeLimit) and + (Application.MessageBox(LANGTheFileYouAreTryingToOpenIsQuiteBig, [mbYes, mbNo], mbWarning, mbNone, mbNo) = mbNo) + then Exit; + + if View then s := ConfViewer + else s := ConfEditor; + + if (Engine is TVFSEngine) and (not NewFile) then + if not HandleRunFromArchive(Filename, Engine, s, '', True) then Exit; + + if ConfUseInternalViewer and View then begin +(* AViewer := TViewerThread.Create(Self); + if not AViewer.LoadFile(AFile) then begin + Application.MessageBox(Format('Cannot load file ''%s''. Please check the permissions.', [ANSIToUTF8(AFile)]), [mbOK], mbError); + AViewer.Free; + end else AViewer.Resume; *) + AViewer := TFViewer.Create(ParentWindow); + if not AViewer.LoadFile(Filename) then begin + Application.MessageBox(Format(LANGCannotLoadFile, [ANSIToUTF8(Filename)]), [mbOK], mbError, mbNone, mbOK); + AViewer.Free; + end else begin +// gtk_window_set_transient_for(PGtkWindow(AViewer.FWidget), PGtkWindow(ParentWindow.FWidget)); + AViewer.Show; + end; + end else begin + if View then x := ConfViewerTerminalBehaviour + else x := ConfEditorTerminalBehaviour; + if not ExecuteProgram(Format('%s %s', [s, QuoteStr(Filename)]), ExtractFilePath(Filename), x = 0, x = 1, Error) then + Application.MessageBox(Format(LANGCannotExecuteSPleaseCheckTheConfiguration, [ANSIToUTF8(s)]), [mbOK], mbError, mbNone, mbOK); + end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.miFileTypesClick(Sender: TObject); +var x: pointer; +begin + try + InternalLock; + FFileTypeSettings := TFFileTypeSettings.Create(Self); + ReadAssoc; + FFileTypeSettings.AssignAssocList(AssocList); + FFileTypeSettings.FillList; + if FFileTypeSettings.Run = mbOK then begin + RemoveIconRefs(FFileTypeSettings.IntAssocList, True); + RemoveIconRefs(AssocList, False); + FFileTypeSettings.CleanItems; + x := AssocList; + AssocList := FFileTypeSettings.IntAssocList; + FFileTypeSettings.IntAssocList := x; + RecreateIcons(AssocList); + DoRefresh(True, True, True); + DoRefresh(False, True, True); + WriteAssoc; + end; + finally + FFileTypeSettings.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.RunFile(Path: string; Engine: TPanelEngine; CustomAction: integer); +var Command, Ext, FileTypeDesc: string; + i, j, Last, ac: integer; + b, AutodetectGUI, RunInTerminal: boolean; + Stat: PDataItemSL; + s: string; +begin + try + InternalLock; + Command := ''; + FileTypeDesc := ''; + AutodetectGUI := True; + RunInTerminal := False; + if (Pos('.', ExtractFileName(Path)) > 0) and (LastDelimiter('.', ExtractFileName(Path)) < Length(ExtractFileName(Path))) then begin + Ext := ANSIUpperCase(Trim(Copy(ExtractFileName(Path), LastDelimiter('.', ExtractFileName(Path)) + 1, Length(ExtractFileName(Path)) - LastDelimiter('.', ExtractFileName(Path))))); + // Search in the association list + if AssocList.Count > 0 then + for i := 0 to AssocList.Count - 1 do + with TFileAssoc(AssocList[i]) do + if (ActionList.Count > 0) and (Length(Trim(Extensions)) > 0) then begin + b := False; + if Pos(';', Extensions) = 0 then b := ANSIUpperCase(Trim(Extensions)) = Ext else begin + Last := 0; + for j := 1 to Length(Extensions) do + if Extensions[j] = ';' then begin + if ANSIUpperCase(Trim(Copy(Extensions, Last + 1, j - Last - 1))) = Ext then begin + b := True; + Break; + end; + Last := j; + end; + if not b then b := ANSIUpperCase(Trim(Copy(Extensions, LastDelimiter(';', Extensions) + 1, Length(Extensions) - LastDelimiter(';', Extensions)))) = Ext; + end; + if b then begin + FileTypeDesc := FileTypeName; + if (CustomAction > ActionList.Count - 1) or (CustomAction = -1) + then ac := DefaultAction + else ac := CustomAction; + if ac > ActionList.Count - 1 then ac := 0; + if ActionList.Count >= ac then begin + Command := Trim(TAssocAction(ActionList[ac]).ActionCommand); + AutodetectGUI := TAssocAction(ActionList[ac]).AutodetectGUI; + RunInTerminal := TAssocAction(ActionList[ac]).RunInTerminal; + end; + if Command <> '' then Break; + end; + end; + end; + + // Association not found, try to execute file itself + if Command = '' then begin + DebugMsg(['File association not found']); + if CustomAction > -1 then begin + DebugMsg(['Some strange error occured...']); + Exit; + end; + Stat := Engine.GetFileInfoSL(Path); + if Assigned(Stat) and Stat^.IsExecutable then begin + b := True; + if Engine is TVFSEngine then b := HandleRunFromArchive(Path, Engine, Command, FileTypeDesc, False); // not a local engine, extract to local first + if b then begin + Libc.__chdir(PChar(ExtractFilePath(Path))); + b := ExecuteProgram(QuoteStr(Path), ExtractFilePath(Path), AutodetectGUI, RunInTerminal, i); + Libc.__chdir(PChar('/')); + end else b := True; // Mask cancelled extraction from VFS + end else begin + if Engine is TVFSEngine then begin + HandleRunFromArchive(Path, Engine, Command, FileTypeDesc, False); + b := True; + end else + if Application.MessageBox(Format(LANGThereIsNoApplicationAssociatedWithS, [ANSIToUTF8(ExtractFileName(Path))]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes + then miFileTypesClick(Self); + Exit; + end; + + end else begin + DebugMsg(['File association found: ', Command]); + s := Command; + b := True; + if Engine is TVFSEngine then b := HandleRunFromArchive(Path, Engine, Command, FileTypeDesc, False); // not a local engine, extract to local first + if Pos('%s', s) > 0 then s := Format(s, ['''' + QuoteStr(Path) + '''']) + else s := Format('%s %s', [s, QuoteStr(Path)]); +// DebugMsg(['execute: ', s, ' , ', Command, ' , ', QuoteStr(Path)]); + if b then begin + Libc.__chdir(PChar(ExtractFilePath(Path))); + b := ExecuteProgram(s, ExtractFilePath(Path), AutodetectGUI, RunInTerminal, i); + Libc.__chdir(PChar('/')); + end else b := True; // Mask cancelled extraction from VFS + end; + if not b then Application.MessageBox(Format(LANGCannotExecuteSPleaseCheckTheConfiguration, [ANSIToUTF8(s)]), [mbOK], mbError, mbNone, mbOK); + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +procedure TFMain.CommandLineComboKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var Error, OldPos, i: integer; + AListView: TGTKListView; + Engine: TPanelEngine; + s, s2, Orig: string; +begin + try + InternalLock; + case Key of + GDK_RETURN, GDK_KP_ENTER: begin + Accept := False; + if LeftLastFocused then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + // Insert filename + if (ssAlt in Shift) or (ssCtrl in Shift) then begin + if LeftLastFocused then AListView := LeftListView + else AListView := RightListView; + if Assigned(AListView.Selected) and Assigned(AListView.Selected.Data) and (not PDataItem(AListView.Selected.Data)^.UpDir) then begin + s2 := QuoteStr(String(PDataItem(AListView.Selected.Data)^.AName)) + ' '; + if Length(CommandLineCombo.Entry.Text) = 0 then begin + CommandLineCombo.Entry.Text := Format('./%s', [s2]); + CommandLineCombo.Entry.CursorPosition := Length(s2); + end else begin + OldPos := CommandLineCombo.Entry.CursorPosition; + s := CommandLineCombo.Entry.Text; + Insert(s2, s, OldPos + 1); + CommandLineCombo.Entry.Text := s; + CommandLineCombo.Entry.CursorPosition := OldPos + Length(s2); + end; + end; + Exit; + end; + + Orig := Trim(CommandLineCombo.Entry.Text); + if Length(Orig) > 0 then begin + if ANSIUpperCase(Orig) = 'CD' then begin + if LeftLastFocused then PathButtonClick(LeftHomeButton) + else PathButtonClick(RightHomeButton); + end else + if (Length(Orig) > 3) and (ANSIUpperCase(Copy(Orig, 1, 3)) = 'CD ') then begin + ChangingDir(LeftLastFocused, ProcessPattern(Engine, Copy(Orig, 4, Length(Orig) - 3), Engine.Path, '', True)); + end else begin + while not (Engine is TLocalTreeEngine) do Engine := Engine.ParentEngine; + ChDir(Engine.Path); + if not ExecuteProgram(Orig, Engine.Path, ConfCmdLineTerminalBehaviour = 0 , ConfCmdLineTerminalBehaviour = 1, Error) then + Application.MessageBox(LANGErrorExecutingCommand, [mbOK], mbError, mbNone, mbOK); + ChDir('/'); + end; + end; + CommandLineCombo.Entry.Text := ''; + if LeftLastFocused then LeftListView.SetFocus + else RightListView.SetFocus; + + if Length(Orig) > 0 then begin + SaveItemToHistory(Orig, CommandLineHistory); + if CommandLineCombo.Items.Count > 0 then + for i := CommandLineCombo.Items.Count - 1 downto 0 do + CommandLineCombo.Items.Delete(i); + if CommandLineHistory.Count > 0 then + for i := 0 to CommandLineHistory.Count - 1 do + CommandLineCombo.Items.Append(CommandLineHistory[i]); + CommandLineCombo.Entry.Text := ''; + end; + end; + GDK_Down, GDK_Up: + begin + Accept := False; + if LeftLastFocused then AListView := LeftListView + else AListView := RightListView; + if (not (([ssCtrl] = Shift) and (Key = GDK_Up))) and ( + ((Key = GDK_Down) and (AListView.ConvertToSorted(AListView.Selected.Index) < AListView.Items.Count - 1)) or + ((Key = GDK_Up) and (AListView.ConvertToSorted(AListView.Selected.Index) > 0))) then + begin + AListView.Selected := AListView.Items[AListView.ConvertFromSorted(AListView.ConvertToSorted(AListView.Selected.Index) + (Ord(Key = GDK_Down) * 2) - 1)]; + AListView.Selected.SetCursor(0, False, False, 0, 0); + end; + AListView.SetFocus; + end; + GDK_ESCAPE: begin + Accept := False; + CommandLineCombo.Entry.Text := ''; + if LeftLastFocused then LeftListView.SetFocus + else RightListView.SetFocus; + end; + GDK_TAB: begin + Accept := False; + if LeftLastFocused then RightListView.SetFocus + else LeftListView.SetFocus; + end; + GDK_P, GDK_Capital_P: if ((Shift = [ssAlt]) or (Shift = [ssCtrl])) and (CommandLineHistory.Count > 0) then + begin + Accept := False; + Orig := Trim(CommandLineCombo.Entry.Text); + i := CommandLineHistory.IndexOf(Orig); + if i < 0 then begin + SavedCmdLine := Orig; + i := 0; + end else + if CommandLineHistory.Count > i + 1 then Inc(i); + CommandLineCombo.Entry.Text := CommandLineHistory[i]; + CommandLineCombo.Entry.SetFocus; + CommandLineCombo.Entry.SelectRegion(Length(CommandLineCombo.Entry.Text), Length(CommandLineCombo.Entry.Text)); + end else if not CommandLineCombo.Entry.Focused then ActivateCommandLine(Key); + GDK_N, GDK_Capital_N: if ((Shift = [ssAlt]) or (Shift = [ssCtrl])) and (CommandLineHistory.Count > 0) then + begin + Accept := False; + Orig := Trim(CommandLineCombo.Entry.Text); + i := CommandLineHistory.IndexOf(Orig); + if i < 0 then Exit else + if i = 0 then begin + s := SavedCmdLine; + SavedCmdLine := ''; + end else + if CommandLineHistory.Count > i then s := CommandLineHistory[i - 1]; + CommandLineCombo.Entry.Text := s; + CommandLineCombo.Entry.SetFocus; + CommandLineCombo.Entry.SelectRegion(Length(CommandLineCombo.Entry.Text), Length(CommandLineCombo.Entry.Text)); + end else if not CommandLineCombo.Entry.Focused then ActivateCommandLine(Key); + GDK_A, GDK_Capital_A: if (Shift = [ssAlt]) or (Shift = [ssCtrl]) then + begin + Accept := False; + if LeftLastFocused then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + s2 := QuoteStr(IncludeTrailingPathDelimiter(Engine.Path)); + OldPos := CommandLineCombo.Entry.CursorPosition; + s := CommandLineCombo.Entry.Text; + Insert(s2, s, OldPos + 1); + CommandLineCombo.Entry.SetFocus; + CommandLineCombo.Entry.Text := s; + CommandLineCombo.Entry.CursorPosition := OldPos + Length(s2); + end else if not CommandLineCombo.Entry.Focused then ActivateCommandLine(Key); + end; + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +function TFMain.ActivateCommandLine(Key: word; const ActualPosition: boolean = False): boolean; +var s, s2: string; + OldPos: integer; +begin + Result := False; + s := UTF8Encode(WideChar(KeyValToUnicode(Key))); + if (Length(s) = 0) or (s = #0) then Exit; + if ActualPosition and CommandLineCombo.Entry.Focused then begin + OldPos := CommandLineCombo.Entry.CursorPosition; + s2 := CommandLineCombo.Entry.Text; + Insert(s, s2, Length(ANSILeftStr(s2, OldPos)) + 1); + CommandLineCombo.Entry.Text := s2; + CommandLineCombo.Entry.CursorPosition := OldPos + 1; + end else begin + CommandLineCombo.Entry.Text := CommandLineCombo.Entry.Text + s; + CommandLineCombo.Entry.SetFocus; + CommandLineCombo.Entry.SelectRegion(Length(CommandLineCombo.Entry.Text), Length(CommandLineCombo.Entry.Text)); + end; + Result := True; +end; + +procedure TFMain.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var AListView: TGTKListView; +begin + if CommandLineCombo.Entry.Focused then CommandLineComboKeyDown(Sender, Key, Shift, Accept); + if Editing and (Key = GDK_ESCAPE) then begin + Editing := False; + if LeftLastFocused then AListView := LeftListView + else AListView := RightListView; + AListView.Columns[0].SetProperty('editable', 0); + end; +end; + +procedure TFMain.InactiveItemsTimerTimer(Sender: TObject); + + procedure Redraw(AListView: TGTKListView; tree_view: PGtkTreeView); + var TreePath: PGtkTreePath; + Iter: TGtkTreeIter; + Rect: TGdkRectangle; + PixBuf, Icon: PGdkPixbuf; + cell_width, cell_height: integer; + begin + if (csDestroying in ComponentState) or (AListView = nil) or (AListView.FSelection = nil) then Exit; + if not gtk_tree_selection_get_selected(AListView.FSelection, nil, @Iter) then Exit; + TreePath := gtk_tree_model_get_path(gtk_tree_view_get_model(tree_view), @Iter); + if not Assigned(TreePath) then Exit; + gtk_tree_view_get_background_area(tree_view, TreePath, AListView.Columns[0].FColumn, @Rect); + gtk_tree_path_free(TreePath); + gtk_cell_renderer_get_size(AListView.Columns[0].FPixbufRenderer, PGtkWidget(tree_view), nil, nil, nil, @cell_width, @cell_height); + Icon := PDataItem(AListView.Selected.Data)^.Icon; + Rect.width := Rect.x + cell_width + AListView.Columns[0].FRenderer^.xpad * 2 + 1; + PixBuf := gdk_pixbuf_new(GDK_COLORSPACE_RGB, True, 8, Rect.width, Rect.height); + gdk_pixbuf_fill(PixBuf, InactiveItemBGColorNum); + gdk_pixbuf_render_to_drawable_alpha(PixBuf, PGdkDrawable(gtk_tree_view_get_bin_window(tree_view)), 0, 0, Rect.x, Rect.y, + Rect.width, Rect.height, GDK_PIXBUF_ALPHA_FULL, 0, GDK_RGB_DITHER_NORMAL, 0, 0); + gdk_pixbuf_unref(PixBuf); + gdk_pixbuf_render_to_drawable_alpha(Icon, PGdkDrawable(gtk_tree_view_get_bin_window(tree_view)), 0, 0, + Rect.x + AListView.Columns[0].FRenderer^.xpad, Rect.y + Rect.height div 2 - (16 div 2), + 16, 16, GDK_PIXBUF_ALPHA_FULL, 0, GDK_RGB_DITHER_NORMAL, 0, 0); + end; + + +begin + if Assigned(Sender) and Assigned(InactiveItemsTimer) and Assigned(LeftListView) and Assigned(RightListView) and + (not (csDestroying in ComponentState)) then + try + InactiveItemsTimer.Enabled := False; + if RedrawLeftInactive and (not LeftListView.Focused) // and (not ConfInactiveItemDefaultColors) + then Redraw(LeftListView, PGtkTreeView(LeftListView.FWidget)); + if RedrawRightInactive and (not RightListView.Focused) // and (not ConfInactiveItemDefaultColors) + then Redraw(RightListView, PGtkTreeView(RightListView.FWidget)); + RedrawLeftInactive := False; + RedrawRightInactive := False; + except end; +end; + + +(********************************************************************************************************************************) +function TFMain.OldGTKConvertToSorted(Sender: TObject; const Index: integer): integer; +var DataList, List: TList; + i: integer; + AListView: TGTKListView; +begin + Result := -1; + if Sender = LeftListView then begin + DataList := LeftPanelData; + AListView := LeftListView; + end else begin + DataList := RightPanelData; + AListView := RightListView; + end; + List := nil; // Silent compiler warnings + if Assigned(DataList) and (DataList.Count > 0) then + try + List := TList.Create; + for i := 0 to DataList.Count - 1 do List.Add(DataList[i]); + if (List.Count > 1) and (AListView.SortOrder <> soNone) then + SortDataList(List, AListView.SortOrder = soAscending, AListView.SortColumnID); + Result := List.IndexOf(DataList[Index]); + finally + List.Free; + end; +end; + +function TFMain.OldGTKConvertFromSorted(Sender: TObject; const Index: integer): integer; +var DataList, List: TList; + i: integer; + AListView: TGTKListView; +begin + Result := -1; + if Sender = LeftListView then begin + DataList := LeftPanelData; + AListView := LeftListView; + end else begin + DataList := RightPanelData; + AListView := RightListView; + end; + List := nil; // Silent compiler warnings + if Assigned(DataList) and (DataList.Count > 0) then + try + List := TList.Create; + for i := 0 to DataList.Count - 1 do List.Add(DataList[i]); + if (List.Count > 1) and (AListView.SortOrder <> soNone) then + SortDataList(List, AListView.SortOrder = soAscending, AListView.SortColumnID); + Result := DataList.IndexOf(List[Index]); + finally + List.Free; + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.SplitterPopupMenuClick(Sender: TObject); +begin + if not (Sender is TGTKMenuItem) then Exit; + ConfPanelSep := Integer((Sender as TGTKMenuItem).Data); + PanelSeparator.Position := Round(Width * (ConfPanelSep / 100)); +end; + +(********************************************************************************************************************************) +procedure TFMain.miChangePermissionsClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; + i: longint; + SelCount: longint; + AFile, NextItem1, NextItem2: string; + Stat: PDataItemSL; + UsrManager: TUserManager; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + if (SelCount = 0) and ((not Assigned(AListView.Selected)) or PDataItem(AListView.Selected.Data)^.UpDir) then begin + Application.MessageBox(LANGNoFilesSelected, [mbOK], mbInfo, mbNone, mbOK); + Exit; + end; + + AFile := ''; + if SelCount = 0 then AFile := PDataItem(AListView.Selected.Data)^.AName else + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then begin + AFile := AName; + Break; + end; + + // Handle password + if (Engine is TVFSEngine) and TVFSEngine(Engine).GetPasswordRequired and (Length(TVFSEngine(Engine).Password) < 1) then + if not HandleSetPassword(Engine) then Exit; + + if AFile <> '' then + try + FChmod := TFChmod.Create(Self); + Stat := Engine.GetFileInfoSL(IncludeTrailingPathDelimiter(Engine.Path) + AFile); + if not Assigned(Stat) then Exit; + UsrManager := TUserManager.Create; + try + FChmod.AssignMode(Stat^.Mode, AFile, UsrManager.GetUserName(Stat^.UID), UsrManager.GetGroupName(Stat^.GID)); + finally + UsrManager.Free; + end; + if FChmod.Run = mbOK then begin + FindNextSelected(AListView, DataList, NextItem1, NextItem2); + + AWorkingThread := TWorkerThread.Create; + AFProgress := TFProgress.Create(Self); + try + AFProgress.SetNumBars(False); + AFProgress.ProgressBar.Value := 0; + AFProgress.Label1.Caption := LANGChmodProgress; + AWorkingThread.ProgressForm := AFProgress; + if Assigned(AListView.Selected) then AWorkingThread.SelectedItem := AListView.Selected.Data; + AWorkingThread.ParamBool1 := FChmod.RecursiveCheckButton.Checked; + AWorkingThread.ParamInt1 := FChmod.RecursiveOptionMenu.ItemIndex; + AWorkingThread.ParamCardinal1 := FChmod.LastMode; + AWorkingThread.Engine := Engine; + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := ChmodFilesWorker; + AWorkingThread.Resume; + AFProgress.ParentForm := FMain; + if (SelCount > 1) or FChmod.RecursiveCheckButton.Checked then AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + finally + AFProgress.Free; + AWorkingThread.Free; + end; + ChangingDir(LeftPanel, Engine.Path, NextItem1, NextItem2); + DoRefresh(not LeftPanel, True, True); + end; + finally + FChmod.Free; + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.miChangeOwnerClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; + i: integer; + SelCount: longint; + AFile, NextItem1, NextItem2: string; + Stat: PDataItemSL; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + if (SelCount = 0) and ((not Assigned(AListView.Selected)) or PDataItem(AListView.Selected.Data)^.UpDir) then begin + Application.MessageBox(LANGNoFilesSelected, [mbOK], mbInfo, mbNone, mbOK); + Exit; + end; + + AFile := ''; + if SelCount = 0 then AFile := PDataItem(AListView.Selected.Data)^.AName else + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then begin + AFile := AName; + Break; + end; + + // Handle password + if (Engine is TVFSEngine) and TVFSEngine(Engine).GetPasswordRequired and (Length(TVFSEngine(Engine).Password) < 1) then + if not HandleSetPassword(Engine) then Exit; + + if AFile <> '' then + try + FChown := TFChown.Create(Self); + Stat := Engine.GetFileInfoSL(IncludeTrailingPathDelimiter(Engine.Path) + AFile); + if not Assigned(Stat) then Exit; + FChown.AssignMode(Stat^.Mode, AFile, Stat^.UID, Stat^.GID); + if FChown.Run = mbOK then begin + FindNextSelected(AListView, DataList, NextItem1, NextItem2); + + AWorkingThread := TWorkerThread.Create; + AFProgress := TFProgress.Create(Self); + try + AFProgress.SetNumBars(False); + AFProgress.ProgressBar.Value := 0; + AFProgress.Label1.Caption := LANGChownProgress; + AWorkingThread.ProgressForm := AFProgress; + if Assigned(AListView.Selected) then AWorkingThread.SelectedItem := AListView.Selected.Data; + AWorkingThread.ParamBool1 := FChown.RecursiveCheckButton.Checked; + AWorkingThread.ParamCardinal1 := FChown.LastUID; + AWorkingThread.ParamCardinal2 := FChown.LastGID; + AWorkingThread.Engine := Engine; + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := ChownFilesWorker; + AWorkingThread.Resume; + AFProgress.ParentForm := FMain; + if (SelCount > 1) or FChown.RecursiveCheckButton.Checked then AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + finally + AFProgress.Free; + AWorkingThread.Free; + end; + + ChangingDir(LeftPanel, Engine.Path, NextItem1, NextItem2); + DoRefresh(not LeftPanel, True, True); + end; + finally + FChown.Free; + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.miCreateSymlinkClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; + Engine, EngineOpposite: TPanelEngine; + s1, s2: string; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + EngineOpposite := RightPanelEngine; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + EngineOpposite := LeftPanelEngine; + end; + + if (not Assigned(AListView.Selected)) or (not Assigned(AListView.Selected.Data)) or PDataItem(AListView.Selected.Data)^.UpDir + then s1 := ExcludeTrailingPathDelimiter(Engine.Path) + else s1 := IncludeTrailingPathDelimiter(Engine.Path) + PDataItem(AListView.Selected.Data)^.AName; + if Engine.Path <> EngineOpposite.Path + then s2 := IncludeTrailingPathDelimiter(EngineOpposite.Path) + PDataItem(AListView.Selected.Data)^.AName + else s2 := ''; + + // Handle password + if (Engine is TVFSEngine) and TVFSEngine(Engine).GetPasswordRequired and (Length(TVFSEngine(Engine).Password) < 1) then + if not HandleSetPassword(Engine) then Exit; + + if CreateSymlink(s1, s2, Engine) then begin + DoRefresh(LeftPanel, True, True); + DoRefresh(not LeftPanel, True, True); + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.miEditSymlinkClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + end; + + if (not Assigned(AListView.Selected)) or (not Assigned(AListView.Selected.Data)) or (not PDataItem(AListView.Selected.Data)^.IsLnk) or + PDataItem(AListView.Selected.Data)^.UpDir then + begin + Application.MessageBox(LANGYouMustSelectAValidSymbolicLink, [mbOK], mbError, mbNone, mbOK); + Exit; + end; + + // Handle password + if (Engine is TVFSEngine) and TVFSEngine(Engine).GetPasswordRequired and (Length(TVFSEngine(Engine).Password) < 1) then + if not HandleSetPassword(Engine) then Exit; + + if EditSymlink(IncludeTrailingPathDelimiter(Engine.Path) + PDataItem(AListView.Selected.Data)^.AName, Engine) then begin + DoRefresh(LeftPanel, True, True); + DoRefresh(not LeftPanel, True, True); + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.FilePopupMenuPopup(Sender: TObject); + + procedure ClearPopupMenu(Popup: TGTKMenuItem); + begin + while Popup.Count > 0 do begin + if Popup.Items[0].Count > 0 then ClearPopupMenu(Popup.Items[0]); + Popup.Items[0].Free; + Popup.Delete(0); + end; + end; + +var Item: TGTKMenuItem; + DataItem: PDataItemSL; + Engine: TPanelEngine; + AListView: TGTKListView; + FileName, ShortFName, Ext: string; + UpDir, b, Found: boolean; + i, j, Last: integer; +begin + ClearPopupMenu(FilePopupMenu); + if LeftLastFocused then begin + Engine := LeftPanelEngine; + AListView := LeftListView; + end else begin + Engine := RightPanelEngine; + AListView := RightListView; + end; + FileName := IncludeTrailingPathDelimiter(Engine.Path); + if Assigned(AListView.Selected) and Assigned(AListView.Selected.Data) and (not PDataItem(AListView.Selected.Data)^.UpDir) + then FileName := FileName + PDataItem(AListView.Selected.Data)^.AName; + ShortFName := ExtractFileName(ExcludeTrailingPathDelimiter(FileName)); + DataItem := Engine.GetFileInfoSL(FileName); + if not Assigned(DataItem) then begin + DebugMsg(['Error: File data not assigned. Bug ???! FileName = ', FileName]); + Exit; + end; + UpDir := PDataItem(AListView.Selected.Data)^.UpDir; + + if not DataItem^.IsDir then begin + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := Format(LANGPopupRunS, [ANSIToUTF8(QuoteMarkupStr(ShortFName))]); + Item.StockIcon := 'gtk-execute'; + Item.Data := Pointer(1); + Item.OnClick := FilePopupMenuItemClick; + Item.Enabled := Engine.FileCanRun(FileName); + FilePopupMenu.Add(Item); + end else begin + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + if UpDir then Item.Caption := LANGPopupGoUp + else Item.Caption := Format(LANGPopupOpenS, [ANSIToUTF8(QuoteMarkupStr(ShortFName))]); + Item.StockIcon := 'gtk-open'; + Item.Data := Pointer(1); + Item.OnClick := FilePopupMenuItemClick; + FilePopupMenu.Add(Item); + end; + + // Find actions for meta-item + if AssocList.Count > 0 then + for i := 0 to AssocList.Count - 1 do + if ((DataItem^.IsDir and (TFileAssoc(AssocList[i]).FileTypeName = ConstFTAMetaDirectory)) or + ((not DataItem^.IsDir) and (TFileAssoc(AssocList[i]).FileTypeName = ConstFTAMetaFile))) and + (TFileAssoc(AssocList[i]).ActionList.Count > 0) then + with TFileAssoc(AssocList[i]) do begin + FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + for j := 0 to ActionList.Count - 1 do begin + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := Format(LANGPopupOpenWithS, [TAssocAction(ActionList[j]).ActionName]); + Item.Data := ActionList[j]; + Item.OnClick := FilePopupMenuItemClick; + FilePopupMenu.Add(Item); + end; + Break; + end; + FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + + // Find and add actions for this file type + Found := False; + if Pos('.', ShortFName) > 0 then begin + Ext := ANSIUpperCase(Trim(Copy(ShortFName, LastDelimiter('.', ShortFName) + 1, Length(ShortFName) - LastDelimiter('.', ShortFName)))); + if AssocList.Count > 0 then + for i := 0 to AssocList.Count - 1 do + with TFileAssoc(AssocList[i]) do + if (ActionList.Count > 0) and (Length(Trim(Extensions)) > 0) then begin + b := False; + if Pos(';', Extensions) = 0 then b := ANSIUpperCase(Trim(Extensions)) = Ext else begin + Last := 0; + for j := 1 to Length(Extensions) do + if Extensions[j] = ';' then begin + if ANSIUpperCase(Trim(Copy(Extensions, Last + 1, j - Last - 1))) = Ext then begin + b := True; + Break; + end; + Last := j; + end; + if not b then b := ANSIUpperCase(Trim(Copy(Extensions, LastDelimiter(';', Extensions) + 1, Length(Extensions) - LastDelimiter(';', Extensions)))) = Ext; + end; + if b and (ActionList.Count > 0) then begin + Found := True; + for j := 0 to ActionList.Count - 1 do begin + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := Format(LANGPopupOpenWithS, [TAssocAction(ActionList[j]).ActionName]); + if ((j = 0) and (DefaultAction > ActionList.Count - 1)) or (j = DefaultAction) then + Item.Caption := Item.Caption + LANGPopupDefault; + Item.Data := ActionList[j]; + Item.OnClick := FilePopupMenuItemClick; + FilePopupMenu.Add(Item); + end; + end; + end; + end; + if (not Found) and (not DataItem^.IsDir) then begin + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGPopupOpenWith; + Item.Data := Pointer(2); + Item.OnClick := FilePopupMenuItemClick; + FilePopupMenu.Add(Item); + end; + + // Other items + if not DataItem^.IsDir then begin + FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGPopupViewFile; + Item.StockIcon := 'gtk-find'; + Item.Data := Pointer(200); // This number HAVE to be here due to F3F4ButtonClick method using + Item.OnClick := F3F4ButtonClick; + FilePopupMenu.Add(Item); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGPopupEditFile; + Item.Data := Pointer(201); // Here too + Item.OnClick := F3F4ButtonClick; + FilePopupMenu.Add(Item); + end; + if not DataItem^.IsDir then FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGPopupMakeSymlink; + Item.StockIcon := 'gtk-jump-to'; + Item.OnClick := miCreateSymlinkClick; + FilePopupMenu.Add(Item); + if DataItem^.IsLnk then begin + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGmiEditSymlink_Caption; + Item.OnClick := miEditSymlinkClick; + FilePopupMenu.Add(Item); + end; + FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGmiChangePermissions_Caption; + Item.StockIcon := 'gtk-convert'; + Item.OnClick := miChangePermissionsClick; + Item.Enabled := not UpDir; + FilePopupMenu.Add(Item); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGmiChangeOwner_Caption; + Item.OnClick := miChangeOwnerClick; + Item.Enabled := not UpDir; + FilePopupMenu.Add(Item); + FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGPopupRename; + Item.OnClick := F6ButtonClick; + Item.Enabled := not UpDir; + FilePopupMenu.Add(Item); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGPopupDelete; + Item.StockIcon := 'gtk-delete'; + Item.OnClick := F8ButtonClick; + Item.Enabled := not UpDir; + FilePopupMenu.Add(Item); +// FilePopupMenu.Add(TGTKMenuItem.CreateTyped(Self, itSeparator)); + Item := TGTKMenuItem.CreateTyped(Self, itImageText); + Item.Caption := LANGFilePopupMenu_Properties; + Item.StockIcon := 'gtk-properties'; + Item.OnClick := miFilePropertiesClick; + Item.Enabled := False; + Item.Visible := False; +// Item.Enabled := not UpDir; + FilePopupMenu.Add(Item); +end; + +procedure TFMain.FilePopupMenuItemClick(Sender: TObject); +var Engine: TPanelEngine; + DataItem: PDataItemSL; + AListView: TGTKListView; + FileName, ShortFName, s, APath: string; + Error: integer; + b: boolean; +begin + try + InternalLock; + if (not Assigned(Sender)) or (not (Sender is TGTKMenuItem)) then begin + DebugMsg(['Error: Popup menuitem is invalid']); + end; + if LeftLastFocused then begin + Engine := LeftPanelEngine; + AListView := LeftListView; + end else begin + Engine := RightPanelEngine; + AListView := RightListView; + end; + FileName := IncludeTrailingPathDelimiter(Engine.Path); + if Assigned(AListView.Selected) and Assigned(AListView.Selected.Data) and (not PDataItem(AListView.Selected.Data)^.UpDir) + then FileName := FileName + PDataItem(AListView.Selected.Data)^.AName; + ShortFName := ExtractFileName(ExcludeTrailingPathDelimiter(FileName)); + DataItem := Engine.GetFileInfoSL(FileName); + if not Assigned(DataItem) then begin + DebugMsg(['Error: File data not assigned. Bug ???! FileName = ', FileName]); + Exit; + end; + if ConfUseURI and ((Engine is TVFSEngine) and (not TVFSEngine(Engine).ArchiveMode)) + then FileName := ExcludeTrailingPathDelimiter(Engine.GetPrefix) + FileName; + + case Integer((Sender as TGTKMenuItem).Data) of + 1: if DataItem^.IsDir then ActivateItem(AListView.Selected.Index, False) + else begin + b := True; + if Engine is TVFSEngine then b := HandleRunFromArchive(FileName, Engine, '', '', False); // not a local engine, extract to local first + if b then begin + Libc.__chdir(PChar(ExtractFilePath(FileName))); + b := ExecuteProgram(QuoteStr(FileName), ExtractFilePath(FileName), True, False, Error); + Libc.__chdir(PChar('/')); + end else b := True; // Mask cancelled extraction from VFS + if not b then Application.MessageBox(LANGErrorExecutingCommand, [mbOK], mbError, mbNone, mbOK); + end; + 2: if Application.MessageBox(Format(LANGThereIsNoApplicationAssociatedWithS, [ANSIToUTF8(ShortFName)]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes + then miFileTypesClick(Self); + else begin + b := True; + s := TAssocAction((Sender as TGTKMenuItem).Data).ActionCommand; + if Engine is TVFSEngine then b := HandleRunFromArchive(FileName, Engine, s, '', False); // not a local engine, extract to local first + if Pos('%s', s) > 0 then s := Format(s, ['''' + QuoteStr(FileName) + '''']) + else s := Format('%s %s', [s, QuoteStr(FileName)]); + if b then begin + Libc.__chdir(PChar(ExtractFilePath(FileName))); + b := ExecuteProgram(s, ExtractFilePath(FileName), TAssocAction((Sender as TGTKMenuItem).Data).AutodetectGUI, + TAssocAction((Sender as TGTKMenuItem).Data).RunInTerminal, Error); + Libc.__chdir(PChar('/')); + end else b := True; // Mask cancelled extraction from VFS + if not b then Application.MessageBox(Format(LANGCannotExecuteSPleaseCheckTheConfiguration, [ANSIToUTF8(FileName)]), [mbOK], mbError, mbNone, mbOK); + end; + end; + finally + Application.ProcessMessages; + InternalUnLock; + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.ListViewMouseUp(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +var AListView: TGTKListView; + i, FirstColumn, LastColumn: integer; + LeftLV, b: boolean; +begin + if Button = mbLeft then begin + AListView := Sender as TGTKListView; + LeftLV := AListView = LeftListView; + GetFirstLastPanelColumn(FirstColumn, LastColumn); + b := True; + for i := 0 to AListView.Columns.Count - 1 do + if (AListView.Columns[i].Tag <> LastColumn) or (FirstColumn = LastColumn) then + b := b and (ConfColumnSizes[AListView.Columns[i].Tag] = AListView.Columns[i].Width); + if not b then begin + DebugMsg(['*** ListView Mouse Up -> resizing columns']); + for i := 0 to AListView.Columns.Count - 1 do + ConfColumnSizes[AListView.Columns[i].Tag] := AListView.Columns[i].Width; + if LeftLV then AListView := RightListView + else AListView := LeftListView; + // Change target widths + for i := 0 to AListView.Columns.Count - 1 do + if ConfColumnSizes[AListView.Columns[i].Tag] <> AListView.Columns[i].Width then + AListView.Columns[i].FixedWidth := ConfColumnSizes[AListView.Columns[i].Tag]; + end; + end; +end; + +procedure TFMain.ListViewColumnClicked(Sender: TObject); +var ANotebook: TEphyNotebook; + AListView: TGTKListView; + LeftLV: boolean; +begin + AListView := ((Sender as TGTKTreeViewColumn).Parent as TGTKTreeViewColumns).Parent as TGTKListView; + LeftLV := AListView = LeftListView; + + // Check for sort change + if LeftLV then ANotebook := LeftPanelNotebook + else ANotebook := RightPanelNotebook; + try + if ANotebook.Visible then begin + DebugMsg(['*** ListView Mouse Up -> saving sort info to tab ', ANotebook.PageIndex, ', SortColumnID = ', AListView.SortColumnID]); + if LeftLV then begin + LeftTabSortIDs[ANotebook.PageIndex] := Pointer(AListView.SortColumnID); + LeftTabSortTypes[ANotebook.PageIndex] := Pointer(Integer(AListView.SortOrder)); + end else begin + RightTabSortIDs[ANotebook.PageIndex] := Pointer(AListView.SortColumnID); + RightTabSortTypes[ANotebook.PageIndex] := Pointer(Integer(AListView.SortOrder)); + end; + end; + except + on E: Exception do DebugMsg(['*** Exception raised in TFMain.ListViewColumnClicked(', E.ClassName, '): ', E.Message]); + end; + +end; + +(********************************************************************************************************************************) +procedure TFMain.miPreferencesClick(Sender: TObject); +begin + try + InternalLock; + FPreferences := TFPreferences.Create(Self); + FPreferences.AssignDefaultValues; + if FPreferences.Run = mbOK then begin + FPreferences.SaveSettings; + WriteMainGUISettings; + ApplySettings(FPreferences.RebuildListViews, FPreferences.RebuildIcons, False); + end; + finally + FPreferences.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.ApplySettings(RebuildListViews, RebuildIcons, Startup: boolean); +var i: integer; +begin + InactiveItemsTimer.Enabled := False; + + ButtonsBox.Visible := ConfShowFuncButtons; + ButtonBoxSeparator.Visible := ConfShowFuncButtons; + ButtonBoxSpace.Visible := not ConfShowFuncButtons; + + // Rebuild Icons + if RebuildIcons then begin + if ConfRowHeight > 0 then ConfRowHeightReal := ConfRowHeight + else ConfRowHeightReal := ConfDefaultRowHeight; + FolderIcon.Free; + FileIcon.Free; + UpDirIcon.Free; + SymLinkEmblem.Free; + FolderIconLnk.Free; + FileIconLnk.Free; + LoadIcons; + RecreateIcons(AssocList, False); + end; + + // Rebuild ListViews + if RebuildListViews then FMain.RebuildListViews(False); + InactiveItemsTimer.Enabled := False; + + // Colors Section + SetupColors; + gtk_widget_modify_base(LeftListView.FWidget, GTK_STATE_NORMAL, NormalItemGDKBackground); + gtk_widget_modify_base(RightListView.FWidget, GTK_STATE_NORMAL, NormalItemGDKBackground); + gtk_widget_modify_base(LeftListView.FWidget, GTK_STATE_SELECTED, ActiveItemGDKBackground); + gtk_widget_modify_base(RightListView.FWidget, GTK_STATE_SELECTED, ActiveItemGDKBackground); +// if Application.GTKVersion_2_6_0_Up then begin + gtk_widget_modify_base(LeftListView.FWidget, GTK_STATE_ACTIVE, InactiveItemGDKBackground); + gtk_widget_modify_base(RightListView.FWidget, GTK_STATE_ACTIVE, InactiveItemGDKBackground); + + gtk_widget_modify_text(LeftListView.FWidget, GTK_STATE_NORMAL, NormalItemGDKColor); + gtk_widget_modify_text(RightListView.FWidget, GTK_STATE_NORMAL, NormalItemGDKColor); + gtk_widget_modify_text(LeftListView.FWidget, GTK_STATE_SELECTED, ActiveItemGDKColor); + gtk_widget_modify_text(RightListView.FWidget, GTK_STATE_SELECTED, ActiveItemGDKColor); + gtk_widget_modify_text(LeftListView.FWidget, GTK_STATE_ACTIVE, InactiveItemGDKColor); + gtk_widget_modify_text(RightListView.FWidget, GTK_STATE_ACTIVE, InactiveItemGDKColor); +// end; + + // Resize commandline history + if ConfNumHistoryItems < CommandLineHistory.Count then begin + try + for i := CommandLineHistory.Count downto ConfNumHistoryItems + 1 do + CommandLineHistory.Delete(i - 1); + if CommandLineCombo.Items.Count > 0 then + for i := CommandLineCombo.Items.Count - 1 downto 0 do + CommandLineCombo.Items.Delete(i); + if CommandLineHistory.Count > 0 then + for i := 0 to CommandLineHistory.Count - 1 do + CommandLineCombo.Items.Append(CommandLineHistory[i]); + except end; + CommandLineCombo.Entry.Text := ''; + end; + + // Refresh the lists + if not Startup then begin + DoRefresh(True, True, True); + DoRefresh(False, True, True); + if RebuildListViews then begin + LeftListView.SetSortInfo(ConfMainWindowLeftSortColumn, TGTKTreeViewSortOrder(ConfMainWindowLeftSortType)); + RightListView.SetSortInfo(ConfMainWindowRightSortColumn, TGTKTreeViewSortOrder(ConfMainWindowRightSortType)); + end; + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.RefreshBookmarksMenu; +const ShortcutKeys = '1234567890'; +var i: integer; + Item: TGTKMenuItem; +begin + if mnuBookmarks.Count > 4 then + for i := mnuBookmarks.Count - 1 downto 4 do begin + mnuBookmarks.Items[i].Free; + mnuBookmarks.Delete(i); + end; + miAddBookmark.Visible := True; + miEditBookmarks.Visible := False; + miBookmarksSeparator.Visible := False; + + if Bookmarks.Count > 0 then begin + miBookmarksSeparator.Visible := True; + for i := 0 to Bookmarks.Count - 1 do begin + Item := TGTKMenuItem.CreateTyped(Self, itLabel); + Item.Caption := Format('_%s %s', [Chr(Ord('a') + i), ANSIToUTF8(QuoteMarkupStr(Bookmarks[i]))]); + Item.Data := Pointer(i); + Item.OnClick := miBookmarkClick; + Item.OnMouseUp := BookmarkItemMouseUp; + if i < Length(ShortcutKeys) - 1 then Item.ShortCuts.AddName(Format('%s', [ShortcutKeys[i + 1]])); + mnuBookmarks.Add(Item); + end; + end; +end; + +procedure TFMain.miAddBookmarkClick(Sender: TObject); +var LeftPanel: boolean; + s: string; +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then s := LeftPanelEngine.Path + else s := RightPanelEngine.Path; + s := ExcludeTrailingPathDelimiter(s); + if Bookmarks.IndexOf(s) > -1 then begin + Application.MessageBox(LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList, [mbOK], mbError); + Exit; + end; + Bookmarks.Add(s); + WriteBookmarks; + RefreshBookmarksMenu; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.miBookmarkClick(Sender: TObject); +var LeftPanel: boolean; +begin + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + + // Close VFS connections + if LeftPanel then while (LeftPanelEngine is TVFSEngine) do CloseVFS(LeftPanel, True) + else while (RightPanelEngine is TVFSEngine) do CloseVFS(LeftPanel, True); + + ChangingDir(LeftPanel, Bookmarks[Integer((Sender as TGTKMenuItem).Data)]); +end; + +procedure TFMain.BookmarkPopupDeleteClick(Sender: TObject); +begin + try + Bookmarks.Delete(Integer((Sender as TGTKMenuItem).Data)); + WriteBookmarks; + RefreshBookmarksMenu; + except + on E: Exception do + DebugMsg(['*** Error deleting item: ', E.Message]); + end; +end; + +procedure TFMain.BookmarkItemMouseUp(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +begin + if Button = mbRight then begin + Accept := False; + BookmarkPopup.PopUp; + BookmarkPopupDelete.Data := (Sender as TGTKMenuItem).Data; + end; +end; + +(********************************************************************************************************************************) +function form_event_handler(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; +begin + Result := False; + if event^._type = GDK_FOCUS_CHANGE then + if event^.focus_change._in = 1 then FMain.HandleFormFocusIn + else FileListTipsHide; +end; + +procedure TFMain.HandleFormFocusIn; +var ChangedMainGUI, ChangedAssoc, ChangedBookmarks, ChangedMounter, ChangedConnMgr, APerformRefresh: boolean; +begin + try + if (csDestroying in ComponentState) or (not Assigned(FMain)) then Exit; + if InternalLockUnlocked then begin + APerformRefresh := ConfFocusRefresh; + + if CheckConfFilesMod(ChangedMainGUI, ChangedAssoc, ChangedBookmarks, ChangedMounter, ChangedConnMgr) then begin + if ChangedBookmarks then begin + DebugMsg(['Bookmark file changed ---> performing refresh']); + ReadBookmarks; + RefreshBookmarksMenu; + end; + if ChangedConnMgr then begin + DebugMsg(['Connection manager file changed ---> performing refresh']); + ReadConnections; + end; + try + InternalLock; + if (ChangedMainGUI or ChangedAssoc or ChangedMounter) and (Application.MessageBox(LANGSomeOtherInstanceChanged, + [mbYes, mbNo], mbWarning) = mbNo) then Exit; + if ChangedMounter then begin + DebugMsg(['Mounter file changed ---> performing refresh']); + ReadMounter; + FillMounterBar; + end; + if ChangedMainGUI then begin + DebugMsg(['GUI file changed ---> performing refresh']); + ReadMainGUISettings; + ApplySettings(True, True, False); + APerformRefresh := True; + end; + if ChangedAssoc then begin + DebugMsg(['Assoc file changed ---> performing refresh']); + ReadAssoc; + LoadIcons; + RemoveIconRefs(AssocList, False); + RecreateIcons(AssocList); + APerformRefresh := True; + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; + end; + if APerformRefresh then begin + DebugMsg(['ANN: Form Focus ---> refresh']); + DoRefresh(True, True, True); + DoRefresh(False, True, True); + if ConfFocusRefresh and ParamDebug then Beep; + end; + end; + except + on E: Exception do DebugMsg(['*** Exception raised in TFMain.HandleFormFocusIn (', E.ClassName, '): ', E.Message]); + end; +end; + +(********************************************************************************************************************************) +function Max(Int1, Int2: integer): integer; +begin + if Int1 > Int2 then Result := Int1 + else Result := Int2; +end; + +procedure menu_position_cb(menu: PGtkMenu; x, y: Pgint; push_in: pgboolean; user_data: gpointer); cdecl; +var menu_requisition: TGtkRequisition; + max_x, max_y: integer; +begin + (* Calculate our preferred position. *) + gdk_window_get_origin(PGtkWidget(user_data).Window, x, y); + x^ := x^ + PGtkWidget(user_data).allocation.x + PGtkWidget(user_data).allocation.width; + y^ := y^ + PGtkWidget(user_data).allocation.y + PGtkWidget(user_data).allocation.height; + + (* Now make sure we are on the screen. *) + gtk_widget_size_request(PGtkWidget(menu), @menu_requisition); + max_x := Max(0, gdk_screen_width () - menu_requisition.width); + max_y := Max(0, gdk_screen_height () - menu_requisition.height); + x^ := x^ - menu_requisition.width; + + x^ := CLAMP(x^, 0, max_x); + y^ := CLAMP(y^, 0, max_y); +end; + +procedure TFMain.BookmarkButtonClick(Sender: TObject); +begin + miAddBookmark.Visible := True; + miEditBookmarks.Visible := False; + miBookmarksSeparator.Visible := mnuBookmarks.Count > 3; + gtk_menu_popup(PGtkMenu(mnuBookmarks.FMenu), nil, nil, menu_position_cb, (Sender as TGTKControl).FWidget, 1, GDK_CURRENT_TIME); + if (Sender = LeftBookmarkButton) {and (not LeftLastFocused)} then LeftListView.SetFocus else + if (Sender = RightBookmarkButton) {and LeftLastFocused} then RightListView.SetFocus; +end; + +(********************************************************************************************************************************) +procedure file_popup_position_cb(menu: PGtkMenu; x, y: Pgint; push_in: pgboolean; user_data: gpointer); cdecl; +var menu_requisition: TGtkRequisition; + max_x, max_y: integer; + TreePath: PGtkTreePath; + Iter: TGtkTreeIter; + Rect: TGdkRectangle; + TreeView: PGtkTreeView; +begin + TreeView := PGtkTreeView(TGTKListView(user_data).FWidget); + if not gtk_tree_selection_get_selected(gtk_tree_view_get_selection(TreeView), nil, @Iter) then Exit; + TreePath := gtk_tree_model_get_path(gtk_tree_view_get_model(TreeView), @iter); + if not Assigned(TreePath) then Exit; + gtk_tree_view_get_background_area(TreeView, TreePath, nil, @Rect); + + gdk_window_get_origin(gtk_tree_view_get_bin_window(TreeView), x, y); + y^ := y^ + Rect.y + Rect.height; + + gtk_widget_size_request(PGtkWidget(menu), @menu_requisition); + if y^ > gdk_screen_height - menu_requisition.height then begin + gdk_window_get_origin(gtk_tree_view_get_bin_window(TreeView), x, y); + y^ := y^ + Rect.y - menu_requisition.height; + end; + + max_x := Max(0, gdk_screen_width () - menu_requisition.width); + max_y := Max(0, gdk_screen_height () - menu_requisition.height); + + x^ := CLAMP(x^, 0, max_x); + y^ := CLAMP(y^, 0, max_y); +end; + +procedure TFMain.PopupFileMenuPos; +var AListView: TGTKListView; + LeftPanel: boolean; +begin + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then AListView := LeftListView + else AListView := RightListView; + FilePopupMenuPopup(AListView); + if not Application.GTKVersion_2_0_5_Up then FilePopupMenu.PopUp else + gtk_menu_popup(PGtkMenu(FilePopupMenu.FMenu), nil, nil, file_popup_position_cb, AListView, 0, gtk_get_current_event_time()); +end; + +(********************************************************************************************************************************) +procedure TFMain.miShowDirectorySizesClick(Sender: TObject); +begin + DoGetDirSize(True); +end; + +procedure TFMain.miTargetSourceClick(Sender: TObject); +begin + if Sender = LeftEqualButton then SwitchOtherPanel(True, True) else + if Sender = RightEqualButton then SwitchOtherPanel(False, True) else + SwitchOtherPanel(LeftLastFocused, True); +end; + +procedure TFMain.SwitchPanelCtrlLeftRight(LeftPanel, LeftArrowPressed: boolean); +var AListView: TGTKListView; + SrcEngine, OrigSrcEngine, TargetEngine: TPanelEngine; + s: string; + DontShowAgain: boolean; +begin + if LeftPanel then begin + AListView := LeftListView; + SrcEngine := LeftPanelEngine; + TargetEngine := RightPanelEngine; + end else begin + AListView := RightListView; + SrcEngine := RightPanelEngine; + TargetEngine := LeftPanelEngine; + end; + OrigSrcEngine := SrcEngine; + + if ((not (SrcEngine is TLocalTreeEngine)) and (LeftPanel <> LeftArrowPressed)) or + ((not (TargetEngine is TLocalTreeEngine)) and (LeftPanel = LeftArrowPressed)) then + begin + if ConfSwitchOtherPanelBehaviour < 0 then begin + MessageBoxShowOnce(LANGSwitchOtherPanelWarning, LANGDontShowAgain, DontShowAgain, [mbOK], mbWarning, mbOK, mbOK); + if DontShowAgain then begin + ConfSwitchOtherPanelBehaviour := 1; + WriteMainGUISettings; + end; + end; + end; + + // don't change dir in VFS engines + while not (SrcEngine is TLocalTreeEngine) do SrcEngine := SrcEngine.ParentEngine; + while not (TargetEngine is TLocalTreeEngine) do TargetEngine := TargetEngine.ParentEngine; + + if LeftPanel <> LeftArrowPressed then begin + s := ExcludeTrailingPathDelimiter(SrcEngine.Path); + if (OrigSrcEngine = SrcEngine) and Assigned(AListView.Selected) and Assigned(AListView.Selected.Data) and + (not PDataItem(AListView.Selected.Data)^.UpDir) and PDataItem(AListView.Selected.Data)^.IsDir + then s := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(s) + PDataItem(AListView.Selected.Data)^.AName); + if IncludeTrailingPathDelimiter(TargetEngine.Path) <> s then begin + if LeftPanel then RightPanelEngine := TargetEngine + else LeftPanelEngine := TargetEngine; + ChangingDir(not LeftPanel, s); + end; + end else begin + // Close opened VFS engines + if LeftPanel then begin + while (LeftPanelEngine is TVFSEngine) do CloseVFS(LeftPanel, True); + end else + while (RightPanelEngine is TVFSEngine) do CloseVFS(LeftPanel, True); + ChangingDir(LeftPanel, TargetEngine.Path); + end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.FillMounterBar; + + procedure ClearButtons(List: TList; Table: TGTKTable); + var i: integer; + begin + if List.Count > 0 then + for i := List.Count - 1 downto 0 do + Table.RemoveControl(TGTKControl(List[i])); + List.Clear; + end; + + procedure FillTableButtons(List: TList; Table: TGTKTable); + var i: integer; + Button: TGTKButton; + Pixmap: TGDKPixbuf; + b: boolean; + Sep: TGTKVSeparator; + begin + if MounterList.Count > 0 then + for i := 0 to MounterList.Count - 1 do + with TMounterItem(MounterList[i]) do begin + if ConfMounterPushDown then begin + Button := TGTKImageToggleButton.Create(Self); + if Length(DisplayText) > 0 then (Button as TGTKImageToggleButton).Caption := DisplayText else + (Button as TGTKImageToggleButton).Caption := Copy(MountPath, LastDelimiter(PathDelim, ExcludeTrailingPathDelimiter(MountPath)) + 1, + Length(ExcludeTrailingPathDelimiter(MountPath)) - LastDelimiter(PathDelim, ExcludeTrailingPathDelimiter(MountPath))); + end else begin + Button := TGTKImageButton.Create(Self); + if Length(DisplayText) > 0 then (Button as TGTKImageButton).Caption := DisplayText else + (Button as TGTKImageButton).Caption := Copy(MountPath, LastDelimiter(PathDelim, ExcludeTrailingPathDelimiter(MountPath)) + 1, + Length(ExcludeTrailingPathDelimiter(MountPath)) - LastDelimiter(PathDelim, ExcludeTrailingPathDelimiter(MountPath))); + end; + Button.CanFocus := False; +// DebugMsg(['Int64(MounterList[i]) = ', Int64(MounterList[i])]); +// DebugMsg(['Integer(MounterList[i]) = ', Integer(MounterList[i])]); +{$IFDEF CPU64} + Button.Tag := QWORD(MounterList[i]); +{$ELSE} + Button.Tag := Longint(MounterList[i]); +{$ENDIF} + Button.Tooltip := Format(LANGMountPointDevice, [ANSIToUTF8(MountPath), ANSIToUTF8(Device)]); + Button.BorderStyle := bsNone; + Button.PopupMenu := MounterButtonPopupMenu; + Button.OnMouseDown := MounterButtonMouseDown; + + // Check the icon + b := FileExists(IconPath); + Pixmap := nil; + if b then begin + Pixmap := TGDKPixbuf.Create(Self); + Pixmap.LoadFromFile(IconPath); + b := Pixmap.FPixbuf <> nil; + if b then Pixmap.ScaleSimple(16, 16); + end; + if not b then + case DeviceType of + 0 : Pixmap := MounterHDD; + 1 : Pixmap := MounterRemovable; + 2 : Pixmap := MounterCD; + 3 : Pixmap := MounterFloppy; + 4 : Pixmap := MounterNetwork; + end; + if ConfMounterPushDown then begin + (Button as TGTKImageToggleButton).Icon := Pixmap; + (Button as TGTKImageToggleButton).Checked := Mounted; + end else (Button as TGTKImageButton).Icon := Pixmap; + + Button.OnClick := MounterButtonClick; // It has to be here because setting the Checked property causes the signal emitting + + Table.AddControlEx(2*i + 1, 0, 1, 1, Button, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 1); + List.Add(Button); + if i < MounterList.Count - 1 then begin + Sep := TGTKVSeparator.Create(Self); + Table.AddControlEx(2*(i + 1), 0, 1, 1, Sep, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 6); + List.Add(Sep); + end; + end; + end; + + +var Lab: TGTKLabel; +begin + if ConfMounterUseFSTab then FillDefaultFstabMounterItems; + + // Clean all items + ClearButtons(MounterTableList, MounterBarTable); + ClearButtons(MounterTableListLeft, LeftMounterTable); + ClearButtons(MounterTableListRight, RightMounterTable); + + // Fill the new items + Lab := TGTKLabel.Create(Self); + Lab.Caption := Format('%s', [LANGMountSC]); + Lab.UseMarkup := True; + MounterTableList.Add(Lab); + MounterBarTable.AddControlEx(0, 0, 1, 1, Lab, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 1); + case ConfShowMounterBar of + 1: FillTableButtons(MounterTableList, MounterBarTable); + 2: begin + FillTableButtons(MounterTableListLeft, LeftMounterTable); + FillTableButtons(MounterTableListRight, RightMounterTable); + end; + end; +end; + +procedure TFMain.MounterButtonClick(Sender: TObject); +var Item: TMounterItem; + LeftPanel, b: boolean; + Engine: TPanelEngine; +begin + if not (Sender is TGTKButton) then Exit; + try + Item := Pointer((Sender as TGTKButton).Tag); + if (not Assigned(Item)) or (Item.MountPath = '') then DebugMsg(['*** Error in mounter button: incorrect data']) else begin + if MounterTableListLeft.IndexOf(Sender) > -1 then LeftPanel := True else + if MounterTableListRight.IndexOf(Sender) > -1 then LeftPanel := False else LeftPanel := LeftLastFocused; + if LeftPanel then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + try + b := Item.Mounted; + except + b := False; + end; + + if ConfMounterPushDown then begin + if not b then b := Item.Mount else + if Pos(Item.MountPath, Engine.Path) = 1 then b := Item.Eject; + (Sender as TGTKToggleButton).OnClick := nil; + (Sender as TGTKToggleButton).Checked := Item.Mounted; + (Sender as TGTKToggleButton).OnClick := MounterButtonClick; + end else if not b then b := Item.Mount; + + if b then begin + if Engine is TVFSEngine then CloseVFS(LeftPanel, True); + ChangingDir(LeftPanel, Item.MountPath); + DoRefresh(LeftPanel, True, True); + end; + if LeftPanel then LeftListView.SetFocus + else RightListView.SetFocus; + end; + except + on E: Exception do DebugMsg(['*** Exception raised in FMain.MounterButtonClick: (', E.ClassName, '): ', E.Message]); + end; +end; + +procedure TFMain.MounterButtonPopupMenuPopup(Sender: TObject); +begin +// DebugMsg(['aaaa']); + try +// DebugMsg(['aaaa']); + if (not Assigned(LastMounterButton)) or (LastMounterButton.Tag = 0) then begin +// DebugMsg(['aaaa']); + MounterButtonPopupMenu.PopDown; +// DebugMsg(['aaaa']); + Exit; + end; +// DebugMsg(['aaaaX']); +// DebugMsg(['sizeof(LastMounterButton.Tag) = ', sizeof(LastMounterButton.Tag)]); +// DebugMsg(['LastMounterButton.Tag = ', Int64(LastMounterButton.Tag)]); +// DebugMsg(['TMounterItem(Pointer(QWord(LastMounterButton.Tag))).Device = ', TMounterItem(Pointer(QWord(LastMounterButton.Tag))).Device]); + +// DebugMsg(['TMounterItem(LastMounterButton.Tag).ClassName = ', TMounterItem(LastMounterButton.Tag).ClassName]); + + miMount.Enabled := not TMounterItem(LastMounterButton.Tag).Mounted; +// DebugMsg(['aaaaX']); + miUmount.Enabled := not miMount.Enabled; +// DebugMsg(['aaaaX']); + miEject.Enabled := not miMount.Enabled; + except + on E: Exception do begin + DebugMsg(['*** Exception raised in FMain.MounterButtonClick: (', E.ClassName, '): ', E.Message]); + MounterButtonPopupMenu.PopDown; + end; + end; +end; + +procedure TFMain.MounterButtonMouseDown(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +begin + LastMounterButton := nil; + if (not (Sender is TGTKButton)) or ((Sender as TGTKButton).Tag = 0) then Exit; + LastMounterButton := Sender as TGTKButton; +end; + +procedure TFMain.miMountClick(Sender: TObject); +begin + if Assigned(LastMounterButton) then TMounterItem(LastMounterButton.Tag).Mount; + DoRefresh(LeftLastFocused, True, True); + DoRefresh(not LeftLastFocused, True, True); + if ConfMounterPushDown then begin + (LastMounterButton as TGTKToggleButton).OnClick := nil; + (LastMounterButton as TGTKToggleButton).Checked := TMounterItem(LastMounterButton.Tag).Mounted; + (LastMounterButton as TGTKToggleButton).OnClick := MounterButtonClick; + end; +end; + +procedure TFMain.miUmountClick(Sender: TObject); +begin + if Assigned(LastMounterButton) then TMounterItem(LastMounterButton.Tag).Umount; + DoRefresh(LeftLastFocused, True, True); + DoRefresh(not LeftLastFocused, True, True); + if ConfMounterPushDown then begin + (LastMounterButton as TGTKToggleButton).OnClick := nil; + (LastMounterButton as TGTKToggleButton).Checked := TMounterItem(LastMounterButton.Tag).Mounted; + (LastMounterButton as TGTKToggleButton).OnClick := MounterButtonClick; + end; +end; + +procedure TFMain.miEjectClick(Sender: TObject); +begin + if Assigned(LastMounterButton) then TMounterItem(LastMounterButton.Tag).Eject; + DoRefresh(LeftLastFocused, True, True); + DoRefresh(not LeftLastFocused, True, True); + if ConfMounterPushDown then begin + (LastMounterButton as TGTKToggleButton).OnClick := nil; + (LastMounterButton as TGTKToggleButton).Checked := TMounterItem(LastMounterButton.Tag).Mounted; + (LastMounterButton as TGTKToggleButton).OnClick := MounterButtonClick; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.miMounterSettingsClick(Sender: TObject); +var x: TList; +begin + try + InternalLock; + FMounterPrefs := TFMounterPrefs.Create(Self); + ReadMounter; + FMounterPrefs.AssignAssocList(MounterList); + FMounterPrefs.FillList; + if FMounterPrefs.Run = mbOK then begin + FMounterPrefs.CleanItems; + x := MounterList; + MounterList := FMounterPrefs.InternalMounterList; + FMounterPrefs.InternalMounterList := x; + ConfMounterUseFSTab := FMounterPrefs.UseFSTabDefaultsCheckBox.Checked; + ConfMounterPushDown := FMounterPrefs.ToggleModeCheckBox.Checked; + WriteMounter; + FillMounterBar; + end; + finally + FMounterPrefs.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.miShowMounterBarClick(Sender: TObject); +begin + if miShowOneMounterBar.Checked then ConfShowMounterBar := 1 else + if miShowTwoMounterBar.Checked then ConfShowMounterBar := 2 else ConfShowMounterBar := 0; + MounterBarHandleBox.Visible := ConfShowMounterBar = 1; + LeftMounterTable.Visible := ConfShowMounterBar = 2; + RightMounterTable.Visible := ConfShowMounterBar = 2; + FillMounterBar; +end; + +procedure TFMain.miColumnsClick(Sender: TObject); +begin + try + InternalLock; + FColumns := TFColumns.Create(Self); +// FColumns.Show; + if FColumns.Run = mbOK then begin + FColumns.ApplyColumnList; + RebuildListViews(True); + end; + finally + FColumns.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.ListViewColumnsChanged(Sender: TObject); +var SourceListView: TGTKListView; + i, j, k, ColIdx, ColumnID: integer; + Column: PGtkTreeViewColumn; + TempIDs, TempArrayI: array[1..ConstNumPanelColumns] of integer; + TempArrayB: array[1..ConstNumPanelColumns] of boolean; +begin + DebugMsg(['*** Columns reordered ---> performing listview rebuild']); + LeftListView.OnMouseUp := nil; + RightListView.OnMouseUp := nil; + LeftListView.OnColumnsChanged := nil; + RightListView.OnColumnsChanged := nil; + SourceListView := Sender as TGTKListView; + + // Copy the old items + for i := 1 to ConstNumPanelColumns do begin + TempIDs[i] := ConfColumnIDs[i]; + TempArrayI[i] := ConfColumnSizes[i]; + TempArrayB[i] := ConfColumnVisible[i]; + end; + + ColIdx := 1; + // Search for moved columns + for i := 0 to SourceListView.Columns.Count - 1 do begin + Column := gtk_tree_view_get_column(PGtkTreeView(SourceListView.FWidget), i); + ColumnID := ColumnSortIDs[gtk_tree_view_column_get_sort_column_id(column) + 1]; + for j := ColIdx to ConstNumPanelColumns do + if TempArrayB[j] then begin + for k := 1 to ConstNumPanelColumns do + if ColumnID = TempIDs[k] then begin + DebugMsg(['moving from ', k, ' to ', j]); + ConfColumnIDs[j] := TempIDs[k]; + ConfColumnSizes[j] := TempArrayI[k]; + ConfColumnVisible[j] := TempArrayB[k]; + Break; + end; + ColIdx := j + 1; + Break; + end; + end; + + RebuildListViewsTimer.Interval := 100; + RebuildListViewsTimer.Enabled := True; +end; + +procedure TFMain.RebuildListViews(DoRefresh: boolean); +begin + LeftListView.OnColumnsChanged := nil; + RightListView.OnColumnsChanged := nil; + ConfMainWindowLeftSortColumn := LeftListView.SortColumnID; + ConfMainWindowLeftSortType := Integer(LeftListView.SortOrder); + ConfMainWindowRightSortColumn := RightListView.SortColumnID; + ConfMainWindowRightSortType := Integer(RightListView.SortOrder); + LeftListView.Items.Clear; + RightListView.Items.Clear; + LeftListView.Columns.Clear; + RightListView.Columns.Clear; + ConstructColumns(LeftListView); + ConstructColumns(RightListView); + InactiveItemsTimer.Enabled := False; + if DoRefresh then begin + FMain.DoRefresh(True, True, True); + FMain.DoRefresh(False, True, True); + LeftListView.SetSortInfo(ConfMainWindowLeftSortColumn, TGTKTreeViewSortOrder(ConfMainWindowLeftSortType)); + RightListView.SetSortInfo(ConfMainWindowRightSortColumn, TGTKTreeViewSortOrder(ConfMainWindowRightSortType)); + end; + LeftListView.OnColumnsChanged := ListViewColumnsChanged; + RightListView.OnColumnsChanged := ListViewColumnsChanged; +end; + +procedure TFMain.RebuildListViewsTimerTimer(Sender: TObject); +begin + RebuildListViewsTimer.Enabled := False; + RebuildListViews(True); + LeftListView.OnMouseUp := ListViewMouseUp; + RightListView.OnMouseUp := ListViewMouseUp; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.FillPluginMenu; +var i: integer; + MenuItem1, MenuItem2: TGTKMenuItem; +begin + if PluginList.Count = 0 then begin + MenuItem1 := TGTKMenuItem.CreateTyped(Self, itLabel); + MenuItem1.Caption := LANGNoPluginsFound; + MenuItem1.Enabled := False; + mnuPlugins.Add(MenuItem1); + end else + for i := 0 to PluginList.Count - 1 do begin + MenuItem1 := TGTKMenuItem.CreateTyped(Self, itImageText); + MenuItem1.Caption := ANSIToUTF8(TVFSPlugin(PluginList[i]).VFSName); + MenuItem2 := TGTKMenuItem.CreateTyped(Self, itImageText); + MenuItem2.Caption := LANGPluginAbout; + MenuItem2.Tag := i; + MenuItem2.OnClick := miPluginAboutClick; + mnuPlugins.Add(MenuItem1); + MenuItem1.Add(MenuItem2); + end; +end; + +procedure TFMain.miTestPluginClick(Sender: TObject); +var Engine: TVFSEngine; + b: boolean; +begin + try + InternalLock; + FTestPlugin := TFTestPlugin.Create(Self); + if (FTestPlugin.Run = mbOK) and (PluginList.Count > 0) then begin + Engine := TVFSEngine.Create(PluginList[FTestPlugin.PluginOptionMenu.ItemIndex]); + if not Engine.VFSOpenURI(UTF8ToANSI(FTestPlugin.CommandEntry.Text)) then begin + Application.MessageBox(LANGCouldntOpenURI, [mbOK], mbError, mbOK, mbOK); + Exit; + end; + b := True; + if not FTestPlugin.AnonymousCheckButton.Checked then + b := HandleLogin(FTestPlugin, Engine, FTestPlugin.UserEntry.Text, FTestPlugin.PasswordEntry.Text); + if b then begin + if LeftLastFocused then LeftPanelEngine := Engine + else RightPanelEngine := Engine; + DoRefresh(LeftLastFocused, False, False); + end; + end; + finally + FTestPlugin.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.miPluginAboutClick(Sender: TObject); +const Authors : array[0..1] of PChar = ('', nil); +var AboutBox: PGtkWidget; + VFSItem: TVFSPlugin; +begin + VFSItem := PluginList[(Sender as TGTKMenuItem).Tag]; + InternalLock; + if (libGnomeUI2Handle = nil) or (@gnome_about_new = nil) then + Application.MessageBox(Format(LANGPluginAboutInside, [VFSItem.VFSName, VFSItem.VFSAbout, VFSItem.VFSCopyright])) + else begin + AboutBox := gnome_about_new(VFSItem.VFSName, nil, VFSItem.VFSCopyright, VFSItem.VFSAbout, @Authors, nil, nil, nil); + gtk_window_set_transient_for(GTK_WINDOW(AboutBox), GTK_WINDOW(FMain.FWidget)); + gtk_dialog_run(GTK_DIALOG(AboutBox)); + end; + Application.ProcessMessages; + InternalLockInit(False); +end; + +procedure TFMain.miSavePositionClick(Sender: TObject); +begin + WriteMainSettings; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.NewTabInternal(LeftPanel: boolean; _Engine: TPanelEngine; _Path: string; NewTabPosition: integer); +var AListView: TGTKListView; + AEngine: TPanelEngine; + ANotebook: TEphyNotebook; + ATabList: TStringList; + AVBoxList: TList; + APath, APathSave: string; + VBox: TGTKVBox; + DockedToNotebook: boolean; + PathsHighlight: TStringList; + TabEngines: TList; + TabSortIDs: TList; + TabSortTypes: TList; + i, InsertPos: integer; +begin + if LeftPanel then begin + AListView := LeftListView; + AEngine := LeftPanelEngine; + ANotebook := LeftPanelNotebook; + ATabList := LeftPanelTabs; + AVBoxList := LeftNotebookBoxList; + PathsHighlight := LeftPathsHighlight; + TabEngines := LeftTabEngines; + TabSortIDs := LeftTabSortIDs; + TabSortTypes := LeftTabSortTypes; + end else begin + AListView := RightListView; + AEngine := RightPanelEngine; + ANotebook := RightPanelNotebook; + ATabList := RightPanelTabs; + AVBoxList := RightNotebookBoxList; + PathsHighlight := RightPathsHighlight; + TabEngines := RightTabEngines; + TabSortIDs := RightTabSortIDs; + TabSortTypes := RightTabSortTypes; + end; + + DockedToNotebook := ANotebook.Visible; + + VBox := nil; + for i := 0 to 0 + Ord(not DockedToNotebook) do begin + InsertPos := 0; + if (i = 1) or DockedToNotebook then begin + APath := _Path; + AEngine := _Engine; + InsertPos := NewTabPosition; + if (i = 1) and (InsertPos > 1) then InsertPos := 1; + end else APath := AEngine.Path; + + ATabList.Insert(InsertPos, APath); + APath := ExtractFileName(ExcludeTrailingPathDelimiter(APath)); + if APath = '' then APath := '/'; + if i = 0 then APathSave := APath; + VBox := TGTKVBox.Create(Self); + AVBoxList.Insert(InsertPos, VBox); + PathsHighlight.Insert(InsertPos, PDataItem(AListView.Selected.Data)^.AName); + TabSortIDs.Insert(InsertPos, Pointer(AListView.SortColumnID)); + TabSortTypes.Insert(InsertPos, Pointer(Integer(AListView.SortOrder))); + TabEngines.Insert(InsertPos, AEngine); + end; + + if not DockedToNotebook then begin + ANotebook.InsertPage(0, AVBoxList[0], APathSave); + SetTabLabel(ANotebook, 0, APathSave, ATabList[0]); + end; + + InsertPos := NewTabPosition; + if InsertPos > ATabList.Count then InsertPos := ATabList.Count; + if not ANotebook.Visible then ANotebook.Visible := True; + i := ANotebook.InsertPage(InsertPos, VBox, APath); + SetTabLabel(ANotebook, i, APath, ATabList[InsertPos]); + ANotebook.PageIndex := i; +end; + +procedure TFMain.NewTab(LeftPanel: boolean); +var AEngine: TPanelEngine; + ATabList: TStringList; + APath: string; + DontShowAgain: boolean; +begin + if LeftPanel then begin + AEngine := LeftPanelEngine; + ATabList := LeftPanelTabs; + end else begin + AEngine := RightPanelEngine; + ATabList := RightPanelTabs; + end; + + APath := AEngine.Path; + if AEngine is TVFSEngine then begin + while AEngine is TVFSEngine do begin + APath := AEngine.SavePath; + AEngine := AEngine.ParentEngine; + end; + // Show warning that we couldn't duplicate the VFS location + if ConfDuplicateTabWarning then begin + MessageBoxShowOnce(LANGDuplicateTabWarning, LANGDontShowAgain, DontShowAgain, [mbOK], mbInfo, mbOK, mbOK); + if DontShowAgain then begin + ConfDuplicateTabWarning := False; + WriteMainGUISettings; + end; + end; + end; + + NewTabInternal(LeftPanel, AEngine, APath, ATabList.Count + Ord(ATabList.Count = 0)); +end; + +procedure TFMain.SwitchTab(TabNo: integer; LeftPanel, SetFocus: boolean); +var ANotebook: TEphyNotebook; + AListView: TGTKListView; + AVBoxList: TList; + ListBox: TGTKVBox; + AScrolledWindow: TGTKScrolledWindow; + i: integer; +begin + if LeftPanel then begin + ANotebook := LeftPanelNotebook; + AVBoxList := LeftNotebookBoxList; + ListBox := LeftListBox; + AScrolledWindow := LeftScrolledWindow; + AListView := LeftListView; + end else begin + ANotebook := RightPanelNotebook; + AVBoxList := RightNotebookBoxList; + ListBox := RightListBox; + AScrolledWindow := RightScrolledWindow; + AListView := RightListView; + end; + + if (AVBoxList.Count < TabNo) or (TabNo < -1) then Exit; + + // Remove any objects + g_object_ref(AScrolledWindow.FWidget); + if ListBox.ChildrenCount > 0 then ListBox.RemoveControl(AScrolledWindow); + if AVBoxList.Count > 0 then + for i := 0 to AVBoxList.Count - 1 do + if TGTKVBox(AVBoxList[i]).ChildrenCount > 0 then TGTKVBox(AVBoxList[i]).RemoveControl(AScrolledWindow); + + if TabNo >= 0 then begin // Reparent to the tab + TGTKVBox(AVBoxList[TabNo]).AddControlEx(AScrolledWindow, True, True, 0); + ListBox.Visible := False; + ANotebook.Visible := True; + end else begin // Reparent back to the panel + ListBox.AddControlEx(AScrolledWindow, True, True, 0); + ListBox.Visible := True; + ANotebook.Visible := False; + end; + g_object_unref(AScrolledWindow.FWidget); + if SetFocus then AListView.SetFocus; +end; + +procedure TFMain.TabNotebookSwitchPage(Sender: TObject; const NewTabNum: integer; const ShouldFocus: boolean); +var LeftPanel: boolean; + ATabList: TStringList; + PathsHighlight: TStringList; + TabEngines: TList; + AListView: TGTKListView; + TabSortIDs: TList; + TabSortTypes: TList; +begin + DebugMsg(['Switch page']); + LeftPanel := (Sender as TEphyNotebook) = LeftPanelNotebook; + if LeftPanel then begin + ATabList := LeftPanelTabs; + PathsHighlight := LeftPathsHighlight; + TabEngines := LeftTabEngines; + TabSortIDs := LeftTabSortIDs; + TabSortTypes := LeftTabSortTypes; + AListView := LeftListView; + end else begin + ATabList := RightPanelTabs; + PathsHighlight := RightPathsHighlight; + TabEngines := RightTabEngines; + TabSortIDs := RightTabSortIDs; + TabSortTypes := RightTabSortTypes; + AListView := RightListView; + end; + SwitchTab(NewTabNum, LeftPanel, ShouldFocus); + if LeftPanel then LeftPanelEngine := TabEngines[NewTabNum] + else RightPanelEngine := TabEngines[NewTabNum]; + ChangingDir(LeftPanel, ATabList[NewTabNum], PathsHighlight[NewTabNum]); + AListView.SetSortInfo(Integer(TabSortIDs[NewTabNum]), + TGTKTreeViewSortOrder(Integer(TabSortTypes[NewTabNum]))); +end; + +procedure TFMain.miDuplicateTabClick(Sender: TObject); +begin + if not CommandLineCombo.Entry.Focused then + if LeftListView.Focused then NewTab(True) else + if RightListView.Focused then NewTab(False) else + if (Sender is TGTKMenuItem) and LeftTabPopup then NewTab(True) else + if (Sender is TGTKMenuItem) and (not LeftTabPopup) then NewTab(False) else + DebugMsg(['Couldn''t duplicate tab: No listview focused.']); +end; + +procedure TFMain.miCloseTabClick(Sender: TObject); +begin + if not CommandLineCombo.Entry.Focused then + if LeftListView.Focused then CloseTab(LeftPanelNotebook.PageIndex, True) else + if RightListView.Focused then CloseTab(RightPanelNotebook.PageIndex, False) else + if (Sender is TGTKMenuItem) and LeftTabPopup then CloseTab(LeftPanelNotebook.PageIndex, True) else + if (Sender is TGTKMenuItem) and (not LeftTabPopup) then CloseTab(RightPanelNotebook.PageIndex, False) else + DebugMsg(['Couldn''t close tab: No listview focused.']); +end; + +procedure TFMain.miCloseAllTabsClick(Sender: TObject); +begin + if Application.MessageBox(LANGAreYouSureCloseAllTabs, [mbYes, mbNo], mbQuestion, mbYes, mbNo) = mbYes then + if (Sender is TGTKMenuItem) and LeftTabPopup then CloseTab(-1, True) else + if (Sender is TGTKMenuItem) and (not LeftTabPopup) then CloseTab(-1, False) else + DebugMsg(['Couldn''t close all tabs: No listview focused.']); +end; + +procedure TFMain.CloseTab(TabNo: integer; LeftPanel: boolean); +var ATabList: TStringList; + PathsHighlight: TStringList; + ANotebook: TEphyNotebook; + AVBoxList: TList; + i, NewPageIndex: integer; + TabEngines: TList; + Engine: TPanelEngine; + TabSortIDs: TList; + TabSortTypes: TList; + AListView: TGTKListView; +begin + if LeftPanel then begin + ATabList := LeftPanelTabs; + PathsHighlight := LeftPathsHighlight; + ANotebook := LeftPanelNotebook; + AVBoxList := LeftNotebookBoxList; + TabEngines := LeftTabEngines; + TabSortIDs := LeftTabSortIDs; + TabSortTypes := LeftTabSortTypes; + AListView := LeftListView; + end else begin + ATabList := RightPanelTabs; + PathsHighlight := RightPathsHighlight; + ANotebook := RightPanelNotebook; + AVBoxList := RightNotebookBoxList; + TabEngines := RightTabEngines; + TabSortIDs := RightTabSortIDs; + TabSortTypes := RightTabSortTypes; + AListView := RightListView; + end; + DebugMsg(['Close tab, TabNo = ', TabNo, ', PageIndex = ', ANotebook.PageIndex]); + + if (ANotebook.ChildrenCount < TabNo) or (TabNo < -1) or (not ANotebook.Visible) then begin + DebugMsg(['Couldn''t close tab: wrong TabNo']); + Exit; + end; + if (ANotebook.ChildrenCount > 2) and (TabNo >= 0) then begin + // Close one tab, leave tab bar visible + Engine := TabEngines[TabNo]; +// !!!!!!!! + NewPageIndex := ANotebook.PageIndex - Ord((TabNo = ANotebook.PageIndex) and (TabNo = ANotebook.ChildrenCount - 1)) + + Ord((TabNo = ANotebook.PageIndex) and (ANotebook.ChildrenCount > TabNo + 1)); +// if (ANotebook.PageIndex = 0) and (NewPageIndex = 0) then NewPageIndex := 1; + ANotebook.PageIndex := NewPageIndex; + // Before remove, ensure some other page is active + ANotebook.RemovePage(TabNo); + ATabList.Delete(TabNo); + PathsHighlight.Delete(TabNo); + TabEngines.Delete(TabNo); +// g_object_unref(TGTKVBox(AVBoxList[TabNo]).FWidget); + AVBoxList.Delete(TabNo); + TabSortIDs.Delete(TabNo); + TabSortTypes.Delete(TabNo); + // Try to close the VFS engine + if Engine is TVFSEngine then + try + if not TVFSEngine(Engine).VFSClose then DebugMsg(['Error closing the engine...']); + Engine.Free; + except end; + + end else begin // Close last/all tabs, hide the tab bar + // Change dir to the opposite + if (TabNo >= 0) and (TabNo = ANotebook.PageIndex) then begin // we should not change directory while closing all tabs... + i := Ord(not Boolean(ANotebook.PageIndex)); + if LeftPanel then LeftPanelEngine := TabEngines[i] + else RightPanelEngine := TabEngines[i]; + ChangingDir(LeftPanel, ATabList[i], PathsHighlight[i]); + end; + // Remove the tabs + SwitchTab(-1, LeftPanel, False); + for i := ANotebook.ChildrenCount - 1 downto 0 do ANotebook.RemovePage(i); + ATabList.Clear; + PathsHighlight.Clear; + for i := 0 to TabEngines.Count - 1 do + if (TPanelEngine(TabEngines[i]) is TVFSEngine) and ((LeftPanel and (LeftPanelEngine <> TabEngines[i])) or + ((not LeftPanel) and (RightPanelEngine <> TabEngines[i]))) then + try + Engine := TabEngines[i]; + if not TVFSEngine(Engine).VFSClose then DebugMsg(['Error closing the engine...']); + Engine.Free; + except end; + + TabEngines.Clear; +{ for i := 0 to AVBoxList.Count - 1 do + g_object_unref(TGTKVBox(AVBoxList[i]).FWidget); } + AVBoxList.Clear; + TabSortIDs.Clear; + TabSortTypes.Clear; + AListView.SetFocus; + end; +end; + +procedure TFMain.TabPopupMenuPopup(Sender: TObject); +begin + LeftTabPopup := Sender = LeftPanelNotebook; +end; + +procedure TFMain.AddTabs(LeftPanel: boolean; TabList: TStringList; TabSortIDs, TabSortTypes: TList; SetTabActive: integer); +var ANotebook: TEphyNotebook; + ATabList: TStringList; + AVBoxList: TList; + APath: string; + VBox: TGTKVBox; + PathsHighlight: TStringList; + TabEngines: TList; + i: integer; + ATabSortIDs: TList; + ATabSortTypes: TList; +begin + if LeftPanel then begin + ANotebook := LeftPanelNotebook; + ATabList := LeftPanelTabs; + AVBoxList := LeftNotebookBoxList; + PathsHighlight := LeftPathsHighlight; + TabEngines := LeftTabEngines; + ATabSortIDs := LeftTabSortIDs; + ATabSortTypes := LeftTabSortTypes; + end else begin + ANotebook := RightPanelNotebook; + ATabList := RightPanelTabs; + AVBoxList := RightNotebookBoxList; + PathsHighlight := RightPathsHighlight; + TabEngines := RightTabEngines; + ATabSortIDs := RightTabSortIDs; + ATabSortTypes := RightTabSortTypes; + end; + + if (not Assigned(TabList)) or (TabList.Count < 1) or (not Assigned(TabSortIDs)) or (TabSortIDs.Count < 1) or + (not Assigned(TabSortTypes)) or (TabSortTypes.Count < 1) then Exit; + + for i := 0 to TabList.Count - 1 do begin + ATabList.Add(TabList[i]); + APath := ExtractFileName(ExcludeTrailingPathDelimiter(TabList[i])); + if APath = '' then APath := '/'; + VBox := TGTKVBox.Create(Self); + AVBoxList.Add(VBox); + PathsHighlight.Add(''); + ATabSortIDs.Add(TabSortIDs[i]); + ATabSortTypes.Add(TabSortTypes[i]); + if LeftPanel then TabEngines.Add(LeftPanelEngine) + else TabEngines.Add(RightPanelEngine); + ANotebook.AppendPage(VBox, APath); + SetTabLabel(ANotebook, ANotebook.ChildrenCount - 1, APath, TabList[i]); + end; + + if not ANotebook.Visible then ANotebook.Visible := True; + ANotebook.PageIndex := SetTabActive; + TabNotebookSwitchPage(ANotebook, SetTabActive, True); +end; + +procedure TFMain.SetTabLabel(Notebook: TEphyNotebook; PageIndex: integer; ALabel, Tooltip: string); +begin + if (ConfTabMaxLength > 0) and (Length(ALabel) > ConfTabMaxLength) then + ALabel := Copy(ALabel, 1, ConfTabMaxLength) + '...'; + Notebook.SetTabCaption(PageIndex, ALabel); + Notebook.SetTabTooltip(PageIndex, Tooltip); +end; + +procedure TFMain.NotebookReordered(Sender: TObject; const Source, Dest: integer); +var ANotebook: TEphyNotebook; + ATabList: TStringList; + AVBoxList: TList; + PathsHighlight: TStringList; + TabEngines: TList; + ATabSortIDs: TList; + ATabSortTypes: TList; +begin + ANotebook := Sender as TEphyNotebook; + if ANotebook = LeftPanelNotebook then begin + ATabList := LeftPanelTabs; + AVBoxList := LeftNotebookBoxList; + PathsHighlight := LeftPathsHighlight; + TabEngines := LeftTabEngines; + ATabSortIDs := LeftTabSortIDs; + ATabSortTypes := LeftTabSortTypes; + end else begin + ATabList := RightPanelTabs; + AVBoxList := RightNotebookBoxList; + PathsHighlight := RightPathsHighlight; + TabEngines := RightTabEngines; + ATabSortIDs := RightTabSortIDs; + ATabSortTypes := RightTabSortTypes; + end; + + ATabList.Move(Source, Dest); + AVBoxList.Move(Source, Dest); + PathsHighlight.Move(Source, Dest); + TabEngines.Move(Source, Dest); + ATabSortIDs.Move(Source, Dest); + ATabSortTypes.Move(Source, Dest); +end; + +procedure TFMain.NotebookTabClosed(Sender: TObject; const TabNum: integer; var CanClose: boolean); +begin + CloseTab(TabNum, Sender = LeftPanelNotebook); + CanClose := False; +end; + +procedure TFMain.NotebookTabDoubleClick(Sender: TObject; const TabNum: integer); +begin + CloseTab(TabNum, Sender = LeftPanelNotebook); +end; + +function TFMain.NotebookFindNotebookAtPointerEvent(Sender: TObject; const AbsX, AbsY: integer): TEphyNotebook; +var wx, wy: Integer; +begin +// DebugMsg([' *** NotebookFindNotebookAtPointerEvent(AbsX = ', AbsX, ', AbsY = ', AbsY, ')']); + Result := nil; + + if LeftPanelNotebook.Visible then begin + gtk_widget_get_pointer(LeftPanelNotebook.FWidget, @wx, @wy); + if (wx > 0) and (wy > 0) and (wx < LeftPanelNotebook.FWidget^.allocation.width) and + (wy < LeftPanelNotebook.FWidget^.allocation.height) then Result := LeftPanelNotebook; + end else begin + gtk_widget_get_pointer(LeftScrolledWindow.FWidget, @wx, @wy); + if (wx > 0) and (wy > 0) and (wx < LeftScrolledWindow.FWidget^.allocation.width) and + (wy < LeftScrolledWindow.FWidget^.allocation.height) then Result := LeftPanelNotebook; + end; + + if Result = nil then begin + if RightPanelNotebook.Visible then begin + gtk_widget_get_pointer(RightPanelNotebook.FWidget, @wx, @wy); + if (wx > 0) and (wy > 0) and (wx < RightPanelNotebook.FWidget^.allocation.width) and + (wy < RightPanelNotebook.FWidget^.allocation.height) then Result := RightPanelNotebook; + end else begin + gtk_widget_get_pointer(RightScrolledWindow.FWidget, @wx, @wy); + if (wx > 0) and (wy > 0) and (wx < RightScrolledWindow.FWidget^.allocation.width) and + (wy < RightScrolledWindow.FWidget^.allocation.height) then Result := RightPanelNotebook; + end; + end; + +{ + if Result = LeftPanelNotebook then DebugMsg([' *** NotebookFindNotebookAtPointerEvent: inside LeftPanelNotebook']) else + if Result = RightPanelNotebook then DebugMsg([' *** NotebookFindNotebookAtPointerEvent: inside RightPanelNotebook']); + } +end; + +function TFMain.NotebookMoveTabToAnotherNotebook(Sender: TObject; Destination: TEphyNotebook; const SourceTabNo, DestTabNo: integer): boolean; +var LeftPanel: boolean; + ATargetEngine, ASrcEngine: TPanelEngine; + ATargetTabList, ASrcTabList: TStringList; + ATargetPathsHighlight, ASrcPathsHighlight: TStringList; + ATargetTabEngines, ASrcTabEngines: TList; + ATargetTabSortIDs, ASrcTabSortIDs: TList; + ATargetTabSortTypes, ASrcTabSortTypes: TList; + APath: string; + DontShowAgain: boolean; + dst_no: integer; +begin + DontShowAgain := False; + DebugMsg([' *** NotebookMoveTabToAnotherNotebook(SourceTabNo = ', SourceTabNo, ', DestTabNo = ', DestTabNo, ')']); + LeftPanel := Sender = LeftPanelNotebook; + if LeftPanel then begin + ATargetEngine := RightPanelEngine; + ATargetTabList := RightPanelTabs; + ASrcEngine := LeftPanelEngine; + ASrcTabList := LeftPanelTabs; + ATargetPathsHighlight := RightPathsHighlight; + ATargetTabEngines := RightTabEngines; + ATargetTabSortIDs := RightTabSortIDs; + ATargetTabSortTypes := RightTabSortTypes; + ASrcPathsHighlight := LeftPathsHighlight; + ASrcTabEngines := LeftTabEngines; + ASrcTabSortIDs := LeftTabSortIDs; + ASrcTabSortTypes := LeftTabSortTypes; + end else begin + ATargetEngine := LeftPanelEngine; + ATargetTabList := LeftPanelTabs; + ASrcEngine := RightPanelEngine; + ASrcTabList := RightPanelTabs; + ATargetPathsHighlight := LeftPathsHighlight; + ATargetTabEngines := LeftTabEngines; + ATargetTabSortIDs := LeftTabSortIDs; + ATargetTabSortTypes := LeftTabSortTypes; + ASrcPathsHighlight := RightPathsHighlight; + ASrcTabEngines := RightTabEngines; + ASrcTabSortIDs := RightTabSortIDs; + ASrcTabSortTypes := RightTabSortTypes; + end; + + if (SourceTabNo < 0) or (SourceTabNo > ASrcTabList.Count - 1) then begin + DebugMsg([' *** NotebookMoveTabToAnotherNotebook: invalid SourceTabNo']); + Exit; + end; + + APath := TPanelEngine(ASrcTabEngines[SourceTabNo]).Path; + if TPanelEngine(ASrcTabEngines[SourceTabNo]) is TVFSEngine then begin + while TPanelEngine(ASrcTabEngines[SourceTabNo]) is TVFSEngine do begin + APath := TPanelEngine(ASrcTabEngines[SourceTabNo]).SavePath; + ASrcTabEngines[SourceTabNo] := TPanelEngine(ASrcTabEngines[SourceTabNo]).ParentEngine; + end; + // Show warning that we couldn't duplicate the VFS location + if ConfDuplicateTabWarning then begin + MessageBoxShowOnce(LANGDuplicateTabWarning, LANGDontShowAgain, DontShowAgain, [mbOK], mbInfo, mbOK, mbOK); + if DontShowAgain then begin + ConfDuplicateTabWarning := False; + WriteMainGUISettings; + end; + end; + end; + + while ATargetEngine is TVFSEngine do + ATargetEngine := ATargetEngine.ParentEngine; + + dst_no := DestTabNo; + if dst_no < 0 then dst_no := ATargetTabList.Count + Ord(ATargetTabList.Count = 0); + CloseTab(SourceTabNo, LeftPanel); + NewTabInternal(not LeftPanel, ATargetEngine, APath, dst_no); + + Result := True; +end; + +procedure TFMain.NotebookTabFocusOnlyEvent(Sender: TObject; const TabNum: integer); +begin + if Sender = LeftPanelNotebook then LeftListView.SetFocus else + if Sender = RightPanelNotebook then RightListView.SetFocus + else Exit; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function TFMain.HandleVFSArchive(const Ext, FullPath, HighlightItem, TargetPath: string): boolean; +var i, j: integer; + Plugin: TVFSPlugin; +begin + Result := False; + Plugin := nil; + + // Try to find a plugin which can handle open the archive type + if PluginList.Count > 0 then + for i := 0 to PluginList.Count - 1 do begin + Plugin := TVFSPlugin(PluginList[i]); + if Length(Plugin.Extensions) > 0 then + for j := 0 to Length(Plugin.Extensions) - 1 do begin +// DebugMsg(['Extension = "', Plugin.Extensions[j], '", Ext = "', Ext, '"']); + if AnsiCompareText(Plugin.Extensions[j], Ext) = 0 then begin + Result := True; + Break; + end; + end; + if Result then Break; + end; + if not Result then Exit; // we didn't find appropriate plugin + DebugMsg(['Found plugin ''', Plugin.VFSName, ''', trying to open the file ''', FullPath, '''']); + + ChangingDir(LeftLastFocused, TargetPath, FullPath, HighlightItem, False, False, Plugin); +end; + +procedure TFMain.CloseVFS(LeftPanel, SurpressRefresh: boolean); +var Engine: TPanelEngine; +begin + if LeftPanel then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + if not Assigned(Engine.ParentEngine) or (not (Engine is TVFSEngine)) then Exit; + if LeftPanel then LeftPanelEngine := Engine.ParentEngine + else RightPanelEngine := Engine.ParentEngine; + if not SurpressRefresh then ChangingDir(LeftPanel, Engine.SavePath, Engine.ParentEngine.LastHighlightItem, '', False, True); + + if not TVFSEngine(Engine).VFSClose then DebugMsg(['Error closing the engine...']); + Engine.Free; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.ShowBookmarkQuick(LeftPanel: boolean); +var SenderControl: TGTKControl; +begin + if LeftPanel then SenderControl := LeftBookmarkButton + else SenderControl := RightBookmarkButton; + miAddBookmark.Visible := False; + miEditBookmarks.Visible := False; + miBookmarksSeparator.Visible := False; + + gtk_menu_popup(PGtkMenu(mnuBookmarks.FMenu), nil, nil, menu_position_cb, SenderControl.FWidget, 1, GDK_CURRENT_TIME); + if LeftPanel then LeftListView.SetFocus else RightListView.SetFocus; +end; + +procedure TFMain.mnuBookmarksPopup(Sender: TObject); +begin + miAddBookmark.Visible := True; + miEditBookmarks.Visible := False; + miBookmarksSeparator.Visible := mnuBookmarks.Count > 3; +end; + + +(********************************************************************************************************************************) +procedure TFMain.miSearchClick(Sender: TObject); +var Engine: TPanelEngine; + DataList: TList; + AListView: TGTKListView; + Ext: string; + i: integer; +begin + if LeftLastFocused then Engine := LeftPanelEngine + else Engine := RightPanelEngine; + + try + FSearch := TFSearch.Create(Self); + FSearch.ParentForm := FMain; + FSearch.Engine := Engine; + FSearch.SearchInEntry.Text := ANSIToUTF8(ExcludeTrailingPathDelimiter(Engine.Path)); + if Length(FSearch.SearchInEntry.Text) < 1 then FSearch.SearchInEntry.Text := '/'; + case FSearch.Run of + mbOK: ; + mbApply: begin + if Length(FSearch.GoToFileArchive) > 0 then begin + Ext := ANSIUpperCase(Trim(Copy(FSearch.GoToFileArchive, LastDelimiter('.', FSearch.GoToFileArchive) + 1, Length(FSearch.GoToFileArchive) - LastDelimiter('.', FSearch.GoToFileArchive)))); + HandleVFSArchive(Ext, FSearch.GoToFileArchive, ExtractFileName(FSearch.GoToFileArchive), ExtractFilePath(FSearch.GoToFile)); + + if LeftLastFocused then begin + Engine := LeftPanelEngine; + DataList := LeftPanelData; + AListView := LeftListView; + end else begin + Engine := RightPanelEngine; + DataList := RightPanelData; + AListView := RightListView; + end; + + if Engine is TVFSEngine then begin + Engine.SavePath := ExtractFilePath(FSearch.GoToFileArchive); +// (Engine as TVFSEngine).ParentEngine.LastHighlightItem := ExtractFileName(FSearch.GoToFileArchive); + for i := 0 to DataList.Count - 1 do + if ANSICompareText(string(PDataItem(DataList[i])^.AName), ExtractFileName(FSearch.GoToFile)) = 0 then begin + AListView.Items[i].Selected := True; + AListView.Items[i].SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + Break; + end; + end; + end else ChangingDir(LeftLastFocused, ExtractFilePath(FSearch.GoToFile), ExtractFileName(FSearch.GoToFile)); + end; + end; + finally + FSearch.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMain.miOpenConnectionClick(Sender: TObject); +var Engine: TVFSEngine; + SourceEngine: TPanelEngine; + i, j: integer; + VFSPlugin: TVFSPlugin; + ConnInfo: TConnMgrItem; + b: boolean; +begin + try + InternalLock; + FConnectionManager := TFConnectionManager.Create(Self); + b := FConnectionManager.Run = mbOK; + WriteConnections; // Save the list to the file + + if b then begin + if PluginList.Count = 0 then begin + Application.MessageBox(LANGThereIsNoModuleAvailable, [mbOK], mbError, mbOK, mbOK); + Exit; + end; + if FConnectionManager.ListView.Selected = nil then Exit; + ConnInfo := FConnectionManager.ListView.Selected.AsPointer(0); + if ConnInfo = nil then Exit; + + // Find the VFS module to use for this connection + VFSPlugin := nil; + if Length(ConnInfo.PluginID) > 0 then + for i := 0 to PluginList.Count - 1 do + if TVFSPlugin(PluginList[i]).VFSName = ConnInfo.PluginID then begin + VFSPlugin := PluginList[i]; + Break; + end; + if VFSPlugin = nil then begin + for i := 0 to PluginList.Count - 1 do begin + if Length(TVFSPlugin(PluginList[i]).Services) > 0 then + for j := 0 to Length(TVFSPlugin(PluginList[i]).Services) - 1 do + if AnsiCompareText(TVFSPlugin(PluginList[i]).Services[j], ConnInfo.ServiceType) = 0 then begin + VFSPlugin := PluginList[i]; + Break; + end; + if VFSPlugin <> nil then Break; + end; + if VFSPlugin = nil then VFSPlugin := PluginList[0]; // Fallback in hope something else could handle it + end; + + if (LeftLastFocused and (LeftPanelEngine is TVFSEngine)) or ((not LeftLastFocused) and (RightPanelEngine is TVFSEngine)) then + begin + if Application.MessageBox(LANGCloseOpenConnection, [mbYes, mbNo], mbWarning, mbYes, mbNo) <> mbYes then Exit; + CloseVFS(LeftLastFocused, True); + end; + + // Construct the VFS Engine and try to open the connection + if LeftLastFocused then SourceEngine := LeftPanelEngine + else SourceEngine := RightPanelEngine; + Engine := TVFSEngine.Create(VFSPlugin); + Engine.ParentEngine := SourceEngine; + Engine.SavePath := SourceEngine.Path; + if not Engine.VFSOpenURI(ConnInfo.URI) then begin + Application.MessageBox(LANGCouldntOpenURI, [mbOK], mbError, mbOK, mbOK); + Exit; + end; + if LeftLastFocused then LeftPanelEngine := Engine + else RightPanelEngine := Engine; + DoRefresh(LeftLastFocused, False, False); + end; + finally + FConnectionManager.Free; + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +procedure TFMain.miDisconnectClick(Sender: TObject); +begin + CloseVFS(LeftLastFocused, False); +end; + +procedure TFMain.DisconnectButtonClick(Sender: TObject); +begin + CloseVFS(Sender = LeftDisconnectButton, False); + if (Sender = LeftDisconnectButton) and (not LeftListView.Focused) then LeftListView.SetFocus else + if (Sender = RightDisconnectButton) and (not RightListView.Focused) then RightListView.SetFocus; +end; + +procedure TFMain.LeaveArchiveButtonClick(Sender: TObject); +begin + CloseVFS(Sender = LeftLeaveArchiveButton, False); + if (Sender = LeftLeaveArchiveButton) and (not LeftListView.Focused) then LeftListView.SetFocus else + if (Sender = RightLeaveArchiveButton) and (not RightListView.Focused) then RightListView.SetFocus; +end; + +procedure TFMain.OpenTerminalButtonClick(Sender: TObject); +var CurrentPath: string; + AEngine: TPanelEngine; + Error: integer; +begin + Error := 0; + if LeftLastFocused then AEngine := LeftPanelEngine + else AEngine := RightPanelEngine; + while not (AEngine is TLocalTreeEngine) do AEngine := AEngine.ParentEngine; + CurrentPath := AEngine.Path; + ChDir(CurrentPath); + ExecuteProgram('bash', CurrentPath, False, True, Error); + ChDir('/'); +end; + + +(********************************************************************************************************************************) +procedure TFMain.miFilePropertiesClick(Sender: TObject); +var LeftPanel: boolean; + AListView: TGTKListView; + Engine: TPanelEngine; + DataList: TList; + i: integer; + SelCount: longint; + AFile, NextItem1, NextItem2: string; + Stat: PDataItemSL; +{ AWorkingThread: TWorkerThread; + AFProgress: TFProgress; } +begin + try + InternalLock; + if LeftListView.Focused then LeftPanel := True else + if RightListView.Focused then LeftPanel := False else + LeftPanel := LeftLastFocused; + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + if (SelCount = 0) and ((not Assigned(AListView.Selected)) {or PDataItem(AListView.Selected.Data)^.UpDir}) then begin + Application.MessageBox(LANGNoFilesSelected, [mbOK], mbInfo, mbNone, mbOK); + Exit; + end; + + AFile := ''; + if SelCount = 0 then AFile := PDataItem(AListView.Selected.Data)^.AName else + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then begin + AFile := AName; + Break; + end; + + if AFile <> '' then + try + FProperties := TFProperties.Create(Self); + Stat := Engine.GetFileInfoSL(IncludeTrailingPathDelimiter(Engine.Path) + AFile); + if not Assigned(Stat) then Exit; +// FProperties.AssignMode(Stat^.Mode, AFile, Stat^.UID, Stat^.GID); + FProperties.DisplayFileName := AFile; + if FProperties.Run = mbOK then begin +{ FindNextSelected(AListView, DataList, NextItem1, NextItem2); + + AWorkingThread := TWorkerThread.Create; + AFProgress := TFProgress.Create(Self); + try + AFProgress.SetNumBars(False); + AFProgress.ProgressBar.Value := 0; + AFProgress.Label1.Caption := LANGChownProgress; + AWorkingThread.ProgressForm := AFProgress; + if Assigned(AListView.Selected) then AWorkingThread.SelectedItem := AListView.Selected.Data; + AWorkingThread.ParamBool1 := FChown.RecursiveCheckButton.Checked; + AWorkingThread.ParamCardinal1 := FChown.LastUID; + AWorkingThread.ParamCardinal2 := FChown.LastGID; + AWorkingThread.Engine := Engine; + AWorkingThread.LeftPanel := LeftPanel; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := ChownFilesWorker; + AWorkingThread.Resume; + AFProgress.ParentForm := FMain; + if (SelCount > 1) or FChown.RecursiveCheckButton.Checked then AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + finally + AFProgress.Free; + AWorkingThread.Free; + end; } + + NextItem1 := ''; + NextItem2 := ''; + ChangingDir(LeftPanel, Engine.Path, NextItem1, NextItem2); + DoRefresh(not LeftPanel, True, True); + end; + finally + FProperties.Free; + end; + finally + Application.ProcessMessages; + InternalLockInit(False); + end; +end; + +(********************************************************************************************************************************) +procedure TFMain.CopyFilenamesToClipboard(FullPaths, LeftPanel: boolean); +var DataList: TList; + Engine: TPanelEngine; + AListView: TGTKListView; + i, x: longint; + SelCount: longint; + clip: PGtkClipboard; + s: string; +begin + if LeftPanel then begin + AListView := LeftListView; + Engine := LeftPanelEngine; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + Engine := RightPanelEngine; + DataList := RightPanelData; + end; + + SelCount := 0; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do + with PDataItem(DataList[i])^ do + if Selected and (not UpDir) then Inc(SelCount); + if (SelCount = 0) and ((not Assigned(AListView.Selected)) or PDataItem(AListView.Selected.Data)^.UpDir) + then Exit; // Silently do nothing + + if SelCount = 0 then begin + s := PDataItem(AListView.Selected.Data)^.AName; + if FullPaths then s := IncludeTrailingPathDelimiter(Engine.GetPath) + s; + end else begin + s := ''; + if DataList.Count > 0 then + for i := 0 to DataList.Count - 1 do begin + x := AListView.ConvertFromSorted(i); + if (x >= 0) and (x < DataList.Count) and PDataItem(DataList[x])^.Selected then begin + if FullPaths then s := s + IncludeTrailingPathDelimiter(Engine.GetPath); + s := s + PDataItem(DataList[x])^.AName + #10; + end; + end; + end; + + clip := gtk_clipboard_get(gdk_atom_intern('CLIPBOARD', False)); + gtk_clipboard_set_text(clip, StringToPgchar(s), Length(s)); +end; + + +(********************************************************************************************************************************) +function TFMain.HandleRunFromArchive(var APath: string; Engine: TPanelEngine; Command, FileTypeDesc: string; BypassDialog: boolean): boolean; +var Res: TMessageButton; + Stat: PDataItemSl; + s: string; + AWorkingThread: TWorkerThread; + AFProgress: TFProgress; + tmp: PChar; + LocalEngine: TLocalTreeEngine; + AListView: TGTKListView; + DataList: TList; + err: integer; +begin + Result := False; + try + if not BypassDialog then begin + Stat := Engine.GetFileInfoSL(APath); + FRunFromVFS := TFRunFromVFS.Create(Self); + FRunFromVFS.FileNameLabel2.Caption := Format('%s ', [APath]); + if FileTypeDesc = '' then FileTypeDesc := LANGHandleRunFromArchive_FileTypeDesc_Unknown; + FRunFromVFS.FileTypeLabel2.Caption := Format('%s ', [FileTypeDesc]); + if Assigned(Stat) then begin + if (ConfSizeFormat < 5) or (Stat^.Size < 1024) then s := Format(' %s', [LANGHandleRunFromArchive_Bytes]); + FRunFromVFS.SizeLabel2.Caption := Format('%s%s ', [ANSIToUTF8(FormatSize(Stat^.Size, 0)), s]); + if (ConfSizeFormat < 5) or (Stat^.Size < 1024) then s := Format(' %s', [LANGHandleRunFromArchive_Bytes]); + FRunFromVFS.PackedSizeLabel2.Caption := Format('%s%s ', [ANSIToUTF8(FormatSize(Stat^.Size, 0)), s]); + FRunFromVFS.DateLabel2.Caption := Format('%s ', [FormatDateTime('ddddd tt', Stat^.ModifyTime)]); + if (Command = '') and (not Stat^.IsExecutable) then begin + FRunFromVFS.OpensWithLabel2.Caption := Format('%s ', [LANGHandleRunFromArchive_NotAssociated]); + FRunFromVFS.ExecuteButton.Enabled := False; + FRunFromVFS.ExecuteAllButton.Enabled := False; + end else begin + if Command = '' then Command := LANGHandleRunFromArchive_SelfExecutable; + FRunFromVFS.OpensWithLabel2.Caption := Format('%s ', [Command]); + end; + end else begin + FRunFromVFS.SizeLabel2.Caption := Format('%s ', ['??']); + FRunFromVFS.PackedSizeLabel2.Caption := Format('%s ', ['??']); + FRunFromVFS.DateLabel2.Caption := Format('%s ', ['??']); + FRunFromVFS.OpensWithLabel2.Caption := Format('%s ', [Command]); + end; + FRunFromVFS.FileNameLabel2.UseMarkup := True; + FRunFromVFS.FileTypeLabel2.UseMarkup := True; + FRunFromVFS.SizeLabel2.UseMarkup := True; + FRunFromVFS.PackedSizeLabel2.UseMarkup := True; + FRunFromVFS.DateLabel2.UseMarkup := True; + FRunFromVFS.OpensWithLabel2.UseMarkup := True; + + FreeDataItem(Stat); + + Res := FRunFromVFS.Run; + FRunFromVFS.Close; + FRunFromVFS.Free; + Application.ProcessMessages; + end else Res := mbYes; + if Res in [mbYes, mbNo] then begin + Result := False; + // Handle password + if (Engine is TVFSEngine) and TVFSEngine(Engine).GetPasswordRequired and (Length(TVFSEngine(Engine).Password) < 1) then + if not HandleSetPassword(Engine) then Exit; + + if Res = mbYes then DebugMsg(['(II) HandleRunFromArchive: Selected extract and execute single item']) + else DebugMsg(['(II) HandleRunFromArchive: Selected extract all and execute']); + s := ConfTempPath + '-XXXXXX'; + tmp := strdup(PChar(s)); + tmp := mkdtemp(tmp); + if tmp = nil then begin + err := errno; + DebugMsg(['(EE) HandleRunFromArchive: Couldn''t create temporary directory: ', strerror(err)]); + Application.MessageBox(PChar(Format(LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory, [s, string(strerror(err))])), [mbOK], mbError, mbOK, mbOK); + Result := False; + Exit; + end; + DebugMsg(['(II) HandleRunFromArchive: Using temporary directory: ', tmp]); + UsedTempPaths.Add(string(tmp)); + + Engine.Path := ExtractFilePath(APath); + // Extract the files + try + AWorkingThread := TWorkerThread.Create; + DebugMsg(['TFMain.HandleRunFromArchive: Creating thread...']); + AFProgress := TFProgress.Create(Self); + AFProgress.Label1.Caption := LANGCopySC; + AFProgress.SetNumBars(True); + AFProgress.ProgressBar.Value := 0; + AWorkingThread.ProgressForm := AFProgress; + LocalEngine := TLocalTreeEngine.Create; + LocalEngine.SetPath(tmp); + AWorkingThread.ExtractFromVFSMode := True; + AWorkingThread.DestEngine := LocalEngine; + AWorkingThread.SrcEngine := Engine; + if LeftLastFocused then begin + AListView := LeftListView; + DataList := LeftPanelData; + end else begin + AListView := RightListView; + DataList := RightPanelData; + end; + if Assigned(AListView.Selected) then AWorkingThread.SelectedItem := AListView.Selected.Data; + AWorkingThread.ExtractFromVFSAll := Res = mbNo; + AWorkingThread.LeftPanel := LeftLastFocused; + AWorkingThread.DataList := DataList; + AWorkingThread.WorkerProcedure := CopyFilesWorker; + AWorkingThread.ParamBool3 := True; + AWorkingThread.ParamBool4 := False; + AWorkingThread.ParamBool5 := True; + AWorkingThread.ParamString1 := string(tmp); + AWorkingThread.ParamString2 := APath; + AWorkingThread.ParamDataItem1 := nil; + DebugMsg(['*** Copy: AWorkingThread.Resume']); + AWorkingThread.Resume; + DebugMsg(['*** Copy: AWorkingThread.Resumed.']); + AFProgress.ParentForm := FMain; + AFProgress.ShowModal; + ProcessProgressThread(AWorkingThread, AFProgress); + AFProgress.Close; + Result := {(not AWorkingThread.Cancelled) and} (not AWorkingThread.ErrorHappened); + finally + AFProgress.Free; + DebugMsg(['TFMain.HandleRunFromArchive: Freeing thread...']); + AWorkingThread.Free; + LocalEngine.Free; + end; + + DebugMsg(['(II) HandleRunFromArchive: Old path = ', APath]); + if Result then begin + if Res = mbYes then APath := IncludeTrailingPathDelimiter(string(tmp)) + ExtractFileName(APath) + else APath := ExcludeTrailingPathDelimiter(string(tmp)) + APath; + end; + DebugMsg(['(II) HandleRunFromArchive: New path = ', APath]); + + + Libc.free(tmp); + DebugMsg(['(II) HandleRunFromArchive: Copy OK, Result = ', Result]); + end; + + finally + Application.ProcessMessages; + end; +end; + +procedure TFMain.PasswordButtonClick(Sender: TObject); +begin + if Sender = LeftPasswordButton then HandleSetPassword(LeftPanelEngine) else + if Sender = RightPasswordButton then HandleSetPassword(RightPanelEngine); +end; + +function TFMain.HandleSetPassword(Engine: TPanelEngine): boolean; +begin + if not (Engine is TVFSEngine) then Exit; + try + FSetPassword := TFSetPassword.Create(Self); + FSetPassword.Entry.Text := TVFSEngine(Engine).Password; + if Length(FSetPassword.Entry.Text) > 0 then FSetPassword.Entry.SelectAll; + Result := FSetPassword.Run = mbOK; + if Result then TVFSEngine(Engine).Password := FSetPassword.Entry.Text; + FSetPassword.Free; + except + on E: Exception do DebugMsg(['*** Exception raised in FMain.HandleSetPassword: (', E.ClassName, '): ', E.Message]); + end; +end; + + + + + +end. + diff --git a/UMounterPrefs.pas b/UMounterPrefs.pas new file mode 100644 index 0000000..6a08454 --- /dev/null +++ b/UMounterPrefs.pas @@ -0,0 +1,565 @@ +(* + Tux Commander - UMounterPrefs - Mounter Preferences dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UMounterPrefs; + +interface + +uses + glib2, gdk2, gtk2, pango, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, + GTKView, GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, GTKMenus, + UCoreClasses, UGnome; + +type + TFMounterPrefs = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + ListView: TGTKListView; + ListViewScrolledWindow: TGTKScrolledWindow; + ListViewFrame, PropertiesFrame: TGTKFrame; + MounterListTable, PropertiesTable: TGTKTable; + AddItemButton, RemoveItemButton: TGTKButton; + MoveUpButton, MoveDownButton: TGTKImageButton; + HBox1: TGTKHBox; + DisplayTextLabel, MountPointLabel, MountDeviceLabel, MountCommandLabel, UmountCommandLabel, IconLabel, DeviceTypeLabel: TGTKLabel; + DisplayTextEntry, MountPointEntry, MountDeviceEntry, MountCommandEntry, UmountCommandEntry: TGTKEntry; + IconEntry: TGnomeIconEntry; + IconEntry2: TGTKButton; + DeviceTypeOptionMenu: TGTKOptionMenu; + miLocalDisk, miRemovable, miCD, miFloppy, miNetwork: TGTKMenuItem; + UseFSTabDefaultsCheckBox: TGTKCheckButton; + ToggleModeCheckBox: TGTKCheckButton; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure ListViewSelectionChanged(Sender: TObject); + procedure UseFSTabDefaultsCheckBoxToggled(Sender: TObject); + procedure AddItemButtonClick(Sender: TObject); + procedure RemoveItemButtonClick(Sender: TObject); + procedure MoveUpDownButtonButtonClick(Sender: TObject); + procedure DisplayTextEntryChanged(Sender: TObject); + procedure MountPointEntryChanged(Sender: TObject); + procedure MountDeviceEntryChanged(Sender: TObject); + procedure MountCommandEntryChanged(Sender: TObject); + procedure UmountCommandEntryChanged(Sender: TObject); + procedure DeviceTypeOptionMenuChanged(Sender: TObject); + procedure IconEntryChanged(Sender: TObject); + procedure IconEntry2Click(Sender: TObject); + private + FUseGnomeIconEntry: boolean; + procedure RefreshIcon(ItemIndex: integer); + public + InternalMounterList: TList; + procedure AssignAssocList(List: TList); + procedure FillList; + procedure CleanItems; + end; + +var + FMounterPrefs: TFMounterPrefs; + +implementation + +uses ULocale, UFileAssoc, UCoreUtils, UConfig, UCore; + +function TGTKListView_drag_end(widget: PGtkWidget; drag_context: PGdkDragContext; user_data: gpointer): gboolean; cdecl; forward; + +procedure TFMounterPrefs.FormCreate(Sender: TObject); +const row_targets: TGtkTargetEntry = (target:'GTK_TREE_MODEL_ROW'; flags:GTK_TARGET_SAME_APP; info:100); +var Column: TGTKTreeViewColumn; +begin + FUseGnomeIconEntry := Assigned(gnome_icon_entry_new) and Assigned(gnome_icon_entry_get_filename) and Assigned(gnome_icon_entry_set_filename); +// FUseGnomeIconEntry := False; + SetDefaultSize(500, 520); + Caption := LANGMounterPrefs_Caption; + Buttons := [mbOK, mbCancel]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [LANGMounterPrefs_TitleLabelCaption]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-cdrom', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + ListViewFrame := TGTKFrame.Create(Self); + ListViewFrame.Caption := LANGMounterPrefs_ListViewFrameCaption; + ListViewFrame.BorderWidth := 7; + ClientArea.AddControlEx(ListViewFrame, True, True, 0); + MounterListTable := TGTKTable.Create(Self); + ListViewFrame.AddControl(MounterListTable); + MounterListTable.BorderWidth := 7; + + ListView := TGTKListView.CreateTyped(Self, False, [lcText, lcText, lcText, lcPointer, lcPixbuf]); + g_signal_connect(ListView.FWidget, 'drag-end', G_CALLBACK(@TGTKListView_drag_end), nil); + gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(ListView.FWidget), GDK_BUTTON1_MASK, @row_targets, 1, GDK_ACTION_MOVE or GDK_ACTION_COPY); + gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(ListView.FWidget), @row_targets, 1, GDK_ACTION_MOVE or GDK_ACTION_COPY); + ListView.RulesHint := True; +// ListView.Reorderable := True; + Column := ListView.Columns.AddTyped(ctImageText); + Column.Caption := LANGMounterPrefs_MountName; + Column.AddImageAttribute('pixbuf', 4); + Column.AddAttribute('text', 0); + Column.Resizable := True; + Column.FixedWidth := 150; + Column.SizingMode := smFixed; +// Column.Clickable := True; + Column := ListView.Columns.Add; + Column.Caption := LANGMounterPrefs_MountPoint; + Column.AddAttribute('text', 1); + Column.Resizable := True; + Column.FixedWidth := 200; + Column.SizingMode := smFixed; +// Column.Clickable := True; + Column := ListView.Columns.Add; + Column.Caption := LANGMounterPrefs_Device; + Column.AddAttribute('text', 2); + Column.Resizable := True; + Column.FixedWidth := 150; + Column.SizingMode := smFixed; +// Column.Clickable := True; + ListViewScrolledWindow := TGTKScrolledWindow.Create(Self); + ListViewScrolledWindow.AddControl(ListView); + ListViewScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ListViewScrolledWindow.ShadowType := stShadowIn; + + AddItemButton := TGTKButton.CreateFromStock(Self, 'gtk-add'); + RemoveItemButton := TGTKButton.CreateFromStock(Self, 'gtk-remove'); + HBox1 := TGTKHBox.Create(Self); + HBox1.Homogeneous := True; + HBox1.AddControlEx(AddItemButton, True, True, 2); + HBox1.AddControlEx(RemoveItemButton, True, True, 2); + MoveUpButton := TGTKImageButton.CreateWithoutLabel(Self); + MoveUpButton.SetFromStock('gtk-go-up', isSmallToolbar); + MoveUpButton.Tooltip := LANGMounterPrefs_MoveUpButtonTooltip; + MoveUpButton.CanFocus := False; + MoveDownButton := TGTKImageButton.CreateWithoutLabel(Self); + MoveDownButton.SetFromStock('gtk-go-down', isSmallToolbar); + MoveDownButton.Tooltip := LANGMounterPrefs_MoveDownButtonTooltip; + MoveDownButton.CanFocus := False; + + UseFSTabDefaultsCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGMounterPrefs_UseFSTabDefaultsCheckBox); + UseFSTabDefaultsCheckBox.Tooltip := LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + ToggleModeCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGMounterPrefs_ToggleModeCheckBox); + ToggleModeCheckBox.Tooltip := LANGMounterPrefs_ToggleModeCheckBoxTooltip; + + MounterListTable.AddControlEx(0, 0, 3, 1, UseFSTabDefaultsCheckBox, [taoExpand, taoFill], [taoShrink, taoFill], 0, 2); + MounterListTable.AddControlEx(0, 1, 3, 1, ToggleModeCheckBox, [taoExpand, taoFill], [taoShrink, taoFill], 0, 2); + MounterListTable.AddControlEx(0, 2, 3, 4, ListViewScrolledWindow, [taoExpand, taoFill], [taoExpand, taoFill], 0, 5); + MounterListTable.AddControlEx(0, 6, 1, 1, TGTKLabel.Create(Self), [taoExpand, taoFill], [taoShrink, taoFill], 0, 2); + MounterListTable.AddControlEx(2, 6, 1, 1, HBox1, [taoShrink, taoFill], [taoShrink, taoFill], 0, 2); + MounterListTable.AddControlEx(3, 3, 1, 1, MoveUpButton, [taoShrink, taoFill], [taoShrink], 5, 5); + MounterListTable.AddControlEx(3, 4, 1, 1, MoveDownButton, [taoShrink, taoFill], [taoShrink], 5, 5); + MounterListTable.AddControlEx(3, 2, 1, 1, TGTKLabel.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 0, 2); + MounterListTable.AddControlEx(3, 5, 1, 1, TGTKLabel.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 0, 2); + + PropertiesFrame := TGTKFrame.Create(Self); + PropertiesFrame.Caption := LANGMounterPrefs_PropertiesFrameCaption; + PropertiesFrame.BorderWidth := 7; + PropertiesTable := TGTKTable.Create(Self); + PropertiesFrame.AddControl(PropertiesTable); + ClientArea.AddControlEx(PropertiesFrame, False, False, 0); + DisplayTextLabel := TGTKLabel.Create(Self); + DisplayTextLabel.Caption := LANGMounterPrefs_DisplayTextLabelCaption; + DisplayTextLabel.XAlign := 0; + DisplayTextLabel.UseUnderline := True; + MountPointLabel := TGTKLabel.Create(Self); + MountPointLabel.Caption := LANGMounterPrefs_MountPointLabelCaption; + MountPointLabel.XAlign := 0; + MountPointLabel.UseUnderline := True; + MountDeviceLabel := TGTKLabel.Create(Self); + MountDeviceLabel.Caption := LANGMounterPrefs_MountDeviceLabelCaption; + MountDeviceLabel.XAlign := 0; + MountDeviceLabel.UseUnderline := True; + DeviceTypeLabel := TGTKLabel.Create(Self); + DeviceTypeLabel.Caption := LANGMounterPrefs_DeviceTypeLabelCaption; + DeviceTypeLabel.XAlign := 0; + DeviceTypeLabel.UseUnderline := True; + DisplayTextEntry := TGTKEntry.Create(Self); + DisplayTextLabel.FocusControl := DisplayTextEntry; + MountPointEntry := TGTKEntry.Create(Self); + MountPointLabel.FocusControl := MountPointEntry; + MountDeviceEntry := TGTKEntry.Create(Self); + MountDeviceLabel.FocusControl := MountDeviceEntry; + DeviceTypeOptionMenu := TGTKOptionMenu.Create(Self); + DeviceTypeLabel.FocusControl := DeviceTypeOptionMenu; + miLocalDisk := TGTKMenuItem.CreateTyped(Self, itImageText); + miLocalDisk.Caption := LANGMounterPrefs_miLocalDiskCaption; + miLocalDisk.Icon := MounterHDD; + miRemovable := TGTKMenuItem.CreateTyped(Self, itImageText); + miRemovable.Caption := LANGMounterPrefs_miRemovableCaption; + miRemovable.Icon := MounterRemovable; + miCD := TGTKMenuItem.CreateTyped(Self, itImageText); + miCD.Caption := LANGMounterPrefs_miCDCaption; + miCD.Icon := MounterCD; + miFloppy := TGTKMenuItem.CreateTyped(Self, itImageText); + miFloppy.Caption := LANGMounterPrefs_miFloppyCaption; + miFloppy.Icon := MounterFloppy; + miNetwork := TGTKMenuItem.CreateTyped(Self, itImageText); + miNetwork.Caption := LANGMounterPrefs_miNetworkCaption; + miNetwork.Icon := MounterNetwork; + DeviceTypeOptionMenu.Items.Add(miLocalDisk); + DeviceTypeOptionMenu.Items.Add(miRemovable); + DeviceTypeOptionMenu.Items.Add(miCD); + DeviceTypeOptionMenu.Items.Add(miFloppy); + DeviceTypeOptionMenu.Items.Add(miNetwork); + + MountCommandLabel := TGTKLabel.Create(Self); + MountCommandLabel.Caption := LANGMounterPrefs_MountCommandLabelCaption; + MountCommandLabel.XAlign := 0; + MountCommandLabel.UseUnderline := True; + UmountCommandLabel := TGTKLabel.Create(Self); + UmountCommandLabel.Caption := LANGMounterPrefs_UmountCommandLabelCaption; + UmountCommandLabel.XAlign := 0; + UmountCommandLabel.UseUnderline := True; + MountCommandEntry := TGTKEntry.Create(Self); + MountCommandEntry.Tooltip := LANGMounterPrefs_MountCommandEntryTooltip; + MountCommandLabel.FocusControl := MountCommandEntry; + UmountCommandEntry := TGTKEntry.Create(Self); + UmountCommandEntry.Tooltip := LANGMounterPrefs_UmountCommandEntryTooltip; + UmountCommandLabel.FocusControl := UmountCommandEntry; + PropertiesTable.AddControlEx(0, 0, 1, 1, DisplayTextLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(1, 0, 2, 1, DisplayTextEntry, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(0, 1, 1, 1, MountPointLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(1, 1, 2, 1, MountPointEntry, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(0, 2, 1, 1, MountDeviceLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(1, 2, 1, 1, MountDeviceEntry, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(2, 2, 1, 1, DeviceTypeLabel, [taoShrink, taoFill], [taoShrink, taoFill], 0, 2); + PropertiesTable.AddControlEx(3, 2, 2, 1, DeviceTypeOptionMenu, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(0, 3, 1, 1, MountCommandLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(1, 3, 1, 1, MountCommandEntry, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + PropertiesTable.AddControlEx(2, 3, 1, 1, UmountCommandLabel, [taoShrink, taoFill], [taoShrink, taoFill], 0, 2); + PropertiesTable.AddControlEx(3, 3, 2, 1, UmountCommandEntry, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + + IconLabel := TGTKLabel.Create(Self); + IconLabel.Caption := LANGMounterPrefs_IconLabelCaption; + IconLabel.XAlign := 1; + IconLabel.UseUnderline := True; + PropertiesTable.AddControlEx(3, 0, 1, 2, IconLabel, [taoExpand, taoFill], [taoShrink, taoFill], 0, 2); + if FUseGnomeIconEntry then begin + IconEntry := TGnomeIconEntry.Create(Self); + IconLabel.FocusControl := IconEntry; + PropertiesTable.AddControlEx(4, 0, 1, 2, IconEntry, [taoExpand, taoFill], [taoExpand, taoFill], 0, 0); + end else begin + IconEntry2 := TGTKButton.Create(Self); + IconEntry2.Caption := LANGBrowseButton_Caption; + PropertiesTable.AddControlEx(4, 0, 1, 2, IconEntry2, [taoExpand, taoFill], [taoExpand, taoFill], 10, 4); + end; + + + + OnDestroy := FormDestroy; + ListView.OnSelectionChanged := ListViewSelectionChanged; + UseFSTabDefaultsCheckBox.OnToggled := UseFSTabDefaultsCheckBoxToggled; + AddItemButton.OnClick := AddItemButtonClick; + RemoveItemButton.OnClick := RemoveItemButtonClick; + MoveUpButton.OnClick := MoveUpDownButtonButtonClick; + MoveDownButton.OnClick := MoveUpDownButtonButtonClick; + DisplayTextEntry.OnChanged := DisplayTextEntryChanged; + MountPointEntry.OnChanged := MountPointEntryChanged; + MountDeviceEntry.OnChanged := MountDeviceEntryChanged; + MountCommandEntry.OnChanged := MountCommandEntryChanged; + UmountCommandEntry.OnChanged := UmountCommandEntryChanged; + DeviceTypeOptionMenu.OnChanged := DeviceTypeOptionMenuChanged; + if FUseGnomeIconEntry then IconEntry.OnIconChanged := IconEntryChanged + else IconEntry2.OnClick := IconEntry2Click; + + ListViewSelectionChanged(Self); + ListView.SetFocus; +end; + +procedure TFMounterPrefs.ListViewSelectionChanged(Sender: TObject); +var b: boolean; + Item: TMounterItem; +begin + b := Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and ListViewScrolledWindow.Enabled; + RemoveItemButton.Enabled := b; + MoveUpButton.Enabled := b and (ListView.Selected.Index > 0); + MoveDownButton.Enabled := b and (ListView.Selected.Index < ListView.Items.Count - 1); + PropertiesTable.Enabled := b; + if not b then begin + DisplayTextEntry.Text := ''; + MountPointEntry.Text := ''; + MountDeviceEntry.Text := ''; + MountCommandEntry.Text := ''; + UmountCommandEntry.Text := ''; + DeviceTypeOptionMenu.ItemIndex := 0; + if FUseGnomeIconEntry then IconEntry.Filename := ''; + Exit; + end; + Item := ListView.Selected.AsPointer(3); + DisplayTextEntry.Text := Item.DisplayText; + MountPointEntry.Text := AnsiToUTF8(Item.MountPath); + MountDeviceEntry.Text := AnsiToUTF8(Item.Device); + MountCommandEntry.Text := AnsiToUTF8(Item.MountCommand); + UmountCommandEntry.Text := AnsiToUTF8(Item.UmountCommand); + DeviceTypeOptionMenu.ItemIndex := Item.DeviceType; + if FUseGnomeIconEntry then IconEntry.Filename := Item.IconPath; +end; + +procedure TFMounterPrefs.UseFSTabDefaultsCheckBoxToggled(Sender: TObject); +begin + ListViewScrolledWindow.Enabled := not UseFSTabDefaultsCheckBox.Checked; + AddItemButton.Enabled := not UseFSTabDefaultsCheckBox.Checked; + RemoveItemButton.Enabled := not UseFSTabDefaultsCheckBox.Checked; + MoveUpButton.Enabled := not UseFSTabDefaultsCheckBox.Checked; + MoveDownButton.Enabled := not UseFSTabDefaultsCheckBox.Checked; + ListViewSelectionChanged(Self); +end; + +procedure TFMounterPrefs.AddItemButtonClick(Sender: TObject); +var Item: TMounterItem; + ListItem: TGTKListItem; +begin + Item := TMounterItem.Create; + InternalMounterList.Add(Item); + ListItem := ListView.Items.Add; + ListItem.SetValue(3, Item); + ListItem.Selected := True; + ListItem.SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + ListViewSelectionChanged(Self); + DisplayTextEntry.SetFocus; + RefreshIcon(ListView.Selected.Index); +end; + +procedure TFMounterPrefs.RemoveItemButtonClick(Sender: TObject); +var Item: TMounterItem; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) then begin + Item := ListView.Selected.AsPointer(3); + Item.Free; + InternalMounterList.Remove(Item); + ListView.Items.Delete(ListView.Selected.Index); + end; +end; + +procedure TFMounterPrefs.MoveUpDownButtonButtonClick(Sender: TObject); +var i, Old, New: integer; + s: string; + p: pointer; +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) then begin + Old := InternalMounterList.IndexOf(ListView.Selected.AsPointer(3)); + if (Sender = MoveUpButton) and (Old > 0) then New := Old - 1 else + if (Sender = MoveDownButton) and (Old < InternalMounterList.Count - 1) then New := Old + 1 else Exit; + InternalMounterList.Move(Old, New); + for i := 0 to 2 do begin + s := ListView.Items[New].AsString(i); + ListView.Items[New].SetValue(i, ListView.Items[Old].AsString(i)); + ListView.Items[Old].SetValue(i, s); + end; + for i := 3 to 4 do begin + p := ListView.Items[New].AsPointer(i); + ListView.Items[New].SetValue(i, ListView.Items[Old].AsPointer(i)); + ListView.Items[Old].SetValue(i, p); + end; + ListView.Items[New].Selected := True; + ListView.Items[New].SetCursor(0, False, not Application.GTKVersion_2_2_0_Up, 0.5, 0); + end; +end; + +procedure TFMounterPrefs.DisplayTextEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).DisplayText := DisplayTextEntry.Text; + ListView.Selected.SetValue(0, DisplayTextEntry.Text); + end; +end; + +procedure TFMounterPrefs.MountPointEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).MountPath := UTF8ToANSI(MountPointEntry.Text); + ListView.Selected.SetValue(1, MountPointEntry.Text); + end; +end; + +procedure TFMounterPrefs.MountDeviceEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).Device := UTF8ToANSI(MountDeviceEntry.Text); + ListView.Selected.SetValue(2, MountDeviceEntry.Text); + end; +end; + +procedure TFMounterPrefs.MountCommandEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).MountCommand := UTF8ToANSI(MountCommandEntry.Text); + end; +end; + +procedure TFMounterPrefs.UmountCommandEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).UmountCommand := UTF8ToANSI(UmountCommandEntry.Text); + end; +end; + +procedure TFMounterPrefs.DeviceTypeOptionMenuChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).DeviceType := DeviceTypeOptionMenu.ItemIndex; + RefreshIcon(ListView.Selected.Index); + end; +end; + +procedure TFMounterPrefs.IconEntryChanged(Sender: TObject); +begin + if Assigned(ListView.Selected) and Assigned(ListView.Selected.AsPointer(3)) and (not UseFSTabDefaultsCheckBox.Checked) then begin + TMounterItem(ListView.Selected.AsPointer(3)).IconPath := IconEntry.Filename; + RefreshIcon(ListView.Selected.Index); + end; +end; + +procedure TFMounterPrefs.RefreshIcon(ItemIndex: integer); +var Pixmap: TGDKPixbuf; + b: boolean; + Data: TMounterItem; +begin + Data := InternalMounterList[ItemIndex]; + b := FileExists(Data.IconPath); + Pixmap := nil; + if b then begin + Pixmap := TGDKPixbuf.Create(Self); + Pixmap.LoadFromFile(Data.IconPath); + b := Pixmap.FPixbuf <> nil; + if b then Pixmap.ScaleSimple(16, 16); + end; + if not b then + case Data.DeviceType of + 0 : Pixmap := MounterHDD; + 1 : Pixmap := MounterRemovable; + 2 : Pixmap := MounterCD; + 3 : Pixmap := MounterFloppy; + 4 : Pixmap := MounterNetwork; + end; + ListView.Items[ItemIndex].SetValue(4, Pixmap.FPixbuf); +end; + +procedure TFMounterPrefs.IconEntry2Click(Sender: TObject); +var Dialog: TGTKFileSelectionDialog; +begin + if (not Assigned(ListView.Selected)) or (not Assigned(ListView.Selected.AsPointer(3))) then Exit; + Dialog := TGTKFileSelectionDialog.CreateWithTitle(Self, LANGBrowseForIcon); + try + Dialog.ShowFileOpButtons := False; + Dialog.FileName := TMounterItem(ListView.Selected.AsPointer(3)).IconPath; + if Byte(Dialog.Run) = 251 then TMounterItem(ListView.Selected.AsPointer(3)).IconPath := Dialog.FileName; + RefreshIcon(ListView.Selected.Index); + finally + Dialog.Free; + end; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TFMounterPrefs.AssignAssocList(List: TList); +var i: integer; + Item: TMounterItem; +begin + InternalMounterList := TList.Create; + if List.Count > 0 then + for i := 0 to List.Count - 1 do begin + Item := TMounterItem.Create; + with Item do begin + DisplayText := TMounterItem(List[i]).DisplayText; + MountPath := TMounterItem(List[i]).MountPath; + Device := TMounterItem(List[i]).Device; + IconPath := TMounterItem(List[i]).IconPath; + MountCommand := TMounterItem(List[i]).MountCommand; + UmountCommand := TMounterItem(List[i]).UmountCommand; + DeviceType := TMounterItem(List[i]).DeviceType; + end; + InternalMounterList.Add(Item); + end; +end; + +procedure TFMounterPrefs.FillList; +var i: integer; + ListItem: TGTKListItem; +begin + if Assigned(InternalMounterList) and (InternalMounterList.Count > 0) then begin + for i := 0 to InternalMounterList.Count - 1 do + with TMounterItem(InternalMounterList[i]) do begin + ListItem := ListView.Items.Add; + ListItem.SetValue(0, DisplayText); + ListItem.SetValue(1, ANSIToUTF8(MountPath)); + ListItem.SetValue(2, ANSIToUTF8(Device)); + ListItem.SetValue(3, InternalMounterList[i]); + RefreshIcon(i); + end; + end; + UseFSTabDefaultsCheckBox.Checked := ConfMounterUseFSTab; + ToggleModeCheckBox.Checked := ConfMounterPushDown; +end; + +procedure TFMounterPrefs.CleanItems; +var i: integer; +begin + try + if InternalMounterList.Count > 0 then + for i := InternalMounterList.Count - 1 downto 0 do + with TMounterItem(InternalMounterList[i]) do begin + if Length(Trim(Device)) = 0 then begin + TMounterItem(InternalMounterList[i]).Free; + InternalMounterList.Delete(i); + end; + end; + except end; +end; + +procedure TFMounterPrefs.FormDestroy(Sender: TObject); +var i: integer; +begin + if Assigned(InternalMounterList) then begin + if InternalMounterList.Count > 0 then + for i := 0 to InternalMounterList.Count - 1 do + if Assigned(InternalMounterList[i]) then TMounterItem(InternalMounterList[i]).Free; + InternalMounterList.Clear; + InternalMounterList.Free; + end; +end; + +function TGTKListView_drag_end(widget: PGtkWidget; drag_context: PGdkDragContext; user_data: gpointer): gboolean; cdecl; +var i: integer; +begin + Result := False; + for i := 0 to FMounterPrefs.ListView.Items.Count - 1 do + FMounterPrefs.InternalMounterList[i] := FMounterPrefs.ListView.Items[i].AsPointer(3); +end; +(********************************************************************************************************************************) +end. + diff --git a/UNewDir.pas b/UNewDir.pas new file mode 100644 index 0000000..a644b30 --- /dev/null +++ b/UNewDir.pas @@ -0,0 +1,80 @@ +(* + Tux Commander - UNewDir - New Directory form and related functions + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UNewDir; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFNewDir = class(TGTKDialog) + Label1: TGTKLabel; + Entry: TGTKEntry; + Box: TGTKVBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + { Private declarations } + public + { Public declarations } + end; + +var + FNewDir: TFNewDir; + +implementation + +uses ULocale; + + +procedure TFNewDir.FormCreate(Sender: TObject); +begin + SetDefaultSize(350, -1); + Caption := LANGCreateANewDirectory; + Buttons := [mbOK, mbCancel]; + Box := TGTKVBox.Create(Self); + Label1 := TGTKLabel.Create(Self); + Label1.Caption := LANGEnterDirectoryName; + Label1.UseUnderline := True; + Label1.XAlign := 0; + Label1.XPadding := 0; + Label1.LineWrap := True; + Entry := TGTKEntry.Create(Self); + Label1.FocusControl := Entry; + Box.AddControlEx(Label1, False, False, 2); + Box.AddControlEx(Entry, False, False, 0); + Box.BorderWidth := 6; + ClientArea.AddControlEx(Box, True, True, 0); + OnKeyDown := FormKeyDown; + Entry.SetFocus; +end; + +procedure TFNewDir.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + + +end. + diff --git a/UOverwrite.pas b/UOverwrite.pas new file mode 100644 index 0000000..04cbd1c --- /dev/null +++ b/UOverwrite.pas @@ -0,0 +1,173 @@ +(* + Tux Commander - UOverwrite - Overwrite dialog form and related funcions + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UOverwrite; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFOverwrite = class(TGTKDialog) + FromLabel, FromInfoLabel, ToLabel, ToInfoLabel: TGTKLabel; + ButtonTable: TGTKTable; + FromVBox, ToVBox: TGTKVBox; + OverwriteButton, OverwriteAllButton, SkipButton, CancelButton, OverwriteAllOlderButton, SkipAllButton, RenameButton, AppendButton : TGTKButton; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure ButtonClick(Sender: TObject); + public + RenameStr, SourceFile, DestFile: string; + procedure AddButtons(Sel: integer); + procedure DoRename; + procedure DoAppend; + end; + +var + FOverwrite: TFOverwrite; + +implementation + +uses ULocale, UCopyMove; + + +procedure TFOverwrite.FormCreate(Sender: TObject); +begin + Caption := LANGOverwriteQuestion; + FromLabel := TGTKLabel.Create(Self); + FromLabel.XAlign := 0; FromLabel.XPadding := 10; + FromInfoLabel := TGTKLabel.Create(Self); + FromInfoLabel.XAlign := 0; FromInfoLabel.XPadding := 40; + ToLabel := TGTKLabel.Create(Self); + ToLabel.XAlign := 0; ToLabel.XPadding := 10; + ToInfoLabel := TGTKLabel.Create(Self); + ToInfoLabel.XAlign := 0; ToInfoLabel.XPadding := 40; + OverwriteButton := TGTKButton.Create(Self); + OverwriteButton.Caption := LANGOverwriteButton_Caption; + OverwriteButton.OnClick := ButtonClick; + OverwriteAllButton := TGTKButton.Create(Self); + OverwriteAllButton.Caption := LANGOverwriteAllButton_Caption; + OverwriteAllButton.OnClick := ButtonClick; + SkipButton := TGTKButton.Create(Self); + SkipButton.Caption := LANGSkipButton_Caption; + SkipButton.OnClick := ButtonClick; + CancelButton := TGTKButton.Create(Self); + CancelButton.Caption := LANGCancel; + CancelButton.OnClick := ButtonClick; + OverwriteAllOlderButton := TGTKButton.Create(Self); + OverwriteAllOlderButton.Caption := LANGOverwriteAllOlderButton_Caption; + OverwriteAllOlderButton.OnClick := ButtonClick; + SkipAllButton := TGTKButton.Create(Self); + SkipAllButton.Caption := LANGSkipAllButton_Caption; + SkipAllButton.OnClick := ButtonClick; + RenameButton := TGTKButton.Create(Self); + RenameButton.Caption := LANGRenameButton_Caption; + RenameButton.OnClick := ButtonClick; + AppendButton := TGTKButton.Create(Self); + AppendButton.Caption := LANGAppendButton_Caption; + AppendButton.OnClick := ButtonClick; + ButtonTable := TGTKTable.Create(Self); + ButtonTable.RowCount := 3; + ButtonTable.ColCount := 3; + ButtonTable.RowSpacing := 3; + ButtonTable.ColSpacing := 3; + ButtonTable.Homogeneous := True; + FromVBox := TGTKVBox.Create(Self); + FromVBox.AddControlEx(FromLabel, True, True, 0); + FromVBox.AddControlEx(FromInfoLabel, True, True, 0); + ToVBox := TGTKVBox.Create(Self); + ToVBox.AddControlEx(ToLabel, True, True, 0); + ToVBox.AddControlEx(ToInfoLabel, True, True, 0); + ClientArea.AddControlEx(FromVBox, True, True, 5); + ClientArea.AddControlEx(ToVBox, True, True, 5); + ActionArea.AddControlEx(ButtonTable, True, True, 0); + OnKeyDown := FormKeyDown; +end; + +procedure TFOverwrite.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_O : ModalResult := TMessageButton(1); + GDK_A : ModalResult := TMessageButton(2); + GDK_S : ModalResult := TMessageButton(3); + GDK_C, GDK_ESCAPE : ModalResult := TMessageButton(4); + GDK_D : ModalResult := TMessageButton(5); + GDK_K : ModalResult := TMessageButton(6); + GDK_R : DoRename; + GDK_P : DoAppend; + end; +end; + +procedure TFOverwrite.AddButtons(Sel: integer); +begin + ButtonTable.AddControl(0, 0, 1, 1, OverwriteButton, 0, 0); + ButtonTable.AddControl(1, 0, 1, 1, OverwriteAllButton, 0, 0); + ButtonTable.AddControl(2, 0, 1, 1, SkipButton, 0, 0); + ButtonTable.AddControl(0, 1, 1, 1, CancelButton, 0, 0); + ButtonTable.AddControl(1, 1, 1, 1, OverwriteAllOlderButton, 0, 0); + ButtonTable.AddControl(2, 1, 1, 1, SkipAllButton, 0, 0); + ButtonTable.AddControl(0, 2, 1, 1, RenameButton, 0, 0); + case Sel of + 2 : ButtonTable.AddControl(1, 2, 1, 1, AppendButton, 0, 0); + end; +end; + +procedure TFOverwrite.ButtonClick(Sender: TObject); +begin + if Sender = OverwriteButton then ModalResult := TMessageButton(1) else + if Sender = OverwriteAllButton then ModalResult := TMessageButton(2) else + if Sender = SkipButton then ModalResult := TMessageButton(3) else + if Sender = CancelButton then ModalResult := TMessageButton(4) else + if Sender = OverwriteAllOlderButton then ModalResult := TMessageButton(5) else + if Sender = SkipAllButton then ModalResult := TMessageButton(6) else + if Sender = RenameButton then DoRename else + if Sender = AppendButton then DoAppend; +end; + +procedure TFOverwrite.DoRename; +var AFCopyMove: TFCopyMove; +begin + AFCopyMove := TFCopyMove.Create(Self); + try + AFCopyMove.Entry.Text := RenameStr; + AFCopyMove.Caption := LANGRename; + AFCopyMove.Label1.Caption := Format(LANGRenameFile, [RenameStr]); + AFCopyMove.Entry.SelectRegion(0, Length(AFCopyMove.Entry.Text)); + if AFCopyMove.Run = mbOK then begin + RenameStr := AFCopyMove.Entry.Text; + ModalResult := TMessageButton(7); + end; + finally + AFCopyMove.Free; + end; +end; + +procedure TFOverwrite.DoAppend; +begin + if Application.MessageBox(Format(LANGAppendQuestion, [ANSIToUTF8(SourceFile), ANSIToUTF8(DestFile)]), [mbYes, mbNo], mbQuestion, mbNone, mbNo) = mbYes + then ModalResult := TMessageButton(8); +end; + + + + +end. + + diff --git a/UPreferences.pas b/UPreferences.pas new file mode 100644 index 0000000..ca4733f --- /dev/null +++ b/UPreferences.pas @@ -0,0 +1,822 @@ +(* + Tux Commander - UPreferences - The Preferences dialog + Copyright (C) 2006 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UPreferences; + +interface + +uses + glib2, gtk2, pango, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, GTKMenus, + UCoreClasses, UGnome; + +type + TFPreferences = class(TGTKDialog) + TitleFrame, ListFontFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + Notebook: TGTKNotebook; + GeneralPage, ColorsPage, FontsPage, PanelsPage, ApplicationsPage, ExperimentalPage: TGTKVBox; + RowHeightLabel, NumHistoryItemsLabel, ViewerLabel, EditorLabel, TerminalLabel, GeneralLabel2, ExternalAppsLabel, FontsLabel2, + ListFontLabel, ListFontPreview, ColorsLabel2, ForegroundLabel, BackgroundLabel, PanelsLabel2, ApplicationsLabel2, + ExperimentalLabel2, PanelsLabel3, PanelsLabel4: TGTKLabel; + NormalItemFGColorLabel, ActiveItemFGColorLabel, InactiveItemFGColorLabel, SelectedItemFGColorLabel, LinkItemFGColorLabel, + DotFileItemFGColorLabel: TGTKLabel; + ExperimentalWarningLabel: TGTKLabel; + ExperimentalWarningIcon: TGTKImage; + ClearROAttr, DisableMouseRename, ShowFiletypeIcons, DefaultFontCheckBox, DefaultRowHeightCheckBox, LynxLikeMotionCheckBox, + DirsInBoldCheckBox, NewStyleAltOCheckBox, WMCompatModeCheckBox, DisableFileTipsCheckBox, DisableDirectoryBracketsCheckBox, + InsertMovesDownCheckBox, SpaceMovesDownCheckBox, SelectAllDirectoriesCheckBox, ShowFuncButtonsCheckBox, + OctalPermissionsCheckBox, FocusRefreshCheckBox, CompatUseLibcSystemCheckBox: TGTKCheckButton; + NormalItemFGColorDefault, ActiveItemFGColorDefault, InactiveItemFGColorDefault, + LinkItemFGColorDefault, DotFileItemFGColorDefault: TGTKCheckButton; + HBox1, HBox2, HBox3, HBox4: TGTKHBox; + VBox1: TGTKVBox; + ViewerCombo, EditorCombo, TerminalCombo: TGTKCombo; + ViewerBrowseButton, EditorBrowseButton, TerminalBrowseButton, ChangeFontButton: TGTKButton; + NormalItemFGColorButton, ActiveItemFGColorButton, InactiveItemFGColorButton, SelectedItemFGColorButton, LinkItemFGColorButton, + DotFileItemFGColorButton, NormalItemBGColorButton, ActiveItemBGColorButton, InactiveItemBGColorButton: TGnomeColorButton; + Table1, Table2, Table3, Table4, Table5, Table6: TGTKTable; + RowHeightSpinEdit, NumHistoryItemsSpinEdit: TGTKSpinEdit; + SizeFormatLabel: TGTKLabel; + SizeFormatOptionMenu: TGTKOptionMenu; + miSizeFormat1, miSizeFormat2, miSizeFormat3, miSizeFormat4, miSizeFormat5, miSizeFormat6: TGTKMenuItem; + UseInternalViewerCheckBox: TGTKCheckButton; + ViewerLabel2, EditorLabel2, TerminalLabel2, CmdLineBehaviourLabel: TGTKLabel; + ViewerOptionMenu, EditorOptionMenu, TerminalOptionMenu: TGTKOptionMenu; + miViewerTerminalDetect, miViewerAlwaysTerminal, miViewerNoTerminal, + miEditorTerminalDetect, miEditorAlwaysTerminal, miEditorNoTerminal, + miTerminalDetect, miAlwaysTerminal, miNoTerminal: TGTKMenuItem; + ShowTextUIDsCheckBox: TGTKCheckButton; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure ViewerBrowseButtonClick(Sender: TObject); + procedure DefaultFontCheckBoxToggled(Sender: TObject); + procedure ChangeFontButtonClick(Sender: TObject); + procedure ColorButtonDefaultsToggled(Sender: TObject); + procedure DefaultRowHeightCheckBoxToggled(Sender: TObject); + procedure UseInternalViewerCheckBoxToggled(Sender: TObject); + private + DefaultGTKFont, LocalListFont: string; + public + RebuildListViews, RebuildIcons: boolean; + procedure AssignDefaultValues; + procedure SaveSettings; + end; + +var + FPreferences: TFPreferences; + +implementation + +uses ULocale, UFileAssoc, UCoreUtils, UConfig; + + +procedure TFPreferences.FormCreate(Sender: TObject); +var i: integer; +begin + SetDefaultSize(450, 500); + Caption := LANGPreferences_Caption; + Buttons := [mbOK, mbCancel]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := LANGPreferences_TitleLabel_Caption; + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-preferences', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + Notebook := TGTKNotebook.Create(Self); + Notebook.BorderWidth := 10; + ClientArea.AddControlEx(Notebook, True, True, 0); + + GeneralPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(GeneralPage, LANGPreferences_GeneralPage); + + PanelsPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(PanelsPage, LANGPreferencesPanelsPage); + + ApplicationsPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(ApplicationsPage, LANGPreferencesApplicationsPage); + + FontsPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(FontsPage, LANGPreferences_FontsPage); + + ColorsPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(ColorsPage, LANGPreferences_ColorsPage); + + ExperimentalPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(ExperimentalPage, LANGPreferencesExperimentalPage); + + + // ********* PAGE General + + GeneralPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + GeneralLabel2 := TGTKLabel.Create(Self); + GeneralLabel2.XAlign := 0; + GeneralLabel2.XPadding := 10; + GeneralLabel2.Caption := Format('%s', [LANGPreferences_GeneralPage]); + GeneralLabel2.UseMarkup := True; + GeneralPage.AddControlEx(GeneralLabel2, False, False, 5); + Table2 := TGTKTable.Create(Self); + Table2.SetRowColCount(8, 5); + GeneralPage.AddControlEx(Table2, False, False, 0); + + ClearROAttr := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_ClearReadonlyAttribute); + Table2.AddControlEx(1, 0, 3, 1, ClearROAttr, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + SelectAllDirectoriesCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesSelectAllDirectoriesCheckBox_Caption); + Table2.AddControlEx(1, 1, 3, 1, SelectAllDirectoriesCheckBox, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + NewStyleAltOCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesNewStyleAltOCheckBox_Caption); + NewStyleAltOCheckBox.Tooltip := LANGPreferencesNewStyleAltOCheckBox_Tooltip; + Table2.AddControlEx(1, 2, 3, 1, NewStyleAltOCheckBox, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + ShowFuncButtonsCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesShowFuncButtonsCheckBox_Caption); + Table2.AddControlEx(1, 3, 3, 1, ShowFuncButtonsCheckBox, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + + NumHistoryItemsLabel := TGTKLabel.Create(Self); + NumHistoryItemsLabel.Caption := LANGPreferences_NumHistoryItems; + NumHistoryItemsLabel.XAlign := 0; + NumHistoryItemsSpinEdit := TGTKSpinEdit.Create(Self); + NumHistoryItemsSpinEdit.Digits := 0; + NumHistoryItemsLabel.FocusControl := NumHistoryItemsSpinEdit; + NumHistoryItemsLabel.UseUnderline := True; + Table2.AddControlEx(0, 4, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 15, 2); + Table2.AddControlEx(1, 4, 1, 1, NumHistoryItemsLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table2.AddControlEx(2, 4, 1, 1, NumHistoryItemsSpinEdit, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + + RowHeightLabel := TGTKLabel.Create(Self); + RowHeightLabel.Caption := LANGPreferences_RowHeight; + RowHeightLabel.XAlign := 0; + RowHeightSpinEdit := TGTKSpinEdit.Create(Self); + RowHeightSpinEdit.Digits := 0; + RowHeightLabel.FocusControl := RowHeightSpinEdit; + RowHeightLabel.UseUnderline := True; + DefaultRowHeightCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_Default); + DefaultRowHeightCheckBox.OnToggled := DefaultRowHeightCheckBoxToggled; + Table2.AddControlEx(1, 5, 1, 1, RowHeightLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table2.AddControlEx(2, 5, 1, 1, RowHeightSpinEdit, [taoFill, taoExpand], [taoShrink, taoExpand, taoFill], 10, 2); + Table2.AddControlEx(3, 5, 1, 1, DefaultRowHeightCheckBox, [taoFill, taoExpand], [taoShrink, taoExpand, taoFill], 10, 2); + Table2.AddControlEx(4, 5, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 8, 2); + + SizeFormatLabel := TGTKLabel.Create(Self); + SizeFormatLabel.Caption := LANGPreferencesSizeFormatLabel_Caption; + SizeFormatLabel.XAlign := 0; + SizeFormatLabel.UseUnderline := True; + SizeFormatOptionMenu := TGTKOptionMenu.Create(Self); + SizeFormatLabel.FocusControl := SizeFormatOptionMenu; + miSizeFormat1 := TGTKMenuItem.CreateTyped(Self, itLabel); + miSizeFormat1.Caption := Format('%s %s', [LANGPreferencesmiSizeFormat1, ANSIToUTF8(FormatFloat('(###,###,###)', 123456))]); + miSizeFormat2 := TGTKMenuItem.CreateTyped(Self, itLabel); + miSizeFormat2.Caption := '123456'; + miSizeFormat3 := TGTKMenuItem.CreateTyped(Self, itLabel); + miSizeFormat3.Caption := '123,456'; + miSizeFormat4 := TGTKMenuItem.CreateTyped(Self, itLabel); + miSizeFormat4.Caption := '123 456'; + miSizeFormat5 := TGTKMenuItem.CreateTyped(Self, itLabel); + miSizeFormat5.Caption := '123''456'; + miSizeFormat6 := TGTKMenuItem.CreateTyped(Self, itLabel); + miSizeFormat6.Caption := LANGPreferencesmiSizeFormat6; + SizeFormatOptionMenu.Items.Add(miSizeFormat1); + SizeFormatOptionMenu.Items.Add(miSizeFormat2); + SizeFormatOptionMenu.Items.Add(miSizeFormat3); + SizeFormatOptionMenu.Items.Add(miSizeFormat4); + SizeFormatOptionMenu.Items.Add(miSizeFormat5); + SizeFormatOptionMenu.Items.Add(miSizeFormat6); + Table2.AddControlEx(1, 6, 1, 1, SizeFormatLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table2.AddControlEx(2, 6, 2, 1, SizeFormatOptionMenu, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + + TerminalOptionMenu := TGTKOptionMenu.Create(Self); + miTerminalDetect := TGTKMenuItem.CreateTyped(Self, itLabel); + miTerminalDetect.Caption := LANGPreferencesAutodetectXApp; + miAlwaysTerminal := TGTKMenuItem.CreateTyped(Self, itLabel); + miAlwaysTerminal.Caption := LANGPreferencesAlwaysRunInTerminal; + miNoTerminal := TGTKMenuItem.CreateTyped(Self, itLabel); + miNoTerminal.Caption := LANGPreferencesNeverRunInTerminal; + TerminalOptionMenu.Items.Add(miTerminalDetect); + TerminalOptionMenu.Items.Add(miAlwaysTerminal); + TerminalOptionMenu.Items.Add(miNoTerminal); + CmdLineBehaviourLabel := TGTKLabel.Create(Self); + CmdLineBehaviourLabel.Caption := LANGPreferencesCmdLineBehaviourLabel_Caption; + CmdLineBehaviourLabel.XAlign := 0; + CmdLineBehaviourLabel.FocusControl := TerminalOptionMenu; + CmdLineBehaviourLabel.UseUnderline := True; + Table2.AddControlEx(1, 7, 1, 1, CmdLineBehaviourLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table2.AddControlEx(2, 7, 2, 1, TerminalOptionMenu, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + + + // ********* PAGE Panels + + PanelsPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + PanelsLabel2 := TGTKLabel.Create(Self); + PanelsLabel2.XAlign := 0; + PanelsLabel2.XPadding := 10; + PanelsLabel2.Caption := Format('%s', [LANGPreferencesFeatures]); + PanelsLabel2.UseMarkup := True; + PanelsPage.AddControlEx(PanelsLabel2, False, False, 5); + + Table5 := TGTKTable.Create(Self); + Table5.SetRowColCount(14, 1); + PanelsPage.AddControlEx(Table5, False, False, 0); + + DisableMouseRename := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_DisableMouseRenaming); + DisableMouseRename.Tooltip := LANGPreferencesDisableMouseRename_Tooltip; + Table5.AddControl(0, 0, 1, 1, DisableMouseRename, 30, 2); + DisableFileTipsCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesDisableFileTipsCheckBox_Caption); + DisableFileTipsCheckBox.Tooltip := LANGPreferencesDisableFileTipsCheckBox_Tooltip; + Table5.AddControl(0, 1, 1, 1, DisableFileTipsCheckBox, 30, 2); + Table5.AddControl(0, 2, 1, 1, TGTKVBox.Create(Self), 0, 7); + + PanelsLabel3 := TGTKLabel.Create(Self); + PanelsLabel3.XAlign := 0; + PanelsLabel3.XPadding := 0; + PanelsLabel3.Caption := Format('%s', [LANGPreferencesShow]); + PanelsLabel3.UseMarkup := True; + Table5.AddControl(0, 3, 1, 1, PanelsLabel3, 10, 2); + + ShowFiletypeIcons := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_ShowFiletypeIconsInList); + Table5.AddControl(0, 4, 1, 1, ShowFiletypeIcons, 30, 2); + DirsInBoldCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesDirsInBoldCheckBox_Caption); + Table5.AddControl(0, 5, 1, 1, DirsInBoldCheckBox, 30, 2); + DisableDirectoryBracketsCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesDisableDirectoryBracketsCheckBox_Caption); + Table5.AddControl(0, 6, 1, 1, DisableDirectoryBracketsCheckBox, 30, 2); + OctalPermissionsCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesOctalPermissionsCheckBox_Caption); + OctalPermissionsCheckBox.Tooltip := LANGPreferencesOctalPermissionsCheckBox_Tooltip; + Table5.AddControl(0, 7, 1, 1, OctalPermissionsCheckBox, 30, 2); + ShowTextUIDsCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGShowTextUIDsCheckBox_Caption); + ShowTextUIDsCheckBox.Tooltip := LANGShowTextUIDsCheckBox_Tooltip; + Table5.AddControl(0, 8, 1, 1, ShowTextUIDsCheckBox, 30, 2); + Table5.AddControl(0, 9, 1, 1, TGTKVBox.Create(Self), 0, 7); + + PanelsLabel4 := TGTKLabel.Create(Self); + PanelsLabel4.XAlign := 0; + PanelsLabel4.XPadding := 0; + PanelsLabel4.Caption := Format('%s', [LANGPreferencesMovement]); + PanelsLabel4.UseMarkup := True; + Table5.AddControl(0, 10, 1, 1, PanelsLabel4, 10, 2); + + LynxLikeMotionCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesLynxLikeMotionCheckBox_Caption); + Table5.AddControl(0, 11, 1, 1, LynxLikeMotionCheckBox, 30, 2); + InsertMovesDownCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesInsertMovesDownCheckBox_Caption); + Table5.AddControl(0, 12, 1, 1, InsertMovesDownCheckBox, 30, 2); + SpaceMovesDownCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesSpaceMovesDownCheckBox_Caption); + Table5.AddControl(0, 13, 1, 1, SpaceMovesDownCheckBox, 30, 2); + + + // ********* PAGE Applications + + ApplicationsPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + Table1 := TGTKTable.Create(Self); + Table1.SetRowColCount(5, 5); + ApplicationsPage.AddControlEx(Table1, False, True, 5); + + ViewerLabel := TGTKLabel.Create(Self); + ViewerLabel.XAlign := 0; + ViewerLabel.XPadding := 10; + ViewerLabel.Caption := Format('%s', [LANGPreferencesViewer]); + ViewerLabel.UseMarkup := True; + Table1.AddControlEx(0, 0, 5, 1, ViewerLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + Table1.AddControlEx(0, 1, 5, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + + ViewerCombo := TGTKCombo.Create(Self); + for i := 1 to Length(ConfViewersApps) do + ViewerCombo.Items.Append(ConfViewersApps[i]); + ViewerBrowseButton := TGTKButton.Create(Self); + ViewerBrowseButton.Caption := LANGBrowseButton_Caption; + ViewerBrowseButton.OnClick := ViewerBrowseButtonClick; + ViewerLabel2 := TGTKLabel.Create(Self); + ViewerLabel2.Caption := LANGPreferencesCommandSC; + ViewerLabel2.XAlign := 0; + ViewerLabel2.FocusControl := ViewerCombo.Entry; + ViewerLabel2.UseUnderline := True; + UseInternalViewerCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesUseInternalViewer); + UseInternalViewerCheckBox.OnToggled := UseInternalViewerCheckBoxToggled; + ViewerOptionMenu := TGTKOptionMenu.Create(Self); + miViewerTerminalDetect := TGTKMenuItem.CreateTyped(Self, itLabel); + miViewerTerminalDetect.Caption := LANGPreferencesAutodetectXApp; + miViewerAlwaysTerminal := TGTKMenuItem.CreateTyped(Self, itLabel); + miViewerAlwaysTerminal.Caption := LANGPreferencesAlwaysRunInTerminal; + miViewerNoTerminal := TGTKMenuItem.CreateTyped(Self, itLabel); + miViewerNoTerminal.Caption := LANGPreferencesNeverRunInTerminal; + ViewerOptionMenu.Items.Add(miViewerTerminalDetect); + ViewerOptionMenu.Items.Add(miViewerAlwaysTerminal); + ViewerOptionMenu.Items.Add(miViewerNoTerminal); + + Table1.AddControlEx(0, 2, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 12, 2); + Table1.AddControlEx(1, 2, 1, 1, ViewerLabel2, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table1.AddControlEx(2, 2, 3, 1, ViewerCombo, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table1.AddControlEx(4, 3, 1, 1, ViewerBrowseButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table1.AddControlEx(3, 3, 1, 1, ViewerOptionMenu, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table1.AddControlEx(0, 4, 5, 1, UseInternalViewerCheckBox, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 30, 2); + + EditorLabel := TGTKLabel.Create(Self); + EditorLabel.XAlign := 0; + EditorLabel.XPadding := 10; + EditorLabel.Caption := Format('%s', [LANGPreferencesEditor]); + EditorLabel.UseMarkup := True; + Table1.AddControlEx(0, 5, 5, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 13); + Table1.AddControlEx(0, 6, 5, 1, EditorLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + Table1.AddControlEx(0, 7, 5, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + + EditorCombo := TGTKCombo.Create(Self); + for i := 1 to Length(ConfEditorApps) do + EditorCombo.Items.Append(ConfEditorApps[i]); + EditorBrowseButton := TGTKButton.Create(Self); + EditorBrowseButton.Caption := LANGBrowseButton_Caption; + EditorBrowseButton.OnClick := ViewerBrowseButtonClick; + EditorLabel2 := TGTKLabel.Create(Self); + EditorLabel2.Caption := LANGPreferencesCommandSC; + EditorLabel2.XAlign := 0; + EditorLabel2.FocusControl := EditorCombo.Entry; + EditorLabel2.UseUnderline := True; + EditorOptionMenu := TGTKOptionMenu.Create(Self); + miEditorTerminalDetect := TGTKMenuItem.CreateTyped(Self, itLabel); + miEditorTerminalDetect.Caption := LANGPreferencesAutodetectXApp; + miEditorAlwaysTerminal := TGTKMenuItem.CreateTyped(Self, itLabel); + miEditorAlwaysTerminal.Caption := LANGPreferencesAlwaysRunInTerminal; + miEditorNoTerminal := TGTKMenuItem.CreateTyped(Self, itLabel); + miEditorNoTerminal.Caption := LANGPreferencesNeverRunInTerminal; + EditorOptionMenu.Items.Add(miEditorTerminalDetect); + EditorOptionMenu.Items.Add(miEditorAlwaysTerminal); + EditorOptionMenu.Items.Add(miEditorNoTerminal); + + Table1.AddControlEx(0, 8, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 12, 2); + Table1.AddControlEx(1, 8, 1, 1, EditorLabel2, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table1.AddControlEx(2, 8, 3, 1, EditorCombo, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table1.AddControlEx(4, 9, 1, 1, EditorBrowseButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table1.AddControlEx(3, 9, 1, 1, EditorOptionMenu, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + + TerminalLabel := TGTKLabel.Create(Self); + TerminalLabel.XAlign := 0; + TerminalLabel.XPadding := 10; + TerminalLabel.Caption := Format('%s', [LANGPreferencesTerminal]); + TerminalLabel.UseMarkup := True; + Table1.AddControlEx(0, 10, 5, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 13); + Table1.AddControlEx(0, 11, 5, 1, TerminalLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + Table1.AddControlEx(0, 12, 5, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + + TerminalCombo := TGTKCombo.Create(Self); + for i := 1 to Length(ConfTerminalApps) do + TerminalCombo.Items.Append(ConfTerminalApps[i]); + TerminalBrowseButton := TGTKButton.Create(Self); + TerminalBrowseButton.Caption := LANGBrowseButton_Caption; + TerminalBrowseButton.OnClick := ViewerBrowseButtonClick; + TerminalLabel2 := TGTKLabel.Create(Self); + TerminalLabel2.Caption := LANGPreferencesCommandSC; + TerminalLabel2.XAlign := 0; + TerminalLabel2.FocusControl := TerminalCombo.Entry; + TerminalLabel2.UseUnderline := True; + + Table1.AddControlEx(0, 13, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 12, 2); + Table1.AddControlEx(1, 13, 1, 1, TerminalLabel2, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + Table1.AddControlEx(2, 13, 3, 1, TerminalCombo, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table1.AddControlEx(4, 14, 1, 1, TerminalBrowseButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + + + // ********* PAGE Fonts + + FontsPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + FontsLabel2 := TGTKLabel.Create(Self); + FontsLabel2.XAlign := 0; + FontsLabel2.XPadding := 10; + FontsLabel2.Caption := Format('%s', [LANGPreferences_FontsPage]); + FontsLabel2.UseMarkup := True; + FontsPage.AddControlEx(FontsLabel2, False, False, 5); + + Table3 := TGTKTable.Create(Self); + Table3.SetRowColCount(2, 4); + FontsPage.AddControlEx(Table3, False, False, 0); + ListFontLabel := TGTKLabel.Create(Self); + ListFontLabel.Caption := LANGPreferences_ListFont; + ListFontLabel.XAlign := 0; + ListFontFrame := TGTKFrame.CreateWithoutLabel(Self); + ListFontFrame.ShadowType := stEtchedIn; + ListFontPreview := TGTKLabel.Create(Self); + ListFontPreview.Caption := 'Luxi Sans, 10'; + ListFontFrame.AddControl(ListFontPreview); + ChangeFontButton := TGTKButton.Create(Self); + ChangeFontButton.Caption := LANGPreferences_Change; + ChangeFontButton.OnClick := ChangeFontButtonClick; + DefaultFontCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_UseDefaultFont); + DefaultFontCheckBox.OnToggled := DefaultFontCheckBoxToggled; + + Table3.AddControlEx(0, 0, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 12, 2); + Table3.AddControlEx(1, 0, 1, 1, ListFontLabel, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table3.AddControlEx(2, 0, 1, 1, ListFontFrame, [taoExpand, taoFill], [taoShrink, taoExpand, taoFill], 2, 2); + Table3.AddControlEx(3, 0, 1, 1, ChangeFontButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 2); + Table3.AddControlEx(1, 1, 3, 1, DefaultFontCheckBox, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 10, 4); + + + // ********* PAGE Colors + + ColorsPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + ColorsLabel2 := TGTKLabel.Create(Self); + ColorsLabel2.XAlign := 0; + ColorsLabel2.XPadding := 10; + ColorsLabel2.Caption := Format('%s', [LANGPreferences_ColorsPage]); + ColorsLabel2.UseMarkup := True; + ColorsPage.AddControlEx(ColorsLabel2, False, False, 5); + + Table4 := TGTKTable.Create(Self); + Table4.SetRowColCount(7, 8); + ColorsPage.AddControlEx(Table4, False, False, 0); + ForegroundLabel := TGTKLabel.Create(Self); + ForegroundLabel.Caption := LANGPreferences_Foreground; + BackgroundLabel := TGTKLabel.Create(Self); + BackgroundLabel.Caption := LANGPreferences_Background; + Table4.AddControl(1, 0, 3, 1, ForegroundLabel, 5, 2); + Table4.AddControl(4, 0, 3, 1, BackgroundLabel, 5, 2); + + NormalItemFGColorLabel := TGTKLabel.Create(Self); + NormalItemFGColorLabel.XAlign := 0; + NormalItemFGColorLabel.Caption := LANGPreferences_NormalItem; + NormalItemFGColorButton := TGnomeColorButton.Create(Self); + NormalItemFGColorButton.SetSizeRequest(30, -1); + NormalItemBGColorButton := TGnomeColorButton.Create(Self); + NormalItemBGColorButton.SetSizeRequest(30, -1); + NormalItemFGColorDefault := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_Default); + NormalItemFGColorDefault.Tooltip := LANGPreferences_SetToDefaultToUseGTKThemeColors; + NormalItemFGColorDefault.OnToggled := ColorButtonDefaultsToggled; + Table4.AddControl(0, 1, 1, 1, NormalItemFGColorLabel, 30, 2); + Table4.AddControl(2, 1, 1, 1, NormalItemFGColorButton, 5, 2); + Table4.AddControl(5, 1, 1, 1, NormalItemBGColorButton, 5, 2); + Table4.AddControl(7, 1, 1, 1, NormalItemFGColorDefault, 10, 2); + + ActiveItemFGColorLabel := TGTKLabel.Create(Self); + ActiveItemFGColorLabel.Caption := LANGPreferences_Cursor; + ActiveItemFGColorLabel.XAlign := 0; + ActiveItemFGColorButton := TGnomeColorButton.Create(Self); + ActiveItemBGColorButton := TGnomeColorButton.Create(Self); + ActiveItemFGColorDefault := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_Default); + ActiveItemFGColorDefault.Tooltip := LANGPreferences_SetToDefaultToUseGTKThemeColors; + ActiveItemFGColorDefault.OnToggled := ColorButtonDefaultsToggled; + Table4.AddControl(0, 2, 1, 1, ActiveItemFGColorLabel, 30, 2); + Table4.AddControl(2, 2, 1, 1, ActiveItemFGColorButton, 5, 2); + Table4.AddControl(5, 2, 1, 1, ActiveItemBGColorButton, 5, 2); + Table4.AddControl(7, 2, 1, 1, ActiveItemFGColorDefault, 10, 2); + + InactiveItemFGColorLabel := TGTKLabel.Create(Self); + InactiveItemFGColorLabel.Caption := LANGPreferences_InactiveItem; + InactiveItemFGColorLabel.XAlign := 0; + InactiveItemFGColorButton := TGnomeColorButton.Create(Self); + InactiveItemBGColorButton := TGnomeColorButton.Create(Self); + InactiveItemFGColorDefault := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_Default); + InactiveItemFGColorDefault.Tooltip := LANGPreferences_SetToDefaultToUseGTKThemeColors; + InactiveItemFGColorDefault.OnToggled := ColorButtonDefaultsToggled; + Table4.AddControl(0, 3, 1, 1, InactiveItemFGColorLabel, 30, 2); + Table4.AddControl(2, 3, 1, 1, InactiveItemFGColorButton, 5, 2); + Table4.AddControl(5, 3, 1, 1, InactiveItemBGColorButton, 5, 2); + Table4.AddControl(7, 3, 1, 1, InactiveItemFGColorDefault, 10, 2); + + SelectedItemFGColorLabel := TGTKLabel.Create(Self); + SelectedItemFGColorLabel.Caption := LANGPreferences_SelectedItem; + SelectedItemFGColorLabel.XAlign := 0; + SelectedItemFGColorButton := TGnomeColorButton.Create(Self); + Table4.AddControl(0, 4, 1, 1, SelectedItemFGColorLabel, 30, 2); + Table4.AddControl(2, 4, 1, 1, SelectedItemFGColorButton, 5, 2); + + LinkItemFGColorLabel := TGTKLabel.Create(Self); + LinkItemFGColorLabel.Caption := LANGPreferences_LinkItem; + LinkItemFGColorLabel.XAlign := 0; + LinkItemFGColorButton := TGnomeColorButton.Create(Self); + LinkItemFGColorDefault := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_Default); + LinkItemFGColorDefault.Tooltip := LANGPreferences_LinkItemHint; + LinkItemFGColorDefault.OnToggled := ColorButtonDefaultsToggled; + Table4.AddControl(0, 5, 1, 1, LinkItemFGColorLabel, 30, 2); + Table4.AddControl(2, 5, 1, 1, LinkItemFGColorButton, 5, 2); + Table4.AddControl(7, 5, 1, 1, LinkItemFGColorDefault, 10, 2); + + DotFileItemFGColorLabel := TGTKLabel.Create(Self); + DotFileItemFGColorLabel.Caption := LANGPreferences_DotFileItem; + DotFileItemFGColorLabel.XAlign := 0; + DotFileItemFGColorButton := TGnomeColorButton.Create(Self); + DotFileItemFGColorDefault := TGTKCheckButton.CreateWithLabel(Self, LANGPreferences_Default); + DotFileItemFGColorDefault.Tooltip := LANGPreferences_DotFileItemHint; + DotFileItemFGColorDefault.OnToggled := ColorButtonDefaultsToggled; + Table4.AddControl(0, 6, 1, 1, DotFileItemFGColorLabel, 30, 2); + Table4.AddControl(2, 6, 1, 1, DotFileItemFGColorButton, 5, 2); + Table4.AddControl(7, 6, 1, 1, DotFileItemFGColorDefault, 10, 2); + + Table4.AddControl(1, 6, 1, 1, TGTKVBox.Create(Self), 2, 2); + Table4.AddControl(3, 6, 1, 1, TGTKVBox.Create(Self), 2, 2); + Table4.AddControl(4, 6, 1, 1, TGTKVBox.Create(Self), 2, 2); + Table4.AddControl(6, 6, 1, 1, TGTKVBox.Create(Self), 2, 2); + + + // ********* PAGE Experimental + + ExperimentalPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + ExperimentalLabel2 := TGTKLabel.Create(Self); + ExperimentalLabel2.XAlign := 0; + ExperimentalLabel2.XPadding := 10; + ExperimentalLabel2.Caption := Format('%s', [LANGPreferencesExperimentalFeatures]); + ExperimentalLabel2.UseMarkup := True; + ExperimentalPage.AddControlEx(ExperimentalLabel2, False, False, 5); + + HBox4 := TGTKHBox.Create(Self); + HBox4.Homogeneous := False; + ExperimentalWarningLabel := TGTKLabel.Create(Self); + ExperimentalWarningLabel.Caption := LANGPreferencesExperimentalWarningLabel_Caption; + ExperimentalWarningLabel.UseMarkup := True; + ExperimentalWarningLabel.LineWrap := True; + ExperimentalWarningLabel.SetSizeRequest(300, -1); + ExperimentalWarningIcon := TGTKImage.Create(Self); + ExperimentalWarningIcon.SetFromStock('gtk-dialog-warning', isDialog); + HBox4.AddControlEx(TGTKVBox.Create(Self), False, False, 12); + HBox4.AddControlEx(ExperimentalWarningIcon, False, False, 7); + HBox4.AddControlEx(ExperimentalWarningLabel, True, True, 7); + HBox4.AddControlEx(TGTKVBox.Create(Self), False, False, 8); + ExperimentalPage.AddControlEx(HBox4, False, False, 5); + ExperimentalPage.AddControlEx(TGTKVBox.Create(Self), False, False, 10); + + Table6 := TGTKTable.Create(Self); + Table6.SetRowColCount(3, 1); + ExperimentalPage.AddControlEx(Table6, False, False, 0); + + FocusRefreshCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesFocusRefreshCheckBox_Caption); + FocusRefreshCheckBox.Tooltip := LANGPreferencesFocusRefreshCheckBox_Tooltip; + Table6.AddControl(0, 0, 1, 1, FocusRefreshCheckBox, 30, 2); + WMCompatModeCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesWMCompatModeCheckBox_Caption); + WMCompatModeCheckBox.Tooltip := LANGPreferencesWMCompatModeCheckBox_Tooltip; + Table6.AddControl(0, 1, 1, 1, WMCompatModeCheckBox, 30, 2); + CompatUseLibcSystemCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGPreferencesCompatUseLibcSystemCheckBox_Caption); + CompatUseLibcSystemCheckBox.Tooltip := LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip; + Table6.AddControl(0, 2, 1, 1, CompatUseLibcSystemCheckBox, 30, 2); + + // ****************** + + OnKeyDown := FormKeyDown; + OnDestroy := FormDestroy; +end; + +procedure TFPreferences.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin +// if Key = GDK_ESCAPE then ModalResult := mbCancel; +end; + +procedure TFPreferences.FormDestroy(Sender: TObject); +begin + +end; + +(********************************************************************************************************************************) +procedure TFPreferences.ViewerBrowseButtonClick(Sender: TObject); + + procedure BrowseForFile(ToControl: TGTKEntry); + var Dialog: TGTKFileSelectionDialog; + begin + Dialog := TGTKFileSelectionDialog.CreateWithTitle(Self, LANGPreferences_BrowseForApplication); + try + Dialog.ShowFileOpButtons := False; + Dialog.FileName := ToControl.Text; + if Byte(Dialog.Run) = 251 then ToControl.Text := Dialog.FileName; + finally + Dialog.Free; + end; + end; + +begin + if Sender = ViewerBrowseButton then BrowseForFile(ViewerCombo.Entry) + else if Sender = EditorBrowseButton then BrowseForFile(EditorCombo.Entry) + else if Sender = TerminalBrowseButton then BrowseForFile(TerminalCombo.Entry); +end; + +procedure TFPreferences.DefaultFontCheckBoxToggled(Sender: TObject); +var FontDesc: PPangoFontDescription; +begin + ListFontLabel.Enabled := not DefaultFontCheckBox.Checked; + ChangeFontButton.Enabled := not DefaultFontCheckBox.Checked; + ListFontFrame.Enabled := not DefaultFontCheckBox.Checked; + if DefaultFontCheckBox.Checked then begin + gtk_widget_modify_font(ListFontPreview.FWidget, nil); + ListFontPreview.Caption := Format(LANGPreferences_DefaultS, [DefaultGTKFont]); + end else begin + FontDesc := pango_font_description_from_string(StringToPgchar(LocalListFont)); + gtk_widget_modify_font(ListFontPreview.FWidget, FontDesc); + ListFontPreview.Caption := LocalListFont; + end; +end; + +procedure TFPreferences.ChangeFontButtonClick(Sender: TObject); + + procedure ChangeFont(ToControl: TGTKLabel); + var Dialog: TGTKFontSelectionDialog; + FontDesc: PPangoFontDescription; + begin + Dialog := TGTKFontSelectionDialog.CreateWithTitle(Self, LANGPreferences_SelectFont); + try + Dialog.FontName := ToControl.Caption; + if Byte(Dialog.Run) = 251 then begin + ToControl.Caption := Dialog.FontName; + FontDesc := pango_font_description_from_string(StringToPgchar(Dialog.FontName)); + gtk_widget_modify_font(ToControl.FWidget, FontDesc); +// g_object_unref(FontDesc); // *** - cannot unref, causes SIGSEGV + LocalListFont := Dialog.FontName; + end; + finally + Dialog.Free; + end; + end; + +begin + if Sender = ChangeFontButton then ChangeFont(ListFontPreview); +end; + +procedure TFPreferences.ColorButtonDefaultsToggled(Sender: TObject); +begin + if NormalItemFGColorDefault.Checked then NormalItemFGColorButton.SetDefaultColor + else NormalItemFGColorButton.UnsetDefaultColor; + if NormalItemFGColorDefault.Checked then NormalItemBGColorButton.SetDefaultColor + else NormalItemBGColorButton.UnsetDefaultColor; + if ActiveItemFGColorDefault.Checked then ActiveItemFGColorButton.SetDefaultColor + else ActiveItemFGColorButton.UnsetDefaultColor; + if ActiveItemFGColorDefault.Checked then ActiveItemBGColorButton.SetDefaultColor + else ActiveItemBGColorButton.UnsetDefaultColor; + if InactiveItemFGColorDefault.Checked then InactiveItemFGColorButton.SetDefaultColor + else InactiveItemFGColorButton.UnsetDefaultColor; + if InactiveItemFGColorDefault.Checked then InactiveItemBGColorButton.SetDefaultColor + else InactiveItemBGColorButton.UnsetDefaultColor; + if LinkItemFGColorDefault.Checked then LinkItemFGColorButton.SetDefaultColor + else LinkItemFGColorButton.UnsetDefaultColor; + if DotFileItemFGColorDefault.Checked then DotFileItemFGColorButton.SetDefaultColor + else DotFileItemFGColorButton.UnsetDefaultColor; +end; + +procedure TFPreferences.DefaultRowHeightCheckBoxToggled(Sender: TObject); +begin + RowHeightLabel.Enabled := not DefaultRowHeightCheckBox.Checked; + RowHeightSpinEdit.Enabled := not DefaultRowHeightCheckBox.Checked; +end; + +procedure TFPreferences.UseInternalViewerCheckBoxToggled(Sender: TObject); +begin + ViewerCombo.Enabled := not UseInternalViewerCheckBox.Checked; + ViewerLabel2.Enabled := not UseInternalViewerCheckBox.Checked; + ViewerBrowseButton.Enabled := not UseInternalViewerCheckBox.Checked; + ViewerOptionMenu.Enabled := not UseInternalViewerCheckBox.Checked; +end; + +(********************************************************************************************************************************) +procedure TFPreferences.AssignDefaultValues; +var AColor: TGDKColor; +begin + DefaultGTKFont := pango_font_description_to_string(pango_context_get_font_description(gtk_widget_get_pango_context(FWidget))); + LocalListFont := ConfPanelFont; + + RowHeightSpinEdit.Min := 6; + RowHeightSpinEdit.Max := 128; + RowHeightSpinEdit.AsInteger := ConfRowHeightReal; + DefaultRowHeightCheckBox.Checked := ConfRowHeight < 0; + NumHistoryItemsSpinEdit.Min := 1; + NumHistoryItemsSpinEdit.Max := 512; + NumHistoryItemsSpinEdit.AsInteger := ConfNumHistoryItems; + ClearROAttr.Checked := ConfClearReadOnlyAttr; + DisableMouseRename.Checked := ConfDisableMouseRename; + ShowFiletypeIcons.Checked := ConfUseFileTypeIcons; + ViewerCombo.Entry.Text := ANSIToUTF8(ConfViewer); + EditorCombo.Entry.Text := ANSIToUTF8(ConfEditor); + TerminalCombo.Entry.Text := ANSIToUTF8(ConfTerminalCommand); + DefaultFontCheckBox.Checked := ConfUseSystemFont; + + if not StringToGDKColor(ConfNormalItemFGColor, AColor) then StringToGDKColor(ConfDefaultNormalItemFGColor, AColor); + NormalItemFGColorButton.Color := AColor; + if not StringToGDKColor(ConfNormalItemBGColor, AColor) then StringToGDKColor(ConfDefaultNormalItemBGColor, AColor); + NormalItemBGColorButton.Color := AColor; + if not StringToGDKColor(ConfActiveItemFGColor, AColor) then StringToGDKColor(ConfDefaultActiveItemFGColor, AColor); + ActiveItemFGColorButton.Color := AColor; + if not StringToGDKColor(ConfActiveItemBGColor, AColor) then StringToGDKColor(ConfDefaultActiveItemBGColor, AColor); + ActiveItemBGColorButton.Color := AColor; + if not StringToGDKColor(ConfInactiveItemFGColor, AColor) then StringToGDKColor(ConfDefaultInactiveItemFGColor, AColor); + InactiveItemFGColorButton.Color := AColor; + if not StringToGDKColor(ConfInactiveItemBGColor, AColor) then StringToGDKColor(ConfDefaultInactiveItemBGColor, AColor); + InactiveItemBGColorButton.Color := AColor; + if not StringToGDKColor(ConfSelectedItemFGColor, AColor) then StringToGDKColor(ConfDefaultSelectedItemFGColor, AColor); + SelectedItemFGColorButton.Color := AColor; + if not StringToGDKColor(ConfLinkItemFGColor, AColor) then StringToGDKColor(ConfDefaultLinkItemFGColor, AColor); + LinkItemFGColorButton.Color := AColor; + if not StringToGDKColor(ConfDotFileItemFGColor, AColor) then StringToGDKColor(ConfDefaultDotFileItemFGColor, AColor); + DotFileItemFGColorButton.Color := AColor; + + NormalItemFGColorDefault.Checked := ConfNormalItemDefaultColors; + ActiveItemFGColorDefault.Checked := ConfCursorDefaultColors; + InactiveItemFGColorDefault.Checked := ConfInactiveItemDefaultColors; + LinkItemFGColorDefault.Checked := ConfLinkItemDefaultColors; + DotFileItemFGColorDefault.Checked := ConfDotFileItemDefaultColors; + + SelectAllDirectoriesCheckBox.Checked := ConfSelectAllDirs; + NewStyleAltOCheckBox.Checked := ConfNewStyleAltO; + ShowFuncButtonsCheckBox.Checked := ConfShowFuncButtons; + SizeFormatOptionMenu.ItemIndex := ConfSizeFormat; + TerminalOptionMenu.ItemIndex := ConfCmdLineTerminalBehaviour; + DisableFileTipsCheckBox.Checked := ConfDisableFileTips; + DirsInBoldCheckBox.Checked := ConfDirsInBold; + DisableDirectoryBracketsCheckBox.Checked := ConfDisableDirectoryBrackets; + OctalPermissionsCheckBox.Checked := ConfOctalPerm; + ShowTextUIDsCheckBox.Checked := ConfShowTextUIDs; + LynxLikeMotionCheckBox.Checked := ConfLynxLikeMotion; + InsertMovesDownCheckBox.Checked := ConfInsMoveDown; + SpaceMovesDownCheckBox.Checked := ConfSpaceMovesDown; + UseInternalViewerCheckBox.Checked := ConfUseInternalViewer; + ViewerOptionMenu.ItemIndex := ConfViewerTerminalBehaviour; + EditorOptionMenu.ItemIndex := ConfEditorTerminalBehaviour; + FocusRefreshCheckBox.Checked := ConfFocusRefresh; + WMCompatModeCheckBox.Checked := ConfWMCompatMode; + CompatUseLibcSystemCheckBox.Checked := ConfUseLibcSystem; + + DefaultFontCheckBoxToggled(Self); + ColorButtonDefaultsToggled(Self); + UseInternalViewerCheckBoxToggled(Self); +end; + +procedure TFPreferences.SaveSettings; +var x: integer; +begin + if not DefaultRowHeightCheckBox.Checked then x := RowHeightSpinEdit.AsInteger + else x := -1; + RebuildListViews := (ConfRowHeight <> x) or (ConfUseFileTypeIcons <> ShowFiletypeIcons.Checked) or + (ConfUseSystemFont <> DefaultFontCheckBox.Checked) or + ((not DefaultFontCheckBox.Checked) and (ConfPanelFont <> ListFontPreview.Caption)); + RebuildIcons := ConfRowHeight <> x; + + ConfRowHeight := x; + ConfNumHistoryItems := NumHistoryItemsSpinEdit.AsInteger; + ConfClearReadOnlyAttr := ClearROAttr.Checked; + ConfDisableMouseRename := DisableMouseRename.Checked; + ConfUseFileTypeIcons := ShowFiletypeIcons.Checked; + ConfViewer := UTF8ToANSI(ViewerCombo.Entry.Text); + ConfEditor := UTF8ToANSI(EditorCombo.Entry.Text); + ConfTerminalCommand := UTF8ToANSI(TerminalCombo.Entry.Text); + ConfUseSystemFont := DefaultFontCheckBox.Checked; + if not ConfUseSystemFont then ConfPanelFont := ListFontPreview.Caption; + + ConfNormalItemFGColor := GDKColorToString(NormalItemFGColorButton.Color); + ConfNormalItemBGColor := GDKColorToString(NormalItemBGColorButton.Color); + ConfActiveItemFGColor := GDKColorToString(ActiveItemFGColorButton.Color); + ConfActiveItemBGColor := GDKColorToString(ActiveItemBGColorButton.Color); + ConfInactiveItemFGColor := GDKColorToString(InactiveItemFGColorButton.Color); + ConfInactiveItemBGColor := GDKColorToString(InactiveItemBGColorButton.Color); + ConfSelectedItemFGColor := GDKColorToString(SelectedItemFGColorButton.Color); + ConfLinkItemFGColor := GDKColorToString(LinkItemFGColorButton.Color); + ConfDotFileItemFGColor := GDKColorToString(DotFileItemFGColorButton.Color); + + ConfNormalItemDefaultColors := NormalItemFGColorDefault.Checked; + ConfCursorDefaultColors := ActiveItemFGColorDefault.Checked; + ConfInactiveItemDefaultColors := InactiveItemFGColorDefault.Checked; + ConfLinkItemDefaultColors := LinkItemFGColorDefault.Checked; + ConfDotFileItemDefaultColors := DotFileItemFGColorDefault.Checked; + + ConfSelectAllDirs := SelectAllDirectoriesCheckBox.Checked; + ConfNewStyleAltO := NewStyleAltOCheckBox.Checked; + ConfSizeFormat := SizeFormatOptionMenu.ItemIndex; + ConfCmdLineTerminalBehaviour := TerminalOptionMenu.ItemIndex; + ConfDirsInBold := DirsInBoldCheckBox.Checked; + ConfDisableDirectoryBrackets := DisableDirectoryBracketsCheckBox.Checked; + ConfOctalPerm := OctalPermissionsCheckBox.Checked; + ConfShowTextUIDs := ShowTextUIDsCheckBox.Checked; + ConfLynxLikeMotion := LynxLikeMotionCheckBox.Checked; + ConfInsMoveDown := InsertMovesDownCheckBox.Checked; + ConfSpaceMovesDown := SpaceMovesDownCheckBox.Checked; + ConfUseInternalViewer := UseInternalViewerCheckBox.Checked; + ConfViewerTerminalBehaviour := ViewerOptionMenu.ItemIndex; + ConfEditorTerminalBehaviour := EditorOptionMenu.ItemIndex; + ConfFocusRefresh := FocusRefreshCheckBox.Checked; + ConfWMCompatMode := WMCompatModeCheckBox.Checked; + ConfUseLibcSystem := CompatUseLibcSystemCheckBox.Checked; + ConfDisableFileTips := DisableFileTipsCheckBox.Checked; + ConfShowFuncButtons := ShowFuncButtonsCheckBox.Checked; +end; + +(********************************************************************************************************************************) +end. + diff --git a/UProgress.pas b/UProgress.pas new file mode 100644 index 0000000..fad5268 --- /dev/null +++ b/UProgress.pas @@ -0,0 +1,142 @@ +(* + Tux Commander - UProgress - Progress dialog controlling various operations and related funcions + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UProgress; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + UEngines; + +type + TFProgress = class(TGTKDialog) + Label1, Label2, Label3: TGTKLabel; + {VBox,} Space, Space2, BarBox, LabelBox: TGTKVBox; + HBox, Bar1HBox, Bar2HBox: TGTKHBox; + ProgressBar, ProgressBar2: TGTKProgressBar; + CancelButton: TGTKButton; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure CancelButtonClick(Sender: TObject); + public + Cancelled: boolean; + FTwoBars: boolean; + procedure SetNumBars(TwoBars: boolean); + end; + +var + FProgress: TFProgress; + +implementation + +uses ULocale; + + +procedure TFProgress.FormCreate(Sender: TObject); +begin + WindowPosition := wpCenter; + Cancelled := False; + Buttons := []; + ShowSeparator := False; + ActionArea.SetSizeRequest(0, 4); + Caption := LANGProgress; + CancelButton := TGTKButton.Create(Self); + CancelButton.Caption := LANGCancel; + CancelButton.SetSizeRequest(90, -1); + Label1 := TGTKLabel.Create(Self); + Label1.Caption := LANGDelete; + Label2 := TGTKLabel.Create(Self); + Label3 := TGTKLabel.Create(Self); + Label2.Caption := LANGPreparingList; + ProgressBar := TGTKProgressBar.Create(Self); + ProgressBar.SetSizeRequest(420, 23); + ProgressBar2 := TGTKProgressBar.Create(Self); + ProgressBar2.SetSizeRequest(420, 23); + Bar1HBox := TGTKHBox.Create(Self); + Bar1HBox.AddControlEx(ProgressBar, False, False, 0); + Bar2HBox := TGTKHBox.Create(Self); + Bar2HBox.AddControlEx(ProgressBar2, False, False, 0); + BarBox := TGTKVBox.Create(Self); + HBox := TGTKHBox.Create(Self); + HBox.AddControlEx(CancelButton, False, False, 0); + Space := TGTKVBox.Create(Self); + Space.SetSizeRequest(-1, 7); + Space2 := TGTKVBox.Create(Self); + Space2.SetSizeRequest(-1, 5); + LabelBox := TGTKVBox.Create(Self); +// VBox := TGTKVBox.Create(Self); + ClientArea.AddControlEx(LabelBox, True, True, 5); + ClientArea.AddControlEx(BarBox, False, False, 10); + ClientArea.AddControlEx(HBox, False, False, 0); +// ClientArea.AddControlEx(Space, False, False, 0); +// ClientArea.AddControlEx(VBox, True, True, 0); +// AddControl(VBox); + OnKeyDown := FormKeyDown; + OnCloseQuery := FormCloseQuery; + CancelButton.OnClick := CancelButtonClick; + CancelButton.Default := True; +end; + +procedure TFProgress.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + if Key = GDK_ESCAPE then begin + Accept := False; + CancelButtonClick(Sender); + end; +end; + +procedure TFProgress.CancelButtonClick(Sender: TObject); +begin + Cancelled := True; +end; + +procedure TFProgress.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CancelButtonClick(Sender); + CanClose := False; +end; + +procedure TFProgress.SetNumBars(TwoBars: boolean); +begin + FTwoBars := TwoBars; + if not TwoBars then begin + LabelBox.AddControlEx(Label1, True, True, 5); + LabelBox.AddControlEx(Label2, True, True, 0); + BarBox.AddControlEx(Bar1HBox, False, False, 0); + SetDefaultSize(480, -1); + SetSizeRequest(480, -1); + end else begin + LabelBox.AddControlEx(Label1, True, True, 0); + LabelBox.AddControlEx(Label2, True, True, 0); + LabelBox.AddControlEx(Label3, True, True, 0); + Label2.XAlign := 0; Label2.XPadding := 20; + Label3.XAlign := 0; Label3.XPadding := 20; + BarBox.AddControlEx(Bar1HBox, False, False, 0); + BarBox.AddControlEx(Space2, False, False, 0); + BarBox.AddControlEx(Bar2HBox, False, False, 0); + SetDefaultSize(480, -1); + SetSizeRequest(480, -1); + end; +end; + + +end. + diff --git a/UProperties.pas b/UProperties.pas new file mode 100644 index 0000000..371f7a6 --- /dev/null +++ b/UProperties.pas @@ -0,0 +1,144 @@ +(* + Tux Commander - UProeprties - File properties dialog + Copyright (C) 2006 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UProperties; + +interface + +uses + glib2, gtk2, pango, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, GTKMenus, + UCoreClasses, UGnome; + +type + TFProperties = class(TGTKDialog) + TitleFrame, ListFontFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + Notebook: TGTKNotebook; + BasicPage, PermissionsPage, OpenWithPage: TGTKVBox; + + Table2: TGTKTable; + NameLabel: TGTKLabel; + NameEdit: TGTKEntry; + + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + public + DisplayFileName: string; + end; + +var + FProperties: TFProperties; + +implementation + +uses ULocale, UFileAssoc, UCoreUtils, UConfig; + + +procedure TFProperties.FormCreate(Sender: TObject); +var i: integer; +begin + SetDefaultSize(450, 500); + Caption := Format('%s Properties', [DisplayFileName]); + Buttons := [mbOK, mbCancel]; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [Format('%s Properties', [DisplayFileName])]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-properties', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + Notebook := TGTKNotebook.Create(Self); + Notebook.BorderWidth := 10; + ClientArea.AddControlEx(Notebook, True, True, 0); + + BasicPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(BasicPage, 'Basic'); + + PermissionsPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(PermissionsPage, 'Permissions'); + + OpenWithPage := TGTKVBox.Create(Notebook); + Notebook.AppendPage(OpenWithPage, 'Open With'); + + + // ********* PAGE Basic + + BasicPage.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + Table2 := TGTKTable.Create(Self); + Table2.SetRowColCount(8, 5); + BasicPage.AddControlEx(Table2, False, False, 0); + + NameLabel := TGTKLabel.Create(Self); + NameLabel.Caption := Format('%s', ['_Name:']); + NameLabel.XAlign := 0; + NameLabel.UseMarkup := True; + NameEdit := TGTKEntry.Create(Self); + NameLabel.FocusControl := NameEdit; + NameLabel.UseUnderline := True; + Table2.AddControlEx(0, 0, 1, 1, NameLabel, [taoShrink, taoFill], [taoShrink], 2, 5); + Table2.AddControlEx(1, 0, 1, 1, NameEdit, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 5); + + + + // ********* PAGE Permissions + + + + // ********* PAGE Applications + + + // ****************** + + OnKeyDown := FormKeyDown; + OnDestroy := FormDestroy; +end; + +procedure TFProperties.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + if Key = GDK_ESCAPE then ModalResult := mbCancel; +end; + +procedure TFProperties.FormDestroy(Sender: TObject); +begin + +end; + +(********************************************************************************************************************************) +end. + diff --git a/URemoteWait.pas b/URemoteWait.pas new file mode 100644 index 0000000..e4a2c13 --- /dev/null +++ b/URemoteWait.pas @@ -0,0 +1,106 @@ +(* + Tux Commander - URemoteWait - Dialog shown while doing some remote actions + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit URemoteWait; + +interface + +uses + glib2, gdk2, gtk2, pango, + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFRemoteWait = class(TGTKDialog) + Label1{, Label2}: TGTKLabel; + Entry: TGTKEntry; + Box: TGTKVBox; + CancelButton: TGTKButton; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure CancelButtonClick(Sender: TObject); + private + { Private declarations } + public + Cancelled: boolean; + end; + +var + FRemoteWait: TFRemoteWait; + +implementation + +uses ULocale; + + +procedure TFRemoteWait.FormCreate(Sender: TObject); +begin + SetDefaultSize(350, -1); + WindowPosition := wpCenterAlways; +// WindowTypeHint := whDialog; + Caption := LANGRemoteWait_Caption; + Buttons := []; + Box := TGTKVBox.Create(Self); + Label1 := TGTKLabel.Create(Self); + Label1.Caption := Format('%s', [LANGRemoteWait_OperationInProgress]); + Label1.UseUnderline := True; + Label1.UseMarkup := True; + Label1.XAlign := 0; + Label1.XPadding := 0; + Label1.LineWrap := True; + Box.AddControlEx(Label1, False, False, 2); +{ + Label2 := TGTKLabel.Create(Self); + Label2.Caption := LANGRemoteWait_ItemsFound; + Label2.XAlign := 0; + Label2.XPadding := 20; + Label2.LineWrap := True; + Box.AddControlEx(Label2, False, False, 7); +} + Box.BorderWidth := 6; + ClientArea.AddControlEx(Box, True, True, 0); + CancelButton := TGTKButton.CreateFromStock(Self, 'gtk-cancel'); + CancelButton.Default := True; + ActionArea.AddControlEndEx(CancelButton, False, False, 2); + OnKeyDown := FormKeyDown; + OnCloseQuery := FormCloseQuery; + CancelButton.OnClick := CancelButtonClick; + Cancelled := False; +end; + +procedure TFRemoteWait.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER, GDK_ESCAPE: Cancelled := True; + end; +end; + +procedure TFRemoteWait.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CanClose := False; + Cancelled := True; +end; + +procedure TFRemoteWait.CancelButtonClick(Sender: TObject); +begin + Cancelled := True; +end; + +end. + diff --git a/URunFromVFS.pas b/URunFromVFS.pas new file mode 100644 index 0000000..393fbb9 --- /dev/null +++ b/URunFromVFS.pas @@ -0,0 +1,260 @@ +(* + Tux Commander - URunFromVFS - The file properties dialog for VFS filesystems + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit URunFromVFS; + +interface + +uses + glib2, gtk2, pango, SysUtils, Types, Classes, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, UCoreClasses; + +type + TFRunFromVFS = class(TGTKDialog) + TitleFrame, ListFontFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + ButtonBox: TGTKHButtonBox; + CloseButton: TGTKButton; + + Table: TGTKTable; + ExecuteButton, ExecuteAllButton: TGTKImageButton; + + FileNameLabel, FileNameLabel2, FileTypeLabel, FileTypeLabel2, SizeLabel, SizeLabel2, PackedSizeLabel, PackedSizeLabel2, + DateLabel, DateLabel2: TGTKLabel; + OpensWithLabel, OpensWithLabel2, InfoLabel: TGTKLabel; + InfoIcon: TGTKImage; + + HBox1, HBox2: TGTKHBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure ExecuteButtonClick(Sender: TObject); + procedure ExecuteAllButtonClick(Sender: TObject); + procedure CloseButtonClick(Sender: TObject); + end; + +var + FRunFromVFS: TFRunFromVFS; + +implementation + +uses ULocale, UConfig; + + +procedure TFRunFromVFS.FormCreate(Sender: TObject); +var i: integer; +begin +// SetDefaultSize(55, 40); + Caption := LANGFRunFromVFS_Caption; + Buttons := []; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [LANGFRunFromVFS_TitleLabel]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-properties', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + CloseButton := TGTKButton.CreateFromStock(Self, GTK_STOCK_CLOSE); +// CloseButton.Default := True; +// Default := CloseButton; + CloseButton.OnClick := CloseButtonClick; + ButtonBox := TGTKHButtonBox.Create(Self); + ButtonBox.Layout := blEnd; + ButtonBox.Spacing := 0; + ButtonBox.BorderWidth := 0; + + FileNameLabel := TGTKLabel.Create(Self); + FileNameLabel.XAlign := 1; + FileNameLabel.YAlign := 0; + FileNameLabel.Caption := Format('%s', [LANGFRunFromVFS_FileNameLabel]); + FileNameLabel.UseMarkup := True; + FileNameLabel2 := TGTKLabel.Create(Self); + FileNameLabel2.Caption := Format('%s ', ['/tmp/t/bbbbb.txt']); + FileNameLabel2.XAlign := 0; + FileNameLabel2.UseMarkup := True; + FileNameLabel2.Selectable := True; + FileNameLabel2.CanFocus := False; + FileNameLabel2.LineWrap := True; + + FileTypeLabel := TGTKLabel.Create(Self); + FileTypeLabel.XAlign := 1; + FileTypeLabel.Caption := Format('%s', [LANGFRunFromVFS_FileTypeLabel]); + FileTypeLabel.UseMarkup := True; + FileTypeLabel2 := TGTKLabel.Create(Self); + FileTypeLabel2.Caption := Format('%s ', ['HTML page']); + FileTypeLabel2.XAlign := 0; + FileTypeLabel2.UseMarkup := True; + + SizeLabel := TGTKLabel.Create(Self); + SizeLabel.XAlign := 1; + SizeLabel.Caption := Format('%s', [LANGFRunFromVFS_SizeLabel]); + SizeLabel.UseMarkup := True; + SizeLabel2 := TGTKLabel.Create(Self); + SizeLabel2.Caption := Format('%s ', ['192 168 bytes']); + SizeLabel2.XAlign := 0; + SizeLabel2.UseMarkup := True; + + PackedSizeLabel := TGTKLabel.Create(Self); + PackedSizeLabel.XAlign := 1; + PackedSizeLabel.Caption := Format('%s', [LANGFRunFromVFS_PackedSizeLabel]); + PackedSizeLabel.UseMarkup := True; + PackedSizeLabel2 := TGTKLabel.Create(Self); + PackedSizeLabel2.Caption := Format('%s ', ['168 192 bytes']); + PackedSizeLabel2.XAlign := 0; + PackedSizeLabel2.UseMarkup := True; + + DateLabel := TGTKLabel.Create(Self); + DateLabel.XAlign := 1; + DateLabel.Caption := Format('%s', [LANGFRunFromVFS_DateLabel]); + DateLabel.UseMarkup := True; + DateLabel2 := TGTKLabel.Create(Self); + DateLabel2.Caption := Format('%s ', ['2007-01-01']); + DateLabel2.XAlign := 0; + DateLabel2.UseMarkup := True; + + HBox1 := TGTKHBox.Create(Self); + HBox1.Homogeneous := False; + InfoLabel := TGTKLabel.Create(Self); + InfoLabel.Caption := LANGFRunFromVFS_InfoLabel; + InfoLabel.UseMarkup := True; + InfoLabel.LineWrap := True; + InfoLabel.SetSizeRequest(400, -1); + InfoIcon := TGTKImage.Create(Self); + InfoIcon.SetFromStock('gtk-dialog-info', isDialog); + HBox1.AddControlEx(TGTKVBox.Create(Self), False, False, 12); + HBox1.AddControlEx(InfoIcon, False, False, 7); + HBox1.AddControlEx(InfoLabel, True, True, 0); + HBox1.AddControlEx(TGTKVBox.Create(Self), False, False, 8); + + OpensWithLabel := TGTKLabel.Create(Self); + OpensWithLabel.XAlign := 1; + OpensWithLabel.YAlign := 0; + OpensWithLabel.Caption := Format('%s', [LANGFRunFromVFS_OpensWithLabel]); + OpensWithLabel.UseMarkup := True; + OpensWithLabel2 := TGTKLabel.Create(Self); + OpensWithLabel2.Caption := Format('%s ', ['galeon']); + OpensWithLabel2.XAlign := 0; + OpensWithLabel2.Selectable := True; + OpensWithLabel2.CanFocus := False; + OpensWithLabel2.UseMarkup := True; + + ExecuteButton := TGTKImageButton.Create(Self); + ExecuteButton.SetFromStock('gtk-execute', isButton); + ExecuteButton.Caption := LANGFRunFromVFS_ExecuteButton; + ExecuteButton.OnClick := ExecuteButtonClick; + ExecuteButton.Spacing := 7; + ExecuteAllButton := TGTKImageButton.Create(Self); + ExecuteAllButton.Caption := LANGFRunFromVFS_ExecuteAllButton; + ExecuteAllButton.OnClick := ExecuteAllButtonClick; + ExecuteAllButton.Spacing := 7; + + + Table := TGTKTable.Create(Self); + Table.SetRowColCount(13, 4); + ClientArea.AddControlEx(Table, True, True, 12); + Table.AddControlEx(0, 0, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink], 10, 6); + Table.AddControlEx(0, 1, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoFill], 12, 2); + Table.AddControlEx(1, 1, 1, 1, FileNameLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(3, 1, 2, 1, FileNameLabel2, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(1, 2, 1, 1, FileTypeLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(3, 2, 2, 1, FileTypeLabel2, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(1, 3, 1, 1, SizeLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(3, 3, 2, 1, SizeLabel2, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(1, 4, 1, 1, PackedSizeLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(3, 4, 2, 1, PackedSizeLabel2, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(1, 5, 1, 1, DateLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(3, 5, 2, 1, DateLabel2, [taoExpand, taoFill], [taoShrink, taoFill], 10, 2); + Table.AddControlEx(0, 6, 5, 1, TGTKHBox.Create(Self), [taoShrink], [taoShrink], 50, 17); + Table.AddControlEx(0, 7, 5, 1, HBox1, [taoExpand, taoFill], [taoShrink], 0, 2); + Table.AddControlEx(1, 8, 1, 1, OpensWithLabel, [taoShrink, taoFill], [taoShrink, taoFill], 10, 10); + Table.AddControlEx(3, 8, 2, 1, OpensWithLabel2, [taoExpand, taoFill], [taoShrink, taoFill], 10, 10); +// Table.AddControlEx(3, 9, 1, 1, ExecuteButton, [taoFill], [taoShrink], 10, 2); +// Table.AddControlEx(3, 10, 1, 1, ExecuteAllButton, [taoFill], [taoShrink], 10, 2); + Table.AddControlEx(4, 11, 1, 1, TGTKHBox.Create(Self), [taoExpand, taoFill], [taoShrink], 30, 2); + Table.AddControlEx(0, 12, 4, 1, TGTKVBox.Create(Self), [taoExpand, taoFill], [taoShrink], 30, 10); + + HBox2 := TGTKHBox.Create(Self); + HBox2.BorderWidth := 3; + HBox2.Homogeneous := False; + HBox2.AddControlEx(ExecuteButton, False, False, 2); + HBox2.AddControlEx(ExecuteAllButton, False, False, 2); + HBox2.AddControlEx(TGTKEventBox.Create(Self), False, False, 4); + ButtonBox.AddControlEnd(CloseButton); + HBox2.AddControlEx(ButtonBox, False, False, 2); + ActionArea.AddControlEx(HBox2, False, False, 0); + + CloseButton.SetFocus; + OnKeyDown := FormKeyDown; +end; + +procedure TFRunFromVFS.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + if Key = GDK_ESCAPE then begin + ModalResult := mbClose; + Accept := False; + end else + if Key = GDK_RIGHT then begin + if ExecuteButton.Focused then ExecuteAllButton.SetFocus else + if ExecuteAllButton.Focused then CloseButton.SetFocus else + ExecuteButton.SetFocus; + Accept := False; + end else + if Key = GDK_LEFT then begin + if ExecuteButton.Focused then CloseButton.SetFocus else + if ExecuteAllButton.Focused then ExecuteButton.SetFocus else + ExecuteAllButton.SetFocus; + Accept := False; + end; +end; + +procedure TFRunFromVFS.ExecuteButtonClick(Sender: TObject); +begin + ModalResult := mbYes; +end; + +procedure TFRunFromVFS.ExecuteAllButtonClick(Sender: TObject); +begin + ModalResult := mbNo; +end; + +procedure TFRunFromVFS.CloseButtonClick(Sender: TObject); +begin + ModalResult := mbClose; +end; + + +end. + diff --git a/USearch.pas b/USearch.pas new file mode 100644 index 0000000..4cd49f1 --- /dev/null +++ b/USearch.pas @@ -0,0 +1,1030 @@ +(* + Tux Commander - USearch - Search dialog + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit USearch; + +interface + +uses + glib2, gdk2, gtk2, SyncObjs, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKMenus, + UEngines, UGnome; + +type + TFSearch = class(TGTKDialog) + BottomBox: TGTKVBox; + HBox, HBox2: TGTKHBox; + ButtonBox: TGTKHButtonBox; + FileList: TGTKListView; + FileListScrolledWindow: TGTKScrolledWindow; + + Notebook: TGTKNotebook; + Table1, Table2: TGTKTable; + ResultsLabel, StatusLabel: TGTKLabel; + Label1, Label2, Label3, Label4, Label5, Label6: TGTKLabel; + FileMaskEntry: TGTKCombo; + SearchInEntry, FindTextEntry: TGTKEntry; + ViewButton, NewSearchButton, GoToFileButton, FeedToListboxButton: TGTKButton; + SearchArchivesCheckButton, CaseSensitiveCheckButton, StayCurrentFSCheckButton, CaseSensitiveMatchCheckButton: TGTKCheckButton; + FindButton, StopButton, CloseButton: TGTKButton; + BiggerThanCheckButton, SmallerThanCheckButton: TGTKCheckButton; + BiggerThanEntry, SmallerThanEntry: TGTKSpinEdit; + BiggerThanOptionMenu, SmallerThanOptionMenu, ModifiedLastOptionMenu, ModifiedNotLastOptionMenu: TGTKOptionMenu; + ModifiedBetweenRadioButton, NotModifiedAfterRadioButton, ModifiedLastRadioButton, ModifiedNotLastRadionButton: TGTKCheckButton; + ModifiedLastSpinEdit, ModifiedNotLastSpinEdit: TGTKSpinEdit; + ModifiedBetweenEntry1, ModifiedBetweenEntry2, NotModifiedAfterEntry: TGTKEntry; + ModifiedBetweenEntry1G, ModifiedBetweenEntry2G, NotModifiedAfterEntryG: TGnomeDateEdit; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure FormResponse(Sender: TObject; const ResponseID: integer); + procedure FileListSelectionChanged(Sender: TObject); + procedure FindButtonClick(Sender: TObject); + procedure StopButtonClick(Sender: TObject); + procedure CloseButtonClick(Sender: TObject); + procedure BiggerThanCheckButtonToggled(Sender: TObject); + procedure NewSearchButtonClick(Sender: TObject); + procedure ViewButtonClick(Sender: TObject); + procedure GoToFileButtonClick(Sender: TObject); + procedure FileListDblClick(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); + procedure FileMaskEntryKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + Processing, Stop, FUseGnomeWidgets: boolean; + SavedData: string; + procedure ConstructViews; + procedure DoSearch; + public + Engine: TPanelEngine; + AListView: TGTKListView; + List: TList; + GoToFile, GoToFileArchive: string; + end; + + TSearchThread = class(TThread) + private + FEngine: TPanelEngine; + Wilds: array of string; + GUIMutex: TCriticalSection; + procedure Rekurze(StartDir: string); + function FindText(FileName: string): boolean; + protected + FStartPath, FFileMask, FStringFind: string; + FDontLeaveFS, FCaseSensitiveMask, FCaseSensitiveStrings, FSearchArchives: boolean; + FBiggerThan, FSmallerThan: integer; // -1 = skip + FModifiedBetween1, FModifiedBetween2, FNotModifiedAfter: TDateTime; + FModifiedLast, FModifiedNotLast: integer; + FList: TList; + procedure Execute; override; + public + Finished, CancelIt: boolean; + CurrentDir: string; + constructor Create(Engine: TPanelEngine); + destructor Destroy; override; + end; + +var + FSearch: TFSearch; + +implementation + +uses Math, UMain, ULocale, UCoreUtils, Libc, UCore, DateUtils, UViewer, UConfig, UVFSCore; + +type TFileListItem = class + CRC: LongWord; + MD5: string; + Name, FullPath: string; + Status: byte; + IsMD5: boolean; + Size: Int64; + end; + +var SizeUnits: array[0..2] of string; + DayUnits: array[0..3] of string; + + +procedure TFSearch.FormCreate(Sender: TObject); +var MenuItem: TGTKMenuItem; + i: integer; +begin + // Set the constants + SizeUnits[0] := LANGSearch_Bytes; + SizeUnits[1] := LANGSearch_kB; + SizeUnits[2] := LANGSearch_MB; + DayUnits[0] := LANGSearch_days; + DayUnits[1] := LANGSearch_weeks; + DayUnits[2] := LANGSearch_months; + DayUnits[3] := LANGSearch_years; + + // Initialization +// WindowTypeHint := whNormal; + List := TList.Create; + List.Clear; + Processing := False; + Stop := False; + GoToFile := ''; + GoToFileArchive := ''; + SetDefaultSize(650, 600); + Caption := LANGSearch_Caption; + Buttons := []; + ShowSeparator := False; + FUseGnomeWidgets := Assigned(@gnome_date_edit_new) and Assigned(@gnome_date_edit_set_time) and Assigned(@gnome_date_edit_get_time); + + Notebook := TGTKNotebook.Create(Self); + Notebook.BorderWidth := 10; + Table1 := TGTKTable.Create(Self); + Table1.BorderWidth := 10; + Table2 := TGTKTable.Create(Self); + Table2.BorderWidth := 10; + Notebook.AppendPage(Table1, LANGSearch_General); + Notebook.AppendPage(Table2, LANGSearch_Advanced); + + ConstructViews; + + ResultsLabel := TGTKLabel.Create(Self); + ResultsLabel.XAlign := 0; + ResultsLabel.XPadding := 0; + ResultsLabel.Caption := Format('%s', [LANGSearch_SearchResults]); + ResultsLabel.FocusControl := FileList; + ResultsLabel.UseMarkup := True; + ResultsLabel.UseUnderline := True; + + ClientArea.AddControlEx(Notebook, False, False, 0); + + + Label1 := TGTKLabel.Create(Self); + Label1.XAlign := 0; + Label1.XPadding := 0; + Label1.Caption := Format('%s', [LANGSearch_SearchFor]); + FileMaskEntry := TGTKCombo.Create(Self); + FileMaskEntry.Tooltip := LANGSearch_FileMaskEntryTooltip; + FileMaskEntry.Entry.OnKeyDown := FileMaskEntryKeyDown; + if SearchHistory.Count > 0 then + for i := 0 to SearchHistory.Count - 1 do + FileMaskEntry.Items.Append(SearchHistory[i]); + FileMaskEntry.Entry.Text := ''; + Label1.FocusControl := FileMaskEntry.Entry; + Label1.UseMarkup := True; + Label1.UseUnderline := True; + Label2 := TGTKLabel.Create(Self); + Label2.XAlign := 0; + Label2.XPadding := 0; + Label2.Caption := LANGSearch_SearchIn; + SearchInEntry := TGTKEntry.Create(Self); + Label2.FocusControl := SearchInEntry; + Label2.UseMarkup := True; + Label2.UseUnderline := True; + SearchArchivesCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_SearchArchivesCheckButton); + SearchArchivesCheckButton.Enabled := PluginList.Count > 0; + Label3 := TGTKLabel.Create(Self); + Label3.XAlign := 0; + Label3.XPadding := 0; + Label3.Caption := LANGSearch_FindText; + FindTextEntry := TGTKEntry.Create(Self); + FindTextEntry.Tooltip := LANGSearch_FindTextEntryTooltip; + Label3.FocusControl := FindTextEntry; + Label3.UseMarkup := True; + Label3.UseUnderline := True; + CaseSensitiveCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_CaseSensitiveCheckButton); + StayCurrentFSCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_StayCurrentFSCheckButton); + CaseSensitiveMatchCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_CaseSensitiveMatchCheckButton); + + Table1.AddControlEx(0, 0, 1, 1, Label1, [taoShrink, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(1, 0, 1, 1, FileMaskEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(2, 0, 1, 1, CaseSensitiveMatchCheckButton, [taoShrink, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(0, 1, 1, 1, Label2, [taoShrink, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(1, 1, 1, 1, SearchInEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(2, 1, 1, 1, StayCurrentFSCheckButton, [taoShrink], [taoShrink], 5, 2); + Table1.AddControlEx(1, 2, 2, 1, SearchArchivesCheckButton, [taoShrink, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(0, 3, 3, 1, TGTKHSeparator.Create(Self), [taoExpand, taoFill], [taoShrink], 5, 4); + Table1.AddControlEx(0, 4, 1, 1, Label3, [taoShrink, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(1, 4, 2, 1, FindTextEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(1, 5, 2, 1, CaseSensitiveCheckButton, [taoShrink, taoFill], [taoShrink], 5, 2); + Table1.AddControlEx(0, 6, 3, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 5, 2); + + + + Label4 := TGTKLabel.Create(Self); + Label4.XAlign := 0; + Label4.XPadding := 0; + Label4.Caption := Format('%s', [LANGSearch_Size]); + Label4.UseMarkup := True; + Label5 := TGTKLabel.Create(Self); + Label5.XAlign := 0; + Label5.XPadding := 0; + Label5.Caption := Format('%s', [LANGSearch_Date]); + Label5.UseMarkup := True; + BiggerThanCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_BiggerThan); + SmallerThanCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_SmallerThan); + BiggerThanEntry := TGTKSpinEdit.Create(Self); + BiggerThanEntry.Min := 0; + BiggerThanEntry.Max := 999999999; + BiggerThanEntry.Digits := 0; + BiggerThanEntry.IncrementStep := 1; + BiggerThanEntry.IncrementPage := 10; + SmallerThanEntry := TGTKSpinEdit.Create(Self); + SmallerThanEntry.Min := 0; + SmallerThanEntry.Max := 999999999; + SmallerThanEntry.Digits := 0; + SmallerThanEntry.IncrementStep := 1; + SmallerThanEntry.IncrementPage := 10; + BiggerThanOptionMenu := TGTKOptionMenu.Create(Self); + for i := Low(SizeUnits) to High(SizeUnits) do begin + MenuItem := TGTKMenuItem.Create(Self); + MenuItem.Caption := SizeUnits[i]; + BiggerThanOptionMenu.Items.Add(MenuItem); + end; + SmallerThanOptionMenu := TGTKOptionMenu.Create(Self); + for i := Low(SizeUnits) to High(SizeUnits) do begin + MenuItem := TGTKMenuItem.Create(Self); + MenuItem.Caption := SizeUnits[i]; + SmallerThanOptionMenu.Items.Add(MenuItem); + end; + ModifiedBetweenRadioButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_ModifiedBetweenRadioButton); + NotModifiedAfterRadioButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_NotModifiedAfterRadioButton); + ModifiedLastRadioButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_ModifiedLastRadioButton); + ModifiedNotLastRadionButton := TGTKCheckButton.CreateWithLabel(Self, LANGSearch_ModifiedNotLastRadionButton); + ModifiedLastSpinEdit := TGTKSpinEdit.Create(Self); + ModifiedLastSpinEdit.Min := 0; + ModifiedLastSpinEdit.Max := 10000; + ModifiedLastSpinEdit.Digits := 0; + ModifiedLastSpinEdit.IncrementStep := 1; + ModifiedLastSpinEdit.IncrementPage := 10; + ModifiedNotLastSpinEdit := TGTKSpinEdit.Create(Self); + ModifiedNotLastSpinEdit.Min := 0; + ModifiedNotLastSpinEdit.Max := 10000; + ModifiedNotLastSpinEdit.Digits := 0; + ModifiedNotLastSpinEdit.IncrementStep := 1; + ModifiedNotLastSpinEdit.IncrementPage := 10; + ModifiedLastOptionMenu := TGTKOptionMenu.Create(Self); + for i := Low(DayUnits) to High(DayUnits) do begin + MenuItem := TGTKMenuItem.Create(Self); + MenuItem.Caption := DayUnits[i]; + ModifiedLastOptionMenu.Items.Add(MenuItem); + end; + ModifiedNotLastOptionMenu := TGTKOptionMenu.Create(Self); + for i := Low(DayUnits) to High(DayUnits) do begin + MenuItem := TGTKMenuItem.Create(Self); + MenuItem.Caption := DayUnits[i]; + ModifiedNotLastOptionMenu.Items.Add(MenuItem); + end; + Label6 := TGTKLabel.Create(Self); + Label6.XAlign := 0; + Label6.XPadding := 0; + Label6.Caption := LANGSearch_And; + Label6.UseMarkup := True; + + if not FUseGnomeWidgets then begin + ModifiedBetweenEntry1 := TGTKEntry.Create(Self); + ModifiedBetweenEntry1.Tooltip := FormatDateTime(LANGSearch_ModifiedBetweenEntry1, Date); + ModifiedBetweenEntry2 := TGTKEntry.Create(Self); + ModifiedBetweenEntry2.Tooltip := FormatDateTime(LANGSearch_ModifiedBetweenEntry1, Date); + NotModifiedAfterEntry := TGTKEntry.Create(Self); + NotModifiedAfterEntry.Tooltip := FormatDateTime(LANGSearch_ModifiedBetweenEntry1, Date); + Table2.AddControlEx(2, 5, 2, 1, ModifiedBetweenEntry1, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(5, 5, 2, 1, ModifiedBetweenEntry2, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 6, 2, 1, NotModifiedAfterEntry, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + end else begin + ModifiedBetweenEntry1G := TGnomeDateEdit.Create(Self); + ModifiedBetweenEntry2G := TGnomeDateEdit.Create(Self); + NotModifiedAfterEntryG := TGnomeDateEdit.Create(Self); + Table2.AddControlEx(2, 5, 2, 1, ModifiedBetweenEntry1G, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(5, 5, 2, 1, ModifiedBetweenEntry2G, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(2, 6, 2, 1, NotModifiedAfterEntryG, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + end; + + Table2.AddControlEx(0, 0, 3, 1, Label4, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + Table2.AddControlEx(0, 1, 1, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 8, 0); + Table2.AddControlEx(1, 1, 1, 1, BiggerThanCheckButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 0); + Table2.AddControlEx(2, 1, 1, 1, BiggerThanEntry, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + Table2.AddControlEx(3, 1, 1, 1, BiggerThanOptionMenu, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + Table2.AddControlEx(5, 1, 1, 1, SmallerThanCheckButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + Table2.AddControlEx(6, 1, 1, 1, SmallerThanEntry, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 0); + Table2.AddControlEx(7, 1, 1, 1, SmallerThanOptionMenu, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 0); + Table2.AddControlEx(1, 3, 3, 1, TGTKVBox.Create(Self), [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 6); + Table2.AddControlEx(0, 4, 3, 1, Label5, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 1); + Table2.AddControlEx(1, 5, 1, 1, ModifiedBetweenRadioButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 2); + Table2.AddControlEx(4, 5, 1, 1, Label6, [taoShrink], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(1, 6, 1, 1, NotModifiedAfterRadioButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 2); + Table2.AddControlEx(1, 7, 1, 1, ModifiedLastRadioButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 2); + Table2.AddControlEx(2, 7, 1, 1, ModifiedLastSpinEdit, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(3, 7, 1, 1, ModifiedLastOptionMenu, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 2, 2); + Table2.AddControlEx(4, 7, 2, 1, ModifiedNotLastRadionButton, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(6, 7, 1, 1, ModifiedNotLastSpinEdit, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table2.AddControlEx(7, 7, 1, 1, ModifiedNotLastOptionMenu, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 0, 2); + + + BottomBox := TGTKVBox.Create(Self); + BottomBox.Homogeneous := False; + BottomBox.BorderWidth := 10; + FileListScrolledWindow := TGTKScrolledWindow.Create(Self); + FileListScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + FileListScrolledWindow.VertScrollBarPolicy := sbAutomatic; + FileListScrolledWindow.ShadowType := stShadowIn; + FileListScrolledWindow.AddControl(FileList); + FileListScrolledWindow.SetSizeRequest(100, -1); + FileList.SetSizeRequest(100, -1); + HBox := TGTKHBox.Create(Self); + HBox2 := TGTKHBox.Create(Self); + HBox2.Homogeneous := False; + HBox.Homogeneous := True; + ViewButton := TGTKButton.Create(Self); + ViewButton.Caption := LANGSearch_ViewButtonCaption; + ViewButton.Visible := True; + NewSearchButton := TGTKButton.Create(Self); + NewSearchButton.Caption := LANGSearch_NewSearchButtonCaption; + GoToFileButton := TGTKButton.Create(Self); + GoToFileButton.Caption := LANGSearch_GoToFileButtonCaption; + FeedToListboxButton := TGTKButton.Create(Self); + FeedToListboxButton.Caption := LANGSearch_FeedToListboxButtonCaption; + FeedToListboxButton.Enabled := False; + FeedToListboxButton.Visible := True; + StatusLabel := TGTKLabel.Create(Self); + StatusLabel.XAlign := 0; + StatusLabel.XPadding := 0; + StatusLabel.Caption := Format('%s %s', [LANGSearch_StatusSC, LANGSearch_Ready]); + StatusLabel.UseMarkup := True; + StatusLabel.SetSizeRequest(100, -1); + HBox.AddControlEx(ViewButton, True, True, 3); + HBox.AddControlEx(NewSearchButton, True, True, 3); + HBox.AddControlEx(GoToFileButton, True, True, 3); + HBox.AddControlEx(FeedToListboxButton, True, True, 3); + HBox2.AddControlEx(TGTKVBox.Create(Self), True, True, 20); + HBox2.AddControlEx(HBox, False, False, 0); + + BottomBox.AddControlEx(ResultsLabel, False, False, 5); + BottomBox.AddControlEx(FileListScrolledWindow, True, True, 0); + BottomBox.AddControlEx(StatusLabel, False, False, 5); + BottomBox.AddControlEx(HBox2, False, False, 2); + ClientArea.AddControlEx(BottomBox, True, True, 5); + + FindButton := TGTKButton.CreateFromStock(Self, GTK_STOCK_FIND); + FindButton.Default := True; + StopButton := TGTKButton.CreateFromStock(Self, GTK_STOCK_STOP); + StopButton.Visible := False; + StopButton.Default := True; + CloseButton := TGTKButton.CreateFromStock(Self, GTK_STOCK_CLOSE); + CloseButton.Default := True; + Default := FindButton; + ButtonBox := TGTKHButtonBox.Create(Self); + ButtonBox.Layout := blEnd; + ButtonBox.Spacing := 10; + ButtonBox.BorderWidth := 10; + ButtonBox.AddControlEnd(FindButton); + ButtonBox.AddControlEnd(StopButton); + ButtonBox.AddControlEnd(CloseButton); + + ActionArea.AddControlEx(ButtonBox, False, False, 0); + + OnKeyDown := FormKeyDown; + OnCloseQuery := FormCloseQuery; + OnResponse := FormResponse; + OnDestroy := FormDestroy; + FileList.OnSelectionChanged := FileListSelectionChanged; + FindButton.OnClick := FindButtonClick; + StopButton.OnClick := StopButtonClick; + CloseButton.OnClick := CloseButtonClick; + BiggerThanCheckButton.OnToggled := BiggerThanCheckButtonToggled; + SmallerThanCheckButton.OnToggled := BiggerThanCheckButtonToggled; + ModifiedBetweenRadioButton.OnToggled := BiggerThanCheckButtonToggled; + NotModifiedAfterRadioButton.OnToggled := BiggerThanCheckButtonToggled; + ModifiedLastRadioButton.OnToggled := BiggerThanCheckButtonToggled; + ModifiedNotLastRadionButton.OnToggled := BiggerThanCheckButtonToggled; + NewSearchButton.OnClick := NewSearchButtonClick; + ViewButton.OnClick := ViewButtonClick; + GoToFileButton.OnClick := GoToFileButtonClick; + FileList.OnDblClick := FileListDblClick; + + Notebook.PageIndex := 0; + FileMaskEntry.Entry.SetFocus; + BiggerThanCheckButtonToggled(Sender); + FileListSelectionChanged(Sender); +end; + +procedure TFSearch.ConstructViews; +var Column: TGTKTreeViewColumn; + i: integer; +begin + FileList := TGTKListView.CreateTyped(Self, True, [lcPointer, lcText]); + FileList.SelectionMode := smSingle; + FileList.RulesHint := True; + FileList.ShowHeaders := False; + Column := FileList.Columns.Add; + Column.Caption := LANGFilenameColumnCaption; + Column.AddAttribute('text', 1); + Column.SortID := 0; + for i := 0 to FileList.Columns.Count - 1 do begin + FileList.Columns[i].SizingMode := smAutoSize; + FileList.Columns[i].Resizable := True; + FileList.Columns[i].SetProperty('ypad', 0); + FileList.Columns[i].SetProperty('yalign', 0.5); + end; +end; + +procedure TFSearch.FormDestroy(Sender: TObject); + var i: integer; +begin + Application.ProcessMessages; + try + if List.Count > 0 then + for i := 0 to List.Count - 1 do + FreeDataItem(PDataItem(List[i])); + List.Free; + except end; +end; + +procedure TFSearch.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + Stop := True; +end; + +procedure TFSearch.FormResponse(Sender: TObject; const ResponseID: integer); +begin + Stop := True; +end; + +procedure TFSearch.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_F3: if FileList.Focused and Assigned(FileList.Selected) then begin + Accept := False; + ViewButtonClick(Sender); + end; + GDK_RETURN, GDK_KP_ENTER: if FileList.Focused and Assigned(FileList.Selected) then begin + Accept := False; + GoToFileButtonClick(Sender); + end else + if FindButton.Visible then begin + FindButtonClick(Sender); + Accept := False; + end; + GDK_ESCAPE: begin + Accept := False; + if Processing then Stop := True + else ModalResult := mbCancel; + end; + end; +end; + +procedure TFSearch.FindButtonClick(Sender: TObject); +var s: string; + i: integer; +begin + s := Trim(FileMaskEntry.Entry.Text); + if Length(s) > 0 then begin + SaveItemToHistory(s, SearchHistory); + if FileMaskEntry.Items.Count > 0 then + for i := FileMaskEntry.Items.Count - 1 downto 0 do + FileMaskEntry.Items.Delete(i); + if SearchHistory.Count > 0 then + for i := 0 to SearchHistory.Count - 1 do + FileMaskEntry.Items.Append(SearchHistory[i]); + end; + + DoSearch; +end; + +procedure TFSearch.StopButtonClick(Sender: TObject); +begin + Stop := True; +end; + +procedure TFSearch.CloseButtonClick(Sender: TObject); +begin + if Processing then Stop := True; + ModalResult := mbClose; +end; + +procedure TFSearch.BiggerThanCheckButtonToggled(Sender: TObject); +begin + BiggerThanEntry.Enabled := BiggerThanCheckButton.Checked; + BiggerThanOptionMenu.Enabled := BiggerThanCheckButton.Checked; + SmallerThanEntry.Enabled := SmallerThanCheckButton.Checked; + SmallerThanOptionMenu.Enabled := SmallerThanCheckButton.Checked; + Label6.Enabled := ModifiedBetweenRadioButton.Checked; + ModifiedLastSpinEdit.Enabled := ModifiedLastRadioButton.Checked; + ModifiedLastOptionMenu.Enabled := ModifiedLastRadioButton.Checked; + ModifiedNotLastSpinEdit.Enabled := ModifiedNotLastRadionButton.Checked; + ModifiedNotLastOptionMenu.Enabled := ModifiedNotLastRadionButton.Checked; + if not FUseGnomeWidgets then begin + ModifiedBetweenEntry1.Enabled := ModifiedBetweenRadioButton.Checked; + ModifiedBetweenEntry2.Enabled := ModifiedBetweenRadioButton.Checked; + NotModifiedAfterEntry.Enabled := NotModifiedAfterRadioButton.Checked; + end else begin + ModifiedBetweenEntry1G.Enabled := ModifiedBetweenRadioButton.Checked; + ModifiedBetweenEntry2G.Enabled := ModifiedBetweenRadioButton.Checked; + NotModifiedAfterEntryG.Enabled := NotModifiedAfterRadioButton.Checked; + end; +end; + +procedure TFSearch.FileListSelectionChanged(Sender: TObject); +begin + GoToFileButton.Enabled := Assigned(FileList.Selected) and Assigned(FileList.Selected.AsPointer(0)); + ViewButton.Enabled := Assigned(FileList.Selected) and Assigned(FileList.Selected.AsPointer(0)); +end; + +procedure TFSearch.NewSearchButtonClick(Sender: TObject); +var i: integer; +begin + try + FileMaskEntry.Entry.Text := ''; + FileMaskEntry.Entry.SetFocus; + FileList.Items.Clear; + if List.Count > 0 then + for i := List.Count - 1 downto 0 do + FreeDataItem(PDataItem(List[i])); + List.Clear; + StatusLabel.Caption := Format('%s %s', [LANGSearch_StatusSC, LANGSearch_Ready]); + StatusLabel.UseMarkup := True; + except + end; +end; + +procedure TFSearch.ViewButtonClick(Sender: TObject); +var AViewer: TViewerThread; + AEngine: TPanelEngine; + Plugin: TVFSPlugin; + b: boolean; + archive, s: string; + i, j: integer; +begin + if not (Assigned(FileList.Selected) and Assigned(FileList.Selected.AsPointer(0))) then Exit; + if Assigned(PDataItem(FileList.Selected.AsPointer(0))^.LnkPointTo) then begin + archive := string(PDataItem(FileList.Selected.AsPointer(0))^.LnkPointTo); + b := False; + s := ANSIUpperCase(Trim(Copy(archive, LastDelimiter('.', archive) + 1, Length(archive) - LastDelimiter('.', archive)))); + if (Length(s) > 1) and (s[1] = '.') then Delete(s, 1, 1); + if PluginList.Count > 0 then + for i := 0 to PluginList.Count - 1 do begin + Plugin := TVFSPlugin(PluginList[i]); + if Length(Plugin.Extensions) > 0 then + for j := 0 to Length(Plugin.Extensions) - 1 do + if AnsiCompareText(Plugin.Extensions[j], s) = 0 then begin + b := True; + Break; + end; + if b then Break; + end; + if b then begin + DebugMsg(['Found plugin ''', Plugin.VFSName, ''', trying to open the archive ''', archive, '''']); + AEngine := TVFSEngine.Create(Plugin); + (AEngine as TVFSEngine).ArchiveMode := True; + b := b and ((AEngine as TVFSEngine).VFSOpenEx(archive) = 0); + end; + end else begin + AEngine := TLocalTreeEngine.Create; + b := True; + end; + if b then FMain.EditViewFileInternal(Self, string(PDataItem(FileList.Selected.AsPointer(0))^.AName), AEngine, True, False) + else Application.MessageBox(Format(LANGCannotLoadFile, [ANSIToUTF8(string(PDataItem(FileList.Selected.AsPointer(0))^.AName))]), [mbOK], mbError, mbNone, mbOK); + if AEngine is TVFSEngine then (AEngine as TVFSEngine).VFSClose; + AEngine.Free; +end; + +procedure TFSearch.GoToFileButtonClick(Sender: TObject); +begin + if not (Assigned(FileList.Selected) and Assigned(FileList.Selected.AsPointer(0))) then Exit; + GoToFile := string(PDataItem(FileList.Selected.AsPointer(0))^.AName); + if Assigned(PDataItem(FileList.Selected.AsPointer(0))^.LnkPointTo) then + GoToFileArchive := string(PDataItem(FileList.Selected.AsPointer(0))^.LnkPointTo); + ModalResult := mbApply; +end; + +procedure TFSearch.FileListDblClick(Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean); +begin + if Assigned(FileList.Selected) and Assigned(FileList.Selected.AsPointer(0)) then GoToFileButtonClick(Sender); +end; + +procedure TFSearch.FileMaskEntryKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var Orig, s: string; + i: integer; +begin + case Key of + GDK_UP, GDK_DOWN: if Shift = [] then begin + Accept := False; + if SearchHistory.Count > 0 then begin + Orig := Trim(FileMaskEntry.Entry.Text); + i := SearchHistory.IndexOf(Orig); + + if Key = GDK_DOWN then begin + if i < 0 then begin + SavedData := Orig; + i := 0; + end else + if SearchHistory.Count > i + 1 then Inc(i); + s := SearchHistory[i]; + end else begin + if i < 0 then Exit else + if i = 0 then begin + s := SavedData; + SavedData := ''; + end else + if SearchHistory.Count > i then s := SearchHistory[i - 1]; + end; + + FileMaskEntry.Entry.Text := s; + FileMaskEntry.Entry.SetFocus; + FileMaskEntry.Entry.SelectAll; + end; + end; + end; +end; + + + +(********************************************************************************************************************************) +procedure TFSearch.DoSearch; +var FSearchThread: TSearchThread; + i, LastItems: integer; + ListItem: TGTKListItem; + x: Pointer; + OldDir: string; +begin + try + Processing := True; + Stop := False; + FindButton.Visible := False; + StopButton.Visible := True; + StopButton.SetFocus; + Default := StopButton; + StatusLabel.Caption := Format('%s %s', [LANGSearch_StatusSC, LANGSearch_PreparingToSearch]); + StatusLabel.UseMarkup := True; + + // Disable the UI + Table1.Enabled := False; + Table2.Enabled := False; + + // Clear the items + FileList.Items.Clear; + if List.Count > 0 then + for i := List.Count - 1 downto 0 do + FreeDataItem(PDataItem(List[i])); + List.Clear; + + // Save current directory + OldDir := Engine.GetPath; + + // Set the parameters + FSearchThread := TSearchThread.Create(Engine); + with FSearchThread do begin + FStartPath := UTF8ToANSI(SearchInEntry.Text); + FFileMask := UTF8ToANSI(FileMaskEntry.Entry.Text); + FStringFind := UTF8ToANSI(FindTextEntry.Text); + FDontLeaveFS := not StayCurrentFSCheckButton.Checked; + FCaseSensitiveMask := CaseSensitiveMatchCheckButton.Checked; + FCaseSensitiveStrings := CaseSensitiveCheckButton.Checked; + FSearchArchives := SearchArchivesCheckButton.Checked; + if not BiggerThanCheckButton.Checked then FBiggerThan := -1 else begin + i := StrToIntDef(BiggerThanEntry.Text, -1); + i := i * Trunc(Power(1024, BiggerThanOptionMenu.ItemIndex)); + FBiggerThan := i; + end; + if not SmallerThanCheckButton.Checked then FSmallerThan := -1 else begin + i := StrToIntDef(SmallerThanEntry.Text, -1); + i := i * Trunc(Power(1024, SmallerThanOptionMenu.ItemIndex)); + FSmallerThan := i; + end; + FModifiedBetween1 := -1; + FModifiedBetween2 := -1; + FNotModifiedAfter := -1; + if not FUseGnomeWidgets then begin + if ModifiedBetweenRadioButton.Checked then begin + FModifiedBetween1 := StrToDateDef(ModifiedBetweenEntry1.Text, -1); + FModifiedBetween2 := StrToDateDef(ModifiedBetweenEntry2.Text, -1); + end; + if NotModifiedAfterRadioButton.Checked then + FNotModifiedAfter := StrToDateDef(NotModifiedAfterEntry.Text, -1); + end else begin + if ModifiedBetweenRadioButton.Checked then begin + FModifiedBetween1 := ModifiedBetweenEntry1G.Time; + FModifiedBetween2 := ModifiedBetweenEntry2G.Time; + end; + if NotModifiedAfterRadioButton.Checked then + FNotModifiedAfter := NotModifiedAfterEntryG.Time; + end; + if not ModifiedLastRadioButton.Checked then FModifiedLast := -1 else begin + i := StrToIntDef(ModifiedLastSpinEdit.Text, -1); + case ModifiedLastOptionMenu.ItemIndex of + 1: i := i * 7; // weeks + 2: i := i * 30; // months + 3: i := i * 365; // years + end; + FModifiedLast := i; + end; + if not ModifiedNotLastRadionButton.Checked then FModifiedNotLast := -1 else begin + i := StrToIntDef(ModifiedNotLastSpinEdit.Text, -1); + case ModifiedNotLastOptionMenu.ItemIndex of + 1: i := i * 7; // weeks + 2: i := i * 30; // months + 3: i := i * 365; // years + end; + FModifiedNotLast := i; + end; + end; + + // UI loop + FSearchThread.Resume; + LastItems := 0; + repeat + Sleep(ConstInternalProgressTimer); + + FSearchThread.GUIMutex.Acquire; + StatusLabel.Caption := Format('%s %s', [LANGSearch_SearchInProgress, FSearchThread.CurrentDir]); + FSearchThread.GUIMutex.Release; + + StatusLabel.UseMarkup := True; + Application.ProcessMessages; + + FSearchThread.GUIMutex.Acquire; + if Stop then FSearchThread.CancelIt := True; + if LastItems < FSearchThread.FList.Count then begin + for i := LastItems to FSearchThread.FList.Count - 1 do begin + ListItem := FileList.Items.Add; + ListItem.SetValue(0, FSearchThread.FList[i]); + if PDataItem(FSearchThread.FList[i])^.LnkPointTo <> nil + then ListItem.SetValue(1, Format('%s%s%s', [string(PDataItem(FSearchThread.FList[i])^.LnkPointTo), ConstPathDelim, string(PDataItem(FSearchThread.FList[i])^.AName)])) + else ListItem.SetValue(1, string(PDataItem(FSearchThread.FList[i])^.AName)); + if i mod 30 = 0 then Application.ProcessMessages; // Refresh UI only after some amount of items added + end; + LastItems := FSearchThread.FList.Count; + end; + FSearchThread.GUIMutex.Release; + + until FSearchThread.Finished; + + if not Stop then StatusLabel.Caption := Format('%s (' + LANGSearch_FilesFound + ')', + [LANGSearch_SearchFinished, FSearchThread.FList.Count]) + else StatusLabel.Caption := Format('%s', [LANGSearch_UserCancelled]); + StatusLabel.UseMarkup := True; + + // Save the list + x := List; + List := FSearchThread.FList; + FSearchThread.FList := x; + FSearchThread.Free; + finally + StopButton.Visible := False; + FindButton.Visible := True; + Default := FindButton; + Processing := False; + Stop := False; + if FileList.Items.Count > 0 then FileList.SetFocus; + if Engine.ChangeDir(OldDir, False) <> 0 then DebugMsg(['DoSearch: cannot change back to saved directory']); + + // Enable the UI + Table1.Enabled := True; + Table2.Enabled := True; + end; +end; + + +(********************************************************************************************************************************) +constructor TSearchThread.Create(Engine: TPanelEngine); +begin + inherited Create(True); + FreeOnTerminate := False; + GUIMutex := TCriticalSection.Create; + CancelIt := False; + Finished := False; + CurrentDir := ''; + FSearchArchives := False; + + FEngine := Engine; + FList := TList.Create; +end; + +destructor TSearchThread.Destroy; +begin + FList.Free; + GUIMutex.Free; + inherited Destroy; +end; + +procedure TSearchThread.Execute; +var i: integer; + s: string; +begin + try + // Prepare the wildcards + SetLength(Wilds, 0); + if Length(FFileMask) > 0 then begin + while LastDelimiter(ConfSelItemsDelim, FFileMask) > 0 do begin + i := LastDelimiter(ConfSelItemsDelim, FFileMask); + if i < Length(FFileMask) then begin + s := Copy(FFileMask, i + 1, Length(FFileMask) - i); + Delete(FFileMask, i, Length(FFileMask) - i + 1); + SetLength(Wilds, Length(Wilds) + 1); + Wilds[Length(Wilds) - 1] := s; + end; + end; + if Length(FFileMask) > 0 then begin + SetLength(Wilds, Length(Wilds) + 1); + Wilds[Length(Wilds) - 1] := FFileMask; + end; + // Check for strings with no jokers ---> allow searching by partial names + if Length(Wilds) > 0 then + for i := 0 to Length(Wilds) - 1 do + if (Pos('*', Wilds[i]) < 1) and (Pos('?', Wilds[i]) < 1) then + Wilds[i] := Format('*%s*', [Wilds[i]]); + end; + + Rekurze(ExcludeTrailingPathDelimiter(FStartPath)); + SetLength(Wilds, 0); + finally + Finished := True; + end; +end; + +procedure TSearchThread.Rekurze(StartDir: string); +var LocalList: TList; + i, j, k: integer; + Matches, b: boolean; + FileName, s: string; + Data: PDataItem; + Plugin: TVFSPlugin; + xEngine: TVFSEngine; + VFSOpenResult: integer; +begin + try + if CancelIt then Exit; + Plugin := nil; + if Length(StartDir) < 1 then StartDir := '/'; + DebugMsg(['++ Entering directory ', StartDir]); + + GUIMutex.Acquire; + CurrentDir := StartDir; + GUIMutex.Release; + + if FEngine.ChangeDir(StartDir, False) <> 0 then Exit; + LocalList := TList.Create; + if FEngine.GetListing(LocalList, True, StartDir) = 0 then begin + + // Processing... + StartDir := IncludeTrailingPathDelimiter(StartDir); + if LocalList.Count > 0 then + for i := 0 to LocalList.Count - 1 do begin + if CancelIt then Break; + Data := LocalList[i]; +// DebugMsg([' --- found ', Data^.AName]); + + FileName := Data^.AName; + + Matches := True; + // Test if the file is on the same FS + if Matches and FDontLeaveFS then + Matches := Matches and FEngine.IsOnSameFS(FStartPath, StartDir + FileName); + // File mask test + if Matches and (Length(Wilds) > 0) then begin + b := False; + for j := 0 to Length(Wilds) - 1 do + b := b or IsWild(FileName, Wilds[j], not FCaseSensitiveMask); + Matches := Matches and b; + end; + if not Data^.IsDir then begin // Stop matching if file is directory + // Size limiting + if Matches and (FSmallerThan > 0) then Matches := Matches and (Data^.Size <= FSmallerThan); + if Matches and (FBiggerThan > 0) then Matches := Matches and (Data^.Size >= FBiggerThan); + // Date limiting + if Matches and (FModifiedLast > 0) then + Matches := Matches and (Data^.ModifyTime <= Now) and (Data^.ModifyTime >= Now - FModifiedLast); + if Matches and (FModifiedNotLast > 0) then + Matches := Matches and ((Data^.ModifyTime > Now) or (Data^.ModifyTime <= Now - FModifiedNotLast)); + if Matches and (FNotModifiedAfter > 0) then + Matches := Matches and (Data^.ModifyTime <= FNotModifiedAfter); + if Matches and (FModifiedBetween1 > 0) and (FModifiedBetween2 > 0) then + Matches := Matches and (Data^.ModifyTime >= FModifiedBetween1) and (Data^.ModifyTime <= FModifiedBetween2); + // Find text in file + if Matches and (Length(FStringFind) > 0) and (not (FEngine is TVFSEngine)) then begin + GUIMutex.Acquire; + CurrentDir := IncludeTrailingPathDelimiter(StartDir) + FileName; + Matches := Matches and FindText(CurrentDir); + CurrentDir := ExcludeTrailingPathDelimiter(StartDir); + GUIMutex.Release; + end; + end else + if (Length(FStringFind) > 0) then Matches := False; // When searching text in files, do not include directories + + // Add the record to the list + if Matches then begin + GUIMutex.Acquire; + FList.Add(LocalList[i]); + Libc.free(Data^.AName); + PDataItem(LocalList[i])^.AName := strdup(PChar(StartDir + FileName)); + if Assigned(PDataItem(LocalList[i])^.LnkPointTo) then begin + Libc.free(PDataItem(LocalList[i])^.LnkPointTo); + PDataItem(LocalList[i])^.LnkPointTo := nil; + end; + if FEngine is TVFSEngine then PDataItem(LocalList[i])^.LnkPointTo := strdup(PChar((FEngine as TVFSEngine).SavePath)); + GUIMutex.Release; + end; + + if Data^.IsDir and ((not FDontLeaveFS) or (FDontLeaveFS and FEngine.IsOnSameFS(FStartPath, StartDir + FileName))) + then Rekurze(IncludeTrailingPathDelimiter(StartDir) + FileName); + + // Handle archives + if (not Data^.IsDir) and FSearchArchives and (not (FEngine is TVFSEngine)) then begin + b := False; + s := ANSIUpperCase(Trim(Copy(FileName, LastDelimiter('.', FileName) + 1, Length(FileName) - LastDelimiter('.', FileName)))); + if (Length(s) > 1) and (s[1] = '.') then Delete(s, 1, 1); + if PluginList.Count > 0 then + for k := 0 to PluginList.Count - 1 do begin + Plugin := TVFSPlugin(PluginList[k]); + if Length(Plugin.Extensions) > 0 then + for j := 0 to Length(Plugin.Extensions) - 1 do + if AnsiCompareText(Plugin.Extensions[j], s) = 0 then begin + b := True; + Break; + end; + if b then Break; + end; + if b then begin + DebugMsg(['Found plugin ''', Plugin.VFSName, ''', trying to open the archive ''', FileName, '''']); + xEngine := TVFSEngine.Create(Plugin); + xEngine.ParentEngine := FEngine; + xEngine.ArchiveMode := True; + xEngine.SavePath := StartDir + FileName; + FEngine := xEngine; + VFSOpenResult := (FEngine as TVFSEngine).VFSOpenEx(IncludeTrailingPathDelimiter(StartDir) + FileName); + if (VFSOpenResult = 0) and (not CancelIt) then Rekurze('/'); + FEngine := FEngine.ParentEngine; + if not (xEngine as TVFSEngine).VFSClose then DebugMsg(['Error closing the engine...']); + xEngine.Free; + end; + end; + + if not Matches then Libc.free(LocalList[i]); + end; + end; + LocalList.Free; + finally +// DebugMsg(['-- Leaving directory ', StartDir]); + end; +end; + +function TSearchThread.FindText(FileName: string): boolean; +const BlockSize = 65536; +var fd: TEngineFileDes; + i, Error, Read, Pos: integer; + Buffer: PByteArray; + x: boolean; +begin + Result := False; + try + Error := 0; + Buffer := Libc.malloc(BlockSize); + if Buffer = nil then Exit; + Libc.memset(Buffer, 0, BlockSize); + fd := FEngine.OpenFile(FileName, omRead, Error); + if (fd = nil) or (Error <> 0) then Exit; + + Pos := 1; + repeat + Read := FEngine.ReadFile(fd, Buffer, BlockSize, Error); + if Read > 0 then + for i := 0 to Read - 1 do begin + if FCaseSensitiveStrings then x := Buffer^[i] = byte(FStringFind[Pos]) + else x := ANSIUpperCase(char(Buffer^[i])) = ANSIUpperCase(FStringFind[Pos]); + if x then begin + Inc(Pos); + if Pos > Length(FStringFind) then begin + Result := True; + FEngine.CloseFile(fd); + Libc.free(Buffer); + Exit; + end; + end else Pos := 1; + end; + + DebugMsg(['Read : ', Read, ' bytes.']); + if CancelIt then Break; + until Read < BlockSize; + FEngine.CloseFile(fd); + Libc.free(Buffer); + except + end; +end; + + + + + + + +end. + diff --git a/USelect.pas b/USelect.pas new file mode 100644 index 0000000..f9edccf --- /dev/null +++ b/USelect.pas @@ -0,0 +1,151 @@ +(* + Tux Commander - USelect - Select pattern dialog and related funcions + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit USelect; + +interface + +uses + glib2, gtk2, pango, SysUtils, Types, Classes, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses; + +type + TFSelect = class(TGTKDialog) +{ TitleFrame, ListFontFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; } + + Label1: TGTKLabel; + ComboBox: TGTKCombo; + Box: TGTKVBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure ComboBoxKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + SavedData: string; + end; + +var + FSelect: TFSelect; + +implementation + +uses ULocale, UCore; + + +procedure TFSelect.FormCreate(Sender: TObject); +var i: integer; +begin + SetDefaultSize(300, 50); + Buttons := [mbOK, mbCancel]; + +{ TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := 'File Properties'; + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-edit', isSmallToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKVBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + ClientArea.AddControlEx(TGTKHBox.Create(Self), False, False, 5); } + + + Box := TGTKVBox.Create(Self); + Label1 := TGTKLabel.Create(Self); + Label1.Caption := LANGSpecifyFileType; + Label1.UseUnderline := True; + Label1.XAlign := 0; + Label1.XPadding := 0; + ComboBox := TGTKCombo.Create(Self); + ComboBox.DisableActivate; + if SelectHistory.Count > 0 then + for i := 0 to SelectHistory.Count - 1 do + ComboBox.Items.Append(SelectHistory[i]); + ComboBox.Entry.Text := '*.*'; + ComboBox.Entry.OnKeyDown := ComboBoxKeyDown; + Label1.FocusControl := ComboBox.Entry; + Box.AddControlEx(Label1, False, False, 0); + Box.AddControlEx(ComboBox, False, False, 3); + Box.BorderWidth := 12; + ClientArea.AddControlEx(Box, True, True, 0); + OnKeyDown := FormKeyDown; + ComboBox.SetFocus; +end; + +procedure TFSelect.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFSelect.ComboBoxKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var Orig, s: string; + i: integer; +begin + case Key of + GDK_UP, GDK_DOWN: if Shift = [] then begin + Accept := False; + if SelectHistory.Count > 0 then begin + Orig := Trim(ComboBox.Entry.Text); + i := SelectHistory.IndexOf(Orig); + + if Key = GDK_DOWN then begin + if i < 0 then begin + SavedData := Orig; + i := 0; + end else + if SelectHistory.Count > i + 1 then Inc(i); + s := SelectHistory[i]; + end else begin + if i < 0 then Exit else + if i = 0 then begin + s := SavedData; + SavedData := ''; + end else + if SelectHistory.Count > i then s := SelectHistory[i - 1]; + end; + + ComboBox.Entry.Text := s; + ComboBox.Entry.SetFocus; + ComboBox.Entry.SelectAll; + end; + end; + end; +end; + + + +end. + diff --git a/USetPassword.pas b/USetPassword.pas new file mode 100644 index 0000000..b64d079 --- /dev/null +++ b/USetPassword.pas @@ -0,0 +1,105 @@ +(* + Tux Commander - USetPassword - Password prompt dialog + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit USetPassword; + +interface + +uses + glib2, gtk2, pango, SysUtils, Types, Classes, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses; + +type + TFSetPassword = class(TGTKDialog) + Label1, Label2: TGTKLabel; + DialogIcon: TGTKImage; + Entry: TGTKEntry; + Table: TGTKTable; + ShowPasswordCheckButton: TGTKCheckButton; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure ShowPasswordCheckButtonClick(Sender: TObject); + end; + +var + FSetPassword: TFSetPassword; + +implementation + +uses ULocale, UFileAssoc; + + +procedure TFSetPassword.FormCreate(Sender: TObject); +begin + SetDefaultSize(400, -1); + Buttons := [mbOK, mbCancel]; + Caption := LANGFSetPassword_Caption; + + Table := TGTKTable.Create(Self); + DialogIcon := TGTKImage.Create(Self); + DialogIcon.CopyFromPixbuf(StockLock48); + + Label1 := TGTKLabel.Create(Self); + Label1.Caption := Format('%s', [LANGFSetPassword_Label1_Caption]); + Label1.UseMarkup := True; + Label1.XAlign := 0; + Label2 := TGTKLabel.Create(Self); + Label2.Caption := LANGFSetPassword_Label2_Caption; + Label2.LineWrap := True; + Label2.XAlign := 0; + Label2.SetSizeRequest(270, -1); + Entry := TGTKEntry.Create(Self); + Entry.Visibility := False; + ShowPasswordCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGFSetPassword_ShowPasswordCheckButton); + ShowPasswordCheckButton.OnToggled := ShowPasswordCheckButtonClick; + + Table.AddControlEx(0, 0, 2, 1, Label1, [taoExpand, taoFill], [taoShrink], 20, 3); + Table.AddControlEx(0, 1, 1, 1, DialogIcon, [taoShrink], [taoShrink], 10, 5); + Table.AddControlEx(1, 1, 1, 1, Label2, [taoExpand, taoFill], [taoShrink], 5, 0); + Table.AddControlEx(0, 2, 1, 1, TGTKVBox.Create(Self), [taoShrink], [taoShrink, taoExpand, taoFill], 2, 6); + Table.AddControlEx(0, 3, 2, 1, Entry, [taoExpand, taoFill], [taoShrink], 5, 0); + Table.AddControlEx(0, 4, 2, 1, ShowPasswordCheckButton, [taoExpand, taoFill], [taoShrink], 15, 5); + Table.BorderWidth := 10; + ClientArea.AddControlEx(Table, True, True, 0); + OnKeyDown := FormKeyDown; + Entry.SetFocus; +end; + +procedure TFSetPassword.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + GDK_M, GDK_Capital_M: if (Shift = [ssAlt]) then begin + ShowPasswordCheckButton.Checked := not ShowPasswordCheckButton.Checked; + Accept := False; + end; + end; +end; + +procedure TFSetPassword.ShowPasswordCheckButtonClick(Sender: TObject); +begin + Entry.Visibility := ShowPasswordCheckButton.Checked; +end; + + + + +end. + diff --git a/USplitFile.pas b/USplitFile.pas new file mode 100644 index 0000000..ad57017 --- /dev/null +++ b/USplitFile.pas @@ -0,0 +1,115 @@ +(* + Tux Commander - USplitFile - Split File dialog + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit USplitFile; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFSplitFile = class(TGTKDialog) + Label1, Label2: TGTKLabel; + Entry: TGTKEntry; + Box: TGTKVBox; + SizeBox: TGTKHBox; + SizeCombo: TGTKCombo; + DeleteTargetCheckBox: TGTKCheckButton; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + { Private declarations } + public + { Public declarations } + end; + +var + FSplitFile: TFSplitFile; + +type TSplitRecord = record + Title: string; + PartSize: Int64; + end; +const SplitConsts: array[1..8] of TSplitRecord = ( + (Title: '100 MB (ZIP)'; PartSize: 100431872), + (Title: '250 MB (ZIP)'; PartSize: 250331136), + (Title: '1.44 MB (3.5")'; PartSize: 1457664), + (Title: '1.2 MB (5.25")'; PartSize: 1213952), + (Title: '720 kB (3.5")'; PartSize: 730112), + (Title: '360 kB (5.25")'; PartSize: 362496), + (Title: '650 MB (CD-R)'; PartSize: 681574400), + (Title: '700 MB (CD-R)'; PartSize: 734003200)); + +implementation + +uses ULocale; + + +procedure TFSplitFile.FormCreate(Sender: TObject); +var i: integer; +begin + SetDefaultSize(400, -1); + Caption := LANGSplitFile; + Buttons := [mbOK, mbCancel]; + Box := TGTKVBox.Create(Self); + Label1 := TGTKLabel.Create(Self); + Label1.XAlign := 0; + Label1.XPadding := 0; + Entry := TGTKEntry.Create(Self); + Label1.FocusControl := Entry; + Box.AddControlEx(Label1, False, False, 0); + Box.AddControlEx(Entry, False, False, 0); + Box.BorderWidth := 8; + ClientArea.AddControlEx(Box, True, True, 0); + SizeBox := TGTKHBox.Create(Self); + SizeBox.Homogeneous := False; + Label2 := TGTKLabel.Create(Self); + Label2.XAlign := 0; + Label2.XPadding := 10; + Label2.Caption := LANGBytesPerFile; + SizeCombo := TGTKCombo.Create(Self); + Label2.FocusControl := SizeCombo.Entry; + Label2.UseUnderline := True; + SizeCombo.Items.Append(LANGAutomatic); + for i := 1 to Length(SplitConsts) do + SizeCombo.Items.Append(SplitConsts[i].Title); + SizeCombo.Entry.Text := LANGAutomatic; + SizeBox.AddControlEx(Label2, False, False, 0); + SizeBox.AddControlEx(SizeCombo, False, False, 5); + SizeBox.AddControlEx(TGTKLabel.Create(Self), True, True, 0); + Box.AddControlEx(TGTKVBox.Create(Self), False, False, 3); + Box.AddControlEx(SizeBox, False, False, 0); + DeleteTargetCheckBox := TGTKCheckButton.CreateWithLabel(Self, LANGDeleteFilesOnTargetDisk); + Box.AddControlEx(DeleteTargetCheckBox, False, False, 3); + OnKeyDown := FormKeyDown; + Entry.SetFocus; +end; + +procedure TFSplitFile.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + + +end. + diff --git a/USymlink.pas b/USymlink.pas new file mode 100644 index 0000000..704b500 --- /dev/null +++ b/USymlink.pas @@ -0,0 +1,89 @@ +(* + Tux Commander - USymlink - Symbolic link + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit USymlink; + +interface + +uses + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts; + +type + TFSymlink = class(TGTKDialog) + Label1, Label2: TGTKLabel; + FromEntry, ToEntry: TGTKEntry; + Box: TGTKVBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private + { Private declarations } + public + { Public declarations } + end; + +var + FSymlink: TFSymlink; + +implementation + +uses ULocale; + + +procedure TFSymlink.FormCreate(Sender: TObject); +begin + SetDefaultSize(500, -1); + Caption := LANGFSymlink_Caption; + Buttons := [mbOK, mbCancel]; + Box := TGTKVBox.Create(Self); + Label1 := TGTKLabel.Create(Self); + Label1.Caption := LANGFSymlink_ExistingFilename; + Label1.UseUnderline := True; + Label1.XAlign := 0; + Label1.XPadding := 0; + FromEntry := TGTKEntry.Create(Self); + Label1.FocusControl := FromEntry; + Label2 := TGTKLabel.Create(Self); + Label2.Caption := LANGFSymlink_SymlinkFilename; + Label2.UseUnderline := True; + Label2.XAlign := 0; + Label2.XPadding := 0; + ToEntry := TGTKEntry.Create(Self); + Label2.FocusControl := ToEntry; + Box.AddControlEx(Label1, False, False, 2); + Box.AddControlEx(FromEntry, False, False, 0); + Box.AddControlEx(TGTKHSeparator.Create(Self), False, False, 5); + Box.AddControlEx(Label2, False, False, 2); + Box.AddControlEx(ToEntry, False, False, 0); + Box.BorderWidth := 10; + ClientArea.AddControlEx(Box, True, True, 0); + OnKeyDown := FormKeyDown; + ToEntry.SetFocus; +end; + +procedure TFSymlink.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + + +end. + diff --git a/UTestPlugin.pas b/UTestPlugin.pas new file mode 100644 index 0000000..d30301a --- /dev/null +++ b/UTestPlugin.pas @@ -0,0 +1,181 @@ +(* + Tux Commander - UTestPlugin - Plugin testing + Copyright (C) 2004 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTestPlugin; + +interface + +uses + glib2, gdk2, gtk2, pango, SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKStdCtrls, GTKExtCtrls, GTKConsts, GTKView, + GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, GTKMenus, + UCoreClasses; + +type + TFTestPlugin = class(TGTKDialog) + TitleFrame: TGTKFrame; + TitleLabel: TGTKLabel; + TitleEventBox: TGTKEventBox; + TitleIcon: TGTKImage; + TitleHBox: TGTKHBox; + Table: TGTKTable; + Label1, Label2, Label3, Label4: TGTKLabel; + PluginOptionMenu: TGTKOptionMenu; + CommandEntry, UserEntry, PasswordEntry: TGTKEntry; + ExperimentalWarningLabel: TGTKLabel; + ExperimentalWarningIcon: TGTKImage; + AnonymousCheckButton: TGTKCheckButton; + HBox4: TGTKHBox; + procedure FormCreate(Sender: TObject); override; + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure AnonymousCheckButtonToggled(Sender: TObject); + end; + +var + FTestPlugin: TFTestPlugin; + +implementation + +uses UVFSCore, ULocale; + + + +procedure TFTestPlugin.FormCreate(Sender: TObject); +var i: integer; + MenuItem: TGTKMenuItem; +begin + SetDefaultSize(400, 200); + Caption := LANGTestPlugin_Caption; + Buttons := [mbOK, mbCancel]; + DefaultButton := mbOK; + ShowSeparator := False; + TitleEventBox := TGTKEventBox.Create(Self); + TitleLabel := TGTKLabel.Create(Self); + TitleLabel.Caption := Format('%s', [LANGTestPlugin_Title]); + TitleLabel.UseMarkup := True; + TitleLabel.XAlign := 0; + TitleLabel.XPadding := 0; + TitleLabel.YPadding := 3; + TitleEventBox.ControlState := csPrelight; + TitleFrame := TGTKFrame.CreateWithoutLabel(Self); + TitleFrame.ShadowType := stShadowOut; + TitleIcon := TGTKImage.Create(Self); + TitleIcon.SetFromStock('gtk-justify-center', isLargeToolbar); + TitleHBox := TGTKHBox.Create(Self); + TitleHBox.Homogeneous := False; + TitleHBox.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + TitleHBox.AddControlEx(TitleIcon, False, False, 0); + TitleHBox.AddControlEx(TitleLabel, True, True, 10); + TitleEventBox.AddControl(TitleHBox); + TitleFrame.AddControl(TitleEventBox); + ClientArea.AddControlEx(TitleFrame, False, True, 0); + + HBox4 := TGTKHBox.Create(Self); + HBox4.Homogeneous := False; + ExperimentalWarningLabel := TGTKLabel.Create(Self); + ExperimentalWarningLabel.Caption := LANGTestPlugin_ExperimentalWarningLabelCaption; + ExperimentalWarningLabel.UseMarkup := True; + ExperimentalWarningLabel.LineWrap := True; + ExperimentalWarningLabel.SetSizeRequest(300, -1); + ExperimentalWarningIcon := TGTKImage.Create(Self); + ExperimentalWarningIcon.SetFromStock('gtk-dialog-warning', isDialog); + HBox4.AddControlEx(TGTKEventBox.Create(Self), False, False, 5); + HBox4.AddControlEx(ExperimentalWarningIcon, False, False, 7); + HBox4.AddControlEx(ExperimentalWarningLabel, True, True, 7); + HBox4.AddControlEx(TGTKEventBox.Create(Self), False, False, 8); + + Table := TGTKTable.Create(Self); + Table.BorderWidth := 20; + ClientArea.AddControlEx(Table, True, True, 0); + Table.AddControlEx(0, 0, 2, 1, HBox4, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(0, 1, 2, 1, TGTKEventBox.Create(Self), [taoShrink, taoFill], [taoShrink], 5, 10); + Label1 := TGTKLabel.Create(Self); + Label1.XAlign := 0; + Label1.Caption := LANGTestPlugin_Plugin; + Label2 := TGTKLabel.Create(Self); + Label2.XAlign := 0; + Label2.Caption := LANGTestPlugin_Command; + PluginOptionMenu := TGTKOptionMenu.Create(Self); + Label1.FocusControl := PluginOptionMenu; + Label1.UseUnderline := True; + CommandEntry := TGTKEntry.Create(Self); + Label2.FocusControl := CommandEntry; + Label2.UseUnderline := True; + Table.AddControlEx(0, 2, 1, 1, Label1, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(0, 3, 1, 1, Label2, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(1, 2, 1, 1, PluginOptionMenu, [taoExpand, taoFill], [taoShrink], 5, 2); + Table.AddControlEx(1, 3, 1, 1, CommandEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Label3 := TGTKLabel.Create(Self); + Label3.XAlign := 0; + Label3.Caption := LANGTestPlugin_Username; + UserEntry := TGTKEntry.Create(Self); + Label3.FocusControl := UserEntry; + Label3.UseUnderline := True; + Label4 := TGTKLabel.Create(Self); + Label4.XAlign := 0; + Label4.Caption := LANGTestPlugin_Password; + PasswordEntry := TGTKEntry.Create(Self); + Label4.FocusControl := PasswordEntry; + Label4.UseUnderline := True; + AnonymousCheckButton := TGTKCheckButton.CreateWithLabel(Self, LANGTestPlugin_AnonymousCheckButton); + AnonymousCheckButton.OnToggled := AnonymousCheckButtonToggled; + AnonymousCheckButton.Checked := True; + Table.AddControlEx(0, 4, 2, 1, TGTKEventBox.Create(Self), [taoShrink, taoFill], [taoExpand, taoFill], 5, 4); + Table.AddControlEx(0, 5, 1, 1, Label3, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(1, 5, 1, 1, UserEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table.AddControlEx(0, 6, 1, 1, Label4, [taoShrink, taoFill], [taoShrink, taoExpand, taoFill], 5, 2); + Table.AddControlEx(1, 6, 1, 1, PasswordEntry, [taoExpand, taoFill], [taoShrink], 5, 2); + Table.AddControlEx(0, 7, 2, 1, AnonymousCheckButton, [taoExpand, taoFill], [taoShrink], 20, 2); + + + + if PluginList.Count = 0 then begin + MenuItem := TGTKMenuItem.CreateTyped(Self, itLabel); + MenuItem.Caption := LANGTestPlugin_NoPluginsFound; + MenuItem.Enabled := False; + PluginOptionMenu.Items.Add(MenuItem); + end else + for i := 0 to PluginList.Count - 1 do begin + MenuItem := TGTKMenuItem.CreateTyped(Self, itImageText); + MenuItem.SetCaptionPlain(Format('%s [%s]', [TVFSPlugin(PluginList[i]).VFSName, + ANSIToUTF8(ExtractFileName(TVFSPlugin(PluginList[i]).FullPath))])); + PluginOptionMenu.Items.Add(MenuItem); + end; + + OnKeyDown := FormKeyDown; +end; + +procedure TFTestPlugin.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + case Key of + GDK_RETURN, GDK_KP_ENTER: ModalResult := mbOK; + GDK_ESCAPE: ModalResult := mbCancel; + end; +end; + +procedure TFTestPlugin.AnonymousCheckButtonToggled(Sender: TObject); +begin + Label3.Enabled := not AnonymousCheckButton.Checked; + Label4.Enabled := not AnonymousCheckButton.Checked; + UserEntry.Enabled := not AnonymousCheckButton.Checked; + PasswordEntry.Enabled := not AnonymousCheckButton.Checked; +end; + + +end. + diff --git a/UToolTips.pas b/UToolTips.pas new file mode 100644 index 0000000..7a79075 --- /dev/null +++ b/UToolTips.pas @@ -0,0 +1,401 @@ +(* + Tux Commander - UToolTips - ToolTips utils and classes (used as the tree hints) + Copyright (C) 2008 Tomas Bzatek + This unit is based on an idea from Gnome File Manager by Miroslav Bajtos + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UToolTips; + +interface + +uses glib2, gdk2, gtk2, pango; + +procedure FileListTipsInstall(ATreeView: PGtkTreeView); +procedure FileListTipsEnable; +procedure FileListTipsDisable; +procedure FileListTipsHide; + +implementation + +uses SysUtils, DateUtils, Classes, GTKForms, GTKView, GTKControls, UMain, UEngines, UCore, UConfig, + UCoreUtils; + +var tip_window: PGtkWindow; + tip_label: PGtkLabel; + timer_id: gint; + tips_enabled: boolean; + data_row: PGtkTreePath; + data_column: PGtkTreeViewColumn; + data_panel: PGtkTreeView; + tips_timer: PGTimer; + + +function event_handler(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; forward; +function on_leave_notify(widget: PGtkWidget; event: PGdkEventCrossing; user_data: gpointer): gboolean; cdecl; forward; +function show_tip_widget(user_data: gpointer): gboolean; cdecl; forward; +procedure create_widgets; forward; +function tip_event_handler(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; forward; +function tips_button_press_event(widget: PGtkWidget; event: PGdkEventButton; user_data: gpointer):gboolean; cdecl; forward; + + + +procedure FileListTipsInstall(ATreeView: PGtkTreeView); +begin + g_signal_connect_after(ATreeView, 'event-after', G_CALLBACK(@event_handler), nil); + g_signal_connect(ATreeView, 'leave-notify-event', G_CALLBACK(@on_leave_notify), nil); +end; + +procedure file_list_tips_show_tip(AListView: PGtkTreeView; row: PGtkTreePath; column: PGtkTreeViewColumn); +var Timeout: integer; + is_active: gboolean; + ms: gulong; + sec: gdouble; +begin + if not tips_enabled then Exit; + FileListTipsHide; + g_object_get(G_OBJECT(FMain.FWidget), 'is-active', @is_active, nil); + if not is_active then Exit; + if Assigned(data_row) and (data_row <> row) then gtk_tree_path_free(data_row); + data_panel := AListView; + data_row := row; + data_column := column; + Timeout := ConstFileListTipsDelay; + if tips_timer <> nil then begin + sec := g_timer_elapsed(tips_timer, @ms); + if (sec < 1) and (ms < ConstFileListTipsDelayNeighbour * 1000) then Timeout := 1; +// DebugMsg(['Time elapsed = ', Double(sec), ':', integer(ms div 1000)]); + end; + timer_id := gtk_timeout_add(Timeout, show_tip_widget, nil); +end; + + +function event_handler(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; +var view: PGtkTreeView; + column: PGtkTreeViewColumn; + path: PGtkTreePath; +begin + Result := False; + view := GTK_TREE_VIEW(widget); + if event^.any.window <> gtk_tree_view_get_bin_window(view) then Exit; + case event^._type of + GDK_KEY_PRESS, GDK_SCROLL: + begin + FileListTipsHide; + if tips_timer <> nil then begin + g_timer_destroy(tips_timer); + tips_timer := nil; + end; + Result := True; + end; + GDK_FOCUS_CHANGE: begin + Result := True; + if event^.focus_change._in <> 1 then FileListTipsHide; + end; + GDK_MOTION_NOTIFY: begin + Result := True; + if not gtk_tree_view_get_path_at_pos(view, Trunc(event^.motion.x), Trunc(event^.motion.y), path, column, nil, nil) + then begin + FileListTipsHide; + if tips_timer <> nil then begin + g_timer_destroy(tips_timer); + tips_timer := nil; + end; + Exit; + end; + if Assigned(path) and Assigned(column) then file_list_tips_show_tip(view, path, column); + end; + end; +end; + +procedure draw_tip_widget(panel: PGtkTreeView; const text: Pgchar; x, y: integer); +var requisition: TGtkRequisition; + widget: PGtkWidget; + w, scr_w, wx, wy: Integer; + FontDesc: PPangoFontDescription; + hadjustment: PGtkAdjustment; +begin + try + + if not Assigned(tip_window) then create_widgets; + if not ConfUseSystemFont then begin + FontDesc := pango_font_description_from_string(PChar(ConfPanelFont)); + gtk_widget_modify_font(PGtkWidget(tip_label), FontDesc); + end else gtk_widget_modify_font(PGtkWidget(tip_label), nil); + + gtk_label_set_markup(GTK_LABEL(tip_label), Text); + widget := GTK_WIDGET(panel); + hadjustment := gtk_tree_view_get_hadjustment(panel); + x := x - Trunc(gtk_adjustment_get_value(hadjustment)); + + gdk_window_get_origin(widget^.window, @wx, @wy); + x := x + wx; + y := y + wy; + scr_w := gdk_screen_width; + + gtk_label_set_line_wrap(tip_label, False); + gtk_widget_size_request(GTK_WIDGET(tip_window), @requisition); + if x + requisition.width > scr_w {PGtkWidget(panel)^.allocation.width} then begin + gtk_label_set_line_wrap(tip_label, True); + gtk_widget_size_request(GTK_WIDGET(tip_window), @requisition); + end; + + w := requisition.width; + if (x + w) > scr_w then x := scr_w - w + else if x < 0 then x := 0; + gtk_window_move(tip_window, x, y); + except + on E: Exception do DebugMsg(['*** Exception raised in function draw_tip_widget: (', E.ClassName, '): ', E.Message]); + end; +end; + +function gtk_tooltips_paint_window(tip_window: PGtkWidget): gboolean; cdecl; +begin + gtk_paint_flat_box(tip_window^.style, tip_window^.window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + nil, GTK_WIDGET(tip_window), 'tooltip', 0, 0, -1, -1); + Result := False; +end; + + +procedure create_widgets; +begin + if Assigned(tip_window) then Exit; + tip_window := GTK_WINDOW(gtk_window_new(GTK_WINDOW_POPUP)); + gtk_widget_set_app_paintable(GTK_WIDGET(tip_window), True); + gtk_window_set_resizable(tip_window, False); + gtk_widget_set_name(GTK_WIDGET(tip_window), 'gtk-tooltips'); + gtk_container_set_border_width(GTK_CONTAINER(tip_window), 4); + gtk_widget_set_events(GTK_WIDGET(tip_window), GDK_POINTER_MOTION_MASK or GDK_BUTTON_PRESS_MASK or GDK_KEY_PRESS_MASK or GDK_FOCUS_CHANGE_MASK or GDK_SCROLL_MASK); + g_signal_connect(tip_window, 'event', G_CALLBACK(@tip_event_handler), nil); + g_signal_connect_swapped(tip_window, 'expose_event', G_CALLBACK(@gtk_tooltips_paint_window), tip_window); + g_signal_connect_swapped(tip_window, 'button-press-event', G_CALLBACK(@tips_button_press_event), tip_window); + + tip_label := GTK_LABEL(gtk_label_new(nil)); + gtk_misc_set_alignment(GTK_MISC(tip_label), 0, 0.5); + gtk_widget_show(GTK_WIDGET(tip_label)); + + gtk_container_add(GTK_CONTAINER(tip_window), GTK_WIDGET(tip_label)); +end; + +procedure FileListTipsHide; +begin + if not Assigned(tip_window) then Exit; + if Assigned(data_row) then gtk_tree_path_free(data_row); + data_row := nil; + data_column := nil; + + if GTK_WIDGET_VISIBLE(tip_window) then begin + gtk_widget_hide(GTK_WIDGET(tip_window)); + if tips_timer = nil then tips_timer := g_timer_new; + g_timer_start(tips_timer); +// gdk_beep(); +// DebugMsg(['FileListTipsHide, Setting last_hide_time to ', last_hide_time]); + end; + + if timer_id <> 0 then begin + gtk_timeout_remove(timer_id); + timer_id := 0; + end; +end; + +function show_tip_widget(user_data: gpointer): gboolean; cdecl; +var Text: PChar; + Data: PDataItem; + AListView: TGTKListView; + + function ColumnFits(ColNo, ColumnWidth: integer): boolean; + var Layout: PPangoLayout; + FontDesc: PPangoFontDescription; + w, h: Integer; + begin + Text := Data^.ColumnData[FMain.ColumnSortIDs[ColNo + 1] - 1]; + Layout := gtk_widget_create_pango_layout(AListView.FWidget, Text); + if ConfDirsInBold and Data^.IsDir then begin + Text := PChar(Format('%s', [QuoteMarkupStr(Text)])); + pango_layout_set_markup(Layout, Text, Length(Text)); + end; + if not ConfUseSystemFont then begin + FontDesc := pango_font_description_from_string(PChar(ConfPanelFont)); + pango_layout_set_font_description(Layout, FontDesc); + end; + pango_layout_get_pixel_size(Layout, @w, @h); + g_object_unref(Layout); + Result := ColumnWidth > w; + end; + +var Col, ColID: Integer; + Rect: TGdkRectangle; + iter: TGtkTreeIter; + DataList: TList; + TreePath: PGtkTreePath; + IsFNameExtColumn, b: boolean; +begin + Result := False; + try + + if not gtk_tree_model_get_iter(gtk_tree_view_get_model(data_panel), @iter, data_row) then Exit; + if Pointer(data_panel) = Pointer(FMain.LeftListView.FWidget) then begin + DataList := LeftPanelData; + AListView := FMain.LeftListView; + end else begin + DataList := RightPanelData; + AListView := FMain.RightListView; + end; + + if not Application.GTKVersion_2_0_5_Up then gtk_tree_model_get(gtk_tree_view_get_model(data_panel), @iter, 0, @Data, -1) + else begin + TreePath := gtk_tree_path_new_from_string(PChar(IntToStr(gtk_tree_path_get_indices(data_row)^))); + if not Assigned(TreePath) then Exit; + AListView.ConvertPathToChild(TreePath); + if (TreePath = nil) or (gtk_tree_path_get_indices(TreePath)^ > DataList.Count - 1) then begin + FileListTipsHide; + Exit; + end; + Data := DataList[gtk_tree_path_get_indices(TreePath)^]; + gtk_tree_path_free(TreePath); + end; + if (Data = nil) or Data^.UpDir then begin + FileListTipsHide; + Exit; + end; + + Col := gtk_tree_view_column_get_sort_column_id(data_column); + ColID := FMain.ColumnSortIDs[Col + 1]; + IsFNameExtColumn := ((ColID = 1) and (ColID < AListView.Columns.Count - 1) and (FMain.ColumnSortIDs[Col + 2] = 3)) or + ((ColID = 3) and (ColID > 0) and (FMain.ColumnSortIDs[Col] = 1)); + gtk_tree_view_get_cell_area(data_panel, data_row, data_column, @rect); + if (Col = 0) and ConfUseFileTypeIcons then begin + Inc(Rect.x, ConfRowHeightReal + 2); + Dec(Rect.width, ConfRowHeightReal + 2); + end; + + // Determine if the text fits into the cell area + b := ColumnFits(Col, Rect.width - 10); + if IsFNameExtColumn then begin + gtk_tree_view_get_cell_area(data_panel, data_row, gtk_tree_view_get_column(data_panel, Col - Ord(ColID = 3) + Ord(ColID = 1)), @rect); + if ((Col - Ord(ColID = 3) + Ord(ColID = 1)) = 0) and ConfUseFileTypeIcons then begin + Inc(Rect.x, ConfRowHeightReal + 2); + Dec(Rect.width, ConfRowHeightReal + 2); + end; + b := b and ColumnFits(Col - Ord(ColID = 3) + Ord(ColID = 1), Rect.width - 10); + end; + + if b then begin + FileListTipsHide; + Exit; + end; + + if IsFNameExtColumn then begin + Text := PChar(ANSIToUTF8(Data^.AName)); + gtk_tree_view_get_cell_area(data_panel, data_row, gtk_tree_view_get_column(data_panel, Col - Ord(ColID = 3)), @rect); + if ((Col - Ord(ColID = 3)) = 0) and ConfUseFileTypeIcons then begin + Inc(Rect.x, ConfRowHeightReal + 2); + Dec(Rect.width, ConfRowHeightReal + 2); + end; + end else Text := Data^.ColumnData[FMain.ColumnSortIDs[Col + 1] - 1]; + Text := PChar(QuoteMarkupStr(Text)); + + if ConfDirsInBold and Data^.IsDir then Text := PChar(Format('%s', [Text])); + draw_tip_widget(data_panel, Text, Rect.x, Rect.y + Rect.height + 2); +// if Assigned(text) then g_free(text); + if not GTK_WIDGET_VISIBLE(GTK_WIDGET(tip_window)) then gtk_widget_show(GTK_WIDGET(tip_window)); + + except + on E: Exception do DebugMsg(['*** Exception raised in function show_tip_widget(user_data: gpointer): gboolean (', E.ClassName, '): ', E.Message]); + end; +end; + +procedure FileListTipsEnable; +begin + tips_enabled := True and (not ConfDisableFileTips); +end; + +procedure FileListTipsDisable; +begin + tips_enabled := True; + FileListTipsHide; +end; + +procedure file_list_tips_hide_tip; +begin + FileListTipsHide; +end; + +function tip_event_handler(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; +begin + Result := True; + case event^._type of + GDK_KEY_PRESS, {GDK_BUTTON_PRESS, }GDK_SCROLL, GDK_FOCUS_CHANGE{, GDK_MOTION_NOTIFY}: + begin + FileListTipsHide; + if tips_timer <> nil then begin + g_timer_destroy(tips_timer); + tips_timer := nil; + end; + Exit; + end; + end; + Result := False; +end; + +function on_leave_notify(widget: PGtkWidget; event: PGdkEventCrossing; user_data: gpointer): gboolean; cdecl; +begin + if Assigned(tip_window) and (not GTK_WIDGET_VISIBLE(tip_window)) + then begin + FileListTipsHide; + if tips_timer <> nil then begin + g_timer_destroy(tips_timer); + tips_timer := nil; + end; + end; + Result := False; +end; + +function tips_button_press_event(widget: PGtkWidget; event: PGdkEventButton; user_data: gpointer): gboolean; cdecl; +var FSelection: PGtkTreeSelection; +begin + if not Assigned(data_panel) then Exit; + if not Assigned(data_row) then begin + FileListTipsHide; + if tips_timer <> nil then begin + g_timer_destroy(tips_timer); + tips_timer := nil; + end; + Exit; + end; + + FMain.LastClick := Now; + gtk_tree_view_set_cursor(data_panel, data_row, nil, False); + FSelection := gtk_tree_view_get_selection(data_panel); + gtk_tree_selection_select_path(FSelection, data_row); + Result := False; + + FileListTipsHide; + if tips_timer <> nil then begin + g_timer_destroy(tips_timer); + tips_timer := nil; + end; + + gtk_widget_grab_focus(PGtkWidget(data_panel)); +end; + + + +initialization + timer_id := 0; + data_row := nil; + tips_timer := nil; +end. diff --git a/UViewer.pas b/UViewer.pas new file mode 100644 index 0000000..d7d1c4c --- /dev/null +++ b/UViewer.pas @@ -0,0 +1,451 @@ +(* + Tux Commander - UViewer - Internal viewer + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + WARNING: This is highly experimental feature, use with caution! +*) +unit UViewer; + +interface + +uses + glib2, gdk2, gtk2, pango, + SysUtils, Types, Classes, Variants, GTKControls, GTKForms, GTKUtils, GTKDialogs, GTKPixbuf, GTKClasses, GTKExtCtrls, GTKConsts, + GTKText; + +type + TFViewer = class(TGTKForm) +// FDrawingArea: TGTKControl; + TextView: TGTKTextView; + ScrolledWindow: TGTKScrolledWindow; + procedure FormCreate(Sender: TObject); override; + procedure FormDestroy(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +// procedure DrawingAreaKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + procedure TextViewKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); + private +// LineHeight, NumLines: integer; + LineBuffer: TStringList; + protected + AThread: TThread; + public + function LoadFile(FileName: string): boolean; + end; + + TViewerThread = class(TThread) + private +// procedure DoIt; + protected + procedure Execute; override; + public + AViewer: TFViewer; + constructor Create(Parent: TComponent); + destructor Destroy; override; + function LoadFile(FileName: string): boolean; + end; + +var + FViewer: TFViewer; + +implementation + +uses UCoreUtils, UCoreClasses, UConfig, DateUtils, Libc; + + + +// function expose_event_callback(AWidget: PGtkWidget; event: PGdkEventExpose; data: gpointer): gboolean; cdecl; forward; +function scroll_event_callback(widget: PGtkWidget; event: PGdkEventScroll; user_data: gpointer): gboolean; cdecl; forward; + + +procedure TFViewer.FormCreate(Sender: TObject); +begin + SetDefaultSize(700, 500); + Caption := 'TuxView'; + BorderWidth := 5; + AThread := nil; + + ScrolledWindow := TGTKScrolledWindow.Create(Self); + ScrolledWindow.HorizScrollBarPolicy := sbAutomatic; + ScrolledWindow.VertScrollBarPolicy := sbAutomatic; + ScrolledWindow.ShadowType := stShadowIn; + g_signal_connect(G_OBJECT(ScrolledWindow.FWidget), 'scroll-event', G_CALLBACK (@scroll_event_callback), Self); + AddControl(ScrolledWindow); +// ClientArea.AddControl(ScrolledWindow); + +(* + FDrawingArea := TGTKControl.Create(Self); + FDrawingArea.FWidget := gtk_drawing_area_new; + gtk_widget_set_events(FDrawingArea.FWidget, GDK_EXPOSURE_MASK or GDK_BUTTON_PRESS_MASK or GDK_POINTER_MOTION_MASK or GDK_KEY_PRESS_MASK); + gtk_widget_set_size_request(FDrawingArea.FWidget, 10000, 40000); + g_signal_connect(G_OBJECT(FDrawingArea.FWidget), 'expose_event', G_CALLBACK (@expose_event_callback), Self); +// g_signal_connect_after(G_OBJECT(FDrawingArea.FWidget), 'key_press_event', G_CALLBACK (@key_press_event_callback), NULL); + gtk_widget_set(FDrawingArea.FWidget, 'can_focus', TRUE, 0); + gtk_widget_set(FDrawingArea.FWidget, 'can_default', TRUE, 0); + gtk_widget_show(FDrawingArea.FWidget); + FDrawingArea.OnKeyDown := DrawingAreaKeyDown; + + ScrolledWindow.AddWithViewPort(FDrawingArea); + FDrawingArea.SetFocus; +*) + + TextView := TGTKTextView.Create(Self); + TextView.CursorVisible := False; + TextView.ReadOnly := True; + TextView.OnKeyDown := TextViewKeyDown; + + ScrolledWindow.AddControl(TextView); + TextView.SetFocus; + + // ****************** + + OnKeyDown := FormKeyDown; + OnDestroy := FormDestroy; + OnClose := FormClose; +end; + +procedure TFViewer.FormKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +begin + if Key = GDK_ESCAPE then Close; +end; + +procedure TFViewer.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Action := caFree; + SetParent(nil); + if Assigned(FWidget) and GTK_IS_WIDGET(FWidget) then gtk_widget_destroy(PGtkWidget(FWidget)); +// AThread.Terminate; +// ModalResult := mbOK; +end; + +procedure TFViewer.FormDestroy(Sender: TObject); +begin + try + LineBuffer.Free; + except end; +end; + + +procedure smooth_scroll(adj: PGtkAdjustment; dest_value: Double; PageScroll: boolean); +var increment, val: Double; + i, x: integer; + timer: PGTimer; + microseconds: gulong; + dur, st: integer; +begin + if gtk_adjustment_get_value(adj) = dest_value then Exit; + if not ConfUseSmoothScrolling then begin + gtk_adjustment_set_value(adj, dest_value); + Exit; + end; + + if not PageScroll then begin + dur := SMOOTH_SCROLL_DURATION; + st := SMOOTH_SCROLL_STEPS; + end else begin + dur := SMOOTH_SCROLL_DURATION_PAGE; + st := SMOOTH_SCROLL_STEPS_PAGE; + end; + + timer := g_timer_new; + increment := (dest_value - gtk_adjustment_get_value(adj)) / st; + val := gtk_adjustment_get_value(adj); + +// DebugMsg(['Start value ', val]); + i := 1; + x := 0; + g_timer_start(timer); + repeat + g_timer_elapsed(timer, @microseconds); + if (microseconds > i*1000*dur / st) and (i < st) then begin + val := val + increment; + gtk_adjustment_set_value(adj, val); +// DebugMsg(['Setting value to ', val]); + Inc(i); + end; + gdk_window_process_all_updates; + Inc(x); + usleep(100); + until (microseconds div 1000) > dur; + gtk_adjustment_set_value(adj, dest_value); + gdk_window_process_all_updates; +// DebugMsg(['End value ', dest_value]); + g_timer_stop(timer); + +{ g_timer_elapsed(timer, @microseconds); + DebugMsg(['Smooth scroll: required = ', dur, 'ms, elapsed = ', Integer(microseconds div 1000), 'ms, iterations = ', x]); } + g_timer_destroy(timer); +end; + + +procedure TFViewer.TextViewKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var vadj, hadj: PGtkAdjustment; + x: Double; +begin + vadj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(ScrolledWindow.FWidget)); + hadj := gtk_scrolled_window_get_hadjustment(PGtkScrolledWindow(ScrolledWindow.FWidget)); +// debugmsg(['lower = ', adj^.lower, ', upper = ', adj^.upper, ', value = ', x, ', page_size = ', adj^.page_size]); + Accept := False; + + case Key of + GDK_HOME: begin + smooth_scroll(vadj, 0, True); + smooth_scroll(hadj, 0, True); + end; + GDK_END: begin + smooth_scroll(vadj, vadj^.upper - vadj^.page_size, True); + end; + GDK_Page_Down, GDK_SPACE: begin + x := gtk_adjustment_get_value(vadj) + vadj^.page_increment; + if x + vadj^.page_size > vadj^.upper then x := vadj^.upper - vadj^.page_size; + smooth_scroll(vadj, x, True); + end; + GDK_Page_Up: begin + x := gtk_adjustment_get_value(vadj) - vadj^.page_increment; + if x < 0 then x := 0; + smooth_scroll(vadj, x, True); + end; + GDK_Down: begin + x := gtk_adjustment_get_value(vadj) + vadj^.step_increment; + if x + vadj^.page_size > vadj^.upper then x := vadj^.upper - vadj^.page_size; + smooth_scroll(vadj, x, False); + end; + GDK_Up: begin + x := gtk_adjustment_get_value(vadj) - vadj^.step_increment; + if x < 0 then x := 0; + smooth_scroll(vadj, x, False); + end; + GDK_Right: begin + x := gtk_adjustment_get_value(hadj) + hadj^.step_increment; + if x + hadj^.page_size > hadj^.upper then x := hadj^.upper - hadj^.page_size; + smooth_scroll(hadj, x, False); + end; + GDK_Left: begin + x := gtk_adjustment_get_value(hadj) - hadj^.step_increment; + if x < 0 then x := 0; + smooth_scroll(hadj, x, False); + end; + GDK_W, GDK_Capital_W: if TextView.WrapMode = wmWrapNone then TextView.WrapMode := wmWrapWord + else TextView.WrapMode := wmWrapNone; + GDK_C, GDK_Capital_C, GDK_Insert: if (ssCtrl in Shift) then Accept := True; + GDK_S, GDK_Capital_S: gtk_widget_modify_font(TextView.FWidget, pango_font_description_from_string('Monospace')); + GDK_A, GDK_Capital_A: gtk_widget_modify_font(TextView.FWidget, nil); + + end; +end; + +function scroll_event_callback(widget: PGtkWidget; event: PGdkEventScroll; user_data: gpointer): gboolean; cdecl; +var vadj: PGtkAdjustment; + x: Double; +begin + vadj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(TFViewer(user_data).ScrolledWindow.FWidget)); + Result := True; + + case event^.direction of + GDK_SCROLL_UP: begin + x := gtk_adjustment_get_value(vadj) - 1.5*vadj^.step_increment; + if x < 0 then x := 0; + smooth_scroll(vadj, x, False); + end; + GDK_SCROLL_DOWN: begin + x := gtk_adjustment_get_value(vadj) + 1.5*vadj^.step_increment; + if x + vadj^.page_size > vadj^.upper then x := vadj^.upper - vadj^.page_size; + smooth_scroll(vadj, x, False); + end; + end; +end; + + +(* +procedure TFViewer.DrawingAreaKeyDown(Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean); +var adj: PGtkAdjustment; + x: integer; +begin + Accept := True; + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(ScrolledWindow.FWidget)); + case Key of + GDK_ESCAPE: Close; + GDK_Down: begin + x := Trunc(gtk_adjustment_get_value(adj)) + LineHeight; + if x + Trunc(adj^.page_size) > LineHeight * NumLines then x := LineHeight * NumLines - Trunc(adj^.page_size); + gtk_adjustment_set_value(adj, x); + end; + GDK_Up: begin + x := Trunc(gtk_adjustment_get_value(adj)) - LineHeight; + if x < 0 then x := 0; + gtk_adjustment_set_value(adj, x); + end; + GDK_space: begin + x := Trunc(gtk_adjustment_get_value(adj) + adj^.page_increment); + if x + Trunc(adj^.page_size) > LineHeight * NumLines then x := LineHeight * NumLines - Trunc(adj^.page_size); + gtk_adjustment_set_value(adj, x); + end; + end; +{ if event^.keyval = 65364 then begin // Down + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(scrolledWindow)); + x := Trunc(gtk_adjustment_get_value(adj)) + LineHeight; + if x + Trunc(adj^.page_size) > LineHeight * NumLines then x := LineHeight * NumLines - Trunc(adj^.page_size); + gtk_adjustment_set_value(adj, x); + end; + if event^.keyval = 65362 then begin // Up + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(scrolledWindow)); + x := Trunc(gtk_adjustment_get_value(adj)) - LineHeight; + if x < 0 then x := 0; + gtk_adjustment_set_value(adj, x); + end; + if (event^.keyval = 65366) or (event^.keyval = 32) then begin // PageDown, Space + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(scrolledWindow)); + x := Trunc(gtk_adjustment_get_value(adj) + adj^.page_increment); + if x + Trunc(adj^.page_size) > LineHeight * NumLines then x := LineHeight * NumLines - Trunc(adj^.page_size); + gtk_adjustment_set_value(adj, x); + end; + if event^.keyval = 65365 then begin // PageUp + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(scrolledWindow)); + x := Trunc(gtk_adjustment_get_value(adj) - adj^.page_increment); + if x < 0 then x := 0; + gtk_adjustment_set_value(adj, x); + end; + if event^.keyval = 65360 then begin // Home + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(scrolledWindow)); + gtk_adjustment_set_value(adj, 0); + end; + if event^.keyval = 65367 then begin // End + adj := gtk_scrolled_window_get_vadjustment(PGtkScrolledWindow(scrolledWindow)); + gtk_adjustment_set_value(adj, LineHeight * NumLines - adj^.page_size); + end; } +end; +*) + +(********************************************************************************************************************************) +(* +function expose_event_callback(AWidget: PGtkWidget; event: PGdkEventExpose; data: gpointer): gboolean; cdecl; +var Layout: PPangoLayout; + s: string; + i, LineFrom, LineTo: integer; +var Cursor: PGdkCursor; +begin + // Count the visible lines + LineFrom := (event^.area.y div TFViewer(data).LineHeight) - 1; + if LineFrom < 0 then LineFrom := 0; + LineTo := ((event^.area.y + event^.area.height) div TFViewer(data).LineHeight) + 1; +// if LineTo > MaxLineNum then LineTo := MaxLineNum; + +// DebugMsg(['Rendering lines ', LineFrom, ' - ', LineTo, '; expose_area: [', event^.area.x, ', ', event^.area.y, '] - ', event^.area.width, 'x', event^.area.height]); + + + + gdk_draw_rectangle(PGdkDrawable(Awidget^.window), Awidget^.style^.white_gc, Integer(TRUE), + event^.area.x, event^.area.y, event^.area.width, event^.area.height); + + + + Layout := pango_layout_new(gtk_widget_get_pango_context(Awidget)); + for i := LineFrom to LineTo do begin +// s := Format('This is the text on the line %d. Hope the rendering will be fast', [i]); + if i < TFViewer(data).LineBuffer.Count + then s := {ANSIToUTF8(}TFViewer(data).LineBuffer[i] + else s := ''; + pango_layout_set_text(Layout, PChar(s), Length(PChar(s))); + gdk_draw_layout(PGdkDrawable(Awidget^.window), Awidget^.style^.fg_gc[GTK_WIDGET_STATE (Awidget)], 5, i * TFViewer(data).LineHeight, Layout); + end; + g_object_unref(Layout); + + +( * gdk_draw_arc(PGdkDrawable(Awidget^.window), + Awidget^.style^.fg_gc[GTK_WIDGET_STATE (Awidget)], + Integer(TRUE), + 0, 0, 500, 500, {Awidget^.allocation.width, Awidget^.allocation.height,} + 0, 64 * 360); +* ) + + // !!!!!!!!!!!! Toto oddelat (musi se volat asi po Application.ProcessMessages (se mne nechtelo s tim drbat tady)) + cursor := gdk_cursor_new(152); + gdk_window_set_cursor(AWidget^.window, cursor); + gdk_cursor_unref(cursor); + + Result := True; +end; +*) + +function TFViewer.LoadFile(FileName: string): boolean; +var Valid: boolean; + i: integer; +begin + Result := False; + try + LineBuffer := TStringList.Create; + LineBuffer.LoadFromFile(FileName); + + Valid := True; + for i := 0 to LineBuffer.Count - 1 do begin + Valid := Valid and g_utf8_validate(PChar(LineBuffer[i]), -1, nil); + if not Valid then Break; + end; + + if Valid then TextView.Lines.SetText(LineBuffer.Text) + else + for i := 0 to LineBuffer.Count - 1 do + TextView.Lines.InsertText(AnsiToUtf8(LineBuffer[i]) + #10); + + +{ LineHeight := 16; + NumLines := LineBuffer.Count; } + Caption := Format('TuxView [%s]', [ANSIToUTF8(FileName)]); +// FDrawingArea.SetSizeRequest(-1, NumLines * LineHeight); + Result := True; + except + Exit; + end; +end; + +(********************************************************************************************************************************) +procedure TViewerThread.Execute; +begin + gdk_threads_enter; +// DoIt; + AViewer.Show; +// AViewer.Run; + gdk_threads_leave; +end; + +constructor TViewerThread.Create(Parent: TComponent); +begin + AViewer := TFViewer.Create(Parent); + AViewer.AThread := Self; + FreeOnTerminate := True; + inherited Create(True); +end; + +destructor TViewerThread.Destroy; +begin +{ AViewer.Free; + inherited Destroy; } +end; + +function TViewerThread.LoadFile(FileName: string): boolean; +begin + Result := AViewer.LoadFile(FileName); +end; + +{procedure TViewerThread.DoIt; +begin + Application.MessageBox('ddd') +end; } + + +end. diff --git a/libgtk_kylix/GTKClasses.pas b/libgtk_kylix/GTKClasses.pas new file mode 100644 index 0000000..af61b66 --- /dev/null +++ b/libgtk_kylix/GTKClasses.pas @@ -0,0 +1,174 @@ +(* + GTK-Kylix Library: GTKClasses - Non-visual objects + Version 0.6.4 (last updated 2003-04-03) + Copyright (C) 2003 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKClasses; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, SysUtils; + + +type + TGDKColor = record + pixel: Cardinal; + red, green, blue: Word; + end; + +(****************************************** TGLIST ******************************************************************************) + TGList = class(TComponent) + private + FNotify: TNotifyEvent; + public + FList: PGList; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Append(Data: Pointer); overload; + procedure Append(Data: string); overload; + procedure Delete(Index: integer); + function Count: integer; + published + property Notify: TNotifyEvent read FNotify write FNotify; + end; + +(****************************************** TGTKTIMER ***************************************************************************) + TGTKTimer = class(TComponent) + private + FOnTimer: TNotifyEvent; + FHandlerID: guint; + FEnabled: boolean; + FInterval: Cardinal; + procedure SetEnabled(Value: boolean); + procedure SetInterval(Value: Cardinal); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Start; + procedure Stop; + published + property OnTimer: TNotifyEvent read FOnTimer write FOnTimer; + property Enabled: boolean read FEnabled write SetEnabled default False; + property Interval: Cardinal read FInterval write SetInterval; + end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses GTKUtils; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGList.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FList := nil; + FNotify := nil; +end; + +destructor TGList.Destroy; +begin + g_list_free(FList); + inherited Destroy; +end; + +procedure TGList.Append(Data: Pointer); +begin + FList := g_list_append(FList, Data); + if Assigned(FNotify) then FNotify(Self); +end; + +procedure TGList.Append(Data: string); +begin + Append(Pointer(StringToPgchar(Data))); +end; + +procedure TGList.Delete(Index: integer); +var El: PGSList; +begin + El := g_list_nth_data(FList, Index); + if El <> nil then FList := g_list_remove(FList, El); +end; + +function TGList.Count: integer; +begin + Result := 0; + if FList <> nil then Result := g_list_length(FList); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTimer.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOnTimer := nil; + FEnabled := False; + FInterval := 0; + FHandlerID := 0; +end; + +destructor TGTKTimer.Destroy; +begin + SetEnableD(False); + inherited Destroy; +end; + +procedure TGTKTimer.SetEnabled(Value: boolean); +begin + if Value <> FEnabled then begin + FEnabled := Value; + if Value then Start + else Stop; + end; +end; + +procedure TGTKTimer.SetInterval(Value: Cardinal); +begin + if FInterval <> Value then begin + FInterval := Value; + Stop; + Start; + end; +end; + +function TGTKTimer_Timeout(data: gpointer): gboolean; cdecl; +begin + if Assigned(TGTKTimer(data).FOnTimer) then TGTKTimer(data).FOnTimer(TGTKTimer(data)); + Result := True; +end; + +procedure TGTKTimer.Start; +begin + if FHandlerID > 0 then Stop; + if FEnabled then FHandlerID := gtk_timeout_add(FInterval, TGTKTimer_Timeout, Self); +end; + +procedure TGTKTimer.Stop; +begin + if FHandlerID > 0 then gtk_timeout_remove(FHandlerID); + FHandlerID := 0; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + +end. diff --git a/libgtk_kylix/GTKConsts.pas b/libgtk_kylix/GTKConsts.pas new file mode 100644 index 0000000..b839b23 --- /dev/null +++ b/libgtk_kylix/GTKConsts.pas @@ -0,0 +1,259 @@ +(* + GTK-Kylix Library: GTKConsts - Various constants, mainly key codes + Version 0.5.20 (last updated 2003-01-25) + Copyright (C) 2003 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKConsts; +{ $WEAKPACKAGEUNIT} + +interface + +uses glib2, gdk2, gtk2; + +const // copied from gdkkeysyms + GDK_BackSpace = $FF08; + GDK_Tab = $FF09; + GDK_Linefeed = $FF0A; + GDK_Clear_Key = $FF0B; + GDK_Return = $FF0D; + GDK_Pause = $FF13; + GDK_Scroll_Lock = $FF14; + GDK_Sys_Req = $FF15; + GDK_Escape = $FF1B; + GDK_Delete_Key = $FFFF; + GDK_Home = $FF50; + GDK_Left = $FF51; + GDK_Up = $FF52; + GDK_Right = $FF53; + GDK_Down = $FF54; + GDK_Prior = $FF55; + GDK_Page_Up = $FF55; + GDK_Next = $FF56; + GDK_Page_Down = $FF56; + GDK_End = $FF57; + GDK_Insert = $FF63; + GDK_Num_Lock = $FF7F; + GDK_KP_Space = $FF80; + GDK_KP_Tab = $FF89; + GDK_KP_Enter = $FF8D; + GDK_KP_F1 = $FF91; + GDK_KP_F2 = $FF92; + GDK_KP_F3 = $FF93; + GDK_KP_F4 = $FF94; + GDK_KP_Home = $FF95; + GDK_KP_Left = $FF96; + GDK_KP_Up = $FF97; + GDK_KP_Right = $FF98; + GDK_KP_Down = $FF99; + GDK_KP_Prior = $FF9A; + GDK_KP_Page_Up = $FF9A; + GDK_KP_Next = $FF9B; + GDK_KP_Page_Down = $FF9B; + GDK_KP_End = $FF9C; + GDK_KP_PLUS = 65451; + GDK_KP_MINUS = 65453; + GDK_KP_ASTERISK = 65450; + GDK_KP_SLASH = 65455; + GDK_KP_0 = $FFB0; + GDK_KP_1 = $FFB1; + GDK_KP_2 = $FFB2; + GDK_KP_3 = $FFB3; + GDK_KP_4 = $FFB4; + GDK_KP_5 = $FFB5; + GDK_KP_6 = $FFB6; + GDK_KP_7 = $FFB7; + GDK_KP_8 = $FFB8; + GDK_KP_9 = $FFB9; + GDK_F1 = $FFBE; + GDK_F2 = $FFBF; + GDK_F3 = $FFC0; + GDK_F4 = $FFC1; + GDK_F5 = $FFC2; + GDK_F6 = $FFC3; + GDK_F7 = $FFC4; + GDK_F8 = $FFC5; + GDK_F9 = $FFC6; + GDK_F10 = $FFC7; + GDK_F11 = $FFC8; + GDK_L1 = $FFC8; + GDK_F12 = $FFC9; + GDK_L2 = $FFC9; + GDK_F13 = $FFCA; + GDK_L3 = $FFCA; + GDK_F14 = $FFCB; + GDK_L4 = $FFCB; + GDK_F15 = $FFCC; + GDK_L5 = $FFCC; + GDK_F16 = $FFCD; + GDK_L6 = $FFCD; + GDK_F17 = $FFCE; + GDK_L7 = $FFCE; + GDK_F18 = $FFCF; + GDK_L8 = $FFCF; + GDK_F19 = $FFD0; + GDK_L9 = $FFD0; + GDK_F20 = $FFD1; + GDK_L10 = $FFD1; + GDK_F21 = $FFD2; + GDK_R1 = $FFD2; + GDK_F22 = $FFD3; + GDK_R2 = $FFD3; + GDK_F23 = $FFD4; + GDK_R3 = $FFD4; + GDK_F24 = $FFD5; + GDK_R4 = $FFD5; + GDK_F25 = $FFD6; + GDK_R5 = $FFD6; + GDK_F26 = $FFD7; + GDK_R6 = $FFD7; + GDK_F27 = $FFD8; + GDK_R7 = $FFD8; + GDK_F28 = $FFD9; + GDK_R8 = $FFD9; + GDK_F29 = $FFDA; + GDK_R9 = $FFDA; + GDK_F30 = $FFDB; + GDK_R10 = $FFDB; + GDK_F31 = $FFDC; + GDK_R11 = $FFDC; + GDK_F32 = $FFDD; + GDK_R12 = $FFDD; + GDK_F33 = $FFDE; + GDK_R13 = $FFDE; + GDK_F34 = $FFDF; + GDK_R14 = $FFDF; + GDK_F35 = $FFE0; + GDK_R15 = $FFE0; + GDK_space = $020; + GDK_exclam = $021; + GDK_quotedbl = $022; + GDK_numbersign = $023; + GDK_dollar = $024; + GDK_percent = $025; + GDK_ampersand = $026; + GDK_apostrophe = $027; + GDK_quoteright = $027; + GDK_parenleft = $028; + GDK_parenright = $029; + GDK_asterisk = $02a; + GDK_plus_key = $02b; + GDK_comma = $02c; + GDK_minus = $02d; + GDK_period = $02e; + GDK_slash = $02f; + GDK_0 = $030; + GDK_1 = $031; + GDK_2 = $032; + GDK_3 = $033; + GDK_4 = $034; + GDK_5 = $035; + GDK_6 = $036; + GDK_7 = $037; + GDK_8 = $038; + GDK_9 = $039; + GDK_colon = $03a; + GDK_semicolon = $03b; + GDK_less = $03c; + GDK_equal = $03d; + GDK_greater = $03e; + GDK_question = $03f; + GDK_at = $040; + GDK_Capital_A = $041; + GDK_Capital_B = $042; + GDK_Capital_C = $043; + GDK_Capital_D = $044; + GDK_Capital_E = $045; + GDK_Capital_F = $046; + GDK_Capital_G = $047; + GDK_Capital_H = $048; + GDK_Capital_I = $049; + GDK_Capital_J = $04a; + GDK_Capital_K = $04b; + GDK_Capital_L = $04c; + GDK_Capital_M = $04d; + GDK_Capital_N = $04e; + GDK_Capital_O = $04f; + GDK_Capital_P = $050; + GDK_Capital_Q = $051; + GDK_Capital_R = $052; + GDK_Capital_S = $053; + GDK_Capital_T = $054; + GDK_Capital_U = $055; + GDK_Capital_V = $056; + GDK_Capital_W = $057; + GDK_Capital_X = $058; + GDK_Capital_Y = $059; + GDK_Capital_Z = $05a; + GDK_bracketleft = $05b; + GDK_backslash = $05c; + GDK_bracketright = $05d; + GDK_quoteleft = $060; + GDK_a = $061; + GDK_b = $062; + GDK_c = $063; + GDK_d = $064; + GDK_e = $065; + GDK_f = $066; + GDK_g = $067; + GDK_h = $068; + GDK_i = $069; + GDK_j = $06a; + GDK_k = $06b; + GDK_l = $06c; + GDK_m = $06d; + GDK_n = $06e; + GDK_o = $06f; + GDK_p = $070; + GDK_q = $071; + GDK_r = $072; + GDK_s = $073; + GDK_t = $074; + GDK_u = $075; + GDK_v = $076; + GDK_w = $077; + GDK_x = $078; + GDK_y = $079; + GDK_z = $07a; + GDK_aacute = $0e1; + GDK_leftarrow = $8fb; + GDK_uparrow = $8fc; + GDK_rightarrow = $8fd; + GDK_downarrow = $8fe; + GDK_WIN_POPUP = $FF67; + + NumMessageButtons = 12; + MessageButtonID : array[1..NumMessageButtons] of Pgchar = + (GTK_STOCK_YES, GTK_STOCK_NO, GTK_STOCK_OK, GTK_STOCK_CANCEL, GTK_STOCK_APPLY, GTK_STOCK_CLOSE, GTK_STOCK_HELP, + GTK_STOCK_PRINT, GTK_STOCK_QUIT, GTK_STOCK_STOP, GTK_STOCK_GO_BACK, GTK_STOCK_GO_FORWARD); + +resourcestring + SCDefaultMenuItemCaption = 'MenuItem'; + SCDefaultButtonCaption = 'Button'; + SCDefaultLabelCaption = 'Label'; + SCDefaultToggleButtonCaption = 'ToggleButton'; + SCDefaultCheckButtonCaption = 'CheckButton'; + SCDefaultRadioButtonCaption = 'RadioButton'; + SCDefaultFrameCaption = 'Frame'; + + +implementation + + +end. diff --git a/libgtk_kylix/GTKControls.pas b/libgtk_kylix/GTKControls.pas new file mode 100644 index 0000000..8004857 --- /dev/null +++ b/libgtk_kylix/GTKControls.pas @@ -0,0 +1,1050 @@ +(* + GTK-Kylix Library: GTKControls - Basic objects + Version 0.6.22 (last updated 2007-12-19) + Copyright (C) 2007 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKControls; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes; + // Quick jump: QForms QControls + +const + + { TModalResult values } + mrNone = 0; + mrOk = mrNone + 1; + mrCancel = mrOk + 1; + mrYes = mrCancel + 1; + mrNo = mrYes + 1; + mrAbort = mrNo + 1; + mrRetry = mrAbort + 1; + mrIgnore = mrRetry + 1; + mrAll = mrIgnore + 1; + mrNoToAll = mrAll + 1; + mrYesToAll = mrNoToAll + 1; + +type +{$IFNDEF CPU64} // 32-bit platform + TComponent64 = class(TComponent); +{$ELSE} // 64-bit platform + TComponent64 = class(TComponent) + private + FTag: QWORD; + published + property Tag: QWORD read FTag write FTag default 0; + end; +{$ENDIF} + + + +type + TGTKShadowType = (stNone, stShadowIn, stShadowOut, stEtchedIn, stEtchedOut); + TGTKPosition = (poLeft, poRight, poTop, poBottom); + +(****************************************** TGTKCONTROL *************************************************************************) + TGDKMouseButton = (mbLeft, mbMiddle, mbRight); + TGDKKeyEvent = procedure (Sender: TObject; Key: Word; Shift: TShiftState; var Accept: boolean) of object; + TGDKMouseEvent = procedure (Sender: TObject; Button: TGDKMouseButton; Shift: TShiftState; X, Y: Integer; var Accept: boolean) of object; + TGDKFocusEvent = procedure (Sender: TObject; var Accept: boolean) of object; + TGDKExposeEvent = procedure (Sender: TObject; const Rect: PGdkRectangle; var Accept: boolean) of object; + TGTKControlState = (csNormal, csActive, csPrelight, csSelected, csInsensitive); + TGTKControl = class(TComponent64) + private + FVisible: Boolean; + FParent: TGTKControl; + FPopupMenu: TGTKControl; + FButtonPressSignalHandler, FButtonReleaseSignalHandler, FKeyDownSignalHandler, FKeyUpSignalHandler, + FFocusInSignalHandler, FFocusOutSignalHandler, FExposeSignalHandler: gulong; + FOnKeyDown: TGDKKeyEvent; + FOnKeyUp: TGDKKeyEvent; + FOnEnter: TGDKFocusEvent; + FOnExit: TGDKFocusEvent; + FOnMouseDown: TGDKMouseEvent; + FOnMouseUp: TGDKMouseEvent; + FOnDblClick: TGDKMouseEvent; + FOnExpose: TGDKExposeEvent; + function GetWidth: Integer; + function GetHeight: Integer; + function GetLeft: Integer; + function GetTop: Integer; + function GetEnabled: boolean; + function GetTooltip: string; + function GetCanFocus: boolean; + function GetFocused: boolean; + function GetDefault: boolean; + function GetControlState: TGTKControlState; + procedure SetHeight(const Value: Integer); + procedure SetVisible(const Value: Boolean); + procedure SetWidth(const Value: Integer); + procedure SetEnabled(const Value: boolean); + procedure SetPopupMenu(Value: TGTKControl); + procedure SetTooltip(Value: string); + procedure SetFocused(Value: boolean); + procedure SetOnKeyDown(Value: TGDKKeyEvent); + procedure SetOnKeyUp(Value: TGDKKeyEvent); + procedure SetOnEnter(Value: TGDKFocusEvent); + procedure SetOnExit(Value: TGDKFocusEvent); + procedure SetOnMouseDown(Value: TGDKMouseEvent); + procedure SetOnMouseUp(Value: TGDKMouseEvent); + procedure SetDefault(Value: boolean); + procedure SetOnDblClick(Value: TGDKMouseEvent); + procedure SetCanFocus(Value: boolean); + procedure SetOnExpose(Value: TGDKExposeEvent); + procedure SetControlState(Value: TGTKControlState); + protected + procedure SetParent(const Value: TGTKControl); virtual; + public + FWidget: PGtkWidget; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Hide; + procedure HideAll; + procedure Show; + procedure ShowAll; + procedure SetSizeRequest(const Width, Height: Integer); + property Parent: TGTKControl read FParent write SetParent; + property Visible: Boolean read FVisible write SetVisible default True; + property Enabled: Boolean read GetEnabled write SetEnabled default True; + property PopupMenu: TGTKControl read FPopupMenu write SetPopupMenu; + procedure SetFocus; + procedure SetForegroundColor(Red, Green, Blue: word); overload; + procedure SetForegroundColor(State: integer; Red, Green, Blue: word); overload; + procedure SetForegroundColor(State: integer; Color: PGdkColor); overload; + procedure SetForegroundColor(Color: PGdkColor); overload; + procedure SetBackgroundColor(Red, Green, Blue: word); overload; + procedure SetBackgroundColor(State: integer; Red, Green, Blue: word); overload; + procedure SetBackgroundColor(State: integer; Color: PGdkColor); overload; + procedure SetBackgroundColor(Color: PGdkColor); overload; + procedure SetTextColor(Red, Green, Blue: word); overload; + procedure SetTextColor(State: integer; Red, Green, Blue: word); overload; + procedure SetBaseColor(Red, Green, Blue: word); overload; + procedure SetBaseColor(State: integer; Red, Green, Blue: word); overload; + procedure Invalidate; + procedure SetAlignment(XAlign, YAlign: Double); + procedure SetPadding(XPad, YPad: integer); + function GetData(Key: string): Pointer; + procedure SetData(Key: string; Value: Pointer); + published + property Width: Integer read GetWidth write SetWidth; + property Height: Integer read GetHeight write SetHeight; + property Left: Integer read GetLeft; + property Top: Integer read GetTop; + property Tooltip: string read GetTooltip write SetTooltip; + property CanFocus: boolean read GetCanFocus write SetCanFocus; + property Focused: boolean read GetFocused write SetFocused; + property Default: boolean read GetDefault write SetDefault; + property OnKeyDown: TGDKKeyEvent read FOnKeyDown write SetOnKeyDown; + property OnKeyUp: TGDKKeyEvent read FOnKeyUp write SetOnKeyUp; + property OnEnter: TGDKFocusEvent read FOnEnter write SetOnEnter; + property OnExit: TGDKFocusEvent read FOnExit write SetOnExit; + property OnMouseDown: TGDKMouseEvent read FOnMouseDown write SetOnMouseDown; + property OnMouseUp: TGDKMouseEvent read FOnMouseUp write SetOnMouseUp; + property OnDblClick: TGDKMouseEvent read FOnDblClick write SetOnDblClick; + property OnExpose: TGDKExposeEvent read FOnExpose write SetOnExpose; + property ComponentState; + property ControlState: TGTKControlState read GetControlState write SetControlState; + end; + +(****************************************** TGTKCONTAINER ***********************************************************************) + TGTKContainer = class(TGTKControl) + private + function GetBorderWidth: integer; + procedure SetBorderWidth(Value: integer); + function GetChildrenCount: integer; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure AddControl(AControl: TGTKControl); + procedure RemoveControl(AControl: TGTKControl); + published + property BorderWidth: integer read GetBorderWidth write SetBorderWidth; + property ChildrenCount: integer read GetChildrenCount; + end; + +(****************************************** TGTKBIN *****************************************************************************) + TGTKBin = class(TGTKContainer) + private + function GetChildControl: PGtkWidget; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property ChildControl: PGtkWidget read GetChildControl; + end; + +(****************************************** TGTKBOX *****************************************************************************) + TGTKBox = class(TGTKContainer) + private + FLinked: boolean; + function GetHomogeneous: boolean; + function GetSpacing: integer; + procedure SetHomogeneous(Value: boolean); + procedure SetSpacing(Value: integer); + public + constructor Create(AOwner: TComponent); override; + constructor CreateLinked(AOwner: TComponent; Widget: PGtkWidget); + destructor Destroy; override; + procedure AddControl(Control: TGTKControl); + procedure AddControlEnd(Control: TGTKControl); + procedure AddControlEx(Control: TGTKControl; Expand, Fill: boolean; Padding: integer); + procedure AddControlEndEx(Control: TGTKControl; Expand, Fill: boolean; Padding: integer); + published + property Homogeneous: boolean read GetHomogeneous write SetHomogeneous; + property Spacing: integer read GetSpacing write SetSpacing; + end; + +(****************************************** TGTKHBOX ****************************************************************************) + TGTKHBox = class(TGTKBox) + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +(****************************************** TGTKVBOX ****************************************************************************) + TGTKVBox = class(TGTKBox) + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +(****************************************** TGTKEVENTBOX ************************************************************************) + TGTKEventBox = class(TGTKBin) + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +(****************************************** TGTKTOOLTIPS ************************************************************************) + TGTKTooltips = class(TComponent) + private + function GetEnabled: boolean; + procedure SetEnabled(Value: boolean); + public + FObject: PGtkTooltips; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Enabled: boolean read GetEnabled write SetEnabled; + end; + +(****************************************** TGTKTABLE ***************************************************************************) + TGTKTableAttachOptions = set of (taoExpand, taoShrink, taoFill); + TGTKTable = class(TGTKContainer) + private + function GetRowCount: integer; + procedure SetRowCount(Value: integer); + function GetColCount: integer; + procedure SetColCount(Value: integer); + function GetRowSpacing: integer; + procedure SetRowSpacing(Value: integer); + function GetColSpacing: integer; + procedure SetColSpacing(Value: integer); + function GetHomogeneous: boolean; + procedure SetHomogeneous(Value: boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure SetRowColCount(Rows, Cols: integer); + procedure AddControl(Column, Row, NumCols, NumRows: integer; Control: TGTKControl; XPadding, YPadding: integer); + procedure AddControlEx(Column, Row, NumCols, NumRows: integer; Control: TGTKControl; XAttachOptions, + YAttachOptions: TGTKTableAttachOptions; XPadding, YPadding: integer); + published + property RowCount: integer read GetRowCount write SetRowCount; + property ColCount: integer read GetColCount write SetColCount; + property RowSpacing: integer read GetRowSpacing write SetRowSpacing; + property ColSpacing: integer read GetColSpacing write SetColSpacing; + property Homogeneous: boolean read GetHomogeneous write SetHomogeneous; + end; + + +procedure Beep; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses GTKMenus, GTKForms, GTKUtils; + +procedure Beep; +begin + gdk_beep; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKControl.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if AOwner is TGTKControl then FParent := AOwner as TGTKControl; + FButtonPressSignalHandler := 0; + FButtonReleaseSignalHandler := 0; + FKeyDownSignalHandler := 0; + FKeyUpSignalHandler := 0; + FFocusInSignalHandler := 0; + FFocusOutSignalHandler := 0; + FExposeSignalHandler := 0; + FVisible := True; + FWidget := nil; + FPopupMenu := nil; + FOnKeyDown := nil; + FOnKeyUp := nil; + FOnEnter := nil; + FOnExit := nil; + FOnExpose := nil; +end; + +destructor TGTKControl.Destroy; +begin + try +// SetParent(nil); +// if Assigned(FWidget) {and GTK_IS_WIDGET(FWidget)} then gtk_widget_destroy(PGtkWidget(FWidget)); + except end; + inherited Destroy; +end; + +procedure TGTKControl.Hide; +begin + FVisible := False; + gtk_widget_hide(FWidget); +end; + +procedure TGTKControl.HideAll; +begin + if Parent <> nil then Parent.HideAll; + FVisible := False; + gtk_widget_hide_all(FWidget); +end; + +procedure TGTKControl.Show; +begin + FVisible := True; + gtk_widget_show(FWidget); +end; + +procedure TGTKControl.ShowAll; +begin + if Parent <> nil then Parent.ShowAll; + FVisible := True; + gtk_widget_show_all(FWidget); +end; + +procedure TGTKControl.SetParent(const Value: TGTKControl); +begin + if (csDestroying in ComponentState) then Exit; + if FParent <> Value then begin + if Value = Self then + raise EInvalidOperation.Create('Invalid Operation'); + FParent := Value; + try + if Assigned(FWidget) and GTK_IS_WIDGET(FWidget) then + if Assigned(Value) + then gtk_widget_set_parent(FWidget, Value.FWidget) + else gtk_widget_unparent(FWidget); + except end; + end; +end; + +procedure TGTKControl.SetVisible(const Value: Boolean); +begin + if Value then Show + else Hide; +end; + +function TGTKControl.GetWidth: Integer; +begin + Result := FWidget^.allocation.width; +end; + +function TGTKControl.GetHeight: Integer; +begin + Result := FWidget^.allocation.height; +end; + +procedure TGTKControl.SetWidth(const Value: Integer); +begin + SetSizeRequest(Value, GetHeight); +end; + +procedure TGTKControl.SetHeight(const Value: Integer); +begin + SetSizeRequest(GetWidth, Value); +end; + +procedure TGTKControl.SetSizeRequest(const Width, Height: Integer); +begin + gtk_widget_set_size_request(FWidget, Width, Height); +end; + +function TGTKControl.GetLeft: Integer; +begin + Result := FWidget^.allocation.x; +end; + +function TGTKControl.GetTop: Integer; +begin + Result := FWidget^.allocation.y; +end; + +function TGTKControl.GetEnabled: boolean; +begin + Result := False; + if (csDestroying in ComponentState) then Exit; + Result := GTK_WIDGET_SENSITIVE(FWidget); +end; + +procedure TGTKControl.SetEnabled(const Value: boolean); +begin + gtk_widget_set_sensitive(FWidget, Value); +end; + +function TGTKControl_button_press_event(widget: PGtkWidget; event: PGdkEventButton; user_data: gpointer):gboolean; cdecl; +var Shift: TShiftState; + Accept: boolean; +begin + Shift := []; + if event^.state and GDK_SHIFT_MASK = GDK_SHIFT_MASK then Include(Shift, ssShift); + if event^.state and GDK_CONTROL_MASK = GDK_CONTROL_MASK then Include(Shift, ssCtrl); + if event^.state and GDK_MOD1_MASK = GDK_MOD1_MASK then Include(Shift, ssAlt); + Accept := True; + if Assigned(TGTKControl(widget).FOnMouseDown) and (event^._type = GDK_BUTTON_PRESS) + then TGTKControl(widget).FOnMouseDown(TGTKControl(widget), TGDKMouseButton(event^.button - 1), Shift, Trunc(event^.x), Trunc(event^.y), Accept); + if Assigned(TGTKControl(widget).FOnDblClick) and (event^._type = GDK_2BUTTON_PRESS) + then TGTKControl(widget).FOnDblClick(TGTKControl(widget), TGDKMouseButton(event^.button - 1), Shift, Trunc(event^.x), Trunc(event^.y), Accept); + Result := not Accept; + if Accept then + if (Event^.button = 3) and Assigned(TGTKControl(widget).FPopupMenu) then begin +// if Assigned(TGTKMenuItem(TGTKControl(widget).FPopupMenu).OnPopup) then TGTKMenuItem(TGTKControl(widget).FPopupMenu).OnPopup(TGTKMenuItem(TGTKControl(widget).FPopupMenu)); + if Assigned(TGTKMenuItem(TGTKControl(widget).FPopupMenu).OnPopup) then TGTKMenuItem(TGTKControl(widget).FPopupMenu).OnPopup(TGTKControl(widget)); + gtk_menu_popup(PGtkMenu(TGTKMenuItem(TGTKControl(widget).FPopupMenu).FMenu), nil, nil, nil, nil, event^.button, event^.time); + Result := True; + end; +end; + +procedure TGTKControl.SetPopupMenu(Value: TGTKControl); +begin + if FPopupMenu <> Value then begin + FPopupMenu := Value; + if not Assigned(Value) then begin + if not Assigned(FOnMouseDown) then begin + g_signal_handler_disconnect(PGtkObject(FWidget), FButtonPressSignalHandler); + FButtonPressSignalHandler := 0; + end; + end else + if FButtonPressSignalHandler = 0 + then FButtonPressSignalHandler := g_signal_connect_swapped(PGtkObject(FWidget), 'button-press-event', G_CALLBACK(@TGTKControl_button_press_event), Self) + end; +end; + +function TGTKControl.GetTooltip: string; +var TooltipsData : PGtkTooltipsData; +begin + Result := ''; + TooltipsData := gtk_tooltips_data_get(FWidget); + if Assigned(TooltipsData) then Result := PgcharToString(TooltipsData^.tip_text); +end; + +procedure TGTKControl.SetTooltip(Value: string); +var FParentForm : TCustomGTKForm; +begin + FParentForm := GetParentForm(Self); + if FParentForm <> nil then gtk_tooltips_set_tip(FParentForm.Tooltips.FObject, FWidget, StringToPgchar(Value), nil); +end; + +procedure TGTKControl.SetFocus; +begin + if (csDestroying in ComponentState) then Exit; + gtk_widget_grab_focus(FWidget); +end; + +function TGTKControl.GetCanFocus: boolean; +begin + Result := False; + if (csDestroying in ComponentState) then Exit; + Result := GTK_WIDGET_CAN_FOCUS(FWidget); +end; + +procedure TGTKControl.SetCanFocus(Value: boolean); +begin +{ if Value then FWidget^.private_flags := FWidget^.private_flags or GTK_CAN_FOCUS + else FWidget^.private_flags := FWidget^.private_flags and (not GTK_CAN_FOCUS); } + g_object_set(G_OBJECT(FWidget), 'can-focus', Ord(Value), nil); +end; + +function TGTKControl.GetFocused: boolean; +begin + Result := False; + try + if (csDestroying in ComponentState) or (FWidget = nil) then Exit; + Result := GTK_WIDGET_HAS_FOCUS(FWidget); + except end; +end; + +procedure TGTKControl.SetFocused(Value: boolean); +begin + SetFocus; +end; + +function TGTKControl_key_event(event: PGdkEventKey; user_data : gpointer; KeyDown : boolean): gboolean; +var Shift: TShiftState; + Accept: boolean; +begin + Accept := True; + Shift := []; + if event^.state and GDK_SHIFT_MASK = GDK_SHIFT_MASK then Include(Shift, ssShift); + if event^.state and GDK_CONTROL_MASK = GDK_CONTROL_MASK then Include(Shift, ssCtrl); + if event^.state and GDK_MOD1_MASK = GDK_MOD1_MASK then Include(Shift, ssAlt); + if KeyDown then begin + if Assigned(TGTKControl(user_data).FOnKeyDown) then TGTKControl(user_data).FOnKeyDown(TGTKControl(user_data), event^.keyval, + Shift, Accept); + end else if Assigned(TGTKControl(user_data).FOnKeyUp) then TGTKControl(user_data).FOnKeyUp(TGTKControl(user_data), event^.keyval, + Shift, Accept); + Result := not Accept; +end; + +function TGTKControl_key_press_event(widget: PGtkWidget; event: PGdkEventKey; user_data : gpointer): gboolean; cdecl; +begin + Result := TGTKControl_key_event(event, user_data, True); +end; + +function TGTKControl_key_release_event(widget: PGtkWidget; event: PGdkEventKey; user_data : gpointer): gboolean; cdecl; +begin + Result := TGTKControl_key_event(event, user_data, False); +end; + +procedure TGTKControl.SetOnKeyDown(Value: TGDKKeyEvent); +begin + if @FOnKeyDown <> @Value then begin + FOnKeyDown := Value; + if Assigned(Value) + then FKeyDownSignalHandler := g_signal_connect(PGtkObject(FWidget), 'key-press-event', G_CALLBACK(@TGTKControl_key_press_event), Self) + else g_signal_handler_disconnect(PGtkObject(FWidget), FKeyDownSignalHandler); + end; +end; + +procedure TGTKControl.SetOnKeyUp(Value: TGDKKeyEvent); +begin + if @FOnKeyUp <> @Value then begin + FOnKeyUp := Value; + if Assigned(Value) + then FKeyUpSignalHandler := g_signal_connect(PGtkObject(FWidget), 'key-release-event', G_CALLBACK(@TGTKControl_key_release_event), Self) + else g_signal_handler_disconnect(PGtkObject(FWidget), FKeyUpSignalHandler); + end; +end; + +function TGTKControl_focus_in_event(widget: PGtkWidget; event: PGdkEventFocus; user_data : gpointer): gboolean; cdecl; +var Accept: boolean; +begin + Accept := True; + if Assigned(TGTKControl(user_data).FOnEnter) then TGTKControl(user_data).FOnEnter(TGTKControl(user_data), Accept); + Result := not Accept; +end; + +function TGTKControl_focus_out_event(widget: PGtkWidget; event: PGdkEventFocus; user_data : gpointer): gboolean; cdecl; +var Accept: boolean; +begin + Accept := True; + if Assigned(TGTKControl(user_data).FOnExit) then TGTKControl(user_data).FOnExit(TGTKControl(user_data), Accept); + Result := not Accept; +end; + +procedure TGTKControl.SetOnEnter(Value: TGDKFocusEvent); +begin + if @FOnEnter <> @Value then begin + FOnEnter := Value; + if Assigned(Value) + then FFocusInSignalHandler := g_signal_connect(PGtkObject(FWidget), 'focus-in-event', G_CALLBACK(@TGTKControl_focus_in_event), Self) + else g_signal_handler_disconnect(PGtkObject(FWidget), FFocusInSignalHandler); + end; +end; + +procedure TGTKControl.SetOnExit(Value: TGDKFocusEvent); +begin + if @FOnExit <> @Value then begin + FOnExit := Value; + if Assigned(Value) + then FFocusOutSignalHandler := g_signal_connect(PGtkObject(FWidget), 'focus-out-event', G_CALLBACK(@TGTKControl_focus_out_event), Self) + else g_signal_handler_disconnect(PGtkObject(FWidget), FFocusOutSignalHandler); + end; +end; + +procedure TGTKControl.SetForegroundColor(Red, Green, Blue: word); +begin + gtk_widget_modify_fg(FWidget, 0, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetForegroundColor(State: integer; Red, Green, Blue: word); +begin + gtk_widget_modify_fg(FWidget, State, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetForegroundColor(State: integer; Color: PGdkColor); +begin + gtk_widget_modify_fg(FWidget, State, Color); +end; + +procedure TGTKControl.SetForegroundColor(Color: PGdkColor); +begin + gtk_widget_modify_fg(FWidget, 0, Color); +end; + +procedure TGTKControl.SetBackgroundColor(Red, Green, Blue: word); +begin + gtk_widget_modify_bg(FWidget, 0, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetBackgroundColor(State: integer; Red, Green, Blue: word); +begin + gtk_widget_modify_bg(FWidget, State, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetBackgroundColor(State: integer; Color: PGdkColor); +begin + gtk_widget_modify_bg(FWidget, State, Color); +end; + +procedure TGTKControl.SetBackgroundColor(Color: PGdkColor); +begin + gtk_widget_modify_bg(FWidget, 0, Color); +end; + +procedure TGTKControl.SetTextColor(Red, Green, Blue: word); +begin + gtk_widget_modify_text(FWidget, 0, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetTextColor(State: integer; Red, Green, Blue: word); +begin + gtk_widget_modify_text(FWidget, State, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetBaseColor(Red, Green, Blue: word); +begin + gtk_widget_modify_base(FWidget, 0, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetBaseColor(State: integer; Red, Green, Blue: word); +begin + gtk_widget_modify_base(FWidget, State, AllocateColor(FWidget, Red, Green, Blue)); +end; + +procedure TGTKControl.SetOnMouseDown(Value: TGDKMouseEvent); +begin + if @FOnMouseDown <> @Value then begin + FOnMouseDown := Value; + if not Assigned(Value) then begin + if (not Assigned(FPopupMenu)) and (not Assigned(FOnDblClick)) then begin + g_signal_handler_disconnect(PGtkObject(FWidget), FButtonPressSignalHandler); + FButtonPressSignalHandler := 0; + end; + end else + if FButtonPressSignalHandler = 0 + then FButtonPressSignalHandler := g_signal_connect_swapped(PGtkObject(FWidget), 'button-press-event', G_CALLBACK(@TGTKControl_button_press_event), Self) + end; +end; + +procedure TGTKControl.SetOnDblClick(Value: TGDKMouseEvent); +begin + if @FOnMouseDown <> @Value then begin + FOnDblClick := Value; + if not Assigned(Value) then begin + if (not Assigned(FPopupMenu)) and (not Assigned(FOnMouseDown)) then begin + g_signal_handler_disconnect(PGtkObject(FWidget), FButtonPressSignalHandler); + FButtonPressSignalHandler := 0; + end; + end else + if FButtonPressSignalHandler = 0 + then FButtonPressSignalHandler := g_signal_connect_swapped(PGtkObject(FWidget), 'button-press-event', G_CALLBACK(@TGTKControl_button_press_event), Self) + end; +end; + +function TGTKControl_button_release_event(widget: PGtkWidget; event: PGdkEventButton; user_data: gpointer):gboolean; cdecl; +var Shift: TShiftState; + Accept: boolean; +begin + Shift := []; + if event^.state and GDK_SHIFT_MASK = GDK_SHIFT_MASK then Include(Shift, ssShift); + if event^.state and GDK_CONTROL_MASK = GDK_CONTROL_MASK then Include(Shift, ssCtrl); + if event^.state and GDK_MOD1_MASK = GDK_MOD1_MASK then Include(Shift, ssAlt); + Accept := True; + if Assigned(TGTKControl(widget).FOnMouseUp) + then TGTKControl(widget).FOnMouseUp(TGTKControl(widget), TGDKMouseButton(event^.button - 1), Shift, Trunc(event^.x), Trunc(event^.y), Accept); + Result := not Accept; +end; + +procedure TGTKControl.SetOnMouseUp(Value: TGDKMouseEvent); +begin + if @FOnMouseUp <> @Value then begin + FOnMouseUp := Value; + if Assigned(Value) then FButtonReleaseSignalHandler := g_signal_connect_swapped(PGtkObject(FWidget), 'button-release-event', G_CALLBACK(@TGTKControl_button_release_event), Self) + else g_signal_handler_disconnect(PGtkObject(FWidget), FButtonReleaseSignalHandler); + end; +end; + +function TGTKControl.GetDefault: boolean; +begin + Result := False; + if (csDestroying in ComponentState) then Exit; + Result := GTK_WIDGET_HAS_DEFAULT(FWidget); +end; + +procedure TGTKControl.SetDefault(Value: boolean); +begin + if (csDestroying in ComponentState) then Exit; + GTK_WIDGET_SET_FLAGS(FWidget, GTK_CAN_DEFAULT); +// gtk_widget_grab_default(FWidget); +end; + +procedure TGTKControl.Invalidate; +begin + if (csDestroying in ComponentState) then Exit; + gtk_widget_queue_draw(FWidget); +end; + +procedure TGTKControl.SetAlignment(XAlign, YAlign: Double); +begin + gtk_misc_set_alignment(PGtkMisc(FWidget), XAlign, YAlign); +end; + +procedure TGTKControl.SetPadding(XPad, YPad: integer); +begin + gtk_misc_set_padding(PGtkMisc(FWidget), XPad, YPad); +end; + +function TGTKControl_expose_event(widget: PGtkWidget; event: PGdkEventExpose; user_data: gpointer):gboolean; cdecl; +var Accept: boolean; +begin + Accept := True; + if Assigned(TGTKControl(user_data).FOnExpose) + then TGTKControl(user_data).FOnExpose(TGTKControl(user_data), @event^.area, Accept); + Result := not Accept; +end; + +procedure TGTKControl.SetOnExpose(Value: TGDKExposeEvent); +begin + if @FOnExpose <> @Value then begin + FOnExpose := Value; + if Assigned(Value) + then FExposeSignalHandler := g_signal_connect(PGtkObject(FWidget), 'expose-event', G_CALLBACK(@TGTKControl_expose_event), Self) + else g_signal_handler_disconnect(PGtkObject(FWidget), FExposeSignalHandler); + end; +end; + +function TGTKControl.GetControlState: TGTKControlState; +begin + Result := TGTKControlState(FWidget^.state); +end; + +procedure TGTKControl.SetControlState(Value: TGTKControlState); +begin + gtk_widget_set_state(FWidget, integer(Value)); +end; + +function TGTKControl.GetData(Key: string): Pointer; +begin + Result := g_object_get_data(G_OBJECT(FWidget), PChar(Key)); +end; + +procedure TGTKControl.SetData(Key: string; Value: Pointer); +begin + g_object_set_data(G_OBJECT(FWidget), PChar(Key), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKContainer.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +destructor TGTKContainer.Destroy; +begin + inherited Destroy; +end; + +function TGTKContainer.GetBorderWidth: integer; +begin + Result := gtk_container_get_border_width(PGtkContainer(FWidget)); +end; + +procedure TGTKContainer.SetBorderWidth(Value: integer); +begin + gtk_container_set_border_width(PGtkContainer(FWidget), Value); +end; + +procedure TGTKContainer.AddControl(AControl: TGTKControl); +begin + gtk_container_add(PGtkContainer(FWidget), AControl.FWidget); +end; + +procedure TGTKContainer.RemoveControl(AControl: TGTKControl); +begin + gtk_container_remove(PGtkContainer(FWidget), AControl.FWidget); +end; + +function TGTKContainer.GetChildrenCount: integer; +begin + Result := g_list_length(gtk_container_get_children(PGtkContainer(FWidget))); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKBin.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +destructor TGTKBin.Destroy; +begin + inherited Destroy; +end; + +function TGTKBin.GetChildControl: PGtkWidget; +begin + Result := gtk_bin_get_child(PGtkBin(FWidget)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FLinked := False; +end; + +constructor TGTKBox.CreateLinked(AOwner: TComponent; Widget: PGtkWidget); +begin + inherited Create(AOwner); + FLinked := True; + FWidget := Widget; + Show; +end; + +destructor TGTKBox.Destroy; +begin + if not FLinked then inherited Destroy; +end; + +procedure TGTKBox.AddControl(Control: TGTKControl); +begin + gtk_box_pack_start_defaults(PGtkBox(FWidget), Control.FWidget); +end; + +procedure TGTKBox.AddControlEnd(Control: TGTKControl); +begin + gtk_box_pack_end_defaults(PGtkBox(FWidget), Control.FWidget); +end; + +procedure TGTKBox.AddControlEx(Control: TGTKControl; Expand, Fill: boolean; Padding: integer); +begin + gtk_box_pack_start(PGtkBox(FWidget), Control.FWidget, Expand, Fill, Padding); +end; + +procedure TGTKBox.AddControlEndEx(Control: TGTKControl; Expand, Fill: boolean; Padding: integer); +begin + gtk_box_pack_end(PGtkBox(FWidget), Control.FWidget, Expand, Fill, Padding); +end; + +function TGTKBox.GetHomogeneous: boolean; +begin + Result := gtk_box_get_homogeneous(PGtkBox(FWidget)); +end; + +procedure TGTKBox.SetHomogeneous(Value: boolean); +begin + gtk_box_set_homogeneous(PGtkBox(FWidget), Value); +end; + +function TGTKBox.GetSpacing: integer; +begin + Result := gtk_box_get_spacing(PGtkBox(FWidget)); +end; + +procedure TGTKBox.SetSpacing(Value: integer); +begin + gtk_box_set_spacing(PGtkBox(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKHBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if ClassName = 'TGTKHBox' then begin + FWidget := gtk_hbox_new(True, 0); + Show; + end; +end; + +destructor TGTKHBox.Destroy; +begin + inherited Destroy; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKVBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if ClassName = 'TGTKVBox' then begin + FWidget := gtk_vbox_new(False, 0); + Show; + end; +end; + +destructor TGTKVBox.Destroy; +begin + inherited Destroy; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTooltips.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FObject := gtk_tooltips_new; +end; + +destructor TGTKTooltips.Destroy; +begin + inherited Destroy; +end; + +function TGTKTooltips.GetEnabled: boolean; +begin + Result := Boolean(gtk2.enabled(FObject^)); +end; + +procedure TGTKTooltips.SetEnabled(Value: boolean); +begin + if Value then gtk_tooltips_enable(FObject) + else gtk_tooltips_disable(FObject); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKEventBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_event_box_new; + Show; +end; + +destructor TGTKEventBox.Destroy; +begin + inherited Destroy; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTable.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_table_new(0, 0, False); + Show; +end; + +destructor TGTKTable.Destroy; +begin + inherited Destroy; +end; + +function TGTKTable.GetRowCount: integer; +begin + Result := PGtkTable(FWidget)^.nrows; +end; + +procedure TGTKTable.SetRowCount(Value: integer); +begin + SetRowColCount(Value, ColCount); +end; + +function TGTKTable.GetColCount: integer; +begin + Result := PGtkTable(FWidget)^.ncols; +end; + +procedure TGTKTable.SetColCount(Value: integer); +begin + SetRowColCount(RowCount, Value); +end; + +procedure TGTKTable.SetRowColCount(Rows, Cols: integer); +begin + gtk_table_resize(PGtkTable(FWidget), Rows, Cols); +end; + +function TGTKTable.GetRowSpacing: integer; +begin + Result := gtk_table_get_default_row_spacing(PGtkTable(FWidget)); +end; + +procedure TGTKTable.SetRowSpacing(Value: integer); +begin + gtk_table_set_row_spacings(PGtkTable(FWidget), Value); +end; + +function TGTKTable.GetColSpacing: integer; +begin + Result := gtk_table_get_default_col_spacing(PGtkTable(FWidget)); +end; + +procedure TGTKTable.SetColSpacing(Value: integer); +begin + gtk_table_set_col_spacings(PGtkTable(FWidget), Value); +end; + +function TGTKTable.GetHomogeneous: boolean; +begin + Result := gtk_table_get_homogeneous(PGtkTable(FWidget)); +end; + +procedure TGTKTable.SetHomogeneous(Value: boolean); +begin + gtk_table_set_homogeneous(PGtkTable(FWidget), Value); +end; + +procedure TGTKTable.AddControl(Column, Row, NumCols, NumRows: integer; Control: TGTKControl; XPadding, YPadding: integer); +begin + gtk_table_attach(PGtkTable(FWidget), Control.FWidget, Column, Column + NumCols, Row, Row + NumRows, + GTK_EXPAND or GTK_SHRINK or GTK_FILL, GTK_EXPAND or GTK_SHRINK or GTK_FILL, XPadding, YPadding); +end; + +procedure TGTKTable.AddControlEx(Column, Row, NumCols, NumRows: integer; Control: TGTKControl; XAttachOptions, + YAttachOptions: TGTKTableAttachOptions; XPadding, YPadding: integer); +begin + gtk_table_attach(PGtkTable(FWidget), Control.FWidget, Column, Column + NumCols, Row, Row + NumRows, + (GTK_EXPAND*Ord(taoExpand in XAttachOptions)) or (GTK_SHRINK*Ord(taoShrink in XAttachOptions)) or (GTK_FILL*Ord(taoFill in XAttachOptions)), + (GTK_EXPAND*Ord(taoExpand in YAttachOptions)) or (GTK_SHRINK*Ord(taoShrink in YAttachOptions)) or (GTK_FILL*Ord(taoFill in YAttachOptions)), + XPadding, YPadding); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + + +end. diff --git a/libgtk_kylix/GTKDialogs.pas b/libgtk_kylix/GTKDialogs.pas new file mode 100644 index 0000000..eb24ccc --- /dev/null +++ b/libgtk_kylix/GTKDialogs.pas @@ -0,0 +1,248 @@ +(* + GTK-Kylix Library: GTKDialogs - Special purpose dialogs + Version 0.7.0 (last updated 2006-02-05) + Copyright (C) 2006 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKDialogs; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, GTKControls, GTKConsts, GTKUtils, GTKClasses, GTKForms; + + +type + +(****************************************** TGTKFILESELECTIONDIALOG *************************************************************) + TGTKFileSelectionDialog = class(TGTKDialog) + private + function GetFileName: string; + function GetShowFileOpButtons: boolean; + function GetMultiSelect: boolean; + procedure SetFileName(Value: string); + procedure SetShowFileOpButtons(Value: boolean); + procedure SetMultiSelect(Value: boolean); + protected + public + constructor Create(AOwner: TComponent); override; + constructor CreateWithTitle(AOwner: TComponent; const Title: string); + destructor Destroy; override; + published + property FileName: string read GetFileName write SetFileName; + property ShowFileOpButtons: boolean read GetShowFileOpButtons write SetShowFileOpButtons; + property MultiSelect: boolean read GetMultiSelect write SetMultiSelect; + end; + +(****************************************** TGTKCOLORSELECTIONDIALOG ************************************************************) + TGTKColorSelectionDialog = class(TGTKDialog) + private + function GetShowOpacity: boolean; + procedure SetShowOpacity(Value: boolean); + function GetShowPalette: boolean; + procedure SetShowPalette(Value: boolean); + function GetColor: TGDKColor; + procedure SetColor(Value: TGDKColor); + protected + public + constructor Create(AOwner: TComponent); override; + constructor CreateWithTitle(AOwner: TComponent; const Title: string); + destructor Destroy; override; + property Color: TGDKColor read GetColor write SetColor; + published + property ShowOpacity: boolean read GetShowOpacity write SetShowOpacity; + property ShowPalette: boolean read GetShowPalette write SetShowPalette; + end; + +(****************************************** TGTKFONTSELECTIONDIALOG *************************************************************) + TGTKFontSelectionDialog = class(TGTKDialog) + private + function GetFontName: string; + procedure SetFontName(Value: string); + function GetPreviewText: string; + procedure SetPreviewText(Value: string); + protected + public + constructor Create(AOwner: TComponent); override; + constructor CreateWithTitle(AOwner: TComponent; const Title: string); + destructor Destroy; override; + published + property FontName: string read GetFontName write SetFontName; + property PreviewText: string read GetPreviewText write SetPreviewText; + end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses SysUtils, DateUtils; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKFileSelectionDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_file_selection_new(nil); + Show; +end; + +constructor TGTKFileSelectionDialog.CreateWithTitle(AOwner: TComponent; const Title: string); +begin + inherited Create(AOwner); + FWidget := gtk_file_selection_new(StringToPgchar(Title)); + Show; +end; + +destructor TGTKFileSelectionDialog.Destroy; +begin + inherited Destroy; +end; + +function TGTKFileSelectionDialog.GetFileName: string; +begin + Result := string(gtk_file_selection_get_filename(PGtkFileSelection(FWidget))); +end; + +procedure TGTKFileSelectionDialog.SetFileName(Value: string); +begin + gtk_file_selection_set_filename(PGtkFileSelection(FWidget), PChar(Value)); +end; + +function TGTKFileSelectionDialog.GetShowFileOpButtons: boolean; +var b: Boolean; +begin + g_object_get(FWidget, 'show-fileops', @b, nil); + Result := b; +end; + +procedure TGTKFileSelectionDialog.SetShowFileOpButtons(Value: boolean); +begin + if Value then gtk_file_selection_show_fileop_buttons(PGtkFileSelection(FWidget)) + else gtk_file_selection_hide_fileop_buttons(PGtkFileSelection(FWidget)); +end; + +function TGTKFileSelectionDialog.GetMultiSelect: boolean; +begin + Result := gtk_file_selection_get_select_multiple(PGtkFileSelection(FWidget)); +end; + +procedure TGTKFileSelectionDialog.SetMultiSelect(Value: boolean); +begin + gtk_file_selection_set_select_multiple(PGtkFileSelection(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKColorSelectionDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_color_selection_dialog_new(nil); + Show; +end; + +constructor TGTKColorSelectionDialog.CreateWithTitle(AOwner: TComponent; const Title: string); +begin + inherited Create(AOwner); + FWidget := gtk_color_selection_dialog_new(StringToPgchar(Title)); + Show; +end; + +destructor TGTKColorSelectionDialog.Destroy; +begin + inherited Destroy; +end; + +function TGTKColorSelectionDialog.GetShowOpacity: boolean; +begin + Result := gtk_color_selection_get_has_opacity_control(PGtkColorSelection(PGtkColorSelectionDialog(FWidget)^.colorsel)); +end; + +procedure TGTKColorSelectionDialog.SetShowOpacity(Value: boolean); +begin + gtk_color_selection_set_has_opacity_control(PGtkColorSelection(PGtkColorSelectionDialog(FWidget)^.colorsel), Value); +end; + +function TGTKColorSelectionDialog.GetShowPalette: boolean; +begin + Result := gtk_color_selection_get_has_palette(PGtkColorSelection(PGtkColorSelectionDialog(FWidget)^.colorsel)); +end; + +procedure TGTKColorSelectionDialog.SetShowPalette(Value: boolean); +begin + gtk_color_selection_set_has_palette(PGtkColorSelection(PGtkColorSelectionDialog(FWidget)^.colorsel), Value); +end; + +function TGTKColorSelectionDialog.GetColor: TGDKColor; +var Col: gdk2.TGDkColor; +begin + gtk_color_selection_get_current_color(PGtkColorSelection(PGtkColorSelectionDialog(FWidget)^.colorsel), @Col); + Result := PGdkColorToGDKColor(@Col); +end; + +procedure TGTKColorSelectionDialog.SetColor(Value: TGDKColor); +var Col: PGDkColor; +begin + Col := GDKColorToPGdkColor(Value); + gtk_color_selection_set_current_color(PGtkColorSelection(PGtkColorSelectionDialog(FWidget)^.colorsel), Col); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKFontSelectionDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_font_selection_dialog_new(nil); + Show; +end; + +constructor TGTKFontSelectionDialog.CreateWithTitle(AOwner: TComponent; const Title: string); +begin + inherited Create(AOwner); + FWidget := gtk_font_selection_dialog_new(StringToPgchar(Title)); + Show; +end; + +destructor TGTKFontSelectionDialog.Destroy; +begin + inherited Destroy; +end; + +function TGTKFontSelectionDialog.GetFontName: string; +begin + Result := PgcharToString(gtk_font_selection_dialog_get_font_name(PGtkFontSelectionDialog(FWidget))); +end; + +procedure TGTKFontSelectionDialog.SetFontName(Value: string); +begin + gtk_font_selection_dialog_set_font_name(PGtkFontSelectionDialog(FWidget), StringToPgchar(Value)); +end; + +function TGTKFontSelectionDialog.GetPreviewText: string; +begin + Result := PgcharToString(gtk_font_selection_dialog_get_preview_text(PGtkFontSelectionDialog(FWidget))); +end; + +procedure TGTKFontSelectionDialog.SetPreviewText(Value: string); +begin + gtk_font_selection_dialog_set_preview_text(PGtkFontSelectionDialog(FWidget), StringToPgchar(Value)); +end; + +(********************************************************************************************************************************) +end. diff --git a/libgtk_kylix/GTKExtCtrls.pas b/libgtk_kylix/GTKExtCtrls.pas new file mode 100644 index 0000000..8426d02 --- /dev/null +++ b/libgtk_kylix/GTKExtCtrls.pas @@ -0,0 +1,707 @@ +(* + GTK-Kylix Library: GTKExtCtrls - Extended visual controls + Version 0.6.22 (last updated 2004-11-20) + Copyright (C) 2004 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKExtCtrls; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, GTKControls, GTKConsts, GTKStdCtrls, GTKUtils, GTKMenus; + // Quick jump: QForms QControls QStdCtrls QExtCtrls + + +type + +(****************************************** TGTKSEPARATOR ***********************************************************************) + TGTKSeparator = class(TGTKControl) + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +(****************************************** TGTKHSEPARATOR **********************************************************************) + TGTKHSeparator = class(TGTKSeparator) + public + constructor Create(AOwner: TComponent); override; + end; + +(****************************************** TGTKVSEPARATOR **********************************************************************) + TGTKVSeparator = class(TGTKSeparator) + public + constructor Create(AOwner: TComponent); override; + end; + +(****************************************** TGTKHANDLEBOX ***********************************************************************) + TGTKHandleBox = class(TGTKBin) + private + function GetShadowType: TGTKShadowType; + function GetHandlePosition: TGTKPosition; + function GetSnapEdge: TGTKPosition; + procedure SetShadowType(Value: TGTKShadowType); + procedure SetHandlePosition(Value: TGTKPosition); + procedure SetSnapEdge(Value: TGTKPosition); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property ShadowType: TGTKShadowType read GetShadowType write SetShadowType; + property HandlePosition: TGTKPosition read GetHandlePosition write SetHandlePosition; + property SnapEdge: TGTKPosition read GetSnapEdge write SetSnapEdge; + end; + +(****************************************** TGTKPROGRESSBAR *********************************************************************) + TGTKProgressBarOrientation = (poLeftToRight, poRightToLeft, poBottomToTop, poTopToBottom); + TGTKProgressBar = class(TGTKControl) + private + FMax: Int64; + function GetText: string; + function GetFraction: Double; + function GetPulseStep: Double; + function GetOrientation: TGTKProgressBarOrientation; + function GetValue: Int64; + procedure SetText(Value: string); + procedure SetFraction(Value: Double); + procedure SetPulseStep(Value: Double); + procedure SetOrientation(Value: TGTKProgressBarOrientation); + procedure SetValue(Value: Int64); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Pulse; + published + property Text: string read GetText write SetText; + property Fraction: Double read GetFraction write SetFraction; + property PulseStep: Double read GetPulseStep write SetPulseStep; + property Orientation: TGTKProgressBarOrientation read GetOrientation write SetOrientation; + property Max: Int64 read FMax write FMax; + property Value: Int64 read GetValue write SetValue; + end; + +(****************************************** TGTKPANED ***************************************************************************) + TGTKPaned = class(TGTKContainer) + private + FChild1, FChild2: TGTKControl; + FOnResize: TNotifyEvent; + function GetPosition: integer; + procedure SetPosition(Value: integer); + procedure SetChild1(Value: TGTKControl); + procedure SetChild2(Value: TGTKControl); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Child1: TGTKControl read FChild1 write SetChild1; + property Child2: TGTKControl read FChild2 write SetChild2; + property Position: integer read GetPosition write SetPosition; + property OnResize: TNotifyEvent read FOnResize write FOnResize; + end; + +(****************************************** TGTKHPANED **************************************************************************) + TGTKHPaned = class(TGTKPaned) + public + constructor Create(AOwner: TComponent); override; + end; + +(****************************************** TGTKVPANED **************************************************************************) + TGTKVPaned = class(TGTKPaned) + public + constructor Create(AOwner: TComponent); override; + end; + +(****************************************** TGTKNOTEBOOK ************************************************************************) + TGTKNotebook = class(TGTKContainer) + private + FOnSwitchPage: TNotifyEvent; + function GetPageIndex: integer; + function GetTabPosition: TGTKPosition; + function GetShowTabs: boolean; + function GetShowBorder: boolean; + function GetScrollable: boolean; + procedure SetPageIndex(Value: integer); + procedure SetTabPosition(Value: TGTKPosition); + procedure SetShowTabs(Value: boolean); + procedure SetShowBorder(Value: boolean); + procedure SetScrollable(Value: boolean); + public + constructor Create(AOwner: TComponent); virtual; + destructor Destroy; virtual; + function AppendPage(Child: TGTKControl; Caption: string): integer; + procedure RemovePage(PageNo: integer); + function GetCaption(PageNo: integer): string; + procedure SetCaption(PageNo: integer; Caption: string); + procedure NextPage; + procedure PrevPage; + function GetExpandTab(PageNo: integer): boolean; + procedure SetExpandTab(PageNo: integer; Value: boolean); + function GetFillTab(PageNo: integer): boolean; + procedure SetFillTab(PageNo: integer; Value: boolean); + function GetTabLabel(PageNo: integer): TGTKLabel; + published + property PageIndex: integer read GetPageIndex write SetPageIndex; + property TabPosition: TGTKPosition read GetTabPosition write SetTabPosition; + property ShowTabs: boolean read GetShowTabs write SetShowTabs; + property ShowBorder: boolean read GetShowBorder write SetShowBorder; + property Scrollable: boolean read GetScrollable write SetScrollable; + property OnSwitchPage: TNotifyEvent read FOnSwitchPage write FOnSwitchPage; + end; + +(****************************************** TGTKOPTIONMENU **********************************************************************) + TGTKOptionMenu = class(TGTKButton) + private + FItems: TGTKMenuItem; + FOnChanged: TNotifyEvent; + procedure ItemsChanged(Sender: TObject); + function GetItemIndex: integer; + procedure SetItemIndex(Value: integer); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Items: TGTKMenuItem read FItems; + property ItemIndex: integer read GetItemIndex write SetItemIndex; + property OnChanged: TNotifyEvent read FOnChanged write FOnChanged; + end; + +(****************************************** TGTKSCROLLEDWINDOW ******************************************************************) + TGTKScrollBarPolicy = (sbAlways, sbAutomatic, sbNever); + TGTKScrolledWindow = class(TGTKBin) + private + function GetHorizScrollBarPolicy: TGTKScrollBarPolicy; + function GetVertScrollBarPolicy: TGTKScrollBarPolicy; + procedure SetHorizScrollBarPolicy(Value: TGTKScrollBarPolicy); + procedure SetVertScrollBarPolicy(Value: TGTKScrollBarPolicy); + function GetShadowType: TGTKShadowType; + procedure SetShadowType(Value: TGTKShadowType); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure AddWithViewPort(Control: TGTKControl); + published + property HorizScrollBarPolicy: TGTKScrollBarPolicy read GetHorizScrollBarPolicy write SetHorizScrollBarPolicy; + property VertScrollBarPolicy: TGTKScrollBarPolicy read GetVertScrollBarPolicy write SetVertScrollBarPolicy; + property ShadowType: TGTKShadowType read GetShadowType write SetShadowType; + end; + +(****************************************** TGTKBUTTONBOX ***********************************************************************) + TGTKButtonBoxLayout = (blDefault, blSpread, blEdge, blStart, blEnd); + TGTKButtonBox = class(TGTKBox) + private + function GetLayout: TGTKButtonBoxLayout; + procedure SetLayout(Value: TGTKButtonBoxLayout); + public + constructor Create(AOwner: TComponent); override; + published + property Layout: TGTKButtonBoxLayout read GetLayout write SetLayout; + end; + +(****************************************** TGTKHBUTTONBOX **********************************************************************) + TGTKHButtonBox = class(TGTKButtonBox) + public + constructor Create(AOwner: TComponent); override; + end; + +(****************************************** TGTKVBUTTONBOX **********************************************************************) + TGTKVButtonBox = class(TGTKButtonBox) + public + constructor Create(AOwner: TComponent); override; + end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKSeparator.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +destructor TGTKSeparator.Destroy; +begin + inherited Destroy; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKHSeparator.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_hseparator_new; + Show; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKVSeparator.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_vseparator_new; + Show; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKHandleBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_handle_box_new; + Show; +end; + +destructor TGTKHandleBox.Destroy; +begin + inherited Destroy; +end; + +function TGTKHandleBox.GetShadowType: TGTKShadowType; +begin + Result := TGTKShadowType(gtk_handle_box_get_shadow_type(PGtkHandleBox(FWidget))); +end; + +procedure TGTKHandleBox.SetShadowType(Value: TGTKShadowType); +begin + gtk_handle_box_set_shadow_type(PGtkHandleBox(FWidget), gtk2.TGtkShadowType(Value)); +end; + +function TGTKHandleBox.GetHandlePosition: TGTKPosition; +begin + Result := TGTKPosition(gtk_handle_box_get_handle_position(PGtkHandleBox(FWidget))); +end; + +procedure TGTKHandleBox.SetHandlePosition(Value: TGTKPosition); +begin + gtk_handle_box_set_handle_position(PGtkHandleBox(FWidget), Integer(Value)); +end; + +function TGTKHandleBox.GetSnapEdge: TGTKPosition; +begin + Result := TGTKPosition(gtk_handle_box_get_snap_edge(PGtkHandleBox(FWidget))); +end; + +procedure TGTKHandleBox.SetSnapEdge(Value: TGTKPosition); +begin + gtk_handle_box_set_snap_edge(PGtkHandleBox(FWidget), Integer(Value)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKProgressBar.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FMax := 100; + FWidget := gtk_progress_bar_new; + Show; +end; + +destructor TGTKProgressBar.Destroy; +begin + inherited Destroy; +end; + +procedure TGTKProgressBar.Pulse; +begin + gtk_progress_bar_pulse(PGtkProgressBar(FWidget)); +end; + +function TGTKProgressBar.GetText: string; +begin + Result := PgcharToString(gtk_progress_bar_get_text(PGtkProgressBar(FWidget))); +end; + +procedure TGTKProgressBar.SetText(Value: string); +begin + gtk_progress_bar_set_text(PGtkProgressbar(FWidget), StringToPgchar(Value)); +end; + +function TGTKProgressBar.GetFraction: Double; +begin + Result := gtk_progress_bar_get_fraction(PGtkProgressbar(FWidget)); +end; + +procedure TGTKProgressBar.SetFraction(Value: Double); +begin + gtk_progress_bar_set_fraction(PGtkProgressbar(FWidget), Value); +end; + +function TGTKProgressBar.GetPulseStep: Double; +begin + Result := gtk_progress_bar_get_pulse_step(PGtkProgressbar(FWidget)); +end; + +procedure TGTKProgressBar.SetPulseStep(Value: Double); +begin + gtk_progress_bar_set_pulse_step(PGtkProgressbar(FWidget), Value); +end; + +function TGTKProgressBar.GetOrientation: TGTKProgressBarOrientation; +begin + Result := TGTKProgressBarOrientation(gtk_progress_bar_get_orientation(PGtkProgressBar(FWidget))); +end; + +procedure TGTKProgressBar.SetOrientation(Value: TGTKProgressBarOrientation); +begin + gtk_progress_bar_set_orientation(PGtkProgressbar(FWidget), gtk2.TGtkProgressBarOrientation(Value)); +end; + +function TGTKProgressBar.GetValue: Int64; +begin + Result := Round(Fraction * Max); +end; + +procedure TGTKProgressBar.SetValue(Value: Int64); +begin + if FMax = 0 then Fraction := 0 + else Fraction := Value / FMax; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + +procedure TGTKPaned_resize(widget : PGtkWidget; allocation : PGtkAllocation; user_data : gpointer); cdecl; +begin + if Assigned(TGTKPaned(user_data).FOnResize) then TGTKPaned(user_data).FOnResize(TGTKPaned(user_data)); +end; + +constructor TGTKPaned.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FChild1 := nil; + FChild2 := nil; +end; + +destructor TGTKPaned.Destroy; +begin + inherited Destroy; +end; + +procedure TGTKPaned.SetChild1(Value: TGTKControl); +begin + gtk_paned_pack1(PGtkPaned(FWidget), Value.FWidget, True, False); + g_signal_connect(PGtkObject(Value.FWidget), 'size-allocate', G_CALLBACK(@TGTKPaned_resize), Self); +end; + +procedure TGTKPaned.SetChild2(Value: TGTKControl); +begin + gtk_paned_pack2(PGtkPaned(FWidget), Value.FWidget, True, False); +end; + +function TGTKPaned.GetPosition: integer; +begin + Result := gtk_paned_get_position(PGtkPaned(FWidget)); +end; + +procedure TGTKPaned.SetPosition(Value: integer); +begin + gtk_paned_set_position(PGtkPaned(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKHPaned.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_hpaned_new; + Show; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKVPaned.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_vpaned_new; + Show; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + +procedure TGTKNotebook_switch_page(notebook: PGtkNotebook; page: PGtkNotebookPage; page_num: guint; user_data: gpointer); cdecl; +begin + if Assigned(user_data) and Assigned(TGTKNotebook(user_data).FOnSwitchPage) then TGTKNotebook(user_data).FOnSwitchPage(user_data); +end; + +constructor TGTKNotebook.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_notebook_new; + FOnSwitchPage := nil; + g_signal_connect_after(PGtkObject(FWidget), 'switch-page', G_CALLBACK(@TGTKNotebook_switch_page), Self); + Show; +end; + +destructor TGTKNotebook.Destroy; +begin + inherited Destroy; +end; + +function TGTKNotebook.AppendPage(Child: TGTKControl; Caption: string): integer; +begin + Result := gtk_notebook_append_page(PGtkNotebook(FWidget), Child.FWidget, nil); + gtk_notebook_set_tab_label_text(PGtkNotebook(FWidget), Child.FWidget, StringToPgchar(Caption)); +end; + +function TGTKNotebook.GetCaption(PageNo: integer): string; +begin + Result := PgcharToString(gtk_notebook_get_tab_label_text(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo))); +end; + +procedure TGTKNotebook.SetCaption(PageNo: integer; Caption: string); +begin + gtk_notebook_set_tab_label_text(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo), StringToPgchar(Caption)); +end; + +procedure TGTKNotebook.RemovePage(PageNo: integer); +begin + gtk_notebook_remove_page(PGtkNotebook(FWidget), PageNo); +end; + +function TGTKNotebook.GetPageIndex: integer; +begin + Result := gtk_notebook_get_current_page(PGtkNotebook(FWidget)); +end; + +procedure TGTKNotebook.SetPageIndex(Value: integer); +begin + gtk_notebook_set_page(PGtkNotebook(FWidget), Value); +end; + +procedure TGTKNotebook.NextPage; +begin + gtk_notebook_next_page(PGtkNotebook(FWidget)); +end; + +procedure TGTKNotebook.PrevPage; +begin + gtk_notebook_prev_page(PGtkNotebook(FWidget)); +end; + +function TGTKNotebook.GetTabPosition: TGTKPosition; +begin + Result := TGTKPosition(gtk_notebook_get_tab_pos(PGtkNotebook(FWidget))); +end; + +procedure TGTKNotebook.SetTabPosition(Value: TGTKPosition); +begin + gtk_notebook_set_tab_pos(PGtkNotebook(FWidget), Integer(Value)); +end; + +function TGTKNotebook.GetShowTabs: boolean; +begin + Result := gtk_notebook_get_show_tabs(PGtkNotebook(FWidget)); +end; + +procedure TGTKNotebook.SetShowTabs(Value: boolean); +begin + gtk_notebook_set_show_tabs(PGtkNotebook(FWidget), Value); +end; + +function TGTKNotebook.GetShowBorder: boolean; +begin + Result := gtk_notebook_get_show_border(PGtkNotebook(FWidget)); +end; + +procedure TGTKNotebook.SetShowBorder(Value: boolean); +begin + gtk_notebook_set_show_border(PGtkNotebook(FWidget), Value); +end; + +function TGTKNotebook.GetScrollable: boolean; +begin + Result := gtk_notebook_get_scrollable(PGtkNotebook(FWidget)); +end; + +procedure TGTKNotebook.SetScrollable(Value: boolean); +begin + gtk_notebook_set_scrollable(PGtkNotebook(FWidget), Value); +end; + +function TGTKNotebook.GetExpandTab(PageNo: integer): boolean; +var expand, fill: Pgboolean; + packtype: PGtkPackType; +begin + gtk_notebook_query_tab_label_packing(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo), expand, fill, packtype); + Result := expand <> nil; +end; + +procedure TGTKNotebook.SetExpandTab(PageNo: integer; Value: boolean); +begin + gtk_notebook_set_tab_label_packing(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo), Value, GetFillTab(PageNo), GTK_PACK_START); +end; + +function TGTKNotebook.GetFillTab(PageNo: integer): boolean; +var expand, fill: Pgboolean; + packtype: PGtkPackType; +begin + gtk_notebook_query_tab_label_packing(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo), expand, fill, packtype); + Result := fill <> nil; +end; + +procedure TGTKNotebook.SetFillTab(PageNo: integer; Value: boolean); +begin + gtk_notebook_set_tab_label_packing(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo), GetExpandTab(PageNo), Value, GTK_PACK_START); +end; + +function TGTKNotebook.GetTabLabel(PageNo: integer): TGTKLabel; +begin + Result := TGTKLabel.CreateFromWidget(Self, gtk_notebook_get_tab_label(PGtkNotebook(FWidget), gtk_notebook_get_nth_page(PGtkNotebook(FWidget), PageNo))); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGTKOptionMenu_changed(optionmenu: PGtkOptionMenu; user_data: pgpointer); cdecl; +begin + if Assigned(TGTKOptionMenu(user_data).FOnChanged) then TGTKOptionMenu(user_data).FOnChanged(TGTKOptionMenu(user_data)); +end; + +constructor TGTKOptionMenu.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOnChanged := nil; + FWidget := gtk_option_menu_new; + g_signal_connect(PGtkObject(FWidget), 'changed', G_CALLBACK(@TGTKOptionMenu_changed), Self); + Show; + FItems := TGTKMenuItem.Create(Self); + FItems.FParentMenu := Self; + FItems.Notify := ItemsChanged; +end; + +destructor TGTKOptionMenu.Destroy; +begin + FItems.Notify := nil; + FItems.Free; + inherited Destroy; +end; + +procedure TGTKOptionMenu.ItemsChanged(Sender: TObject); +begin + if Assigned(FItems.FMenu) and (gtk_option_menu_get_menu(PGtkOptionMenu(FWidget)) <> FItems.FMenu) + then gtk_option_menu_set_menu(PGtkOptionMenu(FWidget), FItems.FMenu); +end; + +function TGTKOptionMenu.GetItemIndex: integer; +begin + Result := gtk_option_menu_get_history(PGtkOptionMenu(FWidget)); +end; + +procedure TGTKOptionMenu.SetItemIndex(Value: integer); +begin + gtk_option_menu_set_history(PGtkOptionMenu(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKScrolledWindow.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_scrolled_window_new(nil, nil); + Show; +end; + +destructor TGTKScrolledWindow.Destroy; +begin + inherited Destroy; +end; + +function TGTKScrolledWindow.GetHorizScrollBarPolicy: TGTKScrollBarPolicy; +var hscrollbar, vscrollbar: tGtkPolicyType; +begin + gtk_scrolled_window_get_policy(PGtkScrolledWindow(FWidget), @hscrollbar, @vscrollbar); + Result := TGTKScrollBarPolicy(hscrollbar); +end; + +procedure TGTKScrolledWindow.SetHorizScrollBarPolicy(Value: TGTKScrollBarPolicy); +begin + gtk_scrolled_window_set_policy(PGtkScrolledWindow(FWidget), TGtkPolicyType(Value), TGtkPolicyType(VertScrollBarPolicy)); +end; + +function TGTKScrolledWindow.GetVertScrollBarPolicy: TGTKScrollBarPolicy; +var hscrollbar, vscrollbar: tGtkPolicyType; +begin + gtk_scrolled_window_get_policy(PGtkScrolledWindow(FWidget), @hscrollbar, @vscrollbar); + Result := TGTKScrollBarPolicy(vscrollbar); +end; + +procedure TGTKScrolledWindow.SetVertScrollBarPolicy(Value: TGTKScrollBarPolicy); +begin + gtk_scrolled_window_set_policy(PGtkScrolledWindow(FWidget), TGtkPolicyType(HorizScrollBarPolicy), TGtkPolicyType(Value)); +end; + +function TGTKScrolledWindow.GetShadowType: TGTKShadowType; +begin + Result := TGTKShadowType(gtk_scrolled_window_get_shadow_type(PGtkScrolledWindow(FWidget))); +end; + +procedure TGTKScrolledWindow.SetShadowType(Value: TGTKShadowType); +begin + gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(FWidget), gtk2.TGtkShadowType(Value)); +end; + +procedure TGTKScrolledWindow.AddWithViewPort(Control: TGTKControl); +begin + gtk_scrolled_window_add_with_viewport(PGtkScrolledWindow(FWidget), Control.FWidget); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKButtonBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +function TGTKButtonBox.GetLayout: TGTKButtonBoxLayout; +begin + Result := TGTKButtonBoxLayout(gtk_button_box_get_layout(PGtkButtonBox(FWidget))); +end; + +procedure TGTKButtonBox.SetLayout(Value: TGTKButtonBoxLayout); +begin + gtk_button_box_set_layout(PGtkButtonBox(FWidget), Integer(Value)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKHButtonBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_hbutton_box_new; + Show; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKVButtonBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_vbutton_box_new; + Show; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + + +end. diff --git a/libgtk_kylix/GTKForms.pas b/libgtk_kylix/GTKForms.pas new file mode 100644 index 0000000..ad755b7 --- /dev/null +++ b/libgtk_kylix/GTKForms.pas @@ -0,0 +1,874 @@ +(* + GTK-Kylix Library: GTKForms - Basic windows (TGTKForm, TGTKDialog), TGTKApplication, TGDKScreen + Version 0.6.26 (last updated 2007-08-19) + Copyright (C) 2007 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKForms; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, SysUtils, GTKControls, GTKConsts; + + +type // Some basic types + PCharArray = array[0..0] of PChar; + + TCustomGTKForm = class; + +(****************************************** TGDKSCREEN **************************************************************************) + TGDKScreen = class(TComponent) + private + FForms: TList; + FActiveForm: TCustomGTKForm; + procedure AddForm(AForm: TCustomGTKForm); + function GetForm(Index: Integer): TCustomGTKForm; + function GetFormCount: Integer; + procedure RemoveForm(AForm: TCustomGTKForm); + function GetHeight: Integer; + function GetWidth: Integer; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property ActiveForm: TCustomGTKForm read FActiveForm; + property FormCount: Integer read GetFormCount; + property Forms[Index: Integer]: TCustomGTKForm read GetForm; + property Height: Integer read GetHeight; + property Width: Integer read GetWidth; + end; + +(****************************************** TGTKFORM ****************************************************************************) + TCloseAction = (caNone, caHide, caFree, caMinimize); + TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object; + TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object; + TWindowPosition = (wpNone, wpCenter, wpMouse, wpCenterAlways, wpCenterOnParent); + TGDKWindowState = (wsNormal, wsState1, wsMinimized, wsState2, wsMaximized); + TGDKWindowTypeHint = (whNormal, whDialog, whToolbar, whSplashScreen, whUtility, whDock, whDesktop); + + TCustomGTKForm = class(TGTKBin) + procedure FormCreate(Sender: TObject); dynamic; + private + FOnClose: TCloseEvent; + FOnCloseQuery: TCloseQueryEvent; + FOnResize: TNotifyEvent; + FOnShow: TNotifyEvent; + FCaption: string; + FOnDestroy: TNotifyEvent; + function GetWindowPosition: TWindowPosition; + function GetResizeable: boolean; + function GetWindowTypeHint: TGDKWindowTypeHint; + function GetWindowState: TGDKWindowState; + function GetLeft: integer; + function GetTop: integer; + function GetWidth: integer; + function GetHeight: integer; + procedure SetVisible(Value: Boolean); + procedure SetCaption(Value: string); + procedure SetWindowPosition(Value: TWindowPosition); + procedure SetResizeable(Value: Boolean); + procedure SetWindowTypeHint(Value: TGDKWindowTypeHint); + procedure SetLeft(Value: integer); + procedure SetTop(Value: integer); + procedure SetWidth(Value: integer); + procedure SetHeight(Value: integer); + procedure SetDefault(Value: TGTKControl); + protected + procedure DoClose(var Action: TCloseAction); dynamic; + property Visible write SetVisible default False; + property OnClose: TCloseEvent read FOnClose write FOnClose; + property OnCloseQuery: TCloseQueryEvent read FOnCloseQuery write FOnCloseQuery; + property OnResize: TNotifyEvent read FOnResize write FOnResize; + property OnShow: TNotifyEvent read FOnShow write FOnShow; + property Caption: string read FCaption write SetCaption; + property WindowPosition: TWindowPosition read GetWindowPosition write SetWindowPosition; + property Resizeable: boolean read GetResizeable write SetResizeable; + property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy; + property WindowTypeHint: TGDKWindowTypeHint read GetWindowTypeHint write SetWindowTypeHint; + property WindowState: TGDKWindowState read GetWindowState; + property Left: integer read GetLeft write SetLeft; + property Top: integer read GetTop write SetTop; + property Width: integer read GetWidth write SetWidth; + property Height: integer read GetHeight write SetHeight; + property Default: TGTKControl write SetDefault; + public + FAccelGroup: PGtkAccelGroup; + Tooltips: TGTKTooltips; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Release; + function Close: boolean; + procedure ShowModal; virtual; + function CloseQuery: Boolean; virtual; + procedure SetDefaultSize(DefaultWidth, DefaultHeight: integer); + procedure SetTransientFor(Parent: TCustomGTKForm); + procedure Maximize; + procedure Unmaximize; + procedure Minimize; + procedure Unminimize; + procedure Stick; + procedure Unstick; + procedure WindowMove(ALeft, ATop: integer); + procedure Resize(AWidth, AHeight: integer); + end; + + TGTKForm = class(TCustomGTKForm) + public + constructor Create(AOwner: TComponent); override; + procedure Show; virtual; + procedure Hide; + end; + +(****************************************** TGTKDIALOG **************************************************************************) + TMessageButton = (mbYes, mbNo, mbOK, mbCancel, mbApply, mbClose, mbHelp, mbPrint, mbQuit, mbStop, mbBack, mbForward, mbNone); + TMessageButtons = set of TMessageButton; + TGTKDialogResponseEvent = procedure(Sender: TObject; const ResponseID: integer) of object; + + TGTKDialog = class(TCustomGTKForm) + private + FButtons: TMessageButtons; + FOnResponse: TGTKDialogResponseEvent; + function GetShowSeparator: boolean; + procedure SetButtons(Value: TMessageButtons); + procedure SetShowSeparator(Value: boolean); + procedure SetModalResult(Value: TMessageButton); + procedure SetDefaultButton(Value: TMessageButton); + procedure SetParentForm(Value: TGTKForm); + public + ClientArea: TGTKVBox; + ActionArea: TGTKHBox; + constructor Create(AOwner: TComponent); override; + function Run: TMessageButton; + procedure AddButton(ButtonCaption: string; ButtonID: integer); + procedure SetResponseSensitive(ButtonID: integer; Sensitive: boolean); + published + property Buttons: TMessageButtons read FButtons write SetButtons default []; + property ShowSeparator: boolean read GetShowSeparator write SetShowSeparator; + property ModalResult: TMessageButton write SetModalResult; + property DefaultButton: TMessageButton write SetDefaultButton; + property Caption; + property OnResponse: TGTKDialogResponseEvent read FOnResponse write FOnResponse; + property ParentForm: TGTKForm write SetParentForm; + end; + +(****************************************** TGTKAPPLICATION *********************************************************************) + TMessageStyle = (mbError, mbInfo, mbQuestion, mbWarning); + + TExceptionEvent = procedure (Sender: TObject; E: Exception) of object; + + TGTKApplication = class(TComponent) + private + FTerminated: Boolean; + FOnException: TExceptionEvent; + FMainForm: TCustomGTKForm; + FMainFormSet, FGTK205Up, FGTK220Up, FGTK240Up, FGTK260Up, FGTK280Up: Boolean; + procedure Quit; + protected + procedure CreateHandle; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure ControlDestroyed(Control: TGTKControl); + procedure CreateForm(InstanceClass: TComponentClass; var Reference); + procedure HandleException(Sender: TObject); + procedure HandleMessage; + procedure HookSynchronizeWakeup; + procedure Initialize; + function MessageBox(const Text: string; Buttons: TMessageButtons = [mbOK]; Style: TMessageStyle = mbInfo; + Default: TMessageButton = mbNone; Escape: TMessageButton = mbNone): TMessageButton; + procedure ProcessMessages; + procedure Run; + procedure ShowException(E: Exception); + procedure Terminate; + procedure UnhookSynchronizeWakeup; + property MainForm: TCustomGTKForm read FMainForm; + property Terminated: Boolean read FTerminated; + property OnException: TExceptionEvent read FOnException write FOnException; + published + property GTKVersion_2_0_5_Up: boolean read FGTK205Up; + property GTKVersion_2_2_0_Up: boolean read FGTK220Up; + property GTKVersion_2_4_0_Up: boolean read FGTK240Up; + property GTKVersion_2_6_0_Up: boolean read FGTK260Up; + property GTKVersion_2_8_0_Up: boolean read FGTK280Up; + end; + + +{ Global objects } + +var Application: TGTKApplication; + Screen: TGDKScreen; + Argc: Integer; + Argv: PPChar; + +function GetParentForm(Control: TGTKControl): TCustomGTKForm; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses GTKUtils; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGDKScreen.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FForms := TList.Create; + FActiveForm := nil; +end; + +destructor TGDKScreen.Destroy; +begin + FForms.Free; + inherited Destroy; +end; + +procedure TGDKScreen.AddForm(AForm: TCustomGTKForm); +begin + FForms.Add(AForm); +end; + +function TGDKScreen.GetForm(Index: Integer): TCustomGTKForm; +begin + Result := FForms[Index]; +end; + +function TGDKScreen.GetFormCount: Integer; +begin + Result := FForms.Count; +end; + +procedure TGDKScreen.RemoveForm(AForm: TCustomGTKForm); +begin + FForms.Remove(AForm); +end; + +function TGDKScreen.GetHeight: Integer; +begin + Result := gdk_screen_height; +end; + +function TGDKScreen.GetWidth: Integer; +begin + Result := gdk_screen_width; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function TCustomGTKForm_delete_event(widget: PGtkWidget; event: PGdkEvent; user_data: gpointer): gboolean; cdecl; +begin + Result := not TCustomGTKForm(user_data).Close; +end; + +procedure TCustomGTKForm_show(anobject : PGtkObject; user_data: pgpointer); cdecl; +begin + if Assigned(TCustomGTKForm(user_data).FOnShow) then TCustomGTKForm(user_data).FOnShow(TCustomGTKForm(user_data)); +end; + +procedure TCustomGTKForm_size_allocate(widget : PGtkWidget; allocation : PGtkAllocation; user_data : gpointer); cdecl; +begin + if Assigned(TCustomGTKForm(user_data).FOnResize) then TCustomGTKForm(user_data).FOnResize(TCustomGTKForm(user_data)); +end; + +constructor TCustomGTKForm.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + Tooltips := TGTKTooltips.Create(Self); + FOnClose := nil; + FOnCloseQuery := nil; + FOnDestroy := nil; + FCaption := ''; + FAccelGroup := gtk_accel_group_new; + Screen.AddForm(Self); +end; + +destructor TCustomGTKForm.Destroy; +begin + try + Screen.RemoveForm(Self); + if Assigned(FOnDestroy) then FOnDestroy(Self); + except + end; + Tooltips.Free; + if not Application.Terminated then gtk_widget_destroy(FWidget); + inherited Destroy; +end; + +procedure TCustomGTKForm.SetVisible(Value: Boolean); +begin + inherited Visible := Value; +end; + +function TCustomGTKForm.Close: boolean; +var CloseAction: TCloseAction; +begin + CloseAction := caFree; + if CloseQuery then begin + DoClose(CloseAction); + if CloseAction <> caNone then + if Application.MainForm = Self + then Application.Terminate + else if CloseAction = caHide then + Hide +{ else if CloseAction = caMinimize then + WindowState := wsMinimized } + else + Release; + end else CloseAction := caNone; + Result := CloseAction = caFree; +end; + +function TCustomGTKForm.CloseQuery: Boolean; +begin + Result := True; + if Assigned(FOnCloseQuery) then FOnCloseQuery(Self, Result); +end; + +procedure TCustomGTKForm.DoClose(var Action: TCloseAction); +begin + if Assigned(FOnClose) then FOnClose(Self, Action); +end; + +procedure TCustomGTKForm.Release; +begin +// SetParent(nil); +// if Assigned(FWidget) and GTK_IS_WIDGET(FWidget) then gtk_widget_destroy(PGtkWidget(FWidget)); +end; + +procedure TCustomGTKForm.FormCreate(Sender: TObject); +begin + // Dummy procedure, override it in ordinary instance if needed +end; + +procedure TCustomGTKForm.SetCaption(Value: string); +begin + FCaption := Value; + gtk_window_set_title(PGtkWindow(FWidget), PChar(Value)); +end; + +function TCustomGTKForm.GetWindowPosition: TWindowPosition; +begin + Result := TWindowPosition(position(PGtkWindow(FWidget)^)); +end; + +procedure TCustomGTKForm.SetWindowPosition(Value: TWindowPosition); +begin + gtk_window_set_position(PGtkWindow(FWidget), TGtkWindowPosition(Value)); +end; + +function TCustomGTKForm.GetResizeable: boolean; +begin + Result := gtk_window_get_resizable(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.SetResizeable(Value: Boolean); +begin + gtk_window_set_resizable(PGtkWindow(FWidget), Value); +end; + +procedure TCustomGTKForm.SetDefaultSize(DefaultWidth, DefaultHeight: integer); +begin + gtk_window_set_default_size(PGtkWindow(FWidget), DefaultWidth, DefaultHeight); +end; + +procedure TCustomGTKForm.SetTransientFor(Parent: TCustomGTKForm); +begin + if Assigned(Parent) and Assigned(Parent.FWidget) then + gtk_window_set_transient_for(PGtkWindow(FWidget), PGtkWindow(Parent.FWidget)); +end; + +procedure TCustomGTKForm.ShowModal; +begin + gtk_window_set_modal(PGtkWindow(FWidget), True); + if Assigned(Parent) and (Parent is TCustomGTKForm) then gtk_window_set_transient_for(PGtkWindow(FWidget), PGtkWindow(Parent.FWidget)); + SetVisible(True); +end; + +function TCustomGTKForm.GetWindowTypeHint: TGDKWindowTypeHint; +begin + Result := TGDKWindowTypeHint(gtk_window_get_type_hint(PGtkWindow(FWidget))); +end; + +procedure TCustomGTKForm.SetWindowTypeHint(Value: TGDKWindowTypeHint); +begin + gtk_window_set_type_hint(PGtkWindow(FWidget), gdk2.TGdkWindowTypeHint(Value)); +end; + +function TCustomGTKForm.GetWindowState: TGDKWindowState; +begin + Result := TGDKWindowState(gdk_window_get_state(PGdkWindow(FWidget^.window))); +end; + +procedure TCustomGTKForm.Maximize; +begin + gtk_window_maximize(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.Unmaximize; +begin + gtk_window_unmaximize(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.Minimize; +begin + gtk_window_iconify(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.Unminimize; +begin + gtk_window_deiconify(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.Stick; +begin + gtk_window_stick(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.Unstick; +begin + gtk_window_unstick(PGtkWindow(FWidget)); +end; + +procedure TCustomGTKForm.WindowMove(ALeft, ATop: integer); +begin + gtk_window_move(PGtkWindow(FWidget), ALeft, ATop); +end; + +function TCustomGTKForm.GetLeft: integer; +var PosLeft, PosTop: integer; +begin + gtk_window_get_position(PGtkWindow(FWidget), @PosLeft, @PosTop); + Result := PosLeft; +end; + +function TCustomGTKForm.GetTop: integer; +var PosLeft, PosTop: integer; +begin + gtk_window_get_position(PGtkWindow(FWidget), @PosLeft, @PosTop); + Result := PosTop; +end; + +function TCustomGTKForm.GetWidth: integer; +var AWidth, AHeight: integer; +begin + gtk_window_get_size(PGtkWindow(FWidget), @AWidth, @AHeight); + Result := AWidth; +end; + +function TCustomGTKForm.GetHeight: integer; +var AWidth, AHeight: integer; +begin + gtk_window_get_size(PGtkWindow(FWidget), @AWidth, @AHeight); + Result := AHeight; +end; + +procedure TCustomGTKForm.SetLeft(Value: integer); +begin + gtk_window_move(PGtkWindow(FWidget), Value, GetTop); +end; + +procedure TCustomGTKForm.SetTop(Value: integer); +begin + gtk_window_move(PGtkWindow(FWidget), GetLeft, Value); +end; + +procedure TCustomGTKForm.SetWidth(Value: integer); +begin + gtk_window_resize(PGtkWindow(FWidget), Value, GetHeight); +end; + +procedure TCustomGTKForm.SetHeight(Value: integer); +begin + gtk_window_resize(PGtkWindow(FWidget), GetWidth, Value); +end; + +procedure TCustomGTKForm.Resize(AWidth, AHeight: integer); +begin + gtk_window_resize(PGtkWindow(FWidget), AWidth, AHeight); +end; + +procedure TCustomGTKForm.SetDefault(Value: TGTKControl); +begin + gtk_window_set_default(PGtkWindow(FWidget), Value.FWidget); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKApplication.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FMainForm := nil; + FMainFormSet := False; + if not Assigned(Classes.ApplicationHandleException) then + Classes.ApplicationHandleException := HandleException; + if not Assigned(Classes.ApplicationShowException) then + Classes.ApplicationShowException := ShowException; + CreateHandle; + HookSynchronizeWakeup; +end; + +procedure my_g_thread_init(vtable:Pointer);cdecl;external 'libgthread-2.0.so' name 'g_thread_init'; + +procedure TGTKApplication.CreateHandle; +var + I: Integer; + Temp: string; + Ver : Pchar; +begin + Argc := ParamCount + 1; + Argv := AllocMem((Argc + 1) * SizeOf(PChar)); + for I := 0 to Argc - 1 do + begin + Temp := ParamStr(I); + {$R-} + PCharArray(Argv^)[I] := AllocMem(Length(Temp)+1); + StrCopy(PCharArray(Argv^)[I], PChar(Temp)); + {$R+} + end; + {$R-} + PCharArray(Argv^)[Argc] := nil; + {$R+} + + // Check for correct version of GTK+ library + Ver := gtk_check_version(2, 8, 0); + FGTK280Up := Ver = nil; + if not FGTK280Up then Ver := gtk_check_version(2, 6, 0); + FGTK260Up := Ver = nil; + if not FGTK260Up then Ver := gtk_check_version(2, 4, 0); + FGTK240Up := Ver = nil; + if not FGTK240Up then Ver := gtk_check_version(2, 2, 0); + FGTK220Up := Ver = nil; + if not FGTK220Up then Ver := gtk_check_version(2, 0, 5); + FGTK205Up := Ver = nil; + if not FGTK220Up then WriteLn('Warning: Your version of GTK+ is old and some workarounds has been activated. It is recommended to update GTK libraries at least to 2.2.0'); + if Ver <> nil then Ver := gtk_check_version(2, 0, 0); + if Ver <> nil then WriteLn('Warning: There might be some problems with GTK+ library or version conflict.'); + + // Init threads + my_g_thread_init(nil); + gdk_threads_init; + + // Initialize the widget set + gtk_init(@argc, @argv); +{ if not gtk_init_check(@argc, @argv) then begin + WriteLn('Unable to initialize GTK+ interface. Make sure you have correctly installed all of GTK libraries and have set a valid X server in the DISPLAY variable.'); + Halt(1); + end; } +end; + +destructor TGTKApplication.Destroy; +type + TExceptionEvent = procedure (E: Exception) of object; +var + P: TNotifyEvent; + E: TExceptionEvent; +begin + UnhookSynchronizeWakeup; + P := HandleException; + if @P = @Classes.ApplicationHandleException then + Classes.ApplicationHandleException := nil; + E := ShowException; + if @E = @Classes.ApplicationShowException then + Classes.ApplicationShowException := nil; + inherited Destroy; +end; + +procedure TGTKApplication.HookSynchronizeWakeup; +begin + if not Assigned(Classes.WakeMainThread) then + Classes.WakeMainThread := WakeMainThread; +end; + +procedure TGTKApplication.UnhookSynchronizeWakeup; +var + P: TNotifyEvent; +begin + P := WakeMainThread; + if @P = @Classes.WakeMainThread then + Classes.WakeMainThread := nil; +end; + +procedure TGTKApplication.HandleException(Sender: TObject); +begin + if ExceptObject is Exception then + begin + if not (ExceptObject is EAbort) then + if Assigned(FOnException) then + FOnException(Sender, Exception(ExceptObject)) + else + ShowException(Exception(ExceptObject)); + end else + SysUtils.ShowException(ExceptObject, ExceptAddr); +end; + +procedure TGTKApplication.CreateForm(InstanceClass: TComponentClass; var Reference); +var + Instance: TComponent; +begin + Instance := TComponent(InstanceClass.NewInstance); + TComponent(Reference) := Instance; + try + Instance.Create(Self); + except + TComponent(Reference) := nil; + raise; + end; + if not FMainFormSet and (Instance is TCustomGTKForm) then + begin + // FMainForm will be set to the first form created by TForm.Create but + // it will be reset by CreateForm if one was created early, such as through + // a splash screen. This allows applications that don't use CreateForm to + // still have a main form but preserve the semantics the first CreateForm + // being the main form. +{ TCustomGTKForm(Instance).HandleNeeded; } + FMainForm := TCustomGTKForm(Instance); +{ if TForm(Instance).ActiveControl = nil then + TForm(Instance).SetFocusedControl(TForm(Instance));} + FMainFormSet := True; + end; +end; + +procedure TGTKApplication.ControlDestroyed(Control: TGTKControl); +begin + if FMainForm = Control then FMainForm := nil; + if Screen.FActiveForm = Control then Screen.FActiveForm := nil; +end; + +procedure TGTKApplication.Initialize; +begin +end; + +// function GetCurrentThreadID: Integer; external 'libpthread.so.0' name 'pthread_self'; + +procedure TGTKApplication.ProcessMessages; +begin + while WordBool(gtk_events_pending) do gtk_main_iteration; + // QApplication_processEvents(Handle); +{ if GetCurrentThreadID = Integer(MainThreadID) then + CheckSynchronize; } +end; + +procedure TGTKApplication.HandleMessage; +begin +// QApplication_processOneEvent(Handle); +{ if GetCurrentThreadID = Integer(MainThreadID) then + CheckSynchronize; } +end; + +procedure TGTKApplication.Run; +begin + repeat + try +// gdk_threads_enter; + gtk_main; +// gdk_threads_leave; + except + on E : Exception do + if E is EControlC then begin + WriteLn('*** Exception: ', E.Message); + Halt(1); + Exit; + end else HandleException(E); + end; + until Terminated; +end; + +function TGTKApplication_MessageBox_key_press_event(widget: PGtkWidget; event: PGdkEventKey; user_data : gpointer): gboolean; cdecl; +begin + Result := False; + if event^.keyval = GDK_ESCAPE then begin + gtk_dialog_response(PGtkDialog(widget), integer(user_data)); +// Beep; + Result := True; + end; +end; + +function TGTKApplication.MessageBox(const Text: string; Buttons: TMessageButtons; Style: TMessageStyle; + Default, Escape: TMessageButton): TMessageButton; +const TMessageStyleID : array[0..3] of TGtkMessageType = (GTK_MESSAGE_ERROR, GTK_MESSAGE_INFO, GTK_MESSAGE_QUESTION, GTK_MESSAGE_WARNING); +var Dialog: PGtkWidget; + DialogParent: PGtkWindow; + i: integer; +begin + if Application.Terminated then + begin + Result := Escape; + Exit; + end; + if Screen.FormCount > 0 + then DialogParent := PGtkWindow(Screen.Forms[0].FWidget) + else DialogParent := nil; + Dialog := gtk_message_dialog_new(DialogParent, GTK_DIALOG_MODAL or GTK_DIALOG_DESTROY_WITH_PARENT, TMessageStyleID[Integer(Style)], + GTK_BUTTONS_NONE, StringToPgchar(Text)); + for i := 1 to NumMessageButtons do + if TMessageButton(i - 1) in Buttons + then gtk_dialog_add_button(PGtkDialog(Dialog), MessageButtonID[i], i); + if Escape <> mbNone then g_signal_connect(PGtkObject(Dialog), 'key-press-event', G_CALLBACK(@TGTKApplication_MessageBox_key_press_event), + Pointer(Ord(Escape) + 1{MessageButtonID[Ord(Escape)]})); + if Default <> mbNone then gtk_dialog_set_default_response(PGtkDialog(Dialog), Ord(Default)); + Result := TMessageButton(gtk_dialog_run(PGtkDialog(Dialog)) - 1); + gtk_widget_destroy(Dialog); +end; + +procedure TGTKApplication.ShowException(E: Exception); +var Msg: string; +begin + Msg := E.Message; + if (Msg <> '') and (AnsiLastChar(Msg) = '.') then Delete(Msg, Length(Msg), 1); + MessageBox(Format('An unhandled exception has occured: '#10' %s'#10#10'It is strongly recommended to save your data and quit the application.', [Msg]), [mbOk], mbError); +end; + +procedure TGTKApplication.Terminate; +begin + if (not Application.Terminated) and CallTerminateProcs then begin + FTerminated := True; + Quit; + end; +end; + +procedure TGTKApplication.Quit; +begin + gtk_main_quit(); +{ // The user lost interest + gtk_exit(0); } +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKForm.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_add_accel_group(PGtkWindow(FWidget), FAccelGroup); + g_signal_connect(PGtkObject(FWidget), 'delete-event', G_CALLBACK(@TCustomGTKForm_delete_event), Self); + g_signal_connect(PGtkObject(FWidget), 'size-allocate', G_CALLBACK(@TCustomGTKForm_size_allocate), Self); + g_signal_connect(PGtkObject(FWidget), 'show', G_CALLBACK(@TCustomGTKForm_show), Self); + Visible := False; + SetResizeable(True); + FormCreate(Self); + if Visible then Show; +end; + +procedure TGTKForm.Hide; +begin + SetVisible(False); +end; + +procedure TGTKForm.Show; +begin + SetVisible(True); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGTKDialog_response_event(dialog: PGtkDialog; arg1: gint; user_data: gpointer); cdecl; +begin + if Assigned(TGTKDialog(user_data).FOnResponse) then TGTKDialog(user_data).FOnResponse(TGTKDialog(user_data), arg1); +end; + +constructor TGTKDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_dialog_new; + if Assigned(AOwner) and (AOwner is TCustomGTKForm) then SetTransientFor(AOwner as TCustomGTKForm); + FOnResponse := nil; + gtk_window_add_accel_group(PGtkWindow(FWidget), FAccelGroup); + g_signal_connect(PGtkObject(FWidget), 'delete-event', G_CALLBACK(@TCustomGTKForm_delete_event), Self); + g_signal_connect(PGtkObject(FWidget), 'show', G_CALLBACK(@TCustomGTKForm_show), Self); + g_signal_connect(PGtkObject(FWidget), 'response', G_CALLBACK(@TGTKDialog_response_event), Self); + ClientArea := TGTKVBox.CreateLinked(Self, PGtkDialog(FWidget)^.vbox); + ActionArea := TGTKHBox.CreateLinked(Self, PGtkDialog(FWidget)^.action_area); + FButtons := []; + Visible := False; + SetResizeable(True); + FormCreate(Self); + if Visible then Show; +end; + +function TGTKDialog.Run: TMessageButton; +begin + gtk_widget_show{_all}(FWidget); + Result := TMessageButton(gtk_dialog_run(PGtkDialog(FWidget))); +end; + +procedure TGTKDialog.SetButtons(Value: TMessageButtons); +var i: integer; +begin + for i := 1 to NumMessageButtons do + if TMessageButton(i - 1) in Value + then gtk_dialog_add_button(PGtkDialog(FWidget), MessageButtonID[i], i - 1); +end; + +function TGTKDialog.GetShowSeparator: boolean; +begin + Result := gtk_dialog_get_has_separator(PGtkDialog(FWidget)); +end; + +procedure TGTKDialog.SetShowSeparator(Value: boolean); +begin + gtk_dialog_set_has_separator(PGtkDialog(FWidget), Value); +end; + +procedure TGTKDialog.SetModalResult(Value: TMessageButton); +begin + gtk_dialog_response(PGtkDialog(FWidget), Integer(Value)); +end; + +procedure TGTKDialog.SetDefaultButton(Value: TMessageButton); +begin + gtk_dialog_set_default_response(PGtkDialog(FWidget), Integer(Value)); +end; + +procedure TGTKDialog.AddButton(ButtonCaption: string; ButtonID: integer); +begin + gtk_dialog_add_button(PGtkDialog(FWidget), StringToPgchar(ButtonCaption), ButtonID); +end; + +procedure TGTKDialog.SetResponseSensitive(ButtonID: integer; Sensitive: boolean); +begin + gtk_dialog_set_response_sensitive(PGtkDialog(FWidget), ButtonID, Sensitive); +end; + +procedure TGTKDialog.SetParentForm(Value: TGTKForm); +begin + if Value <> nil then gtk_window_set_transient_for(PGtkWindow(FWidget), PGtkWindow(Value.FWidget)); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function GetParentForm(Control: TGTKControl): TCustomGTKForm; +begin + while Control.Parent <> nil do Control := Control.Parent; + if Control is TCustomGTKForm then + Result := TCustomGTKForm(Control) else + Result := nil; +end; + +initialization + Screen := TGDKScreen.Create(nil); + Application := TGTKApplication.Create(Screen); +finalization + Application.Free; + Screen.Free; +end. diff --git a/libgtk_kylix/GTKMenus.pas b/libgtk_kylix/GTKMenus.pas new file mode 100644 index 0000000..2b6e190 --- /dev/null +++ b/libgtk_kylix/GTKMenus.pas @@ -0,0 +1,530 @@ +(* + GTK-Kylix Library: GTKMenus - Menu handling and related routines + Version 0.6.13 (last updated 2003-07-10) + Copyright (C) 2003 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKMenus; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, GTKControls, GTKConsts, GTKUtils, GTKPixbuf; + // Quick jump: QForms QControls QMenus + + +type +(****************************************** TGDKSHORTCUTS ***********************************************************************) + TGDKShortCut = record + Key: word; + Locked: boolean; + ModAlt: boolean; + ModShift: boolean; + ModCtrl: boolean; + end; + TGDKShortCuts = class(TComponent) + private + FList: TList; + FOwner: TGTKControl; + function GetCount: Integer; + function GetItem(Index: Integer): TGDKShortCut; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Add(Item: TGDKShortCut); + procedure AddName(Item: string); + procedure Clear; + procedure Delete(Index: Integer); + procedure Insert(Index: Integer; Item: TGDKShortCut); + function IndexOf(Item: TGDKShortCut): Integer; + property Count: Integer read GetCount; + property Items[Index: Integer]: TGDKShortCut read GetItem; default; + end; + +(****************************************** TGTKMENUITEM ************************************************************************) + TGTKMenuItemType = (itLabel, itSeparator, itTearOff, itCheck, itImageText, itRadio); + TGTKMenuItemGroup = PGSList; + TGTKMenuItem = class(TGTKBin) + private + FItems: TList; + FTearOffTitle: string; + FOnClick: TNotifyEvent; + FUKey: guint; + FItemType: TGTKMenuItemType; + FNotify: TNotifyEvent; + FImageWidget: PGtkWidget; + FData: Pointer; + FOnPopup: TNotifyEvent; + function GetCount: Integer; + function GetItem(Index: Integer): TGTKMenuItem; + function GetCaption: string; + function GetRightJustified: boolean; + function GetTornOff: boolean; + function GetChecked: boolean; + function GetGroup: TGTKMenuItemGroup; + procedure SetCaption(Value: string); + procedure SetTearOffTitle(Value: string); + procedure SetRightJustified(Value: boolean); + procedure SetItemType(Value: TGTKMenuItemType); + procedure SetTornOff(Value: boolean); + procedure SetChecked(Value: boolean); + procedure SetStockIcon(Value: string); + procedure SetIcon(Value: TGDKPixbuf); + procedure SetGroup(Value: TGTKMenuItemGroup); + protected + public + FMenu: PGtkWidget; + FParentMenu: TGTKControl; + ShortCuts: TGDKShortCuts; + constructor Create(AOwner: TComponent); override; + constructor CreateTyped(AOwner: TComponent; const ItemType: TGTKMenuItemType; AGroup: TGTKMenuItemGroup = nil); + destructor Destroy; override; + procedure Recreate(AGroup: TGTKMenuItemGroup = nil); + procedure Add(Item: TGTKMenuItem); + procedure Clear; + procedure Delete(Index: Integer); + procedure Insert(Index: Integer; Item: TGTKMenuItem); + procedure TearOff; + procedure UnTearOff; + procedure PopUp; + procedure PopDown; + procedure SetCaptionPlain(Value: string); + property Count: Integer read GetCount; + property Items[Index: Integer]: TGTKMenuItem read GetItem; default; + property Caption: string read GetCaption write SetCaption; + property TearOffTitle: string read FTearOffTitle write SetTearOffTitle; + property RightJustified: boolean read GetRightJustified write SetRightJustified default False; + property OnClick: TNotifyEvent read FOnClick write FOnClick; + property ItemType: TGTKMenuItemType read FItemType write SetItemType default itLabel; + property TornOff: boolean read GetTornOff write SetTornOff; + property Checked: boolean read GetChecked write SetChecked; + property Notify: TNotifyEvent read FNotify write FNotify; + property StockIcon: string write SetStockIcon; + property Icon: TGDKPixbuf write SetIcon; + property Data: Pointer read FData write FData; + property OnPopup: TNotifyEvent read FOnPopup write FOnPopup; + property Group: TGTKMenuItemGroup read GetGroup write SetGroup; + end; + + +(****************************************** TGTKMENUBAR *************************************************************************) + TGTKMenuBar = class(TGTKContainer) + private + FItems: TGTKMenuItem; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Items: TGTKMenuItem read FItems; + end; + + +function MakeGDKShortCut(Key: word; Locked, ModAlt, ModShift, ModCtrl : boolean): TGDKShortCut; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses GTKForms, GTKExtCtrls; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKMenuBar.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_menu_bar_new; + Show; + FItems := TGTKMenuItem.Create(Self); + FItems.FParentMenu := Self; +end; + +destructor TGTKMenuBar.Destroy; +begin + if Assigned(FItems) then FItems.Free; + inherited Destroy; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGTKMenuItem_activate(menuitem : PGtkMenuItem; user_data: pgpointer); cdecl; +begin + if Assigned(TGTKMenuItem(user_data).FOnClick) then TGTKMenuItem(user_data).FOnClick(TGTKMenuItem(user_data)); +end; + +constructor TGTKMenuItem.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FItemType := itLabel; + FImageWidget := nil; + FItems := nil; + FMenu := nil; + FOnClick := nil; + FWidget := nil; + FParentMenu := nil; + FNotify := nil; + FData := nil; + FOnPopup := nil; + ShortCuts := TGDKShortCuts.Create(Self); + FTearOffTitle := ''; + FUKey := 0; + Recreate; +end; + +constructor TGTKMenuItem.CreateTyped(AOwner: TComponent; const ItemType: TGTKMenuItemType; AGroup: TGTKMenuItemGroup = nil); +begin + inherited Create(AOwner); + FItemType := ItemType; + FImageWidget := nil; + FItems := nil; + FMenu := nil; + FOnClick := nil; + FWidget := nil; + FParentMenu := nil; + FNotify := nil; + FData := nil; + ShortCuts := TGDKShortCuts.Create(Self); + FTearOffTitle := ''; + FUKey := 0; + Recreate(AGroup); +end; + +destructor TGTKMenuItem.Destroy; +begin + if not (csDestroying in ComponentState) then begin + ShortCuts.Free; + if FItems <> nil then begin + Clear; + FItems.Free; + FItems := nil; + end; + end; + inherited Destroy; +end; + +procedure TGTKMenuItem.Recreate(AGroup: TGTKMenuItemGroup = nil); +begin + if Assigned(FWidget) then begin + gtk_widget_unparent(FWidget); + gtk_widget_hide(FWidget); + gtk_widget_destroy(FWidget); + end; + case FItemType of + itLabel: FWidget := gtk_menu_item_new_with_mnemonic(Pgchar(SCDefaultMenuItemCaption)); + itSeparator: FWidget := gtk_menu_item_new; + itTearOff: FWidget := gtk_tearoff_menu_item_new; + itCheck: FWidget := gtk_check_menu_item_new_with_mnemonic(Pgchar(SCDefaultMenuItemCaption)); + itImageText: begin + FWidget := gtk_image_menu_item_new_with_mnemonic(Pgchar(SCDefaultMenuItemCaption)); + FImageWidget := gtk_image_new; + gtk_widget_show(FImageWidget); + gtk_image_menu_item_set_image(PGtkImageMenuItem(FWidget), FImageWidget); + end; + itRadio: FWidget := gtk_radio_menu_item_new_with_mnemonic(AGroup, Pgchar(SCDefaultMenuItemCaption)); + end; + g_signal_connect(PGtkObject(FWidget), 'activate', G_CALLBACK(@TGTKMenuItem_activate), Self); + Show; +end; + +procedure TGTKMenuItem.Add(Item: TGTKMenuItem); +begin + Insert(GetCount, Item); +end; + +procedure TGTKMenuItem.Clear; +var i: Integer; +begin + if Count > 0 then + for i := Count - 1 downto 0 do Delete(i); +end; + +function TGTKMenuItem.GetCount: Integer; +begin + if FItems = nil then Result := 0 + else Result := FItems.Count; +end; + +function TGTKMenuItem.GetItem(Index: Integer): TGTKMenuItem; +begin + Result := nil; + if FItems = nil then Exit; + Result := FItems[Index]; +end; + +procedure TGTKMenuItem.Delete(Index: Integer); +begin + if (Index < 0) or (FItems = nil) or (Index >= GetCount) then Exit; + if FParentMenu is TGTKMenuBar + then gtk_container_remove(PGtkContainer(Parent.FWidget), TGTKMenuItem(FItems[Index]).FWidget) + else gtk_container_remove(PGtkContainer(FMenu), TGTKMenuItem(FItems[Index]).FWidget); +// Items[Index].Free; + FItems.Delete(Index); + if FItems.Count = 0 then begin + if (FParentMenu is TGTKMenuItem) or (FParentMenu is TGTKMenuBar) + then begin + if (FParentMenu is TGTKMenuItem) or (FParentMenu is TGTKMenuBar) + then gtk_menu_item_remove_submenu(PGtkMenuItem(FWidget)); + gtk_widget_destroy(FMenu); + FMenu := nil; + end; + FItems.Free; + FItems := nil; + end; + if Assigned(Notify) then Notify(Self); +end; + +procedure TGTKMenuItem.Insert(Index: Integer; Item: TGTKMenuItem); +begin + if (Item = Self) or (FItemType in [itSeparator, itTearOff]) then Exit; + if FItems = nil then begin + FItems := TList.Create; + if FMenu = nil then FMenu := gtk_menu_new; + if (FParentMenu is TGTKMenuItem) or (FParentMenu is TGTKMenuBar) + then gtk_menu_item_set_submenu(PGtkMenuItem(FWidget), FMenu); + SetTearOffTitle(FTearOffTitle); + end; + Item.FParentMenu := Self; + FItems.Insert(Index, Item); + if FParentMenu is TGTKMenuBar + then gtk_menu_shell_insert(PGtkMenuShell(FParentMenu.FWidget), Item.FWidget, Index) + else gtk_menu_shell_insert(PGtkMenuShell(FMenu), Item.FWidget, Index); + if Assigned(Notify) then Notify(Self); +end; + +function TGTKMenuItem.GetCaption: string; +begin + Result := ''; + if FItemType in [itSeparator, itTearOff] then Exit; + if Assigned(ChildControl) then Result := PgcharToString(gtk_label_get_text(PGtkLabel(ChildControl))); +end; + +procedure TGTKMenuItem.SetCaption(Value: string); +begin + if FItemType in [itSeparator, itTearOff] then Exit; + gtk_label_set_markup_with_mnemonic(PGtkLabel(ChildControl), StringToPgchar(Value)); + if FTearOffTitle = '' then SetTearOffTitle(Value); +end; + +procedure TGTKMenuItem.SetCaptionPlain(Value: string); +begin + if FItemType in [itSeparator, itTearOff] then Exit; + gtk_label_set_markup(PGtkLabel(ChildControl), StringToPgchar(Value)); + if FTearOffTitle = '' then SetTearOffTitle(Value); +end; + +procedure TGTKMenuItem.SetTearOffTitle(Value: string); +begin + FTearOffTitle := Value; + if FItemType = itTearOff then begin + if Assigned(FParentMenu) and (FParentMenu is TGTKMenuItem) and Assigned((FParentMenu as TGTKMenuItem).FMenu) + then gtk_menu_set_title(PGtkMenu((FParentMenu as TGTKMenuItem).FMenu), StringToPgchar(FTearOffTitle)) + end else if Assigned(FMenu) then gtk_menu_set_title(PGtkMenu(FMenu), StringToPgchar(FTearOffTitle)); + end; + +function TGTKMenuItem.GetRightJustified: boolean; +begin + Result := False; + if FItemType in [itSeparator, itTearOff] then Exit; + Result := gtk_menu_item_get_right_justified(PGtkMenuItem(FWidget)); +end; + +procedure TGTKMenuItem.SetRightJustified(Value: boolean); +begin + if FItemType in [itSeparator, itTearOff] then Exit; + gtk_menu_item_set_right_justified(PGtkMenuItem(FWidget), Value); +end; + + procedure TGTKMenuItem.SetItemType(Value: TGTKMenuItemType); + begin + if Value <> FItemType then begin + FItemType := Value; + Recreate; + end; + end; + + function TGTKMenuItem.GetTornOff: boolean; + begin + if FItemType = itTearOff then Result := Boolean(torn_off(PGTKTearOffMenuItem(FWidget)^)) else + if Assigned(FMenu) and (Count > 0) then Result := Boolean(torn_off(PGTKMenu(FMenu)^)) + else Result := False; + end; + + procedure TGTKMenuItem.SetTornOff(Value: boolean); + begin + if FItemType = itTearOff then begin + if Assigned(FParentMenu) and (FParentMenu is TGTKMenuItem) and Assigned((FParentMenu as TGTKMenuItem).FMenu) + then gtk_menu_set_tearoff_state(PGtkMenu((FParentMenu as TGTKMenuItem).FMenu), Value); + end else if Assigned(FMenu) then gtk_menu_set_tearoff_state(PGtkMenu(FMenu), Value); + end; + + procedure TGTKMenuItem.TearOff; + begin + SetTornOff(True); + end; + + procedure TGTKMenuItem.UnTearOff; +begin + SetTornOff(False); + end; + + function TGTKMenuItem.GetChecked: boolean; + begin + Result := False; + if (FItemType = itCheck) or (FItemType = itRadio) then + Result := Boolean(active(PGtkCheckMenuItem(FWidget)^)); + end; + + procedure TGTKMenuItem.SetChecked(Value: boolean); + begin + if (FItemType = itCheck) or (FItemType = itRadio) then + gtk_check_menu_item_set_active(PGtkCheckMenuItem(FWidget), Value); + end; + + procedure TGTKMenuItem.PopUp; + begin + if FItems.Count > 0 then gtk_menu_popup(PGtkMenu(FMenu), nil, nil, nil, nil, 3, 0); +end; + + procedure TGTKMenuItem.PopDown; + begin + if FItems.Count > 0 then gtk_menu_popdown(PGtkMenu(FMenu)); +end; + +procedure TGTKMenuItem.SetStockIcon(Value: string); +begin + gtk_image_set_from_stock(PGtkImage(FImageWidget), PChar(Value), GTK_ICON_SIZE_MENU); +end; + +procedure TGTKMenuItem.SetIcon(Value: TGDKPixbuf); +begin + gtk_image_set_from_pixbuf(PGtkImage(FImageWidget), Value.FPixbuf); +end; + +function TGTKMenuItem.GetGroup: TGTKMenuItemGroup; +begin + Result := gtk_radio_menu_item_get_group(PGtkRadioMenuItem(FWidget)); +end; + +procedure TGTKMenuItem.SetGroup(Value: TGTKMenuItemGroup); +begin + gtk_radio_menu_item_set_group(PGtkRadioMenuItem(FWidget), Value); +end; + +(********************************************************************************************************************************) + (********************************************************************************************************************************) +constructor TGDKShortCuts.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FList := TList.Create; + FOwner := TGTKControl(AOwner); +end; + +destructor TGDKShortCuts.Destroy; +begin + if not (csDestroying in ComponentState) then Clear; + inherited Destroy; +end; + +function TGDKShortCuts.GetCount: Integer; +begin + Result := FList.Count; +end; + +procedure TGDKShortCuts.Add(Item: TGDKShortCut); +begin + Insert(GetCount, Item); +end; + +procedure TGDKShortCuts.AddName(Item: string); +var Key, Modifiers: guint; +begin + gtk_accelerator_parse(StringToPgchar(Item), @Key, @Modifiers); + if Key <> 0 then Add(MakeGDKShortCut(Key, False, Modifiers and GDK_MOD1_MASK = GDK_MOD1_MASK, Modifiers and GDK_SHIFT_MASK = GDK_SHIFT_MASK, Modifiers and GDK_CONTROL_MASK = GDK_CONTROL_MASK)); +end; + +procedure TGDKShortCuts.Clear; +var i: Integer; +begin + for i := Count - 1 downto 0 do Delete(i); +end; + +function GetAccelMods(SC: TGDKShortCut): guint; +begin + Result := 0; + if SC.ModShift then Inc(Result, GDK_SHIFT_MASK); + if SC.ModCtrl then Inc(Result, GDK_CONTROL_MASK); + if SC.ModAlt then Inc(Result, GDK_MOD1_MASK); +end; + +function GetAccelFlags(SC: TGDKShortCut): TGtkAccelFlags; +begin + Result := GTK_ACCEL_VISIBLE; + if SC.Locked then Result := GTK_ACCEL_LOCKED; +end; + +procedure TGDKShortCuts.Delete(Index: Integer); +begin + if (Index < 0) or (FList = nil) or (Index >= GetCount) then Exit; + if (GetParentForm(FOwner) <> nil) and (not (csDestroying in ComponentState)) + then gtk_widget_remove_accelerator(FOwner.FWidget, GetParentForm(FOwner).FAccelGroup, TGDKShortCut(FList[Index]^).Key, GetAccelMods(TGDKShortCut(FList[Index]^))); + FList.Delete(Index); +end; + +procedure TGDKShortCuts.Insert(Index: Integer; Item: TGDKShortCut); +begin + FList.Insert(Index, @Item); + if GetParentForm(FOwner) <> nil + then gtk_widget_add_accelerator(FOwner.FWidget, 'activate', GetParentForm(FOwner).FAccelGroup, Item.Key, GetAccelMods(Item), GetAccelFlags(Item)); +end; + +function TGDKShortCuts.GetItem(Index: Integer): TGDKShortCut; +begin + Result := TGDKShortCut(FList[Index]^); +end; + +function TGDKShortCuts.IndexOf(Item: TGDKShortCut): Integer; +var i : integer; +begin + Result := -1; + if FList.Count > 0 then + for i := 0 to FList.Count - 1 do + if (TGDKShortCut(FList[i]^).Key = Item.Key) and (TGDKShortCut(FList[i]^).Locked = Item.Locked) and + (TGDKShortCut(FList[i]^).ModAlt = Item.ModAlt) and (TGDKShortCut(FList[i]^).ModShift = Item.ModShift) and + (TGDKShortCut(FList[i]^).ModCtrl = Item.ModCtrl) then + begin + Result := i; + Break; + end; +end; + +function MakeGDKShortCut(Key: word; Locked, ModAlt, ModShift, ModCtrl : boolean): TGDKShortCut; +begin + Result.Key := Key; + Result.Locked := Locked; + Result.ModAlt := ModAlt; + Result.ModShift := ModShift; + Result.ModCtrl := ModCtrl; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + +end. diff --git a/libgtk_kylix/GTKPixbuf.pas b/libgtk_kylix/GTKPixbuf.pas new file mode 100644 index 0000000..d895071 --- /dev/null +++ b/libgtk_kylix/GTKPixbuf.pas @@ -0,0 +1,214 @@ +(* + GTK-Kylix Library: GTKPixbuf - Image handling routines + Version 0.6.2 (last updated 2003-03-30) + Copyright (C) 2003 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKPixbuf; +{ $WEAKPACKAGEUNIT} + +interface + +uses glib2, gdk2, gdk2pixbuf, gtk2, Classes, GTKControls, GTKStdCtrls; + + +type + TGTKIconSize = (isInvalid, isMenu, isSmallToolbar, isLargeToolbar, isButton, isDND, isDialog); + +(****************************************** TGDKPIXBUF **************************************************************************) + TGDKPixbuf = class (TComponent) + private + function GetWidth: integer; + function GetHeight: integer; + function GetBPP: integer; + protected + public + FPixbuf: PGdkPixbuf; + constructor Create(AOwner: TComponent); override; + constructor CreateNew(AOwner: TComponent; const Width, Height, BPP: integer; const HasAlpha: boolean); + destructor Destroy; override; + function LoadFromFile(const FileName: string): boolean; + function LoadFromXPM(const Data: PPChar): boolean; + function LoadFromInline(Data: Pointer): boolean; + procedure Fill(const Pixel: Cardinal); + procedure ScaleSimple(const DestWidth, DestHeight: integer); + function Copy: PGdkPixbuf; + procedure CopyArea(Source: TGDKPixbuf; SourceX, SourceY, SourceWidth, SourceHeight, DestX, DestY: integer); + procedure SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); + published + property Width: integer read GetWidth; + property Height: integer read GetHeight; + property BPP: integer read GetBPP; + end; + +(****************************************** TGTKIMAGE ***************************************************************************) + TGTKImage = class(TGTKMisc) + private + protected + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure LoadFromFile(const FileName: string); + procedure SetFromPixbuf(Pixbuf: TGDKPixbuf); + function GetPixbuf: PGdkPixbuf; + procedure CopyFromPixbuf(Pixbuf: TGDKPixbuf); + procedure SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); + end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses SysUtils, DateUtils; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGDKPixbuf.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FPixbuf := nil; +end; + +constructor TGDKPixbuf.CreateNew(AOwner: TComponent; const Width, Height, BPP: integer; const HasAlpha: boolean); +begin + inherited Create(AOwner); + FPixbuf := gdk_pixbuf_new(GDK_COLORSPACE_RGB, HasAlpha, BPP, Width, Height); +end; + +destructor TGDKPixbuf.Destroy; +begin + if FPixbuf <> nil then gdk_pixbuf_unref(FPixbuf); + inherited Destroy; +end; + +function TGDKPixbuf.GetWidth: integer; +begin + Result := gdk_pixbuf_get_width(FPixbuf); +end; + +function TGDKPixbuf.GetHeight: integer; +begin + Result := gdk_pixbuf_get_height(FPixbuf); +end; + +function TGDKPixbuf.GetBPP: integer; +begin + Result := gdk_pixbuf_get_bits_per_sample(FPixbuf); +end; + +function TGDKPixbuf.LoadFromFile(const FileName: string): boolean; +var P: Pointer; + Error: PGError; +begin + Error := nil; + P := gdk_pixbuf_new_from_file(PChar(FileName), @Error); + Result := P <> nil; + if P <> nil then FPixbuf := P; +end; + +function TGDKPixbuf.LoadFromXPM(const Data: PPChar): boolean; +var P: Pointer; +begin + P := gdk_pixbuf_new_from_xpm_data(Data); + Result := P <> nil; + if P <> nil then FPixbuf := P; +end; + +function TGDKPixbuf.LoadFromInline(Data: Pointer): boolean; +var P: Pointer; + Error: PGError; +begin + Error := nil; + P := gdk_pixbuf_new_from_inline(-1, Pguint8(Data)^, True, @Error); + Result := P <> nil; + if Error <> nil then begin + WriteLn('TGDKPixbuf.LoadFromInline error: ', Error^.message); + g_error_free(Error); + end; + if P <> nil then FPixbuf := P; +end; + +procedure TGDKPixbuf.Fill(const Pixel: Cardinal); +begin + gdk_pixbuf_fill(FPixbuf, Pixel); +end; + +procedure TGDKPixbuf.ScaleSimple(const DestWidth, DestHeight: integer); +begin + FPixbuf := gdk_pixbuf_scale_simple(FPixbuf, DestWidth, DestHeight, GDK_INTERP_BILINEAR); +end; + +function TGDKPixbuf.Copy: PGdkPixbuf; +begin + Result := gdk_pixbuf_copy(FPixbuf); +end; + +procedure TGDKPixbuf.CopyArea(Source: TGDKPixbuf; SourceX, SourceY, SourceWidth, SourceHeight, DestX, DestY: integer); +begin + gdk_pixbuf_copy_area(Source.FPixbuf, SourceX, SourceY, SourceWidth, SourceHeight, FPixbuf, DestX, DestY); +end; + +procedure TGDKPixbuf.SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); +begin + FPixbuf := gtk_widget_render_icon(gtk_label_new(nil), PChar(Stock_ID), Ord(IconSize), nil); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKImage.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_image_new; + Show; +end; + +destructor TGTKImage.Destroy; +begin + inherited Destroy; +end; + +procedure TGTKImage.LoadFromFile(const FileName: string); +begin + gtk_image_set_from_file(PGtkImage(FWidget), PChar(FileName)); +end; + +function TGTKImage.GetPixbuf: PGdkPixbuf; +begin + Result := gtk_image_get_pixbuf(PGtkImage(FWidget)); +end; + +procedure TGTKImage.SetFromPixbuf(Pixbuf: TGDKPixbuf); +begin + gtk_image_set_from_pixbuf(PGtkImage(FWidget), Pixbuf.FPixbuf); +end; + +procedure TGTKImage.CopyFromPixbuf(Pixbuf: TGDKPixbuf); +begin + gtk_image_set_from_pixbuf(PGtkImage(FWidget), Pixbuf.Copy); +end; + +procedure TGTKImage.SetFromStock(Stock_ID: string; IconSize: TGTKIconSize); +begin + gtk_image_set_from_stock(PGtkImage(FWidget), PChar(Stock_ID), Ord(IconSize)); +end; + +(********************************************************************************************************************************) +end. diff --git a/libgtk_kylix/GTKStdCtrls.pas b/libgtk_kylix/GTKStdCtrls.pas new file mode 100644 index 0000000..1d4157a --- /dev/null +++ b/libgtk_kylix/GTKStdCtrls.pas @@ -0,0 +1,1008 @@ +(* + GTK-Kylix Library: GTKStdCtrls - Standard visual controls (such as buttons, labels, entry) + Version 0.6.23 (last updated 2007-12-08) + Copyright (C) 2007 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKStdCtrls; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, GTKControls, GTKConsts, GTKClasses; + // Quick jump: QForms QControls QStdCtrls + + +type + +(****************************************** TGTKBUTTON **************************************************************************) + TGTKBorderStyle = (bsNormal, bsHalf, bsNone); + TGTKButton = class(TGTKBin) + private + FOnClick: TNotifyEvent; + function GetCaption: string; + function GetUseStock: boolean; + function GetUseUnderline: boolean; + function GetBorderStyle: TGTKBorderStyle; + procedure SetCaption(Value: string); + procedure SetUseStock(Value: boolean); + procedure SetUseUnderline(Value: boolean); + procedure SetBorderStyle(Value: TGTKBorderStyle); + public + constructor Create(AOwner: TComponent); override; + constructor CreateFromStock(AOwner: TComponent; const StockID: PChar); + destructor Destroy; override; + published + property Caption: string read GetCaption write SetCaption; + property OnClick: TNotifyEvent read FOnClick write FOnClick; + property UseStock: boolean read GetUseStock write SetUseStock; + property UseUnderline: boolean read GetUseUnderline write SetUseUnderline; + property BorderStyle: TGTKBorderStyle read GetBorderStyle write SetBorderStyle; + end; + +(****************************************** TGTKMISC ****************************************************************************) + TGTKMisc = class(TGTKControl) + private + function GetXAlign: Single; + function GetYAlign: Single; + function GetXPadding: integer; + function GetYPadding: integer; + procedure SetXAlign(Value: Single); + procedure SetYAlign(Value: Single); + procedure SetXPadding(Value: integer); + procedure SetYPadding(Value: integer); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure SetAlignment(XAlign, YAlign : Single); + procedure SetPadding(XPadding, YPadding : integer); + published + property XAlign: Single read GetXAlign write SetXAlign; + property YAlign: Single read GetYAlign write SetYAlign; + property XPadding: integer read GetXPadding write SetXPadding; + property YPadding: integer read GetYPadding write SetYPadding; + end; + +(****************************************** TGTKLABEL **************************************************************************) + TGTKAlignment = (taLeftJustify, taRightJustify, taCenter, taFill); + TGTKLabel = class(TGTKMisc) + private + FLinked: boolean; + function GetCaption: string; + function GetAlignment: TGTKAlignment; + function GetUseMarkup: boolean; + function GetLineWrap: boolean; + function GetUseUnderline: boolean; + function GetSelectable: boolean; + procedure SetCaption(Value: string); + procedure SetAlignment(Value: TGTKAlignment); + procedure SetUseMarkup(Value: boolean); + procedure SetLineWrap(Value: boolean); + procedure SetUseUnderline(Value: boolean); + procedure SetFocusControl(Value: TGTKControl); + procedure SetSelectable(Value: boolean); + public + constructor Create(AOwner: TComponent); override; + constructor CreateFromWidget(AOwner: TComponent; Widget: PGtkWidget); + destructor Destroy; override; + procedure SetMarkup(const Text: string); + published + property Caption: string read GetCaption write SetCaption; + property Alignment: TGTKAlignment read GetAlignment write SetAlignment; + property UseMarkup: boolean read GetUseMarkup write SetUseMarkup; + property LineWrap: boolean read GetLineWrap write SetLineWrap; + property UseUnderline: boolean read GetUseUnderline write SetUseUnderline; + property FocusControl: TGTKControl write SetFocusControl; + property Selectable: boolean read GetSelectable write SetSelectable; + end; + +(****************************************** TGTKTOGGLEBUTTON ********************************************************************) + TGTKToggleButton = class(TGTKButton) + private + FOnToggled: TNotifyEvent; + function GetCaption: string; + function GetChecked: boolean; + function GetDrawIndicator: boolean; + function GetInconsistent: boolean; + procedure SetCaption(Value: string); + procedure SetChecked(Value: boolean); + procedure SetDrawIndicator(Value: boolean); + procedure SetInconsistent(Value: boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Caption: string read GetCaption write SetCaption; + property Checked: boolean read GetChecked write SetChecked; + property DrawIndicator: boolean read GetDrawIndicator write SetDrawIndicator; + property OnToggled: TNotifyEvent read FOnToggled write FOnToggled; + property Inconsistent: boolean read GetInconsistent write SetInconsistent; + property UseUnderline; + end; + +(****************************************** TGTKCHECKBUTTON *********************************************************************) + TGTKCheckButton = class(TGTKToggleButton) + public + constructor Create(AOwner: TComponent); override; + constructor CreateWithLabel(AOwner: TComponent; const ALabel: string); + destructor Destroy; override; + published + property Caption; + property Checked; + property DrawIndicator; + property OnToggled; + property UseUnderline; + end; + +(****************************************** TGTKRADIOBUTTON *********************************************************************) + TGTKRadioButton = class(TGTKToggleButton) + public + constructor Create(AOwner: TComponent); override; + constructor CreateWithLabel(AOwner: TComponent; const ALabel: string); + destructor Destroy; override; + procedure SetRadioGroup(RadioButton: TGTKRadioButton); + published + property Caption; + property Checked; + property DrawIndicator; + property OnToggled; + end; + +(****************************************** TGTKFRAME ***************************************************************************) + TGTKFrame = class(TGTKBin) + private + function GetCaption: string; + function GetShadowType: TGTKShadowType; + procedure SetCaption(Value: string); + procedure SetShadowType(Value: TGTKShadowType); + public + constructor Create(AOwner: TComponent); override; + constructor CreateWithoutLabel(AOwner: TComponent); + destructor Destroy; override; + published + property Caption: string read GetCaption write SetCaption; + property ShadowType: TGTKShadowType read GetShadowType write SetShadowType; + end; + +(****************************************** TGTKEDITABLE ************************************************************************) + TGTKEditable = class(TGTKControl) + private + FOnChanged: TNotifyEvent; + function GetEditable: boolean; + function GetPosition: integer; + procedure SetEditable(Value: boolean); + procedure SetPosition(Value: integer); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure CutClipboard; + procedure CopyClipboard; + procedure PasteClipboard; + procedure DeleteSelection; + procedure SelectRegion(StartPosition, EndPosition: integer); + procedure InsertText(AText: string; Position: integer); + procedure DeleteText(StartPosition, EndPosition: integer); + function GetChars(StartPosition, EndPosition: integer): string; + published + property Editable: boolean read GetEditable write SetEditable; + property CursorPosition: integer read GetPosition write SetPosition; + property OnChanged: TNotifyEvent read FOnChanged write FOnChanged; + end; + +(****************************************** TGTKENTRY ************************************************************************) + TGTKEntry = class(TGTKEditable) + private + FLinked: boolean; + function GetText: string; + function GetMaxLength: integer; + function GetVisibility: boolean; + procedure SetText(Value: string); + procedure SetMaxLength(Value: integer); + procedure SetVisibility(Value: boolean); + public + constructor Create(AOwner: TComponent); override; + constructor CreateFromWidget(AOwner: TComponent; Widget: PGtkWidget); + destructor Destroy; override; + procedure SelectAll; + published + property Text: string read GetText write SetText; + property MaxLength: integer read GetMaxLength write SetMaxLength; + property Visibility: boolean read GetVisibility write SetVisibility; + end; + +(****************************************** TGTKCOMBO **************************************************************************) + TGTKCombo = class(TGTKHBox) + private + procedure ItemsChanged(Sender: TObject); + function GetAllowEmpty: boolean; + function GetMatchValue: boolean; + function GetCaseSensitive: boolean; + procedure SetAllowEmpty(Value: boolean); + procedure SetMatchValue(Value: boolean); + procedure SetCaseSensitive(Value: boolean); + public + Items: TGList; + Entry: TGTKEntry; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure UpdateItems; + procedure SetPolicy(MatchValue, AllowEmpty: boolean); + procedure DisableActivate; + published + property AllowEmpty: boolean read GetAllowEmpty write SetAllowEmpty; + property MatchValue: boolean read GetMatchValue write SetMatchValue; + property CaseSensitive: boolean read GetCaseSensitive write SetCaseSensitive; + end; + +(****************************************** TGTKSPINEDIT ************************************************************************) + TGTKSpinEdit = class(TGTKEntry) + private + FAdjustment: PGtkAdjustment; + function GetDigits: integer; + procedure SetDigits(AValue: integer); + function GetMin: Double; + procedure SetMin(AValue: Double); + function GetMax: Double; + procedure SetMax(AValue: Double); + function GetIncrementStep: Double; + procedure SetIncrementStep(AValue: Double); + function GetIncrementPage: Double; + procedure SetIncrementPage(AValue: Double); + function GetValue: Double; + procedure SetValue(AValue: Double); + function GetAsInteger: integer; + procedure SetAsInteger(AValue: integer); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Digits: integer read GetDigits write SetDigits; + property Min: Double read GetMin write SetMin; + property Max: Double read GetMax write SetMax; + property IncrementStep: Double read GetIncrementStep write SetIncrementStep; + property IncrementPage: Double read GetIncrementPage write SetIncrementPage; + property Value: Double read GetValue write SetValue; + property AsInteger: integer read GetAsInteger write SetAsInteger; + property AsFloat: Double read GetValue write SetValue; + end; + +procedure TGTKButton_OnClick(button: PGtkButton; user_data: Pgpointer); cdecl; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses GTKUtils; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGTKButton_OnClick(button: PGtkButton; user_data: Pgpointer); cdecl; +begin + if Assigned(TGTKButton(user_data).FOnClick) then TGTKButton(user_data).FOnClick(TGTKButton(user_data)); +end; + +constructor TGTKButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOnClick := nil; + if ClassName = 'TGTKButton' then begin + FWidget := gtk_button_new_with_mnemonic(StringToPgchar(SCDefaultButtonCaption)); + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGTKButton_OnClick), Self); + Show; + end; +end; + +constructor TGTKButton.CreateFromStock(AOwner: TComponent; const StockID: PChar); +begin + inherited Create(AOwner); + FOnClick := nil; + if ClassName = 'TGTKButton' then begin + FWidget := gtk_button_new_from_stock(StockID); + g_signal_connect(PGtkObject(FWidget), 'clicked', G_CALLBACK(@TGTKButton_OnClick), Self); + Show; + end; +end; + +destructor TGTKButton.Destroy; +begin + inherited Destroy; +end; + +function TGTKButton.GetCaption: string; +begin + Result := PgcharToString(gtk_label_get_text(PGtkLabel(ChildControl))); +end; + +procedure TGTKButton.SetCaption(Value: string); +begin + gtk_label_set_text_with_mnemonic(PGtkLabel(ChildControl), StringToPgchar(Value)); +end; + +function TGTKButton.GetUseStock: boolean; +begin + Result := gtk_button_get_use_stock(PGtkButton(FWidget)); +end; + +procedure TGTKButton.SetUseStock(Value: boolean); +begin + gtk_button_set_use_stock(PGtkButton(FWidget), Value); +end; + +function TGTKButton.GetUseUnderline: boolean; +begin + Result := gtk_button_get_use_underline(PGtkButton(FWidget)); +end; + +procedure TGTKButton.SetUseUnderline(Value: boolean); +begin + gtk_button_set_use_underline(PGtkButton(FWidget), Value); +end; + +function TGTKButton.GetBorderStyle: TGTKBorderStyle; +begin + Result := TGTKBorderStyle(gtk_button_get_relief(PGtkButton(FWidget))); +end; + +procedure TGTKButton.SetBorderStyle(Value: TGTKBorderStyle); +begin + gtk_button_set_relief(PGtkButton(FWidget), integer(Value)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKMisc.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +destructor TGTKMisc.Destroy; +begin + inherited Destroy; +end; + +procedure TGTKMisc.SetAlignment(XAlign, YAlign : Single); +begin +// Writeln('gtk_misc_set_alignment, FWidget = ', integer(FWidget), ', XAlign = ', XAlign, ', YAlign = ', YAlign); + gtk_misc_set_alignment(PGtkMisc(FWidget), XAlign, YAlign); +end; + +function TGTKMisc.GetXAlign: Single; +{var xalign, yalign: pgfloat; } +begin +{ gtk_misc_get_alignment(PGtkMisc(FWidget), xalign, yalign); + if Assigned(xalign) then Result := Single(xalign^) + else Result := 0; } + if Assigned(FWidget) then Result := PGtkMisc(FWidget)^.xalign + else Result := 0; +end; + +procedure TGTKMisc.SetXAlign(Value: Single); +begin + SetAlignment(Value, YAlign); +end; + +function TGTKMisc.GetYAlign: Single; +{var xalign, yalign: Extended; + x: Extended; } +begin +{ gtk_misc_get_alignment(PGtkMisc(FWidget), @xalign, @yalign); + writeln('yalign = ', integer(yalign)); + if Assigned(yalign) then Result := yalign + else Result := 0; } + if Assigned(FWidget) then Result := PGtkMisc(FWidget)^.yalign + else Result := 0; +end; + +procedure TGTKMisc.SetYAlign(Value: Single); +begin + SetAlignment(XAlign, Value); +end; + +procedure TGTKMisc.SetPadding(XPadding, YPadding : integer); +begin + gtk_misc_set_padding(PGtkMisc(FWidget), XPadding, YPadding); +end; + +function TGTKMisc.GetXPadding: integer; +var xpad, ypad: pgint; +begin + gtk_misc_get_padding(PGtkMisc(FWidget), xpad, ypad); + if Assigned(xpad) then Result := Integer(xpad) + else Result := 0; +end; + +procedure TGTKMisc.SetXPadding(Value: integer); +begin + SetPadding(Value, YPadding); +end; + +function TGTKMisc.GetYPadding: integer; +var xpad, ypad: pgint; +begin + gtk_misc_get_padding(PGtkMisc(FWidget), xpad, ypad); + if Assigned(ypad) then Result := Integer(ypad) + else Result := 0; +end; + +procedure TGTKMisc.SetYPadding(Value: integer); +begin + SetPadding(XPadding, Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKLabel.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_label_new(nil); + FLinked := False; + Show; +end; + +constructor TGTKLabel.CreateFromWidget(AOwner: TComponent; Widget: PGtkWidget); +begin + inherited Create(AOwner); + FWidget := Widget; + FLinked := True; + Show; +end; + +destructor TGTKLabel.Destroy; +begin + if not FLinked then inherited Destroy; +end; + +function TGTKLabel.GetCaption: string; +begin + Result := PgcharToString(gtk_label_get_text(PGtkLabel(FWidget))); +end; + +procedure TGTKLabel.SetCaption(Value: string); +begin + gtk_label_set_text(PGtkLabel(FWidget), StringToPgchar(Value)); +end; + +function TGTKLabel.GetAlignment: TGTKAlignment; +begin + Result := TGTKAlignment(gtk_label_get_justify(PGtkLabel(FWidget))); +end; + +procedure TGTKLabel.SetAlignment(Value: TGTKAlignment); +begin + gtk_label_set_justify(PGtkLabel(FWidget), TGtkJustification(Value)); +end; + +procedure TGTKLabel.SetMarkup(const Text: string); +begin + gtk_label_set_markup(PGtkLabel(FWidget), PChar(Text)); +end; + +function TGTKLabel.GetUseMarkup: boolean; +begin + Result := gtk_label_get_use_markup(PGtkLabel(FWidget)); +end; + +procedure TGTKLabel.SetUseMarkup(Value: boolean); +begin + gtk_label_set_use_markup(PGtkLabel(FWidget), Value); +end; + +function TGTKLabel.GetLineWrap: boolean; +begin + Result := gtk_label_get_line_wrap(PGtkLabel(FWidget)); +end; + +procedure TGTKLabel.SetLineWrap(Value: boolean); +begin + gtk_label_set_line_wrap(PGtkLabel(FWidget), Value); +end; + +function TGTKLabel.GetUseUnderline: boolean; +begin + Result := gtk_label_get_use_underline(PGtkLabel(FWidget)); +end; + +procedure TGTKLabel.SetUseUnderline(Value: boolean); +begin + gtk_label_set_use_underline(PGtkLabel(FWidget), Value); +end; + +procedure TGTKLabel.SetFocusControl(Value: TGTKControl); +begin + gtk_label_set_mnemonic_widget(PGtkLabel(FWidget), Value.FWidget); +end; + +function TGTKLabel.GetSelectable: boolean; +begin + Result := gtk_label_get_selectable(PGtkLabel(FWidget)); +end; + +procedure TGTKLabel.SetSelectable(Value: boolean); +begin + gtk_label_set_selectable(PGtkLabel(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGTKToggleButton_OnToggled(ToggleButton: PGtkToggleButton; user_data: Pgpointer); cdecl; +begin + if Assigned(TGTKToggleButton(user_data).FOnToggled) then TGTKToggleButton(user_data).FOnToggled(TGTKToggleButton(user_data)); +end; + +constructor TGTKToggleButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOnToggled := nil; + if ClassName = 'TGTKToggleButton' then begin + FWidget := gtk_toggle_button_new_with_label(StringToPgchar(SCDefaultToggleButtonCaption)); + g_signal_connect(PGtkObject(FWidget), 'toggled', G_CALLBACK(@TGTKToggleButton_OnToggled), Self); + Show; + end; +end; + +destructor TGTKToggleButton.Destroy; +begin + inherited Destroy; +end; + +function TGTKToggleButton.GetCaption: string; +begin + Result := PgcharToString(gtk_label_get_text(PGtkLabel(ChildControl))); +end; + +procedure TGTKToggleButton.SetCaption(Value: string); +begin + gtk_label_set_text(PGtkLabel(ChildControl), StringToPgchar(Value)); +end; + +function TGTKToggleButton.GetChecked: boolean; +begin + Result := gtk_toggle_button_get_active(PGtkToggleButton(FWidget)); +end; + +procedure TGTKToggleButton.SetChecked(Value: boolean); +begin + gtk_toggle_button_set_active(PGtkToggleButton(FWidget), Value); +end; + +function TGTKToggleButton.GetDrawIndicator: boolean; +begin + Result := gtk_toggle_button_get_mode(PGtkToggleButton(FWidget)); +end; + +procedure TGTKToggleButton.SetDrawIndicator(Value: boolean); +begin + gtk_toggle_button_set_mode(PGtkToggleButton(FWidget), Value); +end; + +function TGTKToggleButton.GetInconsistent: boolean; +begin + Result := gtk_toggle_button_get_inconsistent(PGtkToggleButton(FWidget)); +end; + +procedure TGTKToggleButton.SetInconsistent(Value: boolean); +begin + gtk_toggle_button_set_inconsistent(PGtkToggleButton(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKCheckButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if ClassName = 'TGTKCheckButton' then begin + FWidget := gtk_check_button_new_with_mnemonic(StringToPgchar(SCDefaultCheckButtonCaption)); + g_signal_connect(PGtkObject(FWidget), 'toggled', G_CALLBACK(@TGTKToggleButton_OnToggled), Self); + Show; + end; +end; + +constructor TGTKCheckButton.CreateWithLabel(AOwner: TComponent; const ALabel: string); +begin + inherited Create(AOwner); + if ClassName = 'TGTKCheckButton' then begin + FWidget := gtk_check_button_new_with_mnemonic(StringToPgchar(ALabel)); + g_signal_connect(PGtkObject(FWidget), 'toggled', G_CALLBACK(@TGTKToggleButton_OnToggled), Self); + Show; + end; +end; + +destructor TGTKCheckButton.Destroy; +begin + inherited Destroy; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKRadioButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if ClassName = 'TGTKRadioButton' then begin + FWidget := gtk_radio_button_new_with_label(nil, StringToPgchar(SCDefaultRadioButtonCaption)); + g_signal_connect(PGtkObject(FWidget), 'toggled', G_CALLBACK(@TGTKToggleButton_OnToggled), Self); + Show; + end; +end; + +constructor TGTKRadioButton.CreateWithLabel(AOwner: TComponent; const ALabel: string); +begin + inherited Create(AOwner); + if ClassName = 'TGTKRadioButton' then begin + FWidget := gtk_radio_button_new_with_mnemonic(nil, StringToPgchar(ALabel)); + g_signal_connect(PGtkObject(FWidget), 'toggled', G_CALLBACK(@TGTKToggleButton_OnToggled), Self); + Show; + end; +end; + +destructor TGTKRadioButton.Destroy; +begin + inherited Destroy; +end; + +procedure TGTKRadioButton.SetRadioGroup(RadioButton: TGTKRadioButton); +begin + if Assigned(RadioButton) then gtk_radio_button_set_group(PGtkRadioButton(FWidget), gtk_radio_button_get_group(PGtkRadioButton(RadioButton.FWidget))) + else gtk_radio_button_set_group(PGtkRadioButton(FWidget), nil); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKFrame.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_frame_new(StringToPgchar(SCDefaultFrameCaption)); + Show; +end; + +constructor TGTKFrame.CreateWithoutLabel(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_frame_new(nil); + Show; +end; + +destructor TGTKFrame.Destroy; +begin + inherited Destroy; +end; + +function TGTKFrame.GetCaption: string; +begin + Result := PgcharToString(gtk_frame_get_label(PGtkFrame(FWidget))); +end; + +procedure TGTKFrame.SetCaption(Value: string); +begin + gtk_label_set_text(PGtkLabel(gtk_frame_get_label_widget(PGtkFrame(FWidget))), StringToPgchar(Value)); +end; + +function TGTKFrame.GetShadowType: TGTKShadowType; +begin + Result := TGTKShadowType(gtk_frame_get_shadow_type(PGtkFrame(FWidget))); +end; + +procedure TGTKFrame.SetShadowType(Value: TGTKShadowType); +begin + gtk_frame_set_shadow_type(PGtkFrame(FWidget), gtk2.TGtkShadowType(Value)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +procedure TGTKEditable_Changed(editable: PGtkEditable; user_data: gpointer); cdecl; +begin + if Assigned(TGTKEditable(user_data).FOnChanged) then TGTKEditable(user_data).FOnChanged(TGTKEditable(user_data)); +end; + +constructor TGTKEditable.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOnChanged := nil; +end; + +destructor TGTKEditable.Destroy; +begin + inherited Destroy; +end; + +function TGTKEditable.GetEditable: boolean; +begin + Result := gtk_editable_get_editable(PGtkEditable(FWidget)); +end; + +procedure TGTKEditable.SetEditable(Value: boolean); +begin + gtk_entry_set_editable(PGtkEntry(FWidget), Value); +end; + +procedure TGTKEditable.CutClipboard; +begin + gtk_editable_cut_clipboard(PGtkEditable(FWidget)); +end; + +procedure TGTKEditable.CopyClipboard; +begin + gtk_editable_copy_clipboard(PGtkEditable(FWidget)); +end; + +procedure TGTKEditable.PasteClipboard; +begin + gtk_editable_paste_clipboard(PGtkEditable(FWidget)); +end; + +procedure TGTKEditable.DeleteSelection; +begin + gtk_editable_delete_selection(PGtkEditable(FWidget)); +end; + +procedure TGTKEditable.InsertText(AText: string; Position: integer); +begin + gtk_editable_insert_text(PGtkEditable(FWidget), StringToPgchar(AText), Length(AText), @Position); +end; + +procedure TGTKEditable.DeleteText(StartPosition, EndPosition: integer); +begin + gtk_editable_delete_text(PGtkEditable(FWidget), StartPosition, EndPosition); +end; + +function TGTKEditable.GetChars(StartPosition, EndPosition: integer): string; +begin + Result := PgcharToString(gtk_editable_get_chars(PGtkEditable(FWidget), StartPosition, EndPosition)); +end; + +procedure TGTKEditable.SelectRegion(StartPosition, EndPosition: integer); +begin + gtk_editable_select_region(PGtkEditable(FWidget), StartPosition, EndPosition); +end; + +function TGTKEditable.GetPosition: integer; +begin + Result := gtk_editable_get_position(PGtkEditable(FWidget)); +end; + +procedure TGTKEditable.SetPosition(Value: integer); +begin + gtk_editable_set_position(PGtkEditable(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKEntry.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FLinked := False; + FWidget := gtk_entry_new; + Show; + g_signal_connect(PGtkObject(FWidget), 'changed', G_CALLBACK(@TGTKEditable_Changed), Self); +end; + +constructor TGTKEntry.CreateFromWidget(AOwner: TComponent; Widget: PGtkWidget); +begin + inherited Create(AOwner); + FLinked := True; + FWidget := Widget; +end; + +destructor TGTKEntry.Destroy; +begin + if not FLinked then inherited Destroy; +end; + +function TGTKEntry.GetText: string; +begin + Result := PgcharToString(gtk_entry_get_text(PGtkEntry(FWidget))); +end; + +procedure TGTKEntry.SetText(Value: string); +begin + gtk_entry_set_text(PGtkEntry(FWidget), StringToPgchar(Value)); +end; + +function TGTKEntry.GetMaxLength: integer; +begin + Result := gtk_entry_get_max_length(PGtkEntry(FWidget)); +end; + +procedure TGTKEntry.SetMaxLength(Value: integer); +begin + gtk_entry_set_max_length(PGtkEntry(FWidget), Value); +end; + +function TGTKEntry.GetVisibility: boolean; +begin + Result := gtk_entry_get_visibility(PGtkEntry(FWidget)); +end; + +procedure TGTKEntry.SetVisibility(Value: boolean); +begin +// g_object_set(FWidget, 'visibility', gboolean(Value), nil); + gtk_entry_set_visibility(PGtkEntry(FWidget), Value); +end; + +procedure TGTKEntry.SelectAll; +begin + SelectRegion(0, Length(Text)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKCombo.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FWidget := gtk_combo_new; + Items := TGList.Create(Self); + Items.Notify := ItemsChanged; + Entry := TGTKEntry.CreateFromWidget(Self, PGtkCombo(FWidget)^.entry); + Show; +end; + +destructor TGTKCombo.Destroy; +begin + Items.Free; + inherited Destroy; +end; + +procedure TGTKCombo.UpdateItems; +begin + gtk_combo_set_popdown_strings(PGtkCombo(FWidget), Items.FList); +end; + +function TGTKCombo.GetAllowEmpty: boolean; +begin + Result := Boolean(ok_if_empty(PGtkCombo(FWidget)^)); +end; + +procedure TGTKCombo.SetAllowEmpty(Value: boolean); +begin + SetPolicy(GetMatchValue, Value); +end; + +function TGTKCombo.GetMatchValue: boolean; +begin + Result := Boolean(value_in_list(PGtkCombo(FWidget)^)); +end; + +procedure TGTKCombo.SetMatchValue(Value: boolean); +begin + SetPolicy(Value, GetAllowEmpty); +end; + +procedure TGTKCombo.SetPolicy(MatchValue, AllowEmpty: boolean); +begin + gtk_combo_set_value_in_list(PGtkCombo(FWidget), MatchValue, AllowEmpty); +end; + +function TGTKCombo.GetCaseSensitive: boolean; +begin + Result := Boolean(gtk2.case_sensitive(PGtkCombo(FWidget)^)); +end; + +procedure TGTKCombo.SetCaseSensitive(Value: boolean); +begin + gtk_combo_set_case_sensitive(PGtkCombo(FWidget), Value); +end; + +procedure TGTKCombo.DisableActivate; +begin + gtk_combo_disable_activate(PGtkCombo(FWidget)); +end; + +procedure TGTKCombo.ItemsChanged(Sender: TObject); +begin + UpdateItems; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKSpinEdit.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FAdjustment := PGtkAdjustment(gtk_adjustment_new(0, 0, 0, 1, 10, 10)); + FWidget := gtk_spin_button_new(FAdjustment, 1, 0); + Show; +end; + +destructor TGTKSpinEdit.Destroy; +begin + inherited Destroy; +end; + +function TGTKSpinEdit.GetDigits: integer; +begin + Result := gtk_spin_button_get_digits(PGtkSpinButton(FWidget)); +end; + +procedure TGTKSpinEdit.SetDigits(AValue: integer); +begin + gtk_spin_button_set_digits(PGtkSpinButton(FWidget), AValue); +end; + +function TGTKSpinEdit.GetMin: Double; +var amin, amax: Double; +begin + gtk_spin_button_get_range(PGtkSpinButton(FWidget), @amin, @amax); + Result := amin; +end; + +procedure TGTKSpinEdit.SetMin(AValue: Double); +begin + gtk_spin_button_set_range(PGtkSpinButton(FWidget), AValue, Max); +end; + +function TGTKSpinEdit.GetMax: Double; +var amin, amax: Double; +begin + gtk_spin_button_get_range(PGtkSpinButton(FWidget), @amin, @amax); + Result := amax; +end; + +procedure TGTKSpinEdit.SetMax(AValue: Double); +begin + gtk_spin_button_set_range(PGtkSpinButton(FWidget), Min, AValue); +end; + +function TGTKSpinEdit.GetIncrementStep: Double; +var astep, apage: Double; +begin + gtk_spin_button_get_increments(PGtkSpinButton(FWidget), @astep, @apage); + Result := astep; +end; + +procedure TGTKSpinEdit.SetIncrementStep(AValue: Double); +begin + gtk_spin_button_set_increments(PGtkSpinButton(FWidget), AValue, IncrementPage); +end; + +function TGTKSpinEdit.GetIncrementPage: Double; +var astep, apage: Double; +begin + gtk_spin_button_get_increments(PGtkSpinButton(FWidget), @astep, @apage); + Result := apage; +end; + +procedure TGTKSpinEdit.SetIncrementPage(AValue: Double); +begin + gtk_spin_button_set_increments(PGtkSpinButton(FWidget), IncrementStep, AValue); +end; + +function TGTKSpinEdit.GetValue: Double; +begin + Result := gtk_spin_button_get_value(PGtkSpinButton(FWidget)); +end; + +procedure TGTKSpinEdit.SetValue(AValue: Double); +begin + gtk_spin_button_set_value(PGtkSpinButton(FWidget), AValue); +end; + +function TGTKSpinEdit.GetAsInteger: integer; +begin + Result := gtk_spin_button_get_value_as_int(PGtkSpinButton(FWidget)); +end; + +procedure TGTKSpinEdit.SetAsInteger(AValue: integer); +begin + gtk_spin_button_set_value(PGtkSpinButton(FWidget), AValue); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + +end. diff --git a/libgtk_kylix/GTKText.pas b/libgtk_kylix/GTKText.pas new file mode 100644 index 0000000..fe1a0c4 --- /dev/null +++ b/libgtk_kylix/GTKText.pas @@ -0,0 +1,167 @@ +(* + GTK-Kylix Library: GTKText - Multiline Text Editor (GtkTextView) + Version 0.5.16 (last updated 2003-01-21) + Copyright (C) 2003 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKText; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, Classes, GTKControls, GTKConsts, GTKUtils, GTKClasses, GTKForms; + + +type + TGTKTextBuffer = class; + +(****************************************** TGTKTEXTVIEW ************************************************************************) + TGTKTextViewWrapMode = (wmWrapNone, wmWrapChar, wmWrapWord); + TGTKTextView = class(TGTKContainer) + private + FTextBuffer: TGTKTextBuffer; + function GetWrapMode: TGTKTextViewWrapMode; + procedure SetWrapMode(Value: TGTKTextViewWrapMode); + function GetReadOnly: boolean; + procedure SetReadOnly(Value: boolean); + function GetCursorVisible: boolean; + procedure SetCursorVisible(Value: boolean); + protected + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property WrapMode: TGTKTextViewWrapMode read GetWrapMode write SetWrapMode; + property ReadOnly: boolean read GetReadOnly write SetReadOnly; + property CursorVisible: boolean read GetCursorVisible write SetCursorVisible; + property TextBuffer: TGTKTextBuffer read FTextBuffer write FTextBuffer; + property Lines: TGTKTextBuffer read FTextBuffer write FTextBuffer; + end; + +(****************************************** TGTKTEXTBUFFER **********************************************************************) + TGTKTextBuffer = class + private + FOwner: TGTKTextView; + FBuffer: PGtkTextBuffer; + function GetLineCount: integer; + function GetCharCount: integer; + protected + public + constructor Create(AOwner: TGTKTextView); + destructor Destroy; override; + procedure SetText(const Text: string); + procedure InsertText(const Text: string); + published + property Count: integer read GetLineCount; + property LineCount: integer read GetLineCount; + property CharCount: integer read GetCharCount; + end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses SysUtils, DateUtils; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTextView.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FTextBuffer := TGTKTextBuffer.Create(Self); + FWidget := gtk_text_view_new_with_buffer(FTextBuffer.FBuffer); + Show; + g_object_unref(FTextBuffer.FBuffer); +end; + +destructor TGTKTextView.Destroy; +begin + inherited Destroy; +end; + +function TGTKTextView.GetWrapMode: TGTKTextViewWrapMode; +begin + Result := TGTKTextViewWrapMode(gtk_text_view_get_wrap_mode(PGtkTextView(FWidget))); +end; + +procedure TGTKTextView.SetWrapMode(Value: TGTKTextViewWrapMode); +begin + gtk_text_view_set_wrap_mode(PGtkTextView(FWidget), integer(Value)); +end; + +function TGTKTextView.GetReadOnly: boolean; +begin + Result := not gtk_text_view_get_editable(PGtkTextView(FWidget)); +end; + +procedure TGTKTextView.SetReadOnly(Value: boolean); +begin + gtk_text_view_set_editable(PGtkTextView(FWidget), not Value); +end; + +function TGTKTextView.GetCursorVisible: boolean; +begin + Result := gtk_text_view_get_cursor_visible(PGtkTextView(FWidget)); +end; + +procedure TGTKTextView.SetCursorVisible(Value: boolean); +begin + gtk_text_view_set_cursor_visible(PGtkTextView(FWidget), Value); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTextBuffer.Create(AOwner: TGTKTextView); +begin + inherited Create; + FOwner := AOwner; + FBuffer := gtk_text_buffer_new(nil); +end; + +destructor TGTKTextBuffer.Destroy; +begin + inherited Destroy; +end; + +procedure TGTKTextBuffer.SetText(const Text: string); +begin + gtk_text_buffer_set_text(FBuffer, PChar(Text), -1); +end; + +procedure TGTKTextBuffer.InsertText(const Text: string); +var Iter: TGtkTextIter; +begin + gtk_text_buffer_get_end_iter(FBuffer, @Iter); + gtk_text_buffer_insert(FBuffer, @Iter, PChar(Text), -1); +end; + +function TGTKTextBuffer.GetLineCount: integer; +begin + Result := gtk_text_buffer_get_line_count(FBuffer); +end; + +function TGTKTextBuffer.GetCharCount: integer; +begin + Result := gtk_text_buffer_get_char_count(FBuffer); +end; + +(********************************************************************************************************************************) +end. diff --git a/libgtk_kylix/GTKUtils.pas b/libgtk_kylix/GTKUtils.pas new file mode 100644 index 0000000..924ece1 --- /dev/null +++ b/libgtk_kylix/GTKUtils.pas @@ -0,0 +1,212 @@ +(* + GTK-Kylix Library: GTKUtils - Various utilities + Version 0.6.17 (last updated 2003-10-07) + Copyright (C) 2003 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKUtils; +{ $WEAKPACKAGEUNIT} + +interface + +uses gtk2, gdk2, glib2, SysUtils, GTKControls, GTKClasses; + +(********************************************************************************************************************************) +function PgcharToString(const S: Pgchar): string; +function StringToPgchar(const S: string): Pgchar; +function AllocateColor(Widget: PGtkWidget; R, G, B: Word): PGdkColor; overload; +function AllocateColor(R, G, B: Word): TGDKColor; overload; +function KeyValToUnicode(const Key: word): guint32; +function UnicodeToKeyVal(const UnicodeVal: guint32): word; +function GetDefaultForegroundColor(State: integer): PGdkColor; overload; +function GetDefaultForegroundColor(Widget: TGTKControl; State: integer): PGdkColor; overload; +function GetDefaultBackgroundColor(State: integer): PGdkColor; overload; +function GetDefaultBackgroundColor(Widget: TGTKControl; State: integer): PGdkColor; overload; +function GetDefaultBaseColor(State: integer): PGdkColor; overload; +function GetDefaultBaseColor(Widget: TGTKControl; State: integer): PGdkColor; overload; +function GetDefaultTextColor(State: integer): PGdkColor; overload; +function GetDefaultTextColor(Widget: TGTKControl; State: integer): PGdkColor; overload; +function GDKColorToPGdkColor(Color: TGDKColor): PGdkColor; +function PGdkColorToGDKColor(Color: PGdkColor): TGDKColor; +function GDKColorToString(Color: TGDKColor): string; +function StringToGDKColor(Str: string; var Color: TGDKColor): boolean; +(********************************************************************************************************************************) + +implementation + +(********************************************************************************************************************************) +function PgcharToString(const S: Pgchar): string; +begin + Result := string(S); +end; + +(********************************************************************************************************************************) +function StringToPgchar(const S: string): Pgchar; +begin + Result := PChar(S); +end; + +(********************************************************************************************************************************) +function AllocateColor(Widget: PGtkWidget; R, G, B: Word): PGdkColor; +begin + New(Result); + with Result^ do begin + Pixel := 0; + Red := R; + Green := G; + Blue := B; + end; + if Assigned(Widget) then gdk_colormap_alloc_color(gtk_widget_get_colormap(Widget), Result, True, False); +end; + +function AllocateColor(R, G, B: Word): TGDKColor; +begin + Result.red := R; + Result.green := G; + Result.blue := B; +end; + +(********************************************************************************************************************************) +function KeyValToUnicode(const Key: word): guint32; +begin + Result := gdk_keyval_to_unicode(Key); +end; + +(********************************************************************************************************************************) +function UnicodeToKeyVal(const UnicodeVal: guint32): word; +begin + Result := gdk_unicode_to_keyval(UnicodeVal); +end; + +(********************************************************************************************************************************) +function GetDefaultForegroundColor(State: integer): PGdkColor; +var Widget: PGtkWidget; + Style: PGtkStyle; +begin + Widget := gtk_window_new(GTK_WINDOW_TOPLEVEL); + Style := gtk_rc_get_style(Widget); + Result := @Style^.fg[State]; + gtk_widget_destroy(Widget); +end; + +function GetDefaultForegroundColor(Widget: TGTKControl; State: integer): PGdkColor; +var Style: PGtkStyle; +begin + Style := gtk_rc_get_style(Widget.FWidget); + Result := @Style^.fg[State]; +end; + +(********************************************************************************************************************************) +function GetDefaultBackgroundColor(State: integer): PGdkColor; +var Widget: PGtkWidget; + Style: PGtkStyle; +begin + Widget := gtk_window_new(GTK_WINDOW_TOPLEVEL); + Style := gtk_rc_get_style(Widget); + Result := @Style^.bg[State]; + gtk_widget_destroy(Widget); +end; + +function GetDefaultBackgroundColor(Widget: TGTKControl; State: integer): PGdkColor; +var Style: PGtkStyle; +begin + Style := gtk_rc_get_style(Widget.FWidget); + Result := @Style^.bg[State]; +end; + +(********************************************************************************************************************************) +function GetDefaultBaseColor(State: integer): PGdkColor; +var Widget: PGtkWidget; + Style: PGtkStyle; +begin + Widget := gtk_window_new(GTK_WINDOW_TOPLEVEL); + Style := gtk_rc_get_style(Widget); + Result := @Style^.base[State]; + gtk_widget_destroy(Widget); +end; + +function GetDefaultBaseColor(Widget: TGTKControl; State: integer): PGdkColor; +var Style: PGtkStyle; +begin + Style := gtk_rc_get_style(Widget.FWidget); + Result := @Style^.base[State]; +end; + +(********************************************************************************************************************************) +function GetDefaultTextColor(State: integer): PGdkColor; +var Widget: PGtkWidget; + Style: PGtkStyle; +begin + Widget := gtk_window_new(GTK_WINDOW_TOPLEVEL); + Style := gtk_rc_get_style(Widget); + Result := @Style^.text[State]; + gtk_widget_destroy(Widget); +end; + +function GetDefaultTextColor(Widget: TGTKControl; State: integer): PGdkColor; +var Style: PGtkStyle; +begin + Style := gtk_rc_get_style(Widget.FWidget); + Result := @Style^.text[State]; +end; + +(********************************************************************************************************************************) +function GDKColorToPGdkColor(Color: TGDKColor): PGdkColor; +begin + New(Result); + Result^.pixel := Color.pixel; + Result^.red := Color.red; + Result^.green := Color.green; + Result^.blue := Color.blue; +end; + +(********************************************************************************************************************************) +function PGdkColorToGDKColor(Color: PGdkColor): TGDKColor; +begin + Result.pixel := Color.pixel; + Result.red := Color.red; + Result.green := Color.green; + Result.blue := Color.blue; +end; + +(********************************************************************************************************************************) +function GDKColorToString(Color: TGDKColor): string; +begin + Result := Format('#%.2x%.2x%.2xFF', [Color.red div 256, Color.green div 256, Color.blue div 256]); +end; + +(********************************************************************************************************************************) +function StringToGDKColor(Str: string; var Color: TGDKColor): boolean; +var AColor: PGdkColor; +begin + Result := False; + Str := ANSIUpperCase(Trim(Str)); + if (Length(Str) < 7) or (Str[1] <> '#') then Exit; + try + New(AColor); + if Length(Str) = 9 then Delete(Str, 8, 2); + Result := boolean(gdk_color_parse(PChar(Str), AColor)); + Color := PGdkColorToGDKColor(AColor); + Dispose(AColor); + except end; +end; + +(********************************************************************************************************************************) + +end. diff --git a/libgtk_kylix/GTKView.pas b/libgtk_kylix/GTKView.pas new file mode 100644 index 0000000..a8b80fc --- /dev/null +++ b/libgtk_kylix/GTKView.pas @@ -0,0 +1,1376 @@ +(* + GTK-Kylix Library: GTKView - GtkTreeView and its modifications + Version 0.6.21 (last updated 2006-05-06) + Copyright (C) 2006 Tomas Bzatek + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +*) + +unit GTKView; +{ $WEAKPACKAGEUNIT} +{$O+} // Optimization needs to be enabled for this unit due to bug in compiler (fixed columns doesn't work) + +interface + +uses gtk2, gdk2, gdk2pixbuf, glib2, Classes, GTKControls, GTKConsts, GTKUtils, GTKClasses, GTKForms, GTKPixbuf; + // Quick jump: QForms QControls QStdCtrls QComCtrls + + +type + TGTKListItem = class; + TGTKTreeViewColumn = class; + +(****************************************** TGTKTREEVIEWCOLUMN ******************************************************************) + TGTKTreeViewColumnSizingMode = (smGrowOnly, smAutoSize, smFixed); + TGTKTreeViewSortOrder = (soAscending, soDescending, soNone); + TGTKTreeViewColumnType = (ctText, ctToggle, ctImageText); + TGTKTreeViewColumnEditedEvent = procedure(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem; var NewText: string; var AllowChange: boolean; var DataColumn: integer) of object; + TGTKTreeViewColumnToggledEvent = procedure(Sender: TObject; Column: TGTKTreeViewColumn; Item: TGTKListItem) of object; + TGTKTreeViewColumn = class(TComponent) + private + FOwner: TComponent; + FColumnType: TGTKTreeViewColumnType; + FOnEdited: TGTKTreeViewColumnEditedEvent; + FOnToggled: TGTKTreeViewColumnToggledEvent; + FOnClicked: TNotifyEvent; + FIndex: integer; + function GetCaption: string; + function GetVisible: boolean; + function GetResizable: boolean; + function GetSizingMode: TGTKTreeViewColumnSizingMode; + function GetWidth: integer; + function GetFixedWidth: integer; + function GetMinWidth: integer; + function GetMaxWidth: integer; + function GetClickable: boolean; + function GetAlignment: Double; + function GetReorderable: boolean; + function GetSortID: integer; + function GetShowSortIndicator: boolean; + function GetSortOrder: TGTKTreeViewSortOrder; + procedure SetCaption(Value: string); + procedure SetVisible(Value: boolean); + procedure SetResizable(Value: boolean); + procedure SetSizingMode(Value: TGTKTreeViewColumnSizingMode); + procedure SetFixedWidth(Value: integer); + procedure SetMinWidth(Value: integer); + procedure SetMaxWidth(Value: integer); + procedure SetClickable(Value: boolean); + procedure SetAlignment(Value: Double); + procedure SetReorderable(Value: boolean); + procedure SetSortID(Value: integer); + procedure SetShowSortIndicator(Value: boolean); + procedure SetSortOrder(Value: TGTKTreeViewSortOrder); + procedure SetColumnType(Value: TGTKTreeViewColumnType); + public + FColumn: PGtkTreeViewColumn; + FRenderer, FPixbufRenderer: PGtkCellRenderer; + constructor Create(AOwner: TComponent); override; + constructor CreateTyped(AOwner: TComponent; ColType: TGTKTreeViewColumnType); + destructor Destroy; override; + procedure AddAttribute(Attribute: string; Value: integer); + procedure SetProperty(AProperty: string; Value: integer); overload; + procedure SetProperty(AProperty: string; Value: string); overload; + procedure SetProperty(AProperty: string; Value: Double); overload; + procedure SetProperty(AProperty: string; Value: pointer); overload; + procedure AddImageAttribute(Attribute: string; Value: integer); + procedure SetImageProperty(AProperty: string; Value: integer); overload; + procedure SetImageProperty(AProperty: string; Value: string); overload; + procedure SetImageProperty(AProperty: string; Value: Double); overload; + procedure SetImageProperty(AProperty: string; Value: pointer); overload; + procedure ClearAttributes; + property Parent: TComponent read FOwner; + published + property Caption: string read GetCaption write SetCaption; + property Visible: boolean read GetVisible write SetVisible; + property Resizable: boolean read GetResizable write SetResizable; + property SizingMode: TGTKTreeViewColumnSizingMode read GetSizingMode write SetSizingMode; + property Width: integer read GetWidth; + property FixedWidth: integer read GetFixedWidth write SetFixedWidth; + property MinWidth: integer read GetMinWidth write SetMinWidth; + property MaxWidth: integer read GetMaxWidth write SetMaxWidth; + property Clickable: boolean read GetClickable write SetClickable; + property Alignment: Double read GetAlignment write SetAlignment; + property Reorderable: boolean read GetReorderable write SetReorderable; + property SortID: integer read GetSortID write SetSortID; + property ShowSortIndicator: boolean read GetShowSortIndicator write SetShowSortIndicator; + property SortOrder: TGTKTreeViewSortOrder read GetSortOrder write SetSortOrder; + property ColumnType: TGTKTreeViewColumnType read FColumnType write SetColumnType; + property Index: integer read FIndex; + property OnEdited: TGTKTreeViewColumnEditedEvent read FOnEdited write FOnEdited; + property OnToggled: TGTKTreeViewColumnToggledEvent read FOnToggled write FOnToggled; + property OnClicked: TNotifyEvent read FOnClicked write FOnClicked; + end; + +(****************************************** TGTKTREEVIEWCOLUMNS *****************************************************************) + TGTKTreeViewColumns = class(TComponent) + private + FOwner: TComponent; + FList: TList; + function GetCount: Integer; + function GetItem(Index: Integer): TGTKTreeViewColumn; + procedure SetItem(Index: Integer; Value: TGTKTreeViewColumn); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function Add: TGTKTreeViewColumn; + function AddTyped(ColType: TGTKTreeViewColumnType): TGTKTreeViewColumn; + procedure Insert(Index: Integer; Item: TGTKTreeViewColumn); + procedure Delete(Index: Integer); + procedure Clear; + procedure AutosizeColumns; + property Items[Index: Integer]: TGTKTreeViewColumn read GetItem write SetItem; default; + property Parent: TComponent read FOwner; + published + property Count: Integer read GetCount; + end; + +(****************************************** TGTKLISTITEM ************************************************************************) + TGTKListItem = class(TComponent) + private + FOwner: TComponent; + FIndex: longint; + FData: pointer; + function GetSelected: boolean; + procedure SetSelected(Value: boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function AsString(Index: longint): string; + function AsInteger(Index: longint): integer; + function AsPointer(Index: longint): pointer; + function AsBoolean(Index: longint): boolean; + procedure SetValue(Index: longint; Value: string); overload; + procedure SetValue(Index: longint; Value: integer); overload; + procedure SetValue(Index: longint; Value: pointer); overload; + procedure SetValue(Index: longint; Value: boolean); overload; + procedure SetCursor(const FocusColumnNo: integer; const StartEditing, UseAlignment: boolean; const AlignX, AlignY: Double); + procedure StartEditing(ColumnNo: integer); + procedure RedrawRow; + property Data: pointer read FData write FData; + property Parent: TComponent read FOwner; + function IsVisible: boolean; + published + property Selected: boolean read GetSelected write SetSelected; + property Index: integer read FIndex; + end; + +(****************************************** TGTKLISTITEMS ***********************************************************************) + TGTKListColumnType = (lcText, lcNumber, lcPointer, lcPixbuf, lcBoolean); + TGTKListItems = class(TComponent) + private + FStore: PGtkListStore; + FOwner: TComponent; + FList: TList; + function GetCount: longint; + function GetItem(Index: longint): TGTKListItem; + procedure SetItem(Index: longint; Value: TGTKListItem); + public + constructor Create(AOwner: TComponent); override; + constructor CreateTyped(AOwner: TComponent; ColumnTypes: array of TGTKListColumnType); + destructor Destroy; override; + procedure SetColumnTypes(Types: array of TGTKListColumnType); + function Add: TGTKListItem; + procedure Insert(Index: longint; Item: TGTKListItem); + procedure Append(Item: TGTKListItem); + procedure Delete(Index: longint); + procedure Clear; + property Items[Index: longint]: TGTKListItem read GetItem write SetItem; default; + property Parent: TComponent read FOwner; + published + property Count: longint read GetCount; + end; + +(****************************************** TGTKVIEW ****************************************************************************) + TGTKSelectionMode = (smNone, smSingle, smBrowse, smMultiple); + TGTKCellDataFunc = procedure (Sender: TObject; tree_view: PGtkTreeView; tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter) of object; + TGTKSortCoversionFunc = function (Sender: TObject; const Index: integer): integer of object; + TGTKView = class(TGTKContainer) + private + FColumns: TGTKTreeViewColumns; + FOnSelectionChanged: TNotifyEvent; + FTreeModelSort: PGtkTreeModelSort; + FCellDataFunc: TGTKCellDataFunc; + FTreeModel: PGtkTreeModel; + FToSortedConvFunc, FFromSortedConvFunc: TGTKSortCoversionFunc; + function GetSelectionMode: TGTKSelectionMode; + function GetShowHeaders: boolean; + function GetRulesHint: boolean; + function GetReorderable: boolean; + function GetEnableSearch: boolean; + function GetSearchColumn: integer; + function GetSortColumnID: integer; + function GetSortOrder: TGTKTreeViewSortOrder; + procedure SetSelectionMode(Value: TGTKSelectionMode); + procedure SetShowHeaders(Value: boolean); + procedure SetRulesHint(Value: boolean); + procedure SetReorderable(Value: boolean); + procedure SetEnableSearch(Value: boolean); + procedure SetSearchColumn(Value: integer); + procedure SetSortColumnID(Value: integer); + procedure SetSortOrder(Value: TGTKTreeViewSortOrder); + protected + public + FSelection: PGtkTreeSelection; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure SelectAll; + procedure DeselectAll; + procedure SetSortInfo(ColumnID: integer; Order: TGTKTreeViewSortOrder); + function ConvertToSorted(Index: integer): integer; + function ConvertFromSorted(Index: integer): integer; + procedure ConvertPathToChild(var Path: PGtkTreePath); + procedure ConvertChildToPath(var Path: PGtkTreePath); + published + property Columns: TGTKTreeViewColumns read FColumns write FColumns; + property SelectionMode: TGTKSelectionMode read GetSelectionMode write SetSelectionMode; + property OnSelectionChanged: TNotifyEvent read FOnSelectionChanged write FOnSelectionChanged; + property ShowHeaders: boolean read GetShowHeaders write SetShowHeaders; + property RulesHint: boolean read GetRulesHint write SetRulesHint; + property Reorderable: boolean read GetReorderable write SetReorderable; + property EnableSearch: boolean read GetEnableSearch write SetEnableSearch; + property SearchColumn: integer read GetSearchColumn write SetSearchColumn; + property SortColumnID: integer read GetSortColumnID write SetSortColumnID; + property SortOrder: TGTKTreeViewSortOrder read GetSortOrder write SetSortOrder; + property CellDataFunc: TGTKCellDataFunc read FCellDataFunc write FCellDataFunc; + property FromSortedCoversionFunc: TGTKSortCoversionFunc read FFromSortedConvFunc write FFromSortedConvFunc; + property ToSortedCoversionFunc: TGTKSortCoversionFunc read FToSortedConvFunc write FToSortedConvFunc; + end; + +(****************************************** TGTKLISTVIEW ************************************************************************) + TGTKLVItemActivateEvent = procedure (Sender: TObject; Item: TGTKListItem) of object; + TGTKTreeViewCompareFunc = function (Sender: TObject; var model: PGtkTreeModel; var a, b: PGtkTreeIter): integer of object; + TGTKListView = class(TGTKView) + private + FOnItemActivate: TGTKLVItemActivateEvent; + FSortable: boolean; + FCompareFunc: TGTKTreeViewCompareFunc; + FOnColumnsChanged: TNotifyEvent; + protected + FListItems: TGTKListItems; + procedure Recreate; + function GetSelected: TGTKListItem; + procedure SetSelected(Value: TGTKListItem); + public + constructor Create(AOwner: TComponent); override; + constructor CreateTyped(AOwner: TComponent; Sortable: boolean; ColumnTypes: array of TGTKListColumnType); + destructor Destroy; override; + procedure StartEditing(ColumnNo: integer); + function GetItemAtPos(X, Y: integer): TGTKListItem; + published + property Items: TGTKListItems read FListItems write FListItems; + property Selected: TGTKListItem read GetSelected write SetSelected; + property OnItemActivate: TGTKLVItemActivateEvent read FOnItemActivate write FOnItemActivate; + property CompareFunc: TGTKTreeViewCompareFunc read FCompareFunc write FCompareFunc; + property OnColumnsChanged: TNotifyEvent read FOnColumnsChanged write FOnColumnsChanged; + end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +implementation + +uses SysUtils, DateUtils; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKView.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FColumns := TGTKTreeViewColumns.Create(Self); + FOnSelectionChanged := nil; + FToSortedConvFunc := nil; + FFromSortedConvFunc := nil; +end; + +destructor TGTKView.Destroy; +begin + FColumns.Free; + inherited Destroy; +end; + +function TGTKView.GetSelectionMode: TGTKSelectionMode; +begin + Result := TGTKSelectionMode(gtk_tree_selection_get_mode(FSelection)); +end; + +procedure TGTKView.SetSelectionMode(Value: TGTKSelectionMode); +begin + gtk_tree_selection_set_mode(FSelection, Integer(Value)); +end; + +procedure TGTKView.SelectAll; +begin + gtk_tree_selection_select_all(FSelection); +end; + +procedure TGTKView.DeselectAll; +begin + gtk_tree_selection_unselect_all(FSelection); +end; + +function TGTKView.GetShowHeaders: boolean; +begin + Result := gtk_tree_view_get_headers_visible(PGtkTreeView(FWidget)); +end; + +procedure TGTKView.SetShowHeaders(Value: boolean); +begin + gtk_tree_view_set_headers_visible(PGtkTreeView(FWidget), Value); +end; + +function TGTKView.GetRulesHint: boolean; +begin + Result := gtk_tree_view_get_rules_hint(PGtkTreeView(FWidget)); +end; + +procedure TGTKView.SetRulesHint(Value: boolean); +begin + gtk_tree_view_set_rules_hint(PGtkTreeView(FWidget), Value); +end; + +function TGTKView.GetReorderable: boolean; +begin + Result := gtk_tree_view_get_reorderable(PGtkTreeView(FWidget)); +end; + +procedure TGTKView.SetReorderable(Value: boolean); +begin + gtk_tree_view_set_reorderable(PGtkTreeView(FWidget), Value); +end; + +function TGTKView.GetEnableSearch: boolean; +begin + Result := gtk_tree_view_get_enable_search(PGtkTreeView(FWidget)); +end; + +procedure TGTKView.SetEnableSearch(Value: boolean); +begin + gtk_tree_view_set_enable_search(PGtkTreeView(FWidget), Value); +end; + +function TGTKView.GetSearchColumn: integer; +begin + Result := gtk_tree_view_get_search_column(PGtkTreeView(FWidget)); +end; + +procedure TGTKView.SetSearchColumn(Value: integer); +begin + gtk_tree_view_set_search_column(PGtkTreeView(FWidget), Value); +end; + +function TGTKView.GetSortColumnID: integer; +var sort_column_id: gint; + order: TGtkSortType; +begin + Result := -1; + if (FTreeModelSort <> nil) and gtk_tree_sortable_get_sort_column_id(PGtkTreeSortable(FTreeModelSort), @sort_column_id, @order) + then Result := sort_column_id; +end; + +procedure TGTKView.SetSortColumnID(Value: integer); +begin + if FTreeModelSort <> nil then + gtk_tree_sortable_set_sort_column_id(PGtkTreeSortable(FTreeModelSort), Value, TGtkSortType(GetSortOrder)); +end; + +procedure TGTKView.ConvertChildToPath(var Path: PGtkTreePath); +var NewPath: PGtkTreePath; +begin + if Assigned(FTreeModelSort) then + if not Assigned(FToSortedConvFunc) then begin + NewPath := gtk_tree_model_sort_convert_child_path_to_path(FTreeModelSort, Path); + Path := NewPath; + end else begin + NewPath := gtk_tree_path_new_from_string(PChar(IntToStr(FToSortedConvFunc(Self, StrToIntDef(gtk_tree_path_to_string(Path), 0))))); + Path := NewPath; + end; +end; + +procedure TGTKView.ConvertPathToChild(var Path: PGtkTreePath); +var NewPath: PGtkTreePath; +begin + if Assigned(FTreeModelSort) then + if not Assigned(FFromSortedConvFunc) then begin + NewPath := gtk_tree_model_sort_convert_path_to_child_path(FTreeModelSort, Path); + Path := NewPath; + end else begin + NewPath := gtk_tree_path_new_from_string(PChar(IntToStr(FFromSortedConvFunc(Self, StrToIntDef(gtk_tree_path_to_string(Path), 0))))); + Path := NewPath; + end; +end; + +function TGTKView.GetSortOrder: TGTKTreeViewSortOrder; +var sort_column_id: gint; + order: TGtkSortType; +begin + Result := soNone; + if (FTreeModelSort <> nil) and gtk_tree_sortable_get_sort_column_id(PGtkTreeSortable(FTreeModelSort), @sort_column_id, @order) + then Result := TGTKTreeViewSortOrder(order); +end; + +procedure TGTKView.SetSortOrder(Value: TGTKTreeViewSortOrder); +begin + if FTreeModelSort <> nil then + gtk_tree_sortable_set_sort_column_id(PGtkTreeSortable(FTreeModelSort), GetSortColumnID, TGtkSortType(Value)); +end; + +procedure TGTKView.SetSortInfo(ColumnID: integer; Order: TGTKTreeViewSortOrder); +begin + if FTreeModelSort <> nil then + gtk_tree_sortable_set_sort_column_id(PGtkTreeSortable(FTreeModelSort), ColumnID, TGtkSortType(Order)); +end; + +function TGTKView.ConvertToSorted(Index: integer): integer; +var Path: PGtkTreePath; + Iter: TGtkTreeIter; +begin + Result := Index; + if Application.GTKVersion_2_0_5_Up then begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(Index))); + if not Assigned(Path) then Exit; + if Assigned(FTreeModelSort) then Path := gtk_tree_model_sort_convert_child_path_to_path(FTreeModelSort, Path); + if not Assigned(Path) then Exit; + Result := gtk_tree_path_get_indices(Path)^; + gtk_tree_path_free(Path); + end else + if Assigned(FToSortedConvFunc) then Result := FToSortedConvFunc(Self, Index) else begin + gtk_tree_model_get_iter_from_string(FTreeModel, @Iter, PChar(IntToStr(Index))); +// gtk_tree_model_sort_convert_child_iter_to_iter(FTreeModelSort, @NewIter, @Iter); + Path := gtk_tree_model_get_path(FTreeModel, @Iter); + if not Assigned(Path) then Exit; + if Assigned(FTreeModelSort) then Path := gtk_tree_model_sort_convert_child_path_to_path(FTreeModelSort, Path); + if not Assigned(Path) then Exit; + Result := StrToIntDef(String(gtk_tree_path_to_string(Path)), Index); + gtk_tree_path_free(Path); + end; +end; + +function TGTKView.ConvertFromSorted(Index: integer): integer; +var Path: PGtkTreePath; + Iter: TGtkTreeIter; +begin + Result := Index; + if Application.GTKVersion_2_0_5_Up then begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(Index))); + if not Assigned(Path) then Exit; + if Assigned(FTreeModelSort) then Path := gtk_tree_model_sort_convert_path_to_child_path(FTreeModelSort, Path); + if not Assigned(Path) then Exit; + Result := gtk_tree_path_get_indices(Path)^; + gtk_tree_path_free(Path); + end else + if Assigned(FFromSortedConvFunc) then Result := FFromSortedConvFunc(Self, Index) else begin + gtk_tree_model_get_iter_from_string(FTreeModel, @Iter, PChar(IntToStr(Index))); +// gtk_tree_model_sort_convert_child_iter_to_iter(FTreeModelSort, @NewIter, @Iter); + Path := gtk_tree_model_get_path(FTreeModel, @Iter); + if not Assigned(Path) then Exit; + if Assigned(FTreeModelSort) then Path := gtk_tree_model_sort_convert_path_to_child_path(FTreeModelSort, Path); + if not Assigned(Path) then Exit; + Result := StrToIntDef(String(gtk_tree_path_to_string(Path)), Index); + gtk_tree_path_free(Path); + end; +end; + +procedure CellDataFunc(tree_column : PGtkTreeViewColumn; cell : PGtkCellRenderer; tree_model : PGtkTreeModel; iter : PGtkTreeIter; data : gpointer); cdecl; +begin + if Assigned(TGTKView(data).FCellDataFunc) then TGTKView(data).FCellDataFunc(TGTKView(data), PGtkTreeView(TGTKView(data).FWidget), tree_column, cell, tree_model, iter); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKListView.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FListItems := TGTKListItems.Create(Self); + FSortable := False; + FCompareFunc := nil; + Recreate; +end; + +destructor TGTKListView.Destroy; +begin + FListItems.Free; + inherited Destroy; +end; + +procedure TGTKListView_changed(treeselection: PGtkTreeSelection; user_data: gpointer); cdecl; +begin + if Assigned(TGTKListView(user_data).FOnSelectionChanged) then TGTKListView(user_data).FOnSelectionChanged(TGTKListView(user_data)); +end; + +procedure TGTKListView_row_activated(treeview: PGtkTreeView; arg1: PGtkTreePath; arg2: PGtkTreeViewColumn; user_data: gpointer); cdecl; +var Item: TGTKListItem; + AIndex: integer; +begin + Item := nil; + if Assigned(arg1) then begin + TGTKListView(user_data).ConvertPathToChild(arg1); + if Application.GTKVersion_2_0_5_Up then AIndex := gtk_tree_path_get_indices(arg1)^ + else AIndex := StrToIntDef(String(gtk_tree_path_to_string(arg1)), 0); + Item := TGTKListView(user_data).Items[AIndex]; + Item.FIndex := AIndex; + end; + if Assigned(TGTKListView(user_data).FOnItemActivate) then TGTKListView(user_data).FOnItemActivate(TGTKListView(user_data), Item); +end; + +procedure TGTKListView_columns_changed(treeselection: PGtkTreeSelection; user_data: gpointer); cdecl; +begin + if Assigned(TGTKListView(user_data).FOnColumnsChanged) then TGTKListView(user_data).FOnColumnsChanged(TGTKListView(user_data)); +end; + +procedure TGTKListView.Recreate; +begin + if Assigned(FWidget) then gtk_widget_destroy(PGtkWidget(FWidget)); + FTreeModelSort := nil; + if not FSortable then FWidget := gtk_tree_view_new_with_model(PGtkTreeModel(FListItems.FStore)) + else begin + FTreeModelSort := gtk_tree_model_sort_new_with_model(FListItems.FStore); + FWidget := gtk_tree_view_new_with_model(FTreeModelSort); + end; + FSelection := gtk_tree_view_get_selection(PGtkTreeView(FWidget)); + g_signal_connect(FSelection, 'changed', G_CALLBACK(@TGTKListView_changed), Self); + g_signal_connect(FWidget, 'row-activated', G_CALLBACK(@TGTKListView_row_activated), Self); + g_signal_connect(FWidget, 'columns-changed', G_CALLBACK(@TGTKListView_columns_changed), Self); + FTreeModel := gtk_tree_view_get_model(PGtkTreeView(FWidget)); + Show; +end; + +constructor TGTKListView.CreateTyped(AOwner: TComponent; Sortable: boolean; ColumnTypes: array of TGTKListColumnType); +begin + inherited Create(AOwner); + FListItems := TGTKListItems.CreateTyped(Self, ColumnTypes); + FSortable := Sortable; + FCompareFunc := nil; + Recreate; +end; + +function TGTKListView.GetSelected: TGTKListItem; +var Iter{, NewIter}: TGtkTreeIter; + Path: PGtkTreePath; + AIndex: integer; + i: integer; +begin + Result := nil; + Path := nil; + if not Application.GTKVersion_2_0_5_Up then begin + for i := 0 to Items.Count - 1 do begin + Path := gtk_tree_path_new_from_string(PChar(IntToStr(i))); + if gtk_tree_selection_path_is_selected(gtk_tree_view_get_selection(PGtkTreeView(FWidget)), Path) then Break else +// WriteLn('Index ', i, ', Selected: ', gtk_tree_selection_path_is_selected(gtk_tree_view_get_selection(PGtkTreeView(FWidget)), Path)); + gtk_tree_path_free(Path); + Path := nil; + end; +// WriteLn('Selected: ', String(gtk_tree_path_to_string(Path))); + ConvertPathToChild(Path); +(* gtk_tree_model_get_iter_from_string(gtk_tree_view_get_model(PGtkTreeView(FWidget)){FTreeModelSort}, @Iter, gtk_tree_path_to_string(Path)); + gtk_tree_model_sort_convert_child_iter_to_iter(FTreeModelSort, @NewIter, @Iter); + Path := gtk_tree_model_get_path({FTreeModelSort}gtk_tree_view_get_model(PGtkTreeView(FWidget)), @NewIter); + *) +// gtk_tree_model_sort_clear_cache(FTreeModelSort); +// Path := gtk_tree_model_sort_convert_path_to_child_path(FTreeModelSort, Path); + end else begin + if not gtk_tree_selection_get_selected(gtk_tree_view_get_selection(PGtkTreeView(FWidget)), nil, @Iter) then Exit; + Path := gtk_tree_model_get_path(gtk_tree_view_get_model(PGtkTreeView(FWidget)), @iter); + if not Assigned(Path) then Exit; + ConvertPathToChild(Path); + end; +// WriteLn('Selected Converted: ', String(gtk_tree_path_to_string(Path))); + if Assigned(Path) then begin + if Application.GTKVersion_2_0_5_Up then AIndex := gtk_tree_path_get_indices(Path)^ + else AIndex := StrToIntDef(String(gtk_tree_path_to_string(Path)), 0); + Result := Items[AIndex]; + Result.FIndex := AIndex; + gtk_tree_path_free(Path); + end; +end; + +procedure TGTKListView.SetSelected(Value: TGTKListItem); +var Path: PGtkTreePath; +begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(Value.FIndex))); + ConvertChildToPath(Path); + gtk_tree_selection_select_path(FSelection, Path); + gtk_tree_path_free(Path); +end; + +function GtkTreeIterCompareFunc(model: PGtkTreeModel; a: PGtkTreeIter; b: PGtkTreeIter; user_data: gpointer): gint; cdecl; +var Value: TGValue; + s: string; +begin + if not Assigned(TGTKListView(user_data).FCompareFunc) then begin + Value.g_type := 0; + gtk_tree_model_get_value(model, a, TGTKView(user_data).GetSortColumnID, @Value); + s := string(PChar(Value.data[0].v_pointer)); + Value.g_type := 0; + gtk_tree_model_get_value(model, b, TGTKView(user_data).GetSortColumnID, @Value); + Result := AnsiCompareStr(s, PChar(Value.data[0].v_pointer)); + end else Result := TGTKListView(user_data).FCompareFunc(TGTKView(user_data), model, a, b); +end; + +procedure TGTKListView.StartEditing(ColumnNo: integer); +var Iter: TGtkTreeIter; + Path: PGtkTreePath; +begin + if not gtk_tree_selection_get_selected(FSelection, nil, @Iter) then Exit; + Path := gtk_tree_model_get_path(FTreeModel, @iter); + if not Assigned(Path) then Exit; + gtk_tree_view_set_cursor(PGtkTreeView(FWidget), Path, FColumns[ColumnNo].FColumn, True); +end; + +function TGTKListView.GetItemAtPos(X, Y: integer): TGTKListItem; +var Path: PGtkTreePath; + Column: PGtkTreeViewColumn; + AIndex: integer; +begin + Result := nil; + if gtk_tree_view_get_path_at_pos(PGtkTreeView(FWidget), X, Y, Path, Column, nil, nil) then begin + if not Assigned(Path) then Exit; + ConvertPathToChild(Path); + if Application.GTKVersion_2_0_5_Up then AIndex := gtk_tree_path_get_indices(Path)^ + else AIndex := StrToIntDef(String(gtk_tree_path_to_string(Path)), 0); + Result := Items[AIndex]; + Result.FIndex := AIndex; + gtk_tree_path_free(Path); + end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKListItems.Create(AOwner: TComponent); +const Types : GType = G_TYPE_STRING; +begin + inherited Create(AOwner); + FOwner := AOwner; + FStore := gtk_list_store_newv(1, @Types); + FList := TList.Create; +end; + +destructor TGTKListItems.Destroy; +begin + if not (csDestroying in ComponentState) then begin + Clear; + FList.Free; + gtk_object_destroy(PGtkObject(FStore)); + end; + inherited Destroy; +end; + +constructor TGTKListItems.CreateTyped(AOwner: TComponent; ColumnTypes: array of TGTKListColumnType); +var i: integer; + Cols : array[0..255] of GType; +begin + inherited Create(AOwner); + FOwner := AOwner; + FList := TList.Create; + for i := Low(ColumnTypes) to High(ColumnTypes) do + case ColumnTypes[i] of + lcText : Cols[i] := G_TYPE_STRING; + lcNumber : Cols[i] := G_TYPE_LONG; + lcPointer : Cols[i] := G_TYPE_POINTER; + lcPixbuf : Cols[i] := GDK_TYPE_PIXBUF; + lcBoolean : Cols[i] := G_TYPE_BOOLEAN; + end; + FStore := gtk_list_store_newv(Length(ColumnTypes), @Cols); +end; + +procedure TGTKListItems.SetColumnTypes(Types: array of TGTKListColumnType); +var i: integer; + Cols : array[0..255] of GType; +begin + for i := Low(Types) to High(Types) do + case Types[i] of + lcText : Cols[i] := G_TYPE_STRING; + lcNumber : Cols[i] := G_TYPE_LONG; + lcPointer : Cols[i] := G_TYPE_POINTER; + lcPixbuf : Cols[i] := GDK_TYPE_PIXBUF; + lcBoolean : Cols[i] := G_TYPE_BOOLEAN; + end; + g_object_unref(PGObject(FStore)); + FStore := gtk_list_store_newv(Length(Types), @Cols); + (FOwner as TGTKListView).Recreate; +end; + +function TGTKListItems.GetItem(Index: longint): TGTKListItem; +begin + Result := TGTKListItem(FList[Index]); + Result.FIndex := Index; +end; + +procedure TGTKListItems.SetItem(Index: longint; Value: TGTKListItem); +begin + FList[Index] := Value; +end; + +function TGTKListItems.Add: TGTKListItem; +begin + Result := TGTKListItem.Create(Self); + Result.FIndex := GetCount; +// Insert(GetCount, Result); + Append(Result); +end; + +function TGTKListItems.GetCount: longint; +begin + Result := FList.Count; +end; + +procedure TGTKListItems.Clear; +var i: longint; +begin + for i := Count - 1 downto 0 do Delete(i); // !!!! DON'T use here gtk_list_store_clear(FStore), because it causes memory leaks !!!! +end; + +procedure TGTKListItems.Delete(Index: longint); +var x: pointer; + Iter: TGtkTreeIter; +begin + x := FList[Index]; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel(FStore), @Iter, StringToPgchar(IntToStr(Index))) then begin +// (FOwner as TGTKView).CovertSortableIter(Iter); + gtk_list_store_remove(FStore, @Iter); + end; + FList.Delete(Index); + TObject(x).Free; +end; + +procedure TGTKListItems.Insert(Index: longint; Item: TGTKListItem); +var Iter: TGtkTreeIter; +begin + FList.Insert(Index, Item); + gtk_list_store_insert(FStore, @Iter, Index); +end; + +procedure TGTKListItems.Append(Item: TGTKListItem); +var Iter: TGtkTreeIter; +begin + FList.Add(Item); + gtk_list_store_append(FStore, @Iter); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTreeViewColumns.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOwner := AOwner; + FList := TList.Create; +end; + +destructor TGTKTreeViewColumns.Destroy; +begin + if not (csDestroying in ComponentState) then begin + Clear; + FList.Free; + end; + inherited Destroy; +end; + +function TGTKTreeViewColumns.GetItem(Index: Integer): TGTKTreeViewColumn; +begin + Result := TGTKTreeViewColumn(FList[Index]); + Result.FIndex := Index; +end; + +procedure TGTKTreeViewColumns.SetItem(Index: Integer; Value: TGTKTreeViewColumn); +begin + FList[Index] := Value; +end; + +function TGTKTreeViewColumns.Add: TGTKTreeViewColumn; +begin + Result := TGTKTreeViewColumn.Create(Self); + Result.FIndex := GetCount; + Insert(GetCount, Result); +end; + +function TGTKTreeViewColumns.AddTyped(ColType: TGTKTreeViewColumnType): TGTKTreeViewColumn; +begin + Result := TGTKTreeViewColumn.CreateTyped(Self, ColType); + Result.FIndex := GetCount; + Insert(GetCount, Result); +end; + +function TGTKTreeViewColumns.GetCount: Integer; +begin + Result := FList.Count; +end; + +procedure TGTKTreeViewColumns.Clear; +var i: Integer; +begin + for i := Count - 1 downto 0 do Delete(i); +end; + +procedure TGTKTreeViewColumns.Delete(Index: Integer); +var x : pointer; +begin + if not (csDestroying in ComponentState) then + gtk_tree_view_remove_column(PGtkTreeView((FOwner as TGTKControl).FWidget), TGTKTreeViewColumn(FList[Index]).FColumn); + x := FList[Index]; + FList.Delete(Index); + TObject(x).Free; +end; + +procedure TGTKTreeViewColumns.Insert(Index: Integer; Item: TGTKTreeViewColumn); +begin + FList.Insert(Index, Item); + Item.FIndex := Index; + gtk_tree_view_insert_column(PGtkTreeView((FOwner as TGTKControl).FWidget), Item.FColumn, Index); + if Assigned((FOwner as TGTKView).FTreeModelSort) then + gtk_tree_sortable_set_sort_func(PGtkTreeSortable((FOwner as TGTKView).FTreeModelSort), Index, TGtkTreeIterCompareFunc(@GtkTreeIterCompareFunc), FOwner, nil); + gtk_tree_view_column_set_cell_data_func(Item.FColumn, Item.FRenderer, @CellDataFunc, (FOwner as TGTKView), nil); + if Item.ColumnType = ctImageText then gtk_tree_view_column_set_cell_data_func(Item.FColumn, Item.FPixbufRenderer, @CellDataFunc, (FOwner as TGTKView), nil); +end; + +procedure TGTKTreeViewColumns.AutosizeColumns; +begin + gtk_tree_view_columns_autosize(PGtkTreeView((FOwner as TGTKControl).FWidget)); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKTreeViewColumn.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOwner := AOwner; + FColumn := gtk_tree_view_column_new; + FRenderer := nil; + FPixbufRenderer := nil; + FOnEdited := nil; + FOnToggled := nil; + FOnClicked := nil; + SetColumnType(ctText); +end; + +constructor TGTKTreeViewColumn.CreateTyped(AOwner: TComponent; ColType: TGTKTreeViewColumnType); +begin + inherited Create(AOwner); + FOwner := AOwner; + FColumn := gtk_tree_view_column_new; + FRenderer := nil; + FPixbufRenderer := nil; + FOnEdited := nil; + FOnToggled := nil; + FOnClicked := nil; + SetColumnType(ColType); +end; + +destructor TGTKTreeViewColumn.Destroy; +begin + if not (csDestroying in ComponentState) then begin + gtk_object_destroy(PGtkObject(FRenderer)); + if GTK_IS_OBJECT(FColumn) then gtk_object_destroy(PGtkObject(FColumn)); + end; + inherited Destroy; +end; + +function TGTKTreeViewColumn.GetCaption: string; +begin + Result := PgcharToString(gtk_tree_view_column_get_title(FColumn)); +end; + +procedure TGTKTreeViewColumn.SetCaption(Value: string); +begin + gtk_tree_view_column_set_title(FColumn, StringToPgchar(Value)); +end; + +function TGTKTreeViewColumn.GetVisible: boolean; +begin + Result := gtk_tree_view_column_get_visible(FColumn); +end; + +procedure TGTKTreeViewColumn.SetVisible(Value: boolean); +begin + gtk_tree_view_column_set_visible(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetResizable: boolean; +begin + Result := gtk_tree_view_column_get_resizable(FColumn); +end; + +procedure TGTKTreeViewColumn.SetResizable(Value: boolean); +begin + gtk_tree_view_column_set_resizable(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetSizingMode: TGTKTreeViewColumnSizingMode; +begin + Result := TGTKTreeViewColumnSizingMode(gtk_tree_view_column_get_sizing(FColumn)); +end; + +procedure TGTKTreeViewColumn.SetSizingMode(Value: TGTKTreeViewColumnSizingMode); +begin + gtk_tree_view_column_set_sizing(FColumn, TGtkTreeViewColumnSizing(Value)); +end; + +function TGTKTreeViewColumn.GetWidth: integer; +begin + Result := gtk_tree_view_column_get_width(FColumn); +end; + +function TGTKTreeViewColumn.GetFixedWidth: integer; +begin + Result := gtk_tree_view_column_get_fixed_width(FColumn); +end; + +procedure TGTKTreeViewColumn.SetFixedWidth(Value: integer); +begin + gtk_tree_view_column_set_fixed_width(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetMinWidth: integer; +begin + Result := gtk_tree_view_column_get_min_width(FColumn); +end; + +procedure TGTKTreeViewColumn.SetMinWidth(Value: integer); +begin + gtk_tree_view_column_set_min_width(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetMaxWidth: integer; +begin + Result := gtk_tree_view_column_get_max_width(FColumn); +end; + +procedure TGTKTreeViewColumn.SetMaxWidth(Value: integer); +begin + gtk_tree_view_column_set_max_width(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetClickable: boolean; +begin + Result := gtk_tree_view_column_get_clickable(FColumn); +end; + +procedure TGTKTreeViewColumn.SetClickable(Value: boolean); +begin + gtk_tree_view_column_set_clickable(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetAlignment: Double; +begin + Result := gtk_tree_view_column_get_alignment(FColumn); +end; + +procedure TGTKTreeViewColumn.SetAlignment(Value: Double); +begin + gtk_tree_view_column_set_alignment(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetReorderable: boolean; +begin + Result := gtk_tree_view_column_get_reorderable(FColumn); +end; + +procedure TGTKTreeViewColumn.SetReorderable(Value: boolean); +begin + gtk_tree_view_column_set_reorderable(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetSortID: integer; +begin + Result := gtk_tree_view_column_get_sort_column_id(FColumn); +end; + +procedure TGTKTreeViewColumn.SetSortID(Value: integer); +begin + gtk_tree_view_column_set_sort_column_id(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetShowSortIndicator: boolean; +begin + Result := gtk_tree_view_column_get_sort_indicator(FColumn); +end; + +procedure TGTKTreeViewColumn.SetShowSortIndicator(Value: boolean); +begin + gtk_tree_view_column_set_sort_indicator(FColumn, Value); +end; + +function TGTKTreeViewColumn.GetSortOrder: TGTKTreeViewSortOrder; +begin + Result := TGTKTreeViewSortOrder(gtk_tree_view_column_get_sort_order(FColumn)); +end; + +procedure TGTKTreeViewColumn.SetSortOrder(Value: TGTKTreeViewSortOrder); +begin + gtk_tree_view_column_set_sort_order(FColumn, TGtkSortType(Value)); +end; + +procedure TGTKTreeViewColumn_edited(cell: PGtkCellRendererText; const path_string, new_text: pgchar; data: gpointer); cdecl; +var NewText: string; + AllowChange: boolean; + DataColumn, AIndex: integer; + Path: PGtkTreePath; +begin + if Assigned(TGTKTreeViewColumn(data).FOnEdited) then begin + NewText := PgcharToString(new_text); + AllowChange := True; + DataColumn := TGTKTreeViewColumn(data).FIndex; + Path := gtk_tree_path_new_from_string(path_string); + if not Assigned(Path) then Exit; + if Application.GTKVersion_2_0_5_Up then AIndex := gtk_tree_path_get_indices(Path)^ + else AIndex := StrToIntDef(String(gtk_tree_path_to_string(Path)), 0); + TGTKTreeViewColumn(data).FOnEdited(TGTKTreeViewColumn(data), TGTKTreeViewColumn(data), ((TGTKTreeViewColumn(data).FOwner as TGTKTreeViewColumns).FOwner as TGTKListView).Items[AIndex], NewText, AllowChange, DataColumn); + if AllowChange and (((TGTKTreeViewColumn(data).FOwner as TGTKTreeViewColumns).FOwner as TGTKListView).Items.Count < AIndex) then + ((TGTKTreeViewColumn(data).FOwner as TGTKTreeViewColumns).FOwner as TGTKListView).Items[AIndex].SetValue(DataColumn, NewText); + gtk_tree_path_free(Path); + end; +end; + +procedure TGTKTreeViewColumn_toggled(cell: PGtkCellRendererToggle; const path_string: pgchar; data: gpointer); cdecl; +var Path: PGtkTreePath; + AIndex: integer; +begin + if Assigned(data) and Assigned(TGTKTreeViewColumn(data).FOnToggled) then begin + Path := gtk_tree_path_new_from_string(path_string); + if not Assigned(Path) then Exit; + if Application.GTKVersion_2_0_5_Up then AIndex := gtk_tree_path_get_indices(Path)^ + else AIndex := StrToIntDef(String(gtk_tree_path_to_string(Path)), 0); + TGTKTreeViewColumn(data).FOnToggled(TGTKTreeViewColumn(data), TGTKTreeViewColumn(data), ((TGTKTreeViewColumn(data).FOwner as TGTKTreeViewColumns).FOwner as TGTKListView).Items[AIndex]); + end; +end; + +procedure TGTKTreeViewColumn_clicked(treeviewcolumn: PGtkTreeViewColumn; user_data: gpointer); cdecl; +begin + if Assigned(user_data) and Assigned(TGTKTreeViewColumn(user_data).FOnClicked) then + TGTKTreeViewColumn(user_data).FOnClicked(TGTKTreeViewColumn(user_data)); +end; + +procedure TGTKTreeViewColumn.SetColumnType(Value: TGTKTreeViewColumnType); +begin + FColumnType := Value; + if Assigned(FRenderer) then begin + gtk_tree_view_column_clear(FColumn); + gtk_object_destroy(PGtkObject(FRenderer)); + end; + case Value of + ctText : FRenderer := gtk_cell_renderer_text_new; + ctToggle : FRenderer := gtk_cell_renderer_toggle_new; + ctImageText : begin + FRenderer := gtk_cell_renderer_text_new; + FPixbufRenderer := gtk_cell_renderer_pixbuf_new; + end; + end; + if Value = ctImageText then gtk_tree_view_column_pack_start(FColumn, FPixbufRenderer, False); + gtk_tree_view_column_pack_start(FColumn, FRenderer, True); + if (Value = ctImageText) or (Value = ctText) then g_signal_connect(FRenderer, 'edited', G_CALLBACK(@TGTKTreeViewColumn_edited), Self); + if Value = ctToggle then g_signal_connect(FRenderer, 'toggled', G_CALLBACK(@TGTKTreeViewColumn_toggled), Self); + g_signal_connect_after(FColumn, 'clicked', G_CALLBACK(@TGTKTreeViewColumn_clicked), Self); +end; + +procedure TGTKTreeViewColumn.AddAttribute(Attribute: string; Value: integer); +begin + gtk_tree_view_column_add_attribute(FColumn, FRenderer, StringToPgchar(Attribute), Value); +end; + +procedure TGTKTreeViewColumn.AddImageAttribute(Attribute: string; Value: integer); +begin + gtk_tree_view_column_add_attribute(FColumn, FPixbufRenderer, StringToPgchar(Attribute), Value); +end; + +procedure TGTKTreeViewColumn.ClearAttributes; +begin + gtk_tree_view_column_clear_attributes(FColumn, FRenderer); +end; + +procedure TGTKTreeViewColumn.SetProperty(AProperty: string; Value: integer); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_LONG; + AValue.data[0].v_long := Value; + g_object_set_property(PGObject(FRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetProperty(AProperty: string; Value: string); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_STRING; + AValue.data[0].v_pointer := StringToPgchar(Value); + g_object_set_property(PGObject(FRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetProperty(AProperty: string; Value: Double); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_DOUBLE; + AValue.data[0].v_double := Value; + g_object_set_property(PGObject(FRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetProperty(AProperty: string; Value: pointer); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_POINTER; + AValue.data[0].v_pointer := Value; + g_object_set_property(PGObject(FRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetImageProperty(AProperty: string; Value: integer); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_LONG; + AValue.data[0].v_long := Value; + g_object_set_property(PGObject(FPixbufRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetImageProperty(AProperty: string; Value: string); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_STRING; + AValue.data[0].v_pointer := StringToPgchar(Value); + g_object_set_property(PGObject(FPixbufRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetImageProperty(AProperty: string; Value: Double); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_DOUBLE; + AValue.data[0].v_double := Value; + g_object_set_property(PGObject(FPixbufRenderer), StringToPgchar(AProperty), @AValue); +end; + +procedure TGTKTreeViewColumn.SetImageProperty(AProperty: string; Value: pointer); +var AValue: TGValue; +begin + AValue.g_type := G_TYPE_POINTER; + AValue.data[0].v_pointer := Value; + g_object_set_property(PGObject(FPixbufRenderer), StringToPgchar(AProperty), @AValue); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TGTKListItem.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOwner := AOwner; + FData := nil; +end; + +destructor TGTKListItem.Destroy; +begin + inherited Destroy; +end; + +function TGTKListItem.AsString(Index: longint): string; +var Iter: TGtkTreeIter; + AValue: TGValue; +begin + Result := ''; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) then + begin + AValue.g_type := 0; + gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); + Result := PgcharToString(AValue.data[0].v_pointer); + end; +end; + +function TGTKListItem.AsInteger(Index: longint): integer; +var Iter: TGtkTreeIter; + AValue: TGValue; +begin + Result := 0; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) then + begin + AValue.g_type := 0; + gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); + Result := AValue.data[0].v_long; + end; +end; + +function TGTKListItem.AsPointer(Index: longint): pointer; +var Iter: TGtkTreeIter; + AValue: TGValue; +begin + Result := nil; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) then + begin + AValue.g_type := 0; + gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); + Result := AValue.data[0].v_pointer; + end; +end; + +function TGTKListItem.AsBoolean(Index: longint): boolean; +var Iter: TGtkTreeIter; + AValue: TGValue; +begin + Result := False; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) then + begin + AValue.g_type := 0; + gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); + Result := boolean(AValue.data[0].v_int); + end; +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: string); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) + then gtk_list_store_set(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, StringToPgchar(Value), -1); +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: integer); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) + then gtk_list_store_set(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, Value, -1); +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: pointer); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) + then gtk_list_store_set(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, Value, -1); +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: boolean); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) + then gtk_list_store_set(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, Value, -1); +end; + +function TGTKListItem.GetSelected: boolean; +var Iter: TGtkTreeIter; +begin + Result := False; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) then begin +// ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertSortableIter(Iter); + Result := gtk_tree_selection_iter_is_selected(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter); + end; +end; + +procedure TGTKListItem.SetSelected(Value: boolean); +var Iter, NewIter: TGtkTreeIter; + Path: PGtkTreePath; +begin + try + if not Application.GTKVersion_2_0_5_Up then begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(FIndex))); + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + gtk_tree_selection_select_path(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, Path); + gtk_tree_path_free(Path); + end else + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, StringToPgchar(IntToStr(FIndex))) then begin + if Assigned(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort) then begin + gtk_tree_model_sort_convert_child_iter_to_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort, @NewIter, @Iter); + Iter := NewIter; + end; + if Value then gtk_tree_selection_select_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter) + else gtk_tree_selection_unselect_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter); + end; + except end; +end; + +procedure TGTKListItem.SetCursor(const FocusColumnNo: integer; const StartEditing, UseAlignment: boolean; const AlignX, AlignY: Double); +var Path: PGtkTreePath; + Column: PGtkTreeViewColumn; +// Renderer: PGtkCellRenderer; + i : integer; +begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + + Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FColumn; +// Renderer := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FRenderer; + +// if not Application.GTKVersion_2_0_5_Up then + for i := 1 to 2 do gtk_main_iteration_do(False); // This ugly piece of code HAVE TO BE HERE due some focus-related problems in GtkTreeView + gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing); +// gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing); +// gtk_tree_view_set_cursor_on_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, Renderer, StartEditing); + gtk_tree_view_scroll_to_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, UseAlignment, AlignX, AlignY); + + gtk_tree_path_free(Path); +end; + +procedure TGTKListItem.StartEditing(ColumnNo: integer); +var CellEditable: PGtkCellEditable; + Path: PGtkTreePath; + Column: PGtkTreeViewColumn; + BackgroundRect, CellRect: TGdkRectangle; +begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FColumn; + gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect); + gtk_tree_view_get_cell_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @CellRect); + + gtk_tree_view_column_focus_cell(Column, ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer); + CellEditable := gtk_cell_renderer_start_editing(((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer, + nil, ((FOwner as TGTKListItems).FOwner as TGTKView).FWidget, PChar(StringToPgchar(IntToStr(FIndex))), + @BackgroundRect, @CellRect, {GTK_CELL_RENDERER_SELECTED or GTK_CELL_RENDERER_SORTED} 0); + gtk_widget_show(CellEditable); +// gtk_cell_editable_start_editing(CellEditable, nil); + + + gtk_tree_path_free(Path); +end; + +procedure TGTKListItem.RedrawRow; +var Rect, BackgroundRect: TGdkRectangle; + Path: PGtkTreePath; + Column: PGtkTreeViewColumn; +begin + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[0].FColumn; + gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect); + + Rect.x := 0; + Rect.width := ((FOwner as TGTKListItems).FOwner as TGTKView).FWidget^.allocation.width; + Rect.y := BackgroundRect.y; + Rect.height := BackgroundRect.height; + gdk_window_invalidate_rect(gtk_tree_view_get_bin_window(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget)), @Rect, True); + + gtk_tree_path_free(Path); +end; + +function TGTKListItem.IsVisible: boolean; +var CellRect, VisibleRect: TGdkRectangle; + Path: PGtkTreePath; +begin + Result := False; + gtk_tree_view_get_visible_rect(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), @VisibleRect); + if not Assigned(Path) then Exit; + Path := gtk_tree_path_new_from_string(StringToPgchar(IntToStr(FIndex))); + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, @CellRect); + gtk_tree_path_free(Path); + Result := (CellRect.y > VisibleRect.y) and (CellRect.y + CellRect.height < VisibleRect.y + VisibleRect.height); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) + + +end. diff --git a/pixmaps/emblem_symbolic_link_png.inc b/pixmaps/emblem_symbolic_link_png.inc new file mode 100644 index 0000000..10e0f29 --- /dev/null +++ b/pixmaps/emblem_symbolic_link_png.inc @@ -0,0 +1,29 @@ +const emblem_symbolic_link_png: array[1..349] of byte = ( + $47, $64, $6B, $50, + $00, $00, $01, $5C, + $01, $01, $00, $02, + $00, $00, $00, $24, + $00, $00, $00, $09, + $00, $00, $00, $09, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, + $00, $33, $66, $FF, $00, $33, $66, $FF, $00, $33, $66, $FF, $00, $33, $66, $FF, + $EF, $EF, $EF, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $FF, $FF, $FF, $FF, $00, $33, $66, $FF, $00, $33, $66, $FF, $00, $33, $66, $FF, + $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $00, $33, $66, $FF, $00, $33, $66, $FF, + $00, $33, $66, $FF, $00, $33, $66, $FF, $EF, $EF, $EF, $FF, $CC, $CC, $CC, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $00, $33, $66, $FF, + $EF, $EF, $EF, $FF, $00, $33, $66, $FF, $00, $33, $66, $FF, $00, $2C, $59, $FF, + $CC, $CC, $CC, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, + $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $00, $28, $50, $FF, + $00, $25, $4A, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $FF, $FF, $FF, $FF, $CC, $CC, $CC, $FF, $CC, $CC, $CC, $FF, $CC, $CC, $CC, $FF, + $CC, $CC, $CC, $FF, $CC, $CC, $CC, $FF, $CC, $CC, $CC, $FF, $18, $18, $18, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $09, $09, $09, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00); + diff --git a/pixmaps/gnome_dev_cdrom_16_png.inc b/pixmaps/gnome_dev_cdrom_16_png.inc new file mode 100644 index 0000000..b497efc --- /dev/null +++ b/pixmaps/gnome_dev_cdrom_16_png.inc @@ -0,0 +1,73 @@ +const gnome_dev_cdrom_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $61, $00, $00, $00, $B7, $00, $00, $00, $EC, $00, $00, $00, $FF, + $00, $00, $00, $EC, $00, $00, $00, $B7, $00, $00, $00, $61, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $30, $00, $00, $00, $C9, + $70, $70, $70, $FF, $D5, $D5, $D5, $FF, $F8, $F8, $F8, $FF, $FF, $FF, $FF, $FF, + $F8, $F8, $F8, $FF, $AE, $AE, $AE, $FF, $5D, $5C, $5D, $FF, $00, $00, $00, $C9, + $00, $00, $00, $30, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $30, $00, $00, $00, $EC, $C5, $C5, $C5, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $A3, $A3, $A3, $FF, + $00, $00, $00, $EC, $00, $00, $00, $30, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $C9, $C5, $C5, $C5, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F2, $F2, $F2, $FF, $D9, $D9, $D9, $FF, + $69, $69, $69, $FF, $00, $00, $00, $C9, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $61, $70, $70, $70, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $CE, $CE, $CE, $FF, $CE, $CE, $CE, $FF, + $CE, $CE, $CE, $FF, $F4, $F4, $F4, $FF, $DA, $DA, $DA, $FF, $DD, $DD, $DC, $FF, + $B4, $B4, $B4, $FF, $34, $34, $34, $FF, $00, $00, $00, $61, $00, $00, $00, $00, + $00, $00, $00, $B7, $D5, $D6, $D5, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $AB, $AB, $AB, $FF, $31, $31, $31, $FF, $00, $00, $00, $FF, + $3B, $3A, $3A, $FF, $B6, $B6, $B6, $FF, $DD, $DD, $DD, $FF, $E0, $E0, $E0, $FF, + $E3, $E4, $E3, $FF, $7D, $7D, $7D, $FF, $00, $00, $00, $D0, $00, $00, $00, $00, + $00, $00, $00, $EC, $F8, $F8, $F8, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $CE, $CE, $CE, $FF, $31, $31, $31, $FF, $00, $00, $00, $12, $00, $00, $00, $00, + $00, $00, $00, $12, $34, $34, $34, $FF, $F0, $F0, $F1, $FF, $E3, $E4, $E3, $FF, + $E7, $E6, $E7, $FF, $AC, $AC, $AC, $FF, $00, $00, $00, $F3, $00, $00, $00, $00, + $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $CE, $CE, $CE, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $F4, $F4, $F4, $FF, $E7, $E7, $E7, $FF, + $EA, $EA, $EA, $FF, $BF, $C0, $C0, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $EC, $F8, $F8, $F8, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $CE, $CE, $CE, $FF, $30, $30, $30, $FF, $00, $00, $00, $12, $00, $00, $00, $00, + $00, $00, $00, $12, $5C, $5C, $5C, $FF, $F5, $F5, $F5, $FF, $EA, $EA, $EA, $FF, + $EE, $ED, $EE, $FF, $B1, $B0, $B1, $FF, $00, $00, $00, $F0, $00, $00, $00, $00, + $00, $00, $00, $B7, $D8, $D9, $D9, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FC, $FC, $FC, $FF, $BB, $BB, $BB, $FF, $35, $35, $35, $FF, $00, $00, $00, $FF, + $94, $94, $94, $FF, $E8, $E8, $E8, $FF, $F3, $F3, $F3, $FF, $EE, $EE, $EE, $FF, + $F1, $F1, $F1, $FF, $84, $84, $85, $FF, $00, $00, $00, $C5, $00, $00, $00, $00, + $00, $00, $00, $61, $74, $74, $74, $FF, $FF, $FF, $FF, $FF, $FD, $FD, $FD, $FF, + $E3, $E3, $E3, $FF, $DE, $DE, $DE, $FF, $F5, $F5, $F5, $FF, $F8, $F8, $F8, $FF, + $F9, $F9, $F8, $FF, $EE, $EE, $EE, $FF, $EE, $EF, $EF, $FF, $F1, $F1, $F2, $FF, + $C5, $C5, $C5, $FF, $39, $39, $39, $FF, $00, $00, $00, $61, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $C9, $A3, $A3, $A3, $FF, $B8, $B8, $B8, $FF, + $DF, $DF, $DF, $FF, $E2, $E1, $E2, $FF, $E5, $E5, $E5, $FF, $E9, $E8, $E8, $FF, + $EB, $EB, $EB, $FF, $EE, $EF, $EF, $FF, $F2, $F2, $F2, $FF, $C5, $C5, $C5, $FF, + $5F, $5F, $5F, $FF, $00, $00, $00, $D3, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $30, $00, $00, $00, $EC, $6A, $6A, $6A, $FF, + $B6, $B6, $B7, $FF, $E5, $E5, $E5, $FF, $E8, $E8, $E9, $FF, $EB, $EC, $EC, $FF, + $EF, $EF, $EF, $FF, $F2, $F2, $F2, $FF, $9F, $9F, $9F, $FF, $5F, $5F, $5F, $FF, + $00, $00, $00, $F0, $00, $00, $00, $30, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $30, $00, $00, $00, $C9, + $42, $42, $42, $FF, $7E, $7E, $7E, $FF, $AD, $AD, $AD, $FF, $C1, $C1, $C1, $FF, + $B3, $B2, $B2, $FF, $85, $85, $85, $FF, $3A, $3A, $3A, $FF, $00, $00, $00, $C9, + $00, $00, $00, $30, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $61, $00, $00, $00, $B7, $00, $00, $00, $EC, $00, $00, $00, $FF, + $00, $00, $00, $EC, $00, $00, $00, $B7, $00, $00, $00, $61, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/gnome_dev_floppy_16_png.inc b/pixmaps/gnome_dev_floppy_16_png.inc new file mode 100644 index 0000000..806a194 --- /dev/null +++ b/pixmaps/gnome_dev_floppy_16_png.inc @@ -0,0 +1,73 @@ +const gnome_dev_floppy_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $47, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $55, + $00, $00, $00, $FF, $F7, $F8, $FA, $FF, $CB, $DD, $EB, $FF, $C8, $8A, $80, $FF, + $D1, $8F, $84, $FF, $D1, $8F, $84, $FF, $D1, $8F, $84, $FF, $D1, $8F, $84, $FF, + $D1, $8F, $84, $FF, $D1, $8F, $84, $FF, $D1, $90, $84, $FF, $D1, $8F, $84, $FF, + $D3, $91, $86, $FF, $BF, $D5, $E8, $FF, $BF, $D5, $E8, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $DB, $E7, $F1, $FF, $8D, $A9, $BE, $FF, $B7, $87, $7E, $FF, + $C7, $75, $68, $FF, $C7, $74, $67, $FF, $C7, $74, $67, $FF, $C7, $74, $67, $FF, + $C7, $74, $67, $FF, $C7, $74, $66, $FF, $C7, $74, $67, $FF, $C8, $76, $68, $FF, + $CD, $86, $7A, $FF, $8D, $A9, $BE, $FF, $54, $69, $7C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $D7, $D7, $D7, $FF, + $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, + $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, + $F9, $F9, $F9, $FF, $84, $A0, $B5, $FF, $4F, $64, $75, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $D7, $D7, $D7, $FF, + $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, + $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, $D6, $D6, $D6, $FF, + $F1, $F1, $F1, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $D7, $D7, $D7, $FF, + $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, + $FC, $FC, $FC, $FF, $F4, $F4, $F4, $FF, $EB, $EB, $EB, $FF, $EB, $EB, $EB, $FF, + $F1, $F1, $F1, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $D7, $D7, $D7, $FF, + $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, $D7, $D7, $D7, $FF, $D4, $D4, $D4, $FF, + $C5, $C5, $C5, $FF, $C5, $C5, $C5, $FF, $C5, $C5, $C5, $FF, $C5, $C5, $C5, $FF, + $F1, $F1, $F1, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $EE, $EE, $EE, $FF, + $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $F2, $F2, $F2, $FF, $EB, $EB, $EB, $FF, + $EB, $EB, $EB, $FF, $EB, $EB, $EB, $FF, $EB, $EB, $EB, $FF, $EB, $EB, $EB, $FF, + $EE, $EE, $EE, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $AE, $BF, $CD, $FF, + $CA, $D6, $DF, $FF, $C7, $CF, $DA, $FF, $BF, $CB, $D6, $FF, $BF, $CB, $D6, $FF, + $BF, $CB, $D6, $FF, $BF, $CB, $D6, $FF, $BF, $CB, $D6, $FF, $BF, $CB, $D6, $FF, + $A1, $B6, $C4, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $8D, $A9, $BE, $FF, + $89, $A6, $BC, $FF, $7F, $9A, $AE, $FF, $81, $9A, $AE, $FF, $81, $9A, $AE, $FF, + $81, $9A, $AE, $FF, $81, $9A, $AE, $FF, $7E, $99, $AD, $FF, $7D, $97, $AC, $FF, + $81, $9A, $AE, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $8C, $A8, $BD, $FF, + $A8, $B1, $BD, $FF, $C5, $C5, $C5, $FF, $C5, $C5, $C5, $FF, $CE, $CE, $CE, $FF, + $EB, $EB, $EB, $FF, $D7, $D7, $D7, $FF, $9C, $9D, $9D, $FF, $2F, $46, $56, $FF, + $80, $86, $8C, $FF, $81, $9A, $AE, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $8D, $A9, $BE, $FF, $84, $A0, $B5, $FF, + $C5, $C5, $C5, $FF, $C5, $C5, $C5, $FF, $18, $30, $42, $FF, $33, $49, $5A, $FF, + $D6, $D6, $D6, $FF, $C5, $C5, $C5, $FF, $B9, $B9, $B9, $FF, $13, $2D, $3C, $FF, + $58, $6D, $80, $FF, $97, $A5, $B0, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CF, $E0, $ED, $FF, $86, $A4, $B9, $FF, $81, $9A, $AE, $FF, + $C5, $C5, $C5, $FF, $CD, $CD, $CD, $FF, $2E, $43, $53, $FF, $5A, $70, $82, $FF, + $C5, $C5, $C5, $FF, $C5, $C5, $C5, $FF, $BF, $BF, $BF, $FF, $11, $28, $35, $FF, + $5A, $70, $82, $FF, $9D, $A9, $B0, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $6B, $78, $82, $FF, $83, $9E, $B2, $FF, $81, $9A, $AE, $FF, + $CD, $CD, $CD, $FF, $E6, $E6, $E6, $FF, $21, $36, $48, $FF, $5F, $79, $89, $FF, + $C5, $C5, $C5, $FF, $C2, $C2, $C2, $FF, $B2, $B2, $B2, $FF, $11, $2C, $3A, $FF, + $5A, $70, $82, $FF, $9F, $A9, $B0, $FF, $49, $60, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $55, $00, $00, $00, $FF, $59, $63, $6D, $FF, $4F, $64, $75, $FF, + $A1, $A1, $A1, $FF, $C0, $C0, $C0, $FF, $90, $90, $90, $FF, $90, $90, $90, $FF, + $86, $86, $86, $FF, $6E, $6E, $6E, $FF, $7A, $7A, $7A, $FF, $2D, $39, $49, $FF, + $3E, $4F, $5C, $FF, $80, $87, $8F, $FF, $1A, $31, $40, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $55, $00, $00, $00, $FF, $00, $00, $00, $D3, + $00, $00, $00, $DC, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $E0, + $00, $00, $00, $E1, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $47, + $00); + diff --git a/pixmaps/gnome_dev_harddisk_16_png.inc b/pixmaps/gnome_dev_harddisk_16_png.inc new file mode 100644 index 0000000..950a8dc --- /dev/null +++ b/pixmaps/gnome_dev_harddisk_16_png.inc @@ -0,0 +1,73 @@ +const gnome_dev_harddisk_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $46, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $46, + $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $D9, $D9, $D9, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $FC, $FC, $FC, $FF, $FB, $FB, $FB, $FF, + $FB, $FC, $FC, $FF, $FB, $FB, $FB, $FF, $FB, $FB, $FB, $FF, $FB, $FB, $FB, $FF, + $FB, $FB, $FB, $FF, $FC, $FB, $FB, $FF, $FB, $FC, $FB, $FF, $FB, $FB, $FC, $FF, + $FB, $FC, $FC, $FF, $FB, $FC, $FB, $FF, $D5, $D6, $D5, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FC, $FB, $FC, $FF, $F7, $F8, $F8, $FF, $F7, $F8, $F8, $FF, + $F7, $F7, $F7, $FF, $F8, $F7, $F7, $FF, $F7, $F8, $F7, $FF, $F7, $F8, $F7, $FF, + $F8, $F8, $F8, $FF, $F7, $F7, $F7, $FF, $F8, $F7, $F7, $FF, $F7, $F7, $F8, $FF, + $F8, $F7, $F8, $FF, $F8, $F8, $F8, $FF, $D3, $D3, $D2, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FA, $FA, $FA, $FF, $F3, $F3, $F4, $FF, $F4, $F4, $F4, $FF, + $F4, $F4, $F4, $FF, $F4, $F4, $F4, $FF, $F4, $F4, $F3, $FF, $F3, $F4, $F4, $FF, + $F4, $F4, $F4, $FF, $F3, $F3, $F4, $FF, $F4, $F4, $F4, $FF, $F4, $F3, $F4, $FF, + $F4, $F4, $F4, $FF, $F4, $F3, $F4, $FF, $CE, $CE, $CE, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $F9, $F9, $F9, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $F9, $F9, $F9, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $F7, $F7, $F7, $FF, $EC, $EC, $EC, $FF, $ED, $EC, $EC, $FF, + $EC, $EC, $EC, $FF, $ED, $EC, $EC, $FF, $EC, $EC, $EC, $FF, $EC, $ED, $ED, $FF, + $ED, $EC, $EC, $FF, $EC, $EC, $ED, $FF, $EC, $EC, $EC, $FF, $EC, $EC, $ED, $FF, + $EC, $ED, $EC, $FF, $EC, $EC, $ED, $FF, $C8, $C8, $C8, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $F4, $F4, $F4, $FF, $F4, $F4, $F4, $FF, $EB, $EB, $EB, $FF, + $EB, $EB, $EB, $FF, $E3, $E3, $E3, $FF, $C9, $C9, $C9, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CE, $CE, $CE, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, + $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, + $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, + $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $A7, $A7, $A8, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CE, $CE, $CE, $FF, $B9, $B9, $B9, $FF, $9D, $9D, $9D, $FF, + $D2, $D2, $D2, $FF, $9D, $9D, $9D, $FF, $D2, $D2, $D2, $FF, $9D, $9D, $9D, $FF, + $D2, $D2, $D2, $FF, $9D, $9D, $9D, $FF, $D2, $D2, $D2, $FF, $9D, $9D, $9D, $FF, + $D2, $D2, $D2, $FF, $B9, $B9, $B9, $FF, $A2, $A2, $A2, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CD, $CD, $CD, $FF, $B6, $B6, $B6, $FF, $9B, $9B, $9A, $FF, + $D1, $D1, $D1, $FF, $9B, $9A, $9B, $FF, $D1, $D1, $D1, $FF, $9A, $9B, $9A, $FF, + $D1, $D1, $D1, $FF, $9B, $9A, $9B, $FF, $D1, $D1, $D1, $FF, $9B, $9A, $9A, $FF, + $D1, $D1, $D1, $FF, $B7, $B6, $B6, $FF, $9F, $9F, $9F, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $BD, $BD, $BD, $FF, $9C, $9C, $9C, $FF, $9D, $9D, $9C, $FF, + $9D, $9C, $9D, $FF, $9C, $9D, $9C, $FF, $9C, $9D, $9C, $FF, $9C, $9D, $9C, $FF, + $9C, $9D, $9C, $FF, $9D, $9D, $9D, $FF, $9D, $9C, $9D, $FF, $9C, $9D, $9D, $FF, + $9D, $9C, $9D, $FF, $9D, $9D, $9C, $FF, $9C, $9C, $9C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $79, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $62, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/gnome_dev_removable_usb_16_png.inc b/pixmaps/gnome_dev_removable_usb_16_png.inc new file mode 100644 index 0000000..a81b9e9 --- /dev/null +++ b/pixmaps/gnome_dev_removable_usb_16_png.inc @@ -0,0 +1,73 @@ +const gnome_dev_removable_usb_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $71, $FF, $FF, $FF, $FF, + $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $41, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $46, $41, $41, $41, $FF, $FF, $FF, $FF, $FF, $62, $5B, $81, $FF, + $62, $5B, $81, $FF, $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $46, + $71, $71, $71, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, $62, $5B, $81, $FF, $62, $5B, $81, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $D9, $D9, $D9, $FF, $00, $00, $00, $FF, + $FF, $FF, $FF, $FF, $AD, $A9, $BC, $FF, $A7, $A3, $B9, $FF, $FF, $FF, $FF, $FF, + $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, $62, $5B, $81, $FF, $62, $5B, $81, $FF, + $FF, $FF, $FF, $FF, $FC, $FB, $FB, $FF, $FB, $FC, $FB, $FF, $FB, $FB, $FC, $FF, + $FB, $FC, $FC, $FF, $FB, $FC, $FB, $FF, $D5, $D6, $D5, $FF, $00, $00, $00, $FF, + $FF, $FF, $FF, $FF, $BD, $BB, $CA, $FF, $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, + $62, $5B, $81, $FF, $62, $5B, $81, $FF, $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $F7, $F7, $F7, $FF, $F8, $F7, $F7, $FF, $F7, $F7, $F8, $FF, + $F8, $F7, $F8, $FF, $F8, $F8, $F8, $FF, $D3, $D3, $D2, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $F1, $F0, $F3, $FF, $62, $5B, $81, $FF, + $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F6, $F6, $F6, $FF, + $F4, $F4, $F4, $FF, $F3, $F3, $F4, $FF, $F4, $F4, $F4, $FF, $F4, $F3, $F4, $FF, + $F4, $F4, $F4, $FF, $F4, $F3, $F4, $FF, $CE, $CE, $CE, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FA, $FA, $FA, $FF, $FF, $FF, $FF, $FF, $7C, $76, $95, $FF, + $62, $5B, $81, $FF, $8C, $87, $A3, $FF, $FF, $FF, $FF, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $F9, $F9, $F9, $FF, $FF, $FF, $FF, $FF, $62, $5B, $81, $FF, + $62, $5B, $81, $FF, $62, $5B, $81, $FF, $FF, $FF, $FF, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, + $F0, $F0, $F0, $FF, $F0, $F0, $F0, $FF, $CC, $CC, $CC, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $F7, $F7, $F7, $FF, $FF, $FF, $FF, $FF, $9B, $97, $AD, $FF, + $62, $5B, $81, $FF, $9B, $97, $AD, $FF, $FF, $FF, $FF, $FF, $EC, $ED, $ED, $FF, + $ED, $EC, $EC, $FF, $EC, $EC, $ED, $FF, $EC, $EC, $EC, $FF, $EC, $EC, $ED, $FF, + $EC, $ED, $EC, $FF, $EC, $EC, $ED, $FF, $C8, $C8, $C8, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, + $FF, $FF, $FF, $FF, $F4, $F4, $F4, $FF, $F4, $F4, $F4, $FF, $EB, $EB, $EB, $FF, + $EB, $EB, $EB, $FF, $E3, $E3, $E3, $FF, $C9, $C9, $C9, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CE, $CE, $CE, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, + $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, + $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, + $B9, $B9, $B9, $FF, $B9, $B9, $B9, $FF, $A7, $A7, $A8, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CE, $CE, $CE, $FF, $D0, $D0, $D0, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $EA, $EA, $EA, $FF, $B9, $B9, $B9, $FF, + $F7, $F7, $F7, $FF, $7E, $7E, $7E, $FF, $A2, $A2, $A2, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $CD, $CD, $CD, $FF, $B9, $B9, $B9, $FF, $E0, $E0, $E0, $FF, + $E0, $E0, $E0, $FF, $E0, $E0, $E0, $FF, $E0, $E0, $E0, $FF, $E0, $E0, $E0, $FF, + $E0, $E0, $E0, $FF, $E0, $E0, $E0, $FF, $D0, $D0, $D0, $FF, $B9, $B9, $B9, $FF, + $7E, $7E, $7E, $FF, $90, $90, $90, $FF, $9F, $9F, $9F, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $BD, $BD, $BD, $FF, $9C, $9C, $9C, $FF, $9D, $9D, $9C, $FF, + $9D, $9C, $9D, $FF, $9C, $9D, $9C, $FF, $9C, $9D, $9C, $FF, $9C, $9D, $9C, $FF, + $9C, $9D, $9C, $FF, $9D, $9D, $9D, $FF, $9D, $9C, $9D, $FF, $9C, $9D, $9D, $FF, + $9D, $9C, $9D, $FF, $9D, $9D, $9C, $FF, $9C, $9C, $9C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $79, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $62, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/gnome_mime_application_zip_16_png.inc b/pixmaps/gnome_mime_application_zip_16_png.inc new file mode 100644 index 0000000..0831aa4 --- /dev/null +++ b/pixmaps/gnome_mime_application_zip_16_png.inc @@ -0,0 +1,73 @@ +const gnome_mime_application_zip_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $0B, $0B, $0B, $00, $07, $07, $07, $00, $00, $00, $01, $00, $02, $02, $02, $00, + $10, $10, $10, $00, $02, $02, $02, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $2A, $11, $11, $10, $BB, $14, $14, $12, $D3, $00, $00, $00, $16, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $0B, $0B, $0B, $00, $07, $07, $07, $00, $00, $00, $01, $00, $00, $00, $00, $00, + $09, $09, $09, $00, $00, $00, $00, $5A, $23, $23, $20, $BC, $38, $38, $36, $D3, + $33, $34, $2F, $F4, $62, $65, $54, $FF, $6D, $6F, $5B, $FF, $13, $13, $10, $D5, + $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $0B, $0B, $0B, $00, $02, $02, $02, $00, $00, $00, $00, $0E, $02, $02, $02, $73, + $36, $36, $33, $DF, $94, $94, $8C, $FD, $D4, $D4, $C8, $FF, $A0, $A1, $93, $FF, + $73, $77, $63, $FF, $79, $7C, $66, $FF, $85, $88, $6F, $FF, $6A, $6E, $5A, $FF, + $0B, $0C, $09, $B9, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $04, $04, $04, $25, $10, $10, $10, $90, $4F, $4F, $4E, $E9, $A8, $A8, $A5, $FF, + $F5, $F5, $EB, $FF, $DE, $DF, $D2, $FF, $88, $8A, $7A, $FF, $69, $6C, $58, $FF, + $73, $75, $61, $FF, $7A, $7E, $67, $FF, $81, $86, $6E, $FF, $98, $9C, $80, $FF, + $5D, $60, $4E, $FF, $04, $04, $03, $83, $00, $00, $00, $00, $00, $00, $00, $00, + $2D, $2E, $2B, $D5, $AF, $B0, $A8, $FF, $D2, $D2, $C8, $FF, $D4, $D5, $CD, $FF, + $C9, $CA, $C5, $FF, $8D, $8E, $83, $FF, $61, $64, $4F, $FF, $70, $73, $5D, $FF, + $79, $7D, $66, $FF, $83, $86, $6E, $FF, $89, $8C, $74, $FF, $82, $85, $6E, $FF, + $75, $79, $61, $FF, $14, $15, $11, $D0, $00, $00, $00, $00, $00, $00, $00, $00, + $50, $50, $4B, $ED, $F8, $F9, $E6, $FF, $CE, $D0, $BF, $FF, $A1, $A2, $91, $FF, + $74, $77, $65, $FF, $7A, $7C, $6B, $FF, $94, $96, $85, $FF, $73, $77, $5F, $FF, + $82, $86, $6F, $FF, $83, $86, $70, $FF, $72, $75, $60, $FF, $6E, $71, $5C, $FF, + $70, $74, $5E, $FF, $16, $17, $13, $D3, $00, $00, $00, $00, $00, $00, $00, $00, + $39, $3A, $36, $E5, $E4, $E5, $D4, $FF, $E5, $E6, $D4, $FF, $E6, $E7, $D6, $FF, + $DE, $DF, $CE, $FF, $C5, $C6, $B3, $FF, $BF, $C1, $AE, $FF, $AA, $AD, $98, $FF, + $79, $7C, $68, $FF, $69, $6C, $59, $FF, $6A, $6D, $58, $FF, $75, $79, $62, $FF, + $77, $7A, $64, $FF, $16, $16, $13, $D6, $00, $00, $00, $00, $00, $00, $00, $00, + $32, $33, $30, $DC, $E0, $E1, $D0, $FF, $E1, $E2, $D1, $FF, $DD, $DE, $CD, $FF, + $E0, $E1, $D0, $FF, $E4, $E5, $D4, $FF, $EA, $EB, $DA, $FF, $C5, $C6, $B6, $FF, + $5E, $62, $4F, $FF, $6B, $6F, $59, $FF, $72, $76, $60, $FF, $7C, $80, $67, $FF, + $7C, $80, $69, $FF, $17, $17, $14, $DA, $00, $00, $00, $00, $00, $00, $00, $00, + $2C, $2C, $29, $C8, $DC, $DD, $CC, $FF, $E2, $E3, $D2, $FF, $DE, $DF, $CE, $FF, + $DE, $DF, $CE, $FF, $DD, $DE, $CD, $FF, $E8, $E9, $D8, $FF, $B8, $B9, $A8, $FF, + $62, $65, $51, $FF, $72, $76, $60, $FF, $78, $7C, $65, $FF, $82, $86, $6D, $FF, + $81, $84, $6D, $FF, $17, $18, $15, $DC, $02, $02, $02, $00, $1C, $1C, $1C, $00, + $24, $24, $21, $B4, $D5, $D6, $C6, $FF, $E4, $E5, $D3, $FF, $DE, $DF, $CE, $FF, + $DE, $DF, $CE, $FF, $DD, $DE, $CD, $FF, $E3, $E5, $D3, $FF, $B8, $BA, $A8, $FF, + $69, $6D, $57, $FF, $77, $7C, $65, $FF, $7E, $82, $6A, $FF, $86, $8A, $70, $FF, + $85, $88, $71, $FF, $17, $17, $15, $E3, $11, $11, $11, $14, $28, $28, $28, $04, + $1A, $1A, $17, $B1, $CF, $CF, $C0, $FF, $E4, $E5, $D4, $FF, $DC, $DD, $CD, $FF, + $DA, $DC, $CB, $FF, $D8, $D9, $C8, $FF, $DE, $DF, $CE, $FF, $B7, $BA, $A7, $FF, + $70, $74, $5C, $FF, $7E, $82, $6A, $FF, $82, $86, $6D, $FF, $90, $94, $79, $FF, + $8D, $8F, $79, $FF, $15, $15, $14, $F1, $1A, $1A, $1B, $57, $25, $25, $25, $26, + $10, $10, $0F, $A9, $C2, $C3, $B5, $FF, $F0, $F2, $DF, $FF, $DC, $DD, $CD, $FF, + $D4, $D6, $C5, $FF, $D2, $D4, $C4, $FF, $D8, $D9, $C9, $FF, $B7, $B9, $A6, $FF, + $76, $7A, $62, $FF, $83, $88, $6D, $FF, $8F, $94, $78, $FF, $8C, $90, $76, $FF, + $4C, $4D, $43, $FF, $0C, $0C, $0D, $DB, $20, $20, $20, $64, $25, $25, $25, $33, + $03, $02, $03, $41, $36, $37, $32, $E7, $8D, $8F, $83, $FF, $CB, $CB, $BC, $FF, + $DF, $E1, $CF, $FF, $D7, $D8, $C8, $FF, $D4, $D5, $C6, $FF, $B5, $B8, $A5, $FF, + $81, $86, $6C, $FF, $90, $94, $79, $FF, $68, $6B, $58, $FF, $27, $28, $23, $FE, + $0D, $0D, $0F, $D7, $1F, $1F, $1F, $7F, $24, $24, $24, $3A, $24, $24, $24, $10, + $01, $01, $02, $00, $00, $00, $00, $0C, $00, $00, $00, $76, $25, $25, $22, $DA, + $72, $73, $6A, $FD, $B2, $B3, $A6, $FF, $D6, $D8, $C9, $FF, $C5, $C8, $B2, $FF, + $7A, $7E, $65, $FF, $41, $43, $38, $FF, $08, $08, $09, $E5, $0E, $0D, $0F, $8F, + $23, $23, $23, $30, $26, $26, $26, $08, $24, $24, $24, $00, $24, $24, $24, $00, + $01, $01, $02, $00, $08, $08, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $50, $14, $14, $13, $C2, $5C, $5C, $56, $F8, $86, $87, $7A, $FF, + $1A, $1A, $16, $F1, $00, $00, $00, $86, $00, $00, $00, $0E, $13, $13, $13, $00, + $24, $24, $24, $00, $25, $25, $25, $00, $24, $24, $24, $00, $24, $24, $24, $00, + $01, $01, $02, $00, $08, $08, $07, $00, $01, $01, $01, $00, $00, $00, $00, $00, + $04, $04, $04, $00, $00, $00, $00, $00, $00, $00, $00, $3E, $03, $03, $03, $87, + $00, $00, $00, $38, $00, $00, $00, $00, $02, $02, $02, $00, $13, $13, $13, $00, + $24, $24, $24, $00, $25, $25, $25, $00, $24, $24, $24, $00, $24, $24, $24, $00, + $00); + diff --git a/pixmaps/gnome_mime_x_directory_smb_share_16_png.inc b/pixmaps/gnome_mime_x_directory_smb_share_16_png.inc new file mode 100644 index 0000000..7f1175e --- /dev/null +++ b/pixmaps/gnome_mime_x_directory_smb_share_16_png.inc @@ -0,0 +1,73 @@ +const gnome_mime_x_directory_smb_share_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $0E, $0E, $0E, $59, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $4F, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $8E, $92, $7C, $FF, + $8E, $92, $7C, $FF, $8E, $92, $7C, $FF, $8E, $92, $7C, $FF, $66, $69, $58, $FF, + $00, $00, $00, $FF, $00, $00, $00, $30, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $8E, $92, $7C, $FF, + $68, $6A, $57, $FF, $68, $6A, $57, $FF, $67, $69, $56, $FF, $67, $69, $56, $FF, + $56, $58, $48, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $30, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $A2, $A3, $9B, $FF, $D8, $D9, $CC, $FF, $D1, $D3, $C6, $FF, + $D0, $D1, $C4, $FF, $BA, $BB, $AF, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $D6, $D7, $CA, $FF, + $D6, $D7, $CA, $FF, $D6, $D7, $CA, $FF, $D6, $D7, $CA, $FF, $D6, $D7, $CA, $FF, + $D6, $D7, $CA, $FF, $DB, $DC, $CF, $FF, $C3, $C5, $B1, $FF, $BB, $BE, $AA, $FF, + $B9, $BB, $A8, $FF, $A5, $A6, $95, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $D0, $D1, $C4, $FF, + $C8, $CA, $B5, $FF, $C8, $CA, $B5, $FF, $C8, $CA, $B5, $FF, $C8, $CA, $B5, $FF, + $BC, $BE, $AA, $FF, $BC, $BE, $AA, $FF, $BC, $BE, $AA, $FF, $BA, $BC, $A9, $FF, + $B8, $B9, $A7, $FF, $A4, $A5, $94, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $D7, $D8, $CC, $FF, + $C1, $C4, $AE, $FF, $BF, $C2, $AC, $FF, $BC, $BF, $AA, $FF, $BB, $BD, $A9, $FF, + $B9, $BA, $A6, $FF, $B8, $B9, $A5, $FF, $B5, $B7, $A3, $FF, $AF, $B0, $9D, $FF, + $AC, $AD, $9B, $FF, $99, $9B, $8A, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $D7, $D8, $CC, $FF, + $BC, $BE, $A9, $FF, $BA, $BC, $A7, $FF, $B7, $B9, $A5, $FF, $B7, $B8, $A3, $FF, + $B4, $B5, $A1, $FF, $B2, $B4, $A0, $FF, $AF, $B1, $9D, $FF, $A9, $AA, $97, $FF, + $A5, $A7, $94, $FF, $93, $94, $84, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $D7, $D8, $CC, $FF, + $B6, $B8, $A3, $FF, $B4, $B6, $A1, $FF, $B2, $B4, $9F, $FF, $B0, $B2, $9D, $FF, + $AE, $AF, $9B, $FF, $AC, $AE, $99, $FF, $A8, $AB, $97, $FF, $A3, $A4, $91, $FF, + $9F, $A1, $8F, $FF, $8E, $90, $7F, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $C1, $C2, $B8, $FF, + $A1, $A3, $8F, $FF, $9F, $A1, $8D, $FF, $9C, $9E, $8B, $FF, $7D, $7E, $70, $FF, + $BC, $BD, $B5, $FF, $7A, $7C, $6D, $FF, $94, $96, $84, $FF, $8F, $90, $7F, $FF, + $8C, $8E, $7E, $FF, $8B, $8D, $7C, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $5C, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $AB, $AB, $AB, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $5C, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, + $B9, $B9, $B9, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $33, $32, $31, $44, $00, $00, $00, $F3, + $C9, $C9, $C9, $FE, $00, $00, $00, $FE, $33, $32, $31, $44, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $16, $00, $00, $00, $1E, $00, $00, $00, $35, $00, $00, $00, $52, + $00, $00, $00, $74, $00, $00, $00, $9C, $00, $00, $00, $C7, $EA, $EA, $EA, $FF, + $DE, $DE, $DE, $FB, $CC, $CC, $CC, $FF, $00, $00, $00, $EC, $00, $00, $00, $C0, + $00, $00, $00, $81, $00, $00, $00, $52, $00, $00, $00, $39, $00, $00, $00, $33, + $00, $00, $00, $00, $C8, $C8, $C8, $15, $C8, $C8, $C8, $27, $C8, $C8, $C8, $44, + $C8, $C8, $C8, $66, $B0, $B0, $B0, $9E, $86, $86, $86, $D5, $CD, $CD, $CD, $F0, + $B4, $B4, $B4, $FA, $B4, $B4, $B4, $FB, $7B, $7B, $7B, $F0, $95, $95, $94, $C8, + $AB, $AA, $AA, $81, $C8, $C8, $C8, $46, $C8, $C8, $C8, $31, $C8, $C8, $C8, $2C, + $00, $00, $00, $14, $00, $00, $00, $20, $00, $00, $00, $39, $00, $00, $00, $5E, + $00, $00, $00, $7E, $00, $00, $00, $A8, $00, $00, $00, $D1, $00, $00, $00, $EE, + $00, $00, $00, $FC, $00, $00, $00, $FC, $00, $00, $00, $EB, $00, $00, $00, $BF, + $00, $00, $00, $85, $00, $00, $00, $58, $00, $00, $00, $42, $00, $00, $00, $3C, + $00); + diff --git a/pixmaps/stock_folder_16_png.inc b/pixmaps/stock_folder_16_png.inc new file mode 100644 index 0000000..7979416 --- /dev/null +++ b/pixmaps/stock_folder_16_png.inc @@ -0,0 +1,73 @@ +const stock_folder_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $39, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $39, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $39, $00, $00, $00, $FF, $E4, $E5, $DE, $FF, + $D3, $D5, $CA, $FF, $D3, $D5, $CA, $FF, $A5, $A7, $97, $FF, $00, $00, $00, $FF, + $00, $00, $00, $39, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $F3, $F4, $F0, $FF, $AB, $AE, $99, $FF, + $BD, $C0, $AD, $FF, $BC, $BE, $AA, $FF, $B1, $B4, $9F, $FF, $6E, $71, $5C, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $65, + $00, $00, $00, $00, $00, $00, $00, $FF, $E6, $E7, $DD, $FF, $F5, $F6, $F3, $FF, + $E6, $E7, $DD, $FF, $E6, $E7, $DD, $FF, $E6, $E7, $DD, $FF, $E4, $E5, $DB, $FF, + $E6, $E7, $DD, $FF, $E2, $E4, $D9, $FF, $E2, $E4, $D9, $FF, $E1, $E3, $D8, $FF, + $E1, $E3, $D8, $FF, $DF, $E1, $D6, $FF, $C4, $C6, $B6, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $F7, $F7, $F6, $FF, $D3, $D6, $C5, $FF, + $D3, $D6, $C4, $FF, $D2, $D4, $C2, $FF, $D0, $D2, $C0, $FF, $CE, $D1, $BD, $FF, + $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, $CA, $CD, $B9, $FF, $C8, $CB, $B6, $FF, + $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, $93, $96, $7C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $F0, $F0, $EB, $FF, $D3, $D6, $C5, $FF, + $D3, $D6, $C4, $FF, $D2, $D4, $C2, $FF, $D0, $D2, $C0, $FF, $CE, $D1, $BD, $FF, + $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, $CA, $CD, $B9, $FF, $C8, $CB, $B6, $FF, + $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, $93, $96, $7C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $F0, $F1, $EC, $FF, $D2, $D4, $C2, $FF, + $D0, $D2, $C0, $FF, $CE, $D1, $BD, $FF, $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, + $C8, $CB, $B6, $FF, $C6, $C9, $B3, $FF, $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, + $C3, $C6, $AF, $FF, $C1, $C4, $AD, $FF, $90, $94, $78, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $EF, $F0, $EB, $FF, $CE, $D1, $BD, $FF, + $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, $C8, $CB, $B6, $FF, $C6, $C9, $B3, $FF, + $C4, $C8, $B1, $FF, $C3, $C6, $AF, $FF, $C3, $C6, $AF, $FF, $C1, $C4, $AD, $FF, + $BF, $C2, $AB, $FF, $BD, $C1, $A8, $FF, $8E, $91, $75, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $ED, $EE, $E8, $FF, $CA, $CD, $B9, $FF, + $C8, $CB, $B6, $FF, $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, $C3, $C6, $AF, $FF, + $C1, $C4, $AD, $FF, $BF, $C2, $AB, $FF, $BF, $C2, $AB, $FF, $BD, $C1, $A8, $FF, + $BB, $BE, $A5, $FF, $BA, $BD, $A3, $FF, $8B, $8F, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $EC, $EE, $E7, $FF, $C6, $C9, $B3, $FF, + $C4, $C8, $B1, $FF, $C3, $C6, $AF, $FF, $C1, $C4, $AD, $FF, $BF, $C2, $AB, $FF, + $BD, $C1, $A8, $FF, $BB, $BE, $A5, $FF, $BB, $BE, $A5, $FF, $BA, $BD, $A3, $FF, + $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, $8B, $8F, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $E8, $E8, $E0, $FF, $C3, $C6, $AF, $FF, + $C1, $C4, $AD, $FF, $BF, $C2, $AB, $FF, $BD, $C1, $A8, $FF, $BB, $BE, $A5, $FF, + $BA, $BD, $A3, $FF, $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, + $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, $8B, $8F, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $C6, $C9, $BA, $FF, $90, $94, $78, $FF, + $8E, $92, $76, $FF, $8E, $91, $75, $FF, $8C, $90, $73, $FF, $8B, $8F, $72, $FF, + $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, + $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, $64, $67, $51, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $65, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $65, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/stock_lock_16_png.inc b/pixmaps/stock_lock_16_png.inc new file mode 100644 index 0000000..1b073ce --- /dev/null +++ b/pixmaps/stock_lock_16_png.inc @@ -0,0 +1,73 @@ +const stock_lock_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $69, $00, $00, $00, $BB, $00, $00, $00, $C6, + $00, $00, $00, $C6, $00, $00, $00, $C1, $00, $00, $00, $3B, $00, $00, $00, $01, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $10, + $1E, $1E, $1E, $94, $7A, $7A, $7A, $FB, $D2, $D2, $D2, $FF, $DB, $DB, $DB, $FF, + $DB, $DB, $DB, $FF, $BC, $BC, $BC, $FE, $72, $72, $72, $F1, $08, $08, $08, $86, + $00, $00, $00, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $13, $13, $13, $7E, + $84, $84, $84, $FC, $BE, $BE, $BE, $F7, $38, $38, $38, $F2, $1C, $1C, $1C, $F9, + $1C, $1C, $1C, $F9, $4D, $4D, $4D, $FC, $B1, $B1, $B1, $FF, $84, $84, $84, $F6, + $00, $00, $00, $6F, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $2D, $2D, $2D, $EB, + $C2, $C2, $C2, $FD, $09, $09, $09, $DE, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $2E, $2E, $2E, $FC, $AA, $AA, $AA, $FE, + $00, $00, $00, $BD, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $2B, $2B, $2B, $FC, + $C0, $C0, $C0, $FC, $00, $00, $00, $DC, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $16, $16, $16, $FA, $C1, $C0, $C0, $FF, + $00, $00, $00, $E0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $60, $13, $11, $0E, $F8, + $9B, $97, $94, $FF, $20, $1D, $1C, $FF, $0B, $0B, $07, $FF, $04, $03, $02, $FF, + $04, $03, $02, $FF, $05, $04, $03, $FF, $2F, $29, $21, $FF, $A8, $A3, $9E, $FF, + $1A, $13, $0B, $FF, $00, $00, $00, $60, $00, $00, $00, $00, $00, $00, $00, $01, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $A5, $91, $76, $FF, + $E0, $C4, $A0, $FF, $DF, $C4, $A3, $FF, $DF, $C4, $A3, $FF, $DA, $BE, $9A, $FF, + $DA, $BE, $9A, $FF, $DA, $BE, $9A, $FF, $D6, $BA, $94, $FF, $CD, $A6, $76, $FF, + $81, $5A, $2B, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $04, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $E2, $C5, $A1, $FF, + $D8, $B5, $8C, $FF, $CA, $9F, $68, $FF, $AC, $87, $58, $FF, $A7, $82, $52, $FF, + $A7, $82, $52, $FF, $A7, $82, $53, $FF, $A3, $7B, $4B, $FF, $BC, $88, $49, $FF, + $AC, $71, $2E, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $05, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $E3, $C6, $A2, $FF, + $D5, $AE, $7E, $FF, $B0, $8D, $5F, $FF, $D5, $B2, $84, $FF, $CF, $AB, $7C, $FF, + $CF, $AB, $7C, $FF, $CF, $AC, $7B, $FF, $CB, $A4, $71, $FF, $BC, $87, $46, $FF, + $AA, $6F, $2B, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $E1, $C4, $A0, $FF, + $D0, $A6, $74, $FF, $C7, $9B, $64, $FF, $AA, $84, $55, $FF, $A4, $7E, $4E, $FF, + $A4, $7E, $4E, $FF, $A4, $7E, $4E, $FF, $A0, $77, $44, $FF, $BA, $84, $42, $FF, + $AC, $71, $2E, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $E1, $C2, $9C, $FF, + $CE, $A4, $70, $FF, $AD, $8D, $64, $FF, $D2, $B2, $89, $FF, $CD, $AC, $83, $FF, + $CD, $AC, $83, $FF, $CE, $AD, $83, $FF, $CC, $A7, $7B, $FF, $B8, $80, $3E, $FF, + $AD, $73, $32, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $E0, $C2, $9E, $FF, + $D4, $AC, $79, $FF, $CD, $A6, $6E, $FF, $AF, $8D, $5E, $FF, $AB, $87, $58, $FF, + $AB, $87, $58, $FF, $AB, $88, $58, $FF, $A8, $81, $4C, $FF, $BC, $87, $46, $FF, + $B4, $7E, $3E, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $D0, $A8, $74, $FF, + $C6, $96, $5D, $FF, $BE, $8D, $50, $FF, $BE, $8D, $50, $FF, $BA, $89, $4B, $FF, + $BA, $89, $4B, $FF, $BD, $8C, $4E, $FF, $BC, $8A, $4C, $FF, $BA, $86, $47, $FF, + $A4, $71, $36, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $60, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $77, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/stock_lock_48_png.inc b/pixmaps/stock_lock_48_png.inc new file mode 100644 index 0000000..2710c79 --- /dev/null +++ b/pixmaps/stock_lock_48_png.inc @@ -0,0 +1,585 @@ +const stock_lock_48_png: array[1..9241] of byte = ( + $47, $64, $6B, $50, + $00, $00, $24, $18, + $01, $01, $00, $02, + $00, $00, $00, $C0, + $00, $00, $00, $30, + $00, $00, $00, $30, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $02, $00, $00, $00, $03, $00, $00, $00, $04, + $00, $00, $00, $05, $00, $00, $00, $05, $00, $00, $00, $05, $00, $00, $00, $04, + $00, $00, $00, $03, $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $02, $00, $00, $00, $04, + $00, $00, $00, $07, $00, $00, $00, $0B, $00, $00, $00, $0E, $00, $00, $00, $11, + $00, $00, $00, $13, $00, $00, $00, $13, $00, $00, $00, $13, $00, $00, $00, $11, + $00, $00, $00, $0E, $00, $00, $00, $0B, $00, $00, $00, $07, $00, $00, $00, $04, + $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $01, $00, $00, $00, $04, $00, $00, $00, $08, $00, $00, $00, $0E, + $00, $00, $00, $67, $00, $00, $00, $AB, $00, $00, $00, $DA, $00, $00, $00, $F6, + $01, $01, $01, $FF, $00, $00, $00, $F6, $00, $00, $00, $DC, $00, $00, $00, $B0, + $00, $00, $00, $72, $00, $00, $00, $1E, $00, $00, $00, $16, $00, $00, $00, $0E, + $00, $00, $00, $08, $00, $00, $00, $04, $00, $00, $00, $01, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $02, + $00, $00, $00, $06, $00, $00, $00, $0C, $00, $00, $00, $83, $00, $00, $00, $EC, + $01, $01, $01, $FF, $9B, $9B, $9B, $FF, $D0, $D0, $D0, $FF, $E3, $E3, $E3, $FF, + $E9, $E9, $E9, $FF, $DD, $DD, $DD, $FF, $C6, $C6, $C6, $FF, $91, $91, $91, $FF, + $01, $01, $01, $FF, $00, $00, $00, $EE, $00, $00, $00, $91, $00, $00, $00, $23, + $00, $00, $00, $17, $00, $00, $00, $0D, $00, $00, $00, $06, $00, $00, $00, $02, + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $02, $00, $00, $00, $07, + $00, $00, $00, $3F, $00, $00, $00, $D0, $01, $01, $01, $FF, $BE, $BE, $BE, $FF, + $EA, $EA, $EA, $FF, $F1, $F1, $F1, $FF, $F3, $F3, $F3, $FF, $F1, $F1, $F1, $FF, + $ED, $ED, $ED, $FF, $EA, $EA, $EA, $FF, $E6, $E6, $E6, $FF, $E2, $E2, $E2, $FF, + $D8, $D8, $D8, $FF, $9C, $9C, $9C, $FF, $01, $01, $01, $FF, $00, $00, $00, $D8, + $00, $00, $00, $57, $00, $00, $00, $1E, $00, $00, $00, $11, $00, $00, $00, $07, + $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $07, $00, $00, $00, $52, + $00, $00, $00, $F6, $60, $60, $60, $FF, $E3, $E3, $E3, $FF, $F3, $F3, $F3, $FF, + $F0, $F0, $F0, $FF, $EC, $EC, $EC, $FF, $E6, $E6, $E6, $FF, $E4, $E4, $E4, $FF, + $E3, $E3, $E3, $FF, $E2, $E2, $E2, $FF, $E2, $E2, $E2, $FF, $E2, $E2, $E2, $FF, + $E1, $E1, $E1, $FF, $D6, $D6, $D6, $FF, $B7, $B7, $B7, $FF, $45, $45, $45, $FF, + $00, $00, $00, $F7, $00, $00, $00, $6E, $00, $00, $00, $22, $00, $00, $00, $12, + $00, $00, $00, $07, $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $01, $00, $00, $00, $06, $00, $00, $00, $3E, $00, $00, $00, $F6, + $85, $85, $85, $FF, $EC, $EC, $EC, $FF, $F3, $F3, $F3, $FF, $EA, $EA, $EA, $FF, + $E3, $E3, $E3, $FF, $D9, $D9, $D9, $FF, $CE, $CE, $CE, $FF, $C2, $C2, $C2, $FF, + $C2, $C2, $C2, $FF, $CC, $CC, $CC, $FF, $D5, $D5, $D5, $FF, $DC, $DC, $DC, $FF, + $E0, $E0, $E0, $FF, $DD, $DD, $DD, $FF, $C8, $C8, $C8, $FF, $B9, $B9, $B9, $FF, + $62, $62, $62, $FF, $00, $00, $00, $F8, $00, $00, $00, $59, $00, $00, $00, $22, + $00, $00, $00, $0F, $00, $00, $00, $05, $00, $00, $00, $01, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, + $00, $00, $00, $04, $00, $00, $00, $0D, $00, $00, $00, $D0, $5E, $5E, $5E, $FF, + $EC, $EC, $EC, $FF, $F3, $F3, $F3, $FF, $E8, $E8, $E8, $FF, $DC, $DC, $DC, $FF, + $BC, $BC, $BC, $F8, $58, $58, $58, $F0, $14, $14, $14, $E1, $00, $00, $00, $DB, + $00, $00, $00, $D6, $00, $00, $00, $D4, $7B, $7B, $7B, $EA, $BE, $BE, $BE, $F6, + $E0, $E0, $E0, $FF, $DF, $DF, $DF, $FF, $DC, $DC, $DC, $FF, $C3, $C3, $C3, $FF, + $BB, $BB, $BB, $FF, $4C, $4C, $4C, $FF, $00, $00, $00, $BC, $00, $00, $00, $35, + $00, $00, $00, $1C, $00, $00, $00, $0B, $00, $00, $00, $03, $00, $00, $00, $01, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $02, + $00, $00, $00, $08, $00, $00, $00, $83, $01, $01, $01, $FF, $E2, $E2, $E2, $FF, + $F3, $F3, $F3, $FF, $E9, $E9, $E9, $FF, $D8, $D8, $D8, $FF, $97, $97, $97, $EC, + $00, $00, $00, $EA, $00, $00, $00, $BD, $00, $00, $00, $68, $00, $00, $00, $5A, + $00, $00, $00, $53, $00, $00, $00, $52, $00, $00, $00, $5A, $00, $00, $00, $C6, + $9C, $9C, $9C, $E9, $DD, $DD, $DD, $F9, $E0, $E0, $E0, $FF, $D8, $D8, $D8, $FF, + $BB, $BB, $BB, $FF, $B6, $B6, $B6, $FF, $01, $01, $01, $FF, $00, $00, $00, $79, + $00, $00, $00, $2B, $00, $00, $00, $13, $00, $00, $00, $07, $00, $00, $00, $01, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $03, + $00, $00, $00, $0D, $00, $00, $00, $EC, $B9, $B9, $B9, $FF, $F3, $F3, $F3, $FF, + $EB, $EB, $EB, $FF, $D8, $D8, $D8, $FF, $8A, $8A, $8A, $EE, $00, $00, $00, $E3, + $00, $00, $00, $7E, $00, $00, $00, $58, $00, $00, $00, $46, $00, $00, $00, $39, + $00, $00, $00, $31, $00, $00, $00, $2E, $00, $00, $00, $32, $00, $00, $00, $3C, + $00, $00, $00, $94, $91, $91, $91, $E0, $DB, $DB, $DB, $F7, $DF, $DF, $DF, $FF, + $CE, $CE, $CE, $FF, $B3, $B3, $B3, $FF, $93, $93, $93, $FF, $00, $00, $00, $CB, + $00, $00, $00, $3B, $00, $00, $00, $1E, $00, $00, $00, $0B, $00, $00, $00, $03, + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $45, $01, $01, $01, $FF, $EA, $EA, $EA, $FF, $F1, $F1, $F1, $FF, + $DD, $DD, $DD, $FF, $C0, $C0, $C0, $FF, $02, $02, $02, $E8, $00, $00, $00, $8C, + $00, $00, $00, $55, $00, $00, $00, $3D, $00, $00, $00, $29, $00, $00, $00, $1C, + $00, $00, $00, $15, $00, $00, $00, $13, $00, $00, $00, $16, $00, $00, $00, $1F, + $00, $00, $00, $2E, $00, $00, $00, $A0, $A2, $A2, $A2, $DF, $E5, $E5, $E5, $FF, + $DD, $DD, $DD, $FF, $C0, $C0, $C0, $FF, $B6, $B6, $B6, $FF, $01, $01, $01, $FF, + $00, $00, $00, $61, $00, $00, $00, $29, $00, $00, $00, $12, $00, $00, $00, $05, + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $09, + $00, $00, $00, $70, $A0, $A0, $A0, $FF, $F1, $F1, $F1, $FF, $E8, $E8, $E8, $FF, + $C6, $C6, $C6, $FF, $80, $80, $80, $ED, $00, $00, $00, $D2, $00, $00, $00, $5B, + $00, $00, $00, $3E, $00, $00, $00, $26, $00, $00, $00, $14, $00, $00, $00, $0B, + $00, $00, $00, $07, $00, $00, $00, $06, $00, $00, $00, $07, $00, $00, $00, $0D, + $00, $00, $00, $18, $00, $00, $00, $30, $02, $02, $02, $CB, $DC, $DC, $DC, $EF, + $EA, $EA, $EA, $FF, $D1, $D1, $D1, $FF, $AE, $AE, $AE, $FF, $76, $76, $76, $FF, + $00, $00, $00, $91, $00, $00, $00, $35, $00, $00, $00, $18, $00, $00, $00, $08, + $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $03, $00, $00, $00, $0C, + $00, $00, $00, $93, $D0, $D0, $D0, $FF, $F2, $F2, $F2, $FF, $D9, $D9, $D9, $FF, + $C0, $C0, $C0, $FF, $2F, $2F, $2F, $E5, $00, $00, $00, $8B, $00, $00, $00, $4B, + $00, $00, $00, $2C, $00, $00, $00, $16, $00, $00, $00, $09, $00, $00, $00, $03, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $02, $00, $00, $00, $04, + $00, $00, $00, $0B, $00, $00, $00, $19, $00, $00, $00, $6E, $82, $82, $82, $E1, + $EE, $EE, $EE, $FF, $DC, $DC, $DC, $FF, $B5, $B5, $B5, $FF, $9F, $9F, $9F, $FF, + $00, $00, $00, $BC, $00, $00, $00, $3E, $00, $00, $00, $1F, $00, $00, $00, $0B, + $00, $00, $00, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $04, $00, $00, $00, $0E, + $00, $00, $00, $D5, $E1, $E1, $E1, $FF, $F1, $F1, $F1, $FF, $CC, $CC, $CC, $FF, + $C0, $C0, $C0, $FF, $0F, $0F, $0F, $D9, $00, $00, $00, $65, $00, $00, $00, $3D, + $00, $00, $00, $21, $00, $00, $00, $0E, $00, $00, $00, $05, $00, $00, $00, $02, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $02, + $00, $00, $00, $06, $00, $00, $00, $0F, $00, $00, $00, $23, $1F, $1F, $1F, $D4, + $EC, $EC, $EC, $FF, $E2, $E2, $E2, $FF, $C0, $C0, $C0, $FF, $A8, $A8, $A8, $FF, + $00, $00, $00, $D6, $00, $00, $00, $47, $00, $00, $00, $26, $00, $00, $00, $0E, + $00, $00, $00, $04, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $07, $00, $00, $00, $14, + $00, $00, $00, $DE, $E6, $E6, $E6, $FF, $EF, $EF, $EF, $FF, $CB, $CB, $CB, $FF, + $B7, $B7, $B7, $FF, $00, $00, $00, $D2, $00, $00, $00, $58, $00, $00, $00, $37, + $00, $00, $00, $1C, $00, $00, $00, $0D, $00, $00, $00, $08, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $08, $00, $00, $00, $0E, $00, $00, $00, $1D, $00, $00, $00, $C1, + $E9, $E9, $E9, $FF, $E5, $E5, $E5, $FF, $C5, $C5, $C5, $FF, $AE, $AE, $AE, $FF, + $00, $00, $00, $F0, $00, $00, $00, $50, $00, $00, $00, $2E, $00, $00, $00, $15, + $00, $00, $00, $08, $00, $00, $00, $03, $00, $00, $00, $01, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, + $00, $00, $00, $02, $00, $00, $00, $06, $00, $00, $00, $0F, $00, $00, $00, $1F, + $00, $00, $00, $EC, $DA, $DA, $DA, $FF, $EB, $EB, $EB, $FF, $CA, $CA, $CA, $FF, + $AB, $AB, $AB, $FF, $00, $00, $00, $D2, $00, $00, $00, $5A, $00, $00, $00, $3C, + $00, $00, $00, $26, $00, $00, $00, $1A, $00, $00, $00, $16, $00, $00, $00, $15, + $00, $00, $00, $15, $00, $00, $00, $15, $00, $00, $00, $15, $00, $00, $00, $15, + $00, $00, $00, $16, $00, $00, $00, $1A, $00, $00, $00, $26, $00, $00, $00, $C1, + $E4, $E4, $E4, $FF, $E3, $E3, $E3, $FF, $CA, $CA, $CA, $FF, $AD, $AC, $AA, $FF, + $00, $00, $00, $F9, $00, $00, $00, $5A, $00, $00, $00, $3B, $00, $00, $00, $22, + $00, $00, $00, $13, $00, $00, $00, $0B, $00, $00, $00, $05, $00, $00, $00, $02, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, + $00, $00, $00, $06, $31, $16, $07, $66, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $9C, $52, $17, $FF, $B8, $6E, $25, $FF, $B9, $6B, $26, $FF, + $A7, $5A, $1C, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $A5, $5E, $1F, $FF, $BC, $73, $2A, $FF, $B8, $6F, $27, $FF, $97, $55, $1A, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $25, $10, $05, $5F, $00, $00, $00, $1B, $00, $00, $00, $0E, $00, $00, $00, $05, + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $03, + $00, $00, $00, $0B, $37, $19, $08, $FF, $C9, $9C, $62, $FF, $F4, $E1, $CB, $FF, + $F4, $E0, $C9, $FF, $EF, $DB, $BE, $FF, $EC, $D5, $B7, $FF, $EB, $D2, $B4, $FF, + $EA, $D2, $B3, $FF, $EB, $CF, $B0, $FF, $E9, $CE, $AE, $FF, $E8, $CC, $AB, $FF, + $E7, $CC, $A8, $FF, $E8, $C7, $A1, $FF, $E6, $C6, $A1, $FF, $E6, $C6, $A1, $FF, + $E6, $C6, $A1, $FF, $E6, $C6, $A1, $FF, $E6, $C6, $A1, $FF, $E8, $C7, $A1, $FF, + $E8, $C7, $A1, $FF, $E6, $C6, $A1, $FF, $E5, $C5, $A0, $FF, $E5, $C5, $A0, $FF, + $E3, $C2, $9A, $FF, $E0, $C0, $9B, $FF, $E0, $BD, $93, $FF, $DF, $BA, $92, $FF, + $DF, $BA, $8E, $FF, $DD, $B3, $86, $FF, $D5, $AC, $7C, $FF, $A2, $61, $1B, $FF, + $37, $19, $08, $FF, $00, $00, $00, $31, $00, $00, $00, $1B, $00, $00, $00, $0B, + $00, $00, $00, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $04, + $00, $00, $00, $10, $37, $19, $08, $FF, $F5, $E6, $D0, $FF, $EA, $D3, $AF, $FF, + $EA, $CF, $AF, $FF, $E3, $C2, $9A, $FF, $DA, $B8, $8B, $FF, $DA, $B6, $87, $FF, + $D8, $B0, $81, $FF, $D6, $AE, $7F, $FF, $D3, $AB, $7C, $FF, $D1, $A9, $74, $FF, + $CF, $A5, $6E, $FF, $CC, $A3, $6D, $FF, $CA, $9F, $67, $FF, $CA, $9F, $67, $FF, + $CA, $9F, $67, $FF, $CA, $9F, $67, $FF, $CA, $9F, $67, $FF, $CA, $9F, $67, $FF, + $CA, $9F, $67, $FF, $C8, $9E, $67, $FF, $C6, $9B, $63, $FF, $C2, $98, $61, $FF, + $C2, $93, $5B, $FF, $BF, $90, $52, $FF, $BC, $88, $4B, $FF, $BD, $84, $40, $FF, + $BA, $7E, $3D, $FF, $B3, $76, $34, $FF, $A7, $6A, $22, $FF, $8D, $53, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $45, $00, $00, $00, $27, $00, $00, $00, $0F, + $00, $00, $00, $04, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $05, + $00, $00, $00, $13, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $E9, $CE, $AE, $FF, + $E7, $CD, $A8, $FF, $DF, $BD, $90, $FF, $D8, $B1, $83, $FF, $D5, $AD, $7E, $FF, + $D2, $AA, $7B, $FF, $D2, $A6, $77, $FF, $D0, $A7, $71, $FF, $CD, $A3, $6C, $FF, + $C8, $9F, $68, $FF, $C5, $9B, $64, $FF, $C4, $99, $61, $FF, $C4, $99, $61, $FF, + $C4, $99, $61, $FF, $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, + $C5, $9A, $62, $FF, $C4, $99, $61, $FF, $C2, $98, $5D, $FF, $C1, $94, $5A, $FF, + $BF, $90, $54, $FF, $BE, $8E, $4F, $FF, $BC, $87, $49, $FF, $BA, $82, $3F, $FF, + $BA, $7E, $3D, $FF, $B1, $74, $32, $FF, $A7, $6A, $22, $FF, $8B, $52, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $52, $00, $00, $00, $2E, $00, $00, $00, $13, + $00, $00, $00, $05, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $14, $37, $19, $08, $FF, $F5, $E6, $D0, $FF, $EB, $CF, $B0, $FF, + $E9, $CE, $AE, $FF, $E0, $BF, $97, $FF, $DB, $B4, $86, $FF, $D8, $B0, $81, $FF, + $D7, $AF, $80, $FF, $D2, $AC, $7B, $FF, $D2, $A6, $77, $FF, $D0, $A6, $6F, $FF, + $CC, $A3, $6D, $FF, $CA, $9F, $67, $FF, $C7, $9C, $64, $FF, $C7, $9C, $64, $FF, + $C7, $9C, $64, $FF, $C7, $9C, $64, $FF, $C7, $9C, $64, $FF, $C7, $9C, $64, $FF, + $C7, $9C, $64, $FF, $C5, $9A, $62, $FF, $C2, $97, $5F, $FF, $C2, $93, $5B, $FF, + $BF, $90, $54, $FF, $BE, $8E, $4F, $FF, $BC, $84, $41, $FF, $BA, $82, $3F, $FF, + $B5, $7C, $38, $FF, $AF, $73, $2C, $FF, $A3, $66, $1E, $FF, $87, $50, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $57, $00, $00, $00, $32, $00, $00, $00, $15, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $EA, $CF, $AF, $FF, + $E8, $CD, $A9, $FF, $DF, $BC, $92, $FF, $D5, $AD, $7E, $FF, $D2, $AB, $7D, $FF, + $D2, $AA, $7B, $FF, $D0, $AB, $75, $FF, $D0, $A6, $6F, $FF, $CD, $A3, $6C, $FF, + $C8, $9F, $68, $FF, $C7, $9C, $64, $FF, $C5, $9B, $64, $FF, $C5, $9A, $62, $FF, + $C5, $9B, $64, $FF, $C7, $9C, $64, $FF, $C8, $9E, $67, $FF, $C8, $9F, $68, $FF, + $CA, $9F, $67, $FF, $C7, $9D, $66, $FF, $C5, $9B, $64, $FF, $C4, $99, $61, $FF, + $C2, $98, $5D, $FF, $BF, $91, $56, $FF, $BE, $8E, $4F, $FF, $BE, $86, $45, $FF, + $BC, $83, $3F, $FF, $B6, $7C, $37, $FF, $AA, $6C, $23, $FF, $8D, $55, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $58, $00, $00, $00, $33, $00, $00, $00, $15, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $E9, $CE, $AE, $FF, + $E8, $CE, $A9, $FF, $E1, $BC, $94, $FF, $DA, $B4, $87, $FF, $D8, $B2, $81, $FF, + $D7, $AF, $80, $FF, $D2, $AA, $7B, $FF, $D0, $A8, $73, $FF, $CF, $A5, $6E, $FF, + $CA, $A1, $6B, $FF, $CA, $9F, $67, $FF, $C7, $9C, $64, $FF, $C8, $9E, $67, $FF, + $C8, $9E, $67, $FF, $C8, $9F, $68, $FF, $C8, $9F, $68, $FF, $C8, $9F, $68, $FF, + $CA, $9F, $67, $FF, $C5, $9B, $64, $FF, $C5, $9A, $62, $FF, $C2, $97, $5F, $FF, + $C1, $94, $5A, $FF, $BE, $8F, $51, $FF, $BC, $87, $49, $FF, $BA, $81, $3D, $FF, + $B7, $7E, $3A, $FF, $B3, $79, $34, $FF, $A6, $69, $21, $FF, $8B, $52, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E8, $CD, $A9, $FF, + $E5, $C9, $A4, $FF, $DD, $BA, $90, $FF, $D5, $AD, $7E, $FF, $D2, $AA, $7B, $FF, + $D2, $AA, $7B, $FF, $D2, $A5, $75, $FF, $D1, $A7, $70, $FF, $CC, $A3, $6D, $FF, + $CA, $9F, $67, $FF, $C8, $9E, $67, $FF, $C5, $9A, $62, $FF, $C5, $9B, $64, $FF, + $C7, $9C, $64, $FF, $C8, $9E, $67, $FF, $C8, $9F, $68, $FF, $CA, $9F, $67, $FF, + $CA, $9F, $67, $FF, $C8, $9E, $67, $FF, $C6, $9B, $63, $FF, $C4, $99, $61, $FF, + $C2, $97, $5F, $FF, $BF, $91, $56, $FF, $BD, $8C, $4C, $FF, $BC, $88, $45, $FF, + $BB, $82, $3E, $FF, $B6, $7C, $37, $FF, $A9, $6B, $22, $FF, $8D, $53, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $E9, $CD, $AC, $FF, + $E7, $CB, $A6, $FF, $DF, $BC, $92, $FF, $D8, $B0, $81, $FF, $D0, $A4, $73, $FF, + $CA, $9F, $70, $FF, $C9, $9C, $6B, $FF, $C6, $94, $60, $FF, $BF, $8E, $56, $FF, + $B8, $87, $4F, $FF, $B4, $83, $4B, $FF, $AE, $7C, $45, $FF, $AD, $7A, $43, $FF, + $AF, $7B, $43, $FF, $B0, $7C, $44, $FF, $B2, $7F, $48, $FF, $B3, $82, $4A, $FF, + $B6, $86, $4E, $FF, $B7, $87, $50, $FF, $B6, $87, $4F, $FF, $B7, $88, $50, $FF, + $B7, $87, $4E, $FF, $B6, $85, $48, $FF, $B6, $83, $44, $FF, $BC, $85, $43, $FF, + $BA, $7E, $3D, $FF, $B3, $78, $32, $FF, $A7, $6A, $22, $FF, $8B, $52, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E8, $CC, $A7, $FF, + $E5, $CA, $A4, $FF, $DC, $B9, $8F, $FF, $D6, $AE, $7F, $FF, $D7, $B2, $84, $FF, + $D7, $B2, $85, $FF, $D8, $AF, $80, $FF, $D8, $B2, $7C, $FF, $D6, $B2, $7D, $FF, + $D7, $B4, $7D, $FF, $D8, $B5, $7C, $FF, $DA, $B7, $7E, $FF, $DB, $B9, $80, $FF, + $DB, $B9, $80, $FF, $DB, $B8, $80, $FF, $D9, $B6, $7E, $FF, $D7, $B4, $7B, $FF, + $D5, $B0, $78, $FF, $D0, $AA, $73, $FF, $CC, $A1, $64, $FF, $C8, $9C, $5E, $FF, + $C4, $96, $56, $FF, $C2, $8F, $4F, $FF, $BF, $88, $43, $FF, $B5, $7D, $3A, $FF, + $B5, $78, $36, $FF, $AD, $72, $2C, $FF, $A4, $66, $1D, $FF, $87, $50, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $E9, $CD, $AC, $FF, + $E7, $CB, $A6, $FF, $DD, $BA, $90, $FF, $D5, $AD, $7E, $FF, $CE, $A5, $72, $FF, + $CC, $A0, $6A, $FF, $C9, $9C, $64, $FF, $C1, $95, $5E, $FF, $BC, $8F, $57, $FF, + $B6, $85, $4E, $FF, $AE, $7E, $44, $FF, $A9, $75, $3D, $FF, $AA, $72, $3C, $FF, + $A9, $72, $3B, $FF, $AA, $73, $3C, $FF, $AA, $79, $3F, $FF, $AD, $7C, $43, $FF, + $B1, $82, $47, $FF, $B5, $81, $4A, $FF, $B7, $85, $4A, $FF, $B7, $86, $49, $FF, + $B8, $86, $48, $FF, $B7, $81, $45, $FF, $B8, $7E, $3B, $FF, $B7, $7F, $3C, $FF, + $B6, $7C, $37, $FF, $B0, $75, $2F, $FF, $A4, $68, $21, $FF, $89, $51, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E6, $D0, $FF, $EA, $CF, $AF, $FF, + $E9, $CE, $AA, $FF, $E1, $BC, $94, $FF, $DB, $B4, $86, $FF, $DC, $B7, $8A, $FF, + $DD, $B8, $8B, $FF, $DA, $B5, $87, $FF, $D8, $B4, $84, $FF, $D8, $B5, $81, $FF, + $DB, $B6, $81, $FF, $DB, $B9, $85, $FF, $DD, $BA, $83, $FF, $DF, $BE, $86, $FF, + $DE, $BE, $88, $FF, $DD, $BD, $87, $FF, $DC, $BB, $85, $FF, $D9, $B6, $80, $FF, + $D6, $B2, $7B, $FF, $D1, $AA, $72, $FF, $CA, $A3, $67, $FF, $C7, $9C, $61, $FF, + $C3, $96, $59, $FF, $C0, $90, $4F, $FF, $BE, $88, $47, $FF, $B7, $7F, $3C, $FF, + $B6, $7A, $39, $FF, $B1, $76, $30, $FF, $A4, $68, $21, $FF, $8B, $52, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E9, $CE, $AA, $FF, + $E5, $C9, $A4, $FF, $DA, $B8, $8B, $FF, $D2, $AC, $77, $FF, $CF, $A0, $70, $FF, + $CD, $A2, $6C, $FF, $C8, $9D, $66, $FF, $C3, $97, $61, $FF, $BE, $91, $5A, $FF, + $B6, $87, $4F, $FF, $B0, $80, $46, $FF, $AD, $77, $40, $FF, $A8, $77, $3D, $FF, + $AA, $78, $3E, $FF, $AA, $79, $42, $FF, $AC, $7B, $45, $FF, $B2, $80, $49, $FF, + $B5, $85, $4D, $FF, $B6, $89, $52, $FF, $B9, $88, $50, $FF, $B8, $88, $4E, $FF, + $BA, $8A, $4E, $FF, $B9, $87, $48, $FF, $B9, $84, $42, $FF, $BA, $82, $3F, $FF, + $B7, $7D, $38, $FF, $B3, $78, $32, $FF, $AD, $6F, $26, $FF, $89, $51, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $E9, $CE, $AA, $FF, + $E7, $CB, $A6, $FF, $DC, $B9, $8F, $FF, $D6, $AE, $7F, $FF, $D5, $AF, $81, $FF, + $D5, $AF, $80, $FF, $D6, $AB, $7C, $FF, $D5, $AE, $78, $FF, $D2, $AD, $77, $FF, + $D4, $AF, $78, $FF, $D5, $B1, $7A, $FF, $D9, $B5, $7D, $FF, $DA, $B8, $7F, $FF, + $DB, $B8, $80, $FF, $DA, $B7, $7F, $FF, $D8, $B5, $7C, $FF, $D5, $B1, $78, $FF, + $D2, $AC, $74, $FF, $CD, $A6, $6F, $FF, $C9, $9C, $60, $FF, $C4, $98, $5C, $FF, + $C2, $93, $53, $FF, $BF, $8B, $4C, $FF, $BE, $86, $41, $FF, $B7, $7E, $3A, $FF, + $B5, $79, $38, $FF, $AD, $76, $2E, $FF, $AF, $72, $2A, $FF, $87, $50, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E6, $D0, $FF, $EA, $CF, $AF, $FF, + $E9, $CE, $AA, $FF, $E1, $BD, $96, $FF, $DB, $B4, $86, $FF, $D5, $AB, $7B, $FF, + $D2, $A8, $78, $FF, $CD, $A5, $73, $FF, $CA, $9F, $69, $FF, $C4, $96, $5E, $FF, + $BD, $8E, $57, $FF, $B7, $87, $50, $FF, $B0, $7E, $46, $FF, $AE, $7B, $43, $FF, + $AC, $79, $41, $FF, $AD, $7A, $42, $FF, $AF, $7C, $45, $FF, $B1, $80, $48, $FF, + $B5, $85, $4D, $FF, $B6, $88, $4D, $FF, $B8, $86, $4B, $FF, $B8, $87, $4C, $FF, + $B8, $86, $48, $FF, $B8, $84, $43, $FF, $B9, $7F, $3C, $FF, $B7, $7E, $3A, $FF, + $B5, $79, $38, $FF, $AF, $73, $2C, $FF, $BD, $82, $42, $FF, $87, $50, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E7, $CC, $A8, $FF, + $E6, $C6, $A1, $FF, $DB, $B8, $8E, $FF, $D3, $AB, $7C, $FF, $D5, $B0, $7E, $FF, + $D4, $AC, $7C, $FF, $D5, $AD, $77, $FF, $D2, $AB, $75, $FF, $D3, $AC, $74, $FF, + $D2, $AC, $74, $FF, $D5, $B0, $78, $FF, $D7, $B3, $78, $FF, $D9, $B7, $7B, $FF, + $D9, $B7, $7B, $FF, $D9, $B7, $7F, $FF, $D9, $B6, $7D, $FF, $D6, $B2, $7A, $FF, + $D3, $AE, $75, $FF, $CE, $A8, $71, $FF, $CB, $9F, $66, $FF, $C8, $9B, $5E, $FF, + $C4, $96, $58, $FF, $C0, $8D, $4F, $FF, $BE, $88, $47, $FF, $BA, $7E, $3D, $FF, + $B4, $7B, $37, $FF, $B1, $76, $30, $FF, $C0, $8D, $51, $FF, $89, $4E, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E0, $C9, $FF, $E7, $CB, $A6, $FF, + $E6, $C6, $A1, $FF, $DC, $B3, $87, $FF, $D1, $AB, $76, $FF, $D1, $A5, $72, $FF, + $D0, $A6, $6F, $FF, $CD, $A3, $6C, $FF, $C8, $9F, $68, $FF, $C4, $99, $61, $FF, + $C2, $97, $5F, $FF, $C0, $92, $57, $FF, $BF, $91, $56, $FF, $BF, $91, $56, $FF, + $C0, $92, $57, $FF, $C2, $93, $5B, $FF, $C1, $97, $5C, $FF, $C2, $98, $5D, $FF, + $C2, $98, $61, $FF, $C2, $93, $5B, $FF, $BF, $91, $56, $FF, $BF, $90, $54, $FF, + $BD, $8D, $4E, $FF, $BC, $89, $47, $FF, $B8, $80, $3D, $FF, $B5, $7C, $38, $FF, + $B5, $78, $36, $FF, $AF, $74, $2E, $FF, $C0, $8D, $51, $FF, $86, $4C, $13, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E6, $CA, $A5, $FF, + $E6, $C6, $A1, $FF, $DB, $B4, $86, $FF, $D1, $AB, $76, $FF, $D0, $A7, $71, $FF, + $CF, $A5, $6E, $FF, $CA, $A1, $6B, $FF, $C8, $9E, $67, $FF, $C4, $99, $61, $FF, + $C2, $93, $5B, $FF, $BF, $91, $56, $FF, $BE, $90, $55, $FF, $BE, $8F, $51, $FF, + $BD, $90, $56, $FF, $BD, $90, $56, $FF, $BD, $90, $56, $FF, $BD, $90, $56, $FF, + $BD, $90, $56, $FF, $BD, $8E, $50, $FF, $BD, $8D, $4E, $FF, $BC, $88, $4B, $FF, + $BB, $84, $44, $FF, $BA, $82, $3F, $FF, $B7, $7E, $3A, $FF, $B4, $7B, $37, $FF, + $B1, $77, $32, $FF, $AD, $71, $2A, $FF, $CA, $9D, $63, $FF, $87, $4D, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E8, $CC, $A7, $FF, + $E4, $C8, $A3, $FF, $DA, $B8, $8D, $FF, $D3, $AB, $7C, $FF, $D2, $A6, $77, $FF, + $D0, $AB, $75, $FF, $D0, $A6, $6F, $FF, $CB, $A2, $6C, $FF, $C8, $9F, $68, $FF, + $C6, $9B, $63, $FF, $C4, $99, $61, $FF, $C2, $97, $5F, $FF, $C2, $98, $5D, $FF, + $C2, $98, $61, $FF, $C2, $98, $61, $FF, $C4, $99, $61, $FF, $C4, $99, $61, $FF, + $C4, $99, $61, $FF, $C2, $98, $61, $FF, $C1, $92, $56, $FF, $BF, $91, $56, $FF, + $BE, $8F, $51, $FF, $BC, $88, $4B, $FF, $BC, $84, $41, $FF, $B5, $7D, $3A, $FF, + $B5, $7C, $38, $FF, $B1, $76, $30, $FF, $CC, $9F, $69, $FF, $89, $51, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F5, $E4, $CE, $FF, $E8, $CD, $A9, $FF, + $E5, $C9, $A4, $FF, $DC, $B9, $8F, $FF, $D5, $AD, $7E, $FF, $D2, $AA, $7B, $FF, + $D2, $AB, $79, $FF, $D1, $A7, $70, $FF, $CF, $A5, $6E, $FF, $CA, $A1, $6B, $FF, + $C8, $9F, $68, $FF, $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, + $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, $C5, $9A, $62, $FF, + $C5, $9A, $62, $FF, $C4, $99, $61, $FF, $C2, $93, $5B, $FF, $BF, $91, $56, $FF, + $BF, $90, $52, $FF, $BC, $87, $49, $FF, $BC, $83, $3F, $FF, $B7, $7E, $3A, $FF, + $B8, $7F, $3B, $FF, $BC, $82, $3D, $FF, $CE, $A1, $6B, $FF, $89, $4E, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E1, $CB, $FF, $E8, $CB, $A5, $FF, + $E5, $C9, $A4, $FF, $DA, $B8, $8B, $FF, $D2, $AA, $7B, $FF, $D2, $A5, $75, $FF, + $D1, $A7, $70, $FF, $CD, $A4, $6E, $FF, $CA, $9F, $67, $FF, $C7, $9C, $64, $FF, + $C4, $99, $61, $FF, $C1, $97, $5C, $FF, $C0, $93, $59, $FF, $C0, $92, $57, $FF, + $C0, $92, $57, $FF, $C0, $92, $57, $FF, $C0, $92, $57, $FF, $C0, $92, $57, $FF, + $C0, $92, $57, $FF, $BF, $91, $56, $FF, $BF, $90, $52, $FF, $BE, $8E, $4F, $FF, + $BC, $89, $47, $FF, $BB, $84, $44, $FF, $B9, $81, $3E, $FF, $B5, $7C, $38, $FF, + $B8, $7F, $3B, $FF, $BC, $85, $45, $FF, $CD, $A0, $6A, $FF, $87, $50, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $59, $00, $00, $00, $33, $00, $00, $00, $16, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $15, $37, $19, $08, $FF, $F4, $E0, $C9, $FF, $E6, $C9, $A3, $FF, + $E5, $C5, $A0, $FF, $D9, $B8, $88, $FF, $D3, $A6, $76, $FF, $D0, $A7, $71, $FF, + $CF, $A5, $6E, $FF, $CB, $A2, $6C, $FF, $CA, $9F, $67, $FF, $C6, $9B, $63, $FF, + $C5, $9A, $62, $FF, $C4, $99, $61, $FF, $C2, $98, $5D, $FF, $C2, $98, $61, $FF, + $C2, $98, $61, $FF, $C4, $99, $61, $FF, $C4, $99, $61, $FF, $C5, $9A, $62, $FF, + $C5, $9A, $62, $FF, $C4, $99, $61, $FF, $C1, $94, $5A, $FF, $C0, $93, $59, $FF, + $BF, $90, $54, $FF, $BC, $8C, $4D, $FF, $BC, $89, $47, $FF, $BE, $8A, $4D, $FF, + $C4, $99, $61, $FF, $BE, $8B, $4F, $FF, $C7, $9D, $60, $FF, $89, $4E, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $58, $00, $00, $00, $33, $00, $00, $00, $15, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $06, + $00, $00, $00, $14, $37, $19, $08, $FF, $F4, $E0, $C9, $FF, $E6, $C8, $A1, $FF, + $E1, $C3, $9C, $FF, $DA, $B3, $85, $FF, $D1, $A5, $72, $FF, $CF, $A5, $6E, $FF, + $CD, $A3, $6C, $FF, $C8, $9F, $68, $FF, $C5, $9B, $64, $FF, $C2, $99, $5F, $FF, + $C2, $93, $5B, $FF, $C0, $92, $57, $FF, $BF, $91, $56, $FF, $BF, $91, $56, $FF, + $C0, $92, $57, $FF, $C2, $93, $5B, $FF, $C1, $97, $5C, $FF, $C5, $9A, $62, $FF, + $C8, $9E, $67, $FF, $CD, $A3, $6C, $FF, $CD, $A3, $6C, $FF, $CE, $A1, $6B, $FF, + $CE, $A1, $6B, $FF, $D2, $AB, $79, $FF, $D2, $AA, $77, $FF, $D1, $A5, $72, $FF, + $D4, $A7, $73, $FF, $BF, $8A, $4C, $FF, $B1, $73, $30, $FF, $87, $4D, $14, $FF, + $37, $19, $08, $FF, $00, $00, $00, $55, $00, $00, $00, $30, $00, $00, $00, $14, + $00, $00, $00, $06, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $05, + $00, $00, $00, $12, $33, $17, $07, $C1, $B2, $75, $2D, $FF, $C7, $9D, $60, $FF, + $C4, $9A, $5D, $FF, $BD, $8C, $4C, $FF, $BA, $7E, $3D, $FF, $B8, $7E, $39, $FF, + $B6, $7A, $39, $FF, $B5, $78, $36, $FF, $B3, $75, $32, $FF, $AF, $77, $2E, $FF, + $AD, $72, $2C, $FF, $AC, $74, $2B, $FF, $AA, $72, $29, $FF, $AA, $72, $29, $FF, + $AA, $72, $29, $FF, $AE, $71, $29, $FF, $AE, $71, $29, $FF, $AE, $71, $29, $FF, + $AE, $71, $29, $FF, $AA, $72, $29, $FF, $A9, $6D, $26, $FF, $AA, $6C, $23, $FF, + $A5, $69, $22, $FF, $A3, $67, $20, $FF, $A2, $65, $1D, $FF, $9E, $61, $19, $FF, + $9B, $5F, $18, $FF, $99, $5D, $16, $FF, $92, $56, $15, $FF, $58, $30, $0D, $FF, + $26, $11, $05, $B4, $00, $00, $00, $4C, $00, $00, $00, $2A, $00, $00, $00, $11, + $00, $00, $00, $04, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $04, + $00, $00, $00, $0E, $2B, $13, $06, $71, $31, $16, $07, $C7, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, + $37, $19, $08, $FF, $37, $19, $08, $FF, $37, $19, $08, $FF, $26, $11, $05, $B4, + $0C, $05, $01, $66, $00, $00, $00, $3C, $00, $00, $00, $20, $00, $00, $00, $0C, + $00, $00, $00, $03, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $02, + $00, $00, $00, $09, $00, $00, $00, $18, $00, $00, $00, $2D, $00, $00, $00, $41, + $00, $00, $00, $4F, $00, $00, $00, $56, $00, $00, $00, $58, $00, $00, $00, $58, + $00, $00, $00, $58, $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, + $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, + $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, + $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, + $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, $00, $00, $00, $59, + $00, $00, $00, $58, $00, $00, $00, $58, $00, $00, $00, $54, $00, $00, $00, $4C, + $00, $00, $00, $3C, $00, $00, $00, $27, $00, $00, $00, $14, $00, $00, $00, $07, + $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, + $00, $00, $00, $04, $00, $00, $00, $0D, $00, $00, $00, $18, $00, $00, $00, $24, + $00, $00, $00, $2C, $00, $00, $00, $31, $00, $00, $00, $33, $00, $00, $00, $33, + $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, + $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, + $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, + $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, + $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, $00, $00, $00, $33, + $00, $00, $00, $33, $00, $00, $00, $32, $00, $00, $00, $30, $00, $00, $00, $2A, + $00, $00, $00, $20, $00, $00, $00, $14, $00, $00, $00, $09, $00, $00, $00, $03, + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $02, $00, $00, $00, $04, $00, $00, $00, $09, $00, $00, $00, $0E, + $00, $00, $00, $12, $00, $00, $00, $14, $00, $00, $00, $15, $00, $00, $00, $15, + $00, $00, $00, $15, $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, + $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, + $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, + $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, + $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, $00, $00, $00, $16, + $00, $00, $00, $15, $00, $00, $00, $15, $00, $00, $00, $14, $00, $00, $00, $11, + $00, $00, $00, $0C, $00, $00, $00, $07, $00, $00, $00, $03, $00, $00, $00, $01, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $02, $00, $00, $00, $04, + $00, $00, $00, $05, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, + $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $06, $00, $00, $00, $04, + $00, $00, $00, $03, $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/stock_new_16_png.inc b/pixmaps/stock_new_16_png.inc new file mode 100644 index 0000000..9994c2e --- /dev/null +++ b/pixmaps/stock_new_16_png.inc @@ -0,0 +1,73 @@ +const stock_new_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $53, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $4C, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, + $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, $FE, $FE, $FE, $FF, + $FD, $FD, $FD, $FF, $E0, $E0, $E0, $FF, $C1, $C1, $C1, $FF, $00, $00, $00, $FF, + $00, $00, $00, $53, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $F1, $F1, $F1, $FF, + $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, + $F1, $F1, $F1, $FF, $C3, $C3, $C3, $FF, $FB, $FB, $FB, $FF, $A8, $A8, $A8, $FF, + $00, $00, $00, $FF, $00, $00, $00, $4C, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $F1, $F1, $F1, $FF, + $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, + $F1, $F1, $F1, $FF, $AD, $AD, $AD, $FF, $76, $76, $76, $FF, $5D, $5D, $5D, $FF, + $40, $40, $40, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $F1, $F1, $F1, $FF, + $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, $F1, $F1, $F1, $FF, + $F0, $F0, $F0, $FF, $E2, $E2, $E2, $FF, $85, $85, $85, $FF, $4B, $4B, $49, $FF, + $16, $16, $16, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $F1, $F1, $F1, $FF, + $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, + $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, + $C5, $C5, $C5, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FE, $FE, $FE, $FF, $EF, $EF, $EF, $FF, + $EF, $EF, $EF, $FF, $EF, $EF, $EF, $FF, $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, + $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, $EC, $EC, $EC, $FF, + $C4, $C4, $C4, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $EE, $EE, $EE, $FF, + $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, + $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, $EE, $EE, $EE, $FF, $EB, $EB, $EB, $FF, + $C3, $C3, $C3, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $ED, $ED, $ED, $FF, + $EC, $EC, $EC, $FF, $EC, $EC, $EC, $FF, $EC, $EC, $EC, $FF, $EB, $EB, $EB, $FF, + $EB, $EB, $EB, $FF, $EA, $EA, $EA, $FF, $EA, $EA, $EA, $FF, $EA, $EA, $EA, $FF, + $C1, $C1, $C1, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $EB, $EB, $EB, $FF, + $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, + $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, + $C0, $C0, $C0, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $EA, $EA, $EA, $FF, + $EA, $EA, $EA, $FF, $E9, $E9, $E9, $FF, $E9, $E9, $E9, $FF, $E8, $E8, $E8, $FF, + $E8, $E8, $E8, $FF, $E8, $E8, $E8, $FF, $E7, $E7, $E7, $FF, $E7, $E7, $E7, $FF, + $BF, $BF, $BF, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $E8, $E8, $E8, $FF, + $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, + $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, $E5, $E5, $E5, $FF, + $BE, $BE, $BE, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $E7, $E7, $E7, $FF, + $E7, $E7, $E7, $FF, $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, $E6, $E6, $E6, $FF, + $E5, $E5, $E5, $FF, $E5, $E5, $E5, $FF, $E4, $E4, $E4, $FF, $E4, $E4, $E4, $FF, + $BD, $BD, $BD, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $FD, $FD, $FD, $FF, $E6, $E6, $E6, $FF, + $E5, $E5, $E5, $FF, $E5, $E5, $E5, $FF, $E5, $E5, $E5, $FF, $E4, $E4, $E4, $FF, + $E4, $E4, $E4, $FF, $E3, $E3, $E3, $FF, $E3, $E3, $E3, $FF, $E3, $E3, $E3, $FF, + $BB, $BB, $BB, $FF, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $C2, $C2, $C2, $FF, $BD, $BD, $BD, $FF, + $BD, $BD, $BD, $FF, $BD, $BD, $BD, $FF, $BC, $BC, $BC, $FF, $BC, $BC, $BC, $FF, + $BB, $BB, $BB, $FF, $BB, $BB, $BB, $FF, $BB, $BB, $BB, $FF, $BB, $BB, $BB, $FF, + $A0, $A0, $A0, $FF, $00, $00, $00, $D4, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $6B, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $64, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/pixmaps/stock_up_one_dir_16_png.inc b/pixmaps/stock_up_one_dir_16_png.inc new file mode 100644 index 0000000..2234efc --- /dev/null +++ b/pixmaps/stock_up_one_dir_16_png.inc @@ -0,0 +1,73 @@ +const stock_up_one_dir_16_png: array[1..1049] of byte = ( + $47, $64, $6B, $50, + $00, $00, $04, $18, + $01, $01, $00, $02, + $00, $00, $00, $40, + $00, $00, $00, $10, + $00, $00, $00, $10, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $39, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $39, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $39, $00, $00, $00, $FF, $E4, $E5, $DE, $FF, + $D3, $D5, $CA, $FF, $D3, $D5, $CA, $FF, $A5, $A7, $97, $FF, $00, $00, $00, $FF, + $00, $00, $00, $39, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $FF, $F3, $F4, $F0, $FF, $AB, $AE, $99, $FF, + $BD, $C0, $AD, $FF, $BC, $BE, $AA, $FF, $B1, $B4, $9F, $FF, $6E, $71, $5C, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $65, + $00, $00, $00, $00, $00, $00, $00, $FF, $E6, $E7, $DD, $FF, $F5, $F6, $F3, $FF, + $E6, $E7, $DD, $FF, $E6, $E7, $DD, $FF, $E6, $E7, $DD, $FF, $E4, $E5, $DB, $FF, + $E6, $E7, $DD, $FF, $E2, $E4, $D9, $FF, $E2, $E4, $D9, $FF, $E1, $E3, $D8, $FF, + $E1, $E3, $D8, $FF, $DF, $E1, $D6, $FF, $C4, $C6, $B6, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $F7, $F7, $F6, $FF, $D3, $D6, $C5, $FF, + $D3, $D6, $C4, $FF, $D2, $D4, $C2, $FF, $73, $74, $6A, $FF, $CE, $D1, $BD, $FF, + $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, $CA, $CD, $B9, $FF, $C8, $CB, $B6, $FF, + $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, $93, $96, $7C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $F0, $F0, $EB, $FF, $D3, $D6, $C5, $FF, + $D3, $D6, $C4, $FF, $74, $76, $6C, $FF, $00, $00, $00, $FF, $72, $74, $69, $FF, + $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, $CA, $CD, $B9, $FF, $C8, $CB, $B6, $FF, + $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, $93, $96, $7C, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $F0, $F1, $EC, $FF, $D2, $D4, $C2, $FF, + $7C, $7E, $73, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $6F, $71, $65, $FF, $C6, $C9, $B3, $FF, $C6, $C9, $B3, $FF, $C4, $C8, $B1, $FF, + $C3, $C6, $AF, $FF, $C1, $C4, $AD, $FF, $90, $94, $78, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $EF, $F0, $EB, $FF, $CE, $D1, $BD, $FF, + $CC, $CE, $BA, $FF, $CA, $CD, $B9, $FF, $00, $00, $00, $FF, $C6, $C9, $B3, $FF, + $C4, $C8, $B1, $FF, $C3, $C6, $AF, $FF, $C3, $C6, $AF, $FF, $C1, $C4, $AD, $FF, + $BF, $C2, $AB, $FF, $BD, $C1, $A8, $FF, $8E, $91, $75, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $ED, $EE, $E8, $FF, $CA, $CD, $B9, $FF, + $C8, $CB, $B6, $FF, $C6, $C9, $B3, $FF, $00, $00, $00, $FF, $C3, $C6, $AF, $FF, + $C1, $C4, $AD, $FF, $BF, $C2, $AB, $FF, $BF, $C2, $AB, $FF, $BD, $C1, $A8, $FF, + $BB, $BE, $A5, $FF, $BA, $BD, $A3, $FF, $8B, $8F, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $EC, $EE, $E7, $FF, $C6, $C9, $B3, $FF, + $C4, $C8, $B1, $FF, $C3, $C6, $AF, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $37, $38, $31, $FF, $55, $56, $4B, $FF, $63, $64, $56, $FF, + $8B, $8D, $79, $FF, $B7, $BA, $A0, $FF, $8B, $8F, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $E8, $E8, $E0, $FF, $C3, $C6, $AF, $FF, + $C1, $C4, $AD, $FF, $BF, $C2, $AB, $FF, $BD, $C1, $A8, $FF, $BB, $BE, $A5, $FF, + $BA, $BD, $A3, $FF, $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, + $B7, $BA, $A0, $FF, $B7, $BA, $A0, $FF, $8B, $8F, $72, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $FF, $C6, $C9, $BA, $FF, $90, $94, $78, $FF, + $8E, $92, $76, $FF, $8E, $91, $75, $FF, $8C, $90, $73, $FF, $8B, $8F, $72, $FF, + $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, + $8B, $8F, $72, $FF, $8B, $8F, $72, $FF, $64, $67, $51, $FF, $00, $00, $00, $FF, + $00, $00, $00, $00, $00, $00, $00, $65, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, + $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $FF, $00, $00, $00, $65, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00); + diff --git a/translations/UTranslation_CZ.pas b/translations/UTranslation_CZ.pas new file mode 100644 index 0000000..cbaf654 --- /dev/null +++ b/translations/UTranslation_CZ.pas @@ -0,0 +1,1256 @@ +(* + Tux Commander - UTranslation_CZ - Czech Localization constants + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_CZ; + +interface + +implementation + +uses ULocale; + +const LANGcsF2Button_Caption = 'F2 - Přejmenovat'; + LANGcsF3Button_Caption = 'F3 - Prohlížet'; + LANGcsF4Button_Caption = 'F4 - Upravit'; + LANGcsF5Button_Caption = 'F5 - Kopírovat'; + LANGcsF6Button_Caption = 'F6 - Přesunout'; + LANGcsF7Button_Caption = 'F7 - Nová složka'; + LANGcsF8Button_Caption = 'F8 - Smazat'; + + LANGcsmnuFile_Caption = 'Sou_bor'; + LANGcsmnuMark_Caption = 'O_značení'; + LANGcsmnuCommands_Caption = 'Pří_kazy'; + LANGcsmnuHelp_Caption = 'Nápo_věda'; + LANGcsmiExit_Caption = '_Konec'; + LANGcsmiSelectGroup_Caption = 'Označit _skupinu...'; + LANGcsmiUnselectGroup_Caption = '_Odznačit skupinu...'; + LANGcsmiSelectAll_Caption = '_Vybrat vše'; + LANGcsmiUnselectAll_Caption = 'O_doznačit vše'; + LANGcsmiInvertSelection_Caption = '_Převrátit výběr'; + LANGcsmiRefresh_Caption = 'O_bnovit'; + LANGcsmiAbout_Caption = '_O programu...'; + + LANGcsColumn1_Caption = 'Jméno'; + LANGcsColumn2_Caption = 'Přípona'; + LANGcsColumn3_Caption = 'Velikost'; + LANGcsColumn4_Caption = 'Datum'; + LANGcsColumn5_Caption = 'Atributy'; + + LANGcsExpandSelection = 'Rozšířit výběr'; + LANGcsShrinkSelection = 'Zúžit výběr'; + LANGcsNoMatchesFound = 'Nenalezen žádný výskyt'; + LANGcsNoFilesSelected = 'Není označen žádný soubor!'; + LANGcsSelectedFilesDirectories = '%d označených souborů/složek'; + LANGcsDirectoryS = 'složku %s'; + LANGcsFileS = 'soubor %s'; + LANGcsDoYouReallyWantToDeleteTheS = 'Opravdu si přejete odstranit %s?'; + LANGcsDoYouReallyWantToDeleteTheSS = 'Opravdu si přejete odstranit %s?'#10'%s'; + LANGcsCopyFiles = 'Kopírovat soubory'; + LANGcsMoveRenameFiles = 'Přesunout/přejmenovat soubory'; + LANGcsCopyDFileDirectoriesTo = 'Zkopírovat %d souborů/složek do'; + LANGcsMoveRenameDFileDirectoriesTo = 'Přesunout/přejmenovat %d souborů/složek do'; + LANGcsCopySC = 'Kopírovat:'; + LANGcsMoveRenameSC = 'Přesunout/přejmenovat:'; + + LANGcsQuickFind = ' Vyhledat:'; + + LANGcsAboutString = 'Tux Commander'#10'Verze %s'#10'Datum sestavení: %s'#10#10'Copyright (c) 2008 Tomáš Bžatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'WWW stránka: http://tuxcmd.sourceforge.net/'; + LANGcsAboutStringGnome = 'verze %s'#10'Datum sestavení: %s'#10'WWW stránka: http://tuxcmd.sourceforge.net/'; + LANGcsDiskStatFmt = '%s z %s volných'; + LANGcsDiskStatVolNameFmt = '[%s] %s z %s volných'; + LANGcsStatusLineFmt = '%s z %s v %d z %d souborů označeno'; + LANGcsPanelStrings : array[boolean] of string = ('pravém', 'levém'); + + LANGcsDIR = ''; + LANGcsErrorGettingListingForSPanel = 'Chyba při otevírání složky v %s panelu:'#10' %s'#10#10'Cesta = ''%s'''; + LANGcsErrorGettingListingForSPanelNoPath = 'Chyba při otevírání složky v %s panelu:'#10' %s'; + LANGcsErrorCreatingNewDirectorySInSPanel = 'Nelze vytvořit složku ''%s'' v %s panelu:'#10' %s'; + LANGcsErrorCreatingNewDirectorySInSPanelNoPath = 'Nelze vytvořit složku ''%s'' v %s panelu:'#10' %s'; + LANGcsTheFileDirectory = 'Soubor/adresář'; + LANGcsCouldNotBeDeleted = 'nemohl být smazán'; + LANGcsCouldNotBeDeletedS = 'nemohl být smazán: %s'; + LANGcsUserCancelled = 'Operace přerušena!'; + LANGcsTheDirectorySIsNotEmpty = 'Složka %s není prázdná!'; + LANGcsCannotCopyFile = 'Nelze zkopírovat soubor'; + LANGcsCopyError = 'Chyba při kopírování'; + LANGcsMoveError = 'Chyba při přesouvání'; + LANGcsOverwriteS = 'Přepsat: %s'; + LANGcsWithFileS = 'Souborem: %s'; + LANGcsOvewriteSBytesS = '%s bytů, %s'; + LANGcsTheFile = 'Soubor'; + LANGcsCopy = 'Kopírovat'; + LANGcsMove = 'Přesunout'; + LANGcsTheDirectory = 'Adresář'; + LANGcsTheSymbolicLink = 'Symbolický odkaz'; + LANGcsCannotMoveFile = 'Nelze přesunout soubor'; + LANGcsCouldNotBeCreated = 'nemohl být vytvořen'; + LANGcsCouldNotBeCreatedS = 'nemohl být vytvořen: %s'; + LANGcsFromS = 'Z: %s'; + LANGcsToS = 'Do: %s'; + LANGcsCannotCopyFileToItself = 'Zdrojový a cílový soubor jsou totožné!'; + LANGcsMemoryAllocationFailed = 'Chyba při alokaci paměti:'; + LANGcsCannotOpenSourceFile = 'Nelze otevřít zdrojový soubor'; + LANGcsCannotOpenDestinationFile = 'Nelze otevřít cílový soubor'; + LANGcsCannotCloseDestinationFile = 'Nelze uzavřít cílový soubor'; + LANGcsCannotCloseSourceFile = 'Nelze uzavřít zdrojový soubor'; + LANGcsCannotReadFromSourceFile = 'Nelze číst ze zdrojového souboru'; + LANGcsCannotWriteToDestinationFile = 'Nelze zapisovat do cílového souboru'; + + LANGcsUnknownException = 'Neznámá chyba'; + LANGcsNoAccess = 'Přístup zamítnut'; + LANGcsUnknownError = 'Neznámá chyba'; + + LANGcsCreateANewDirectory = 'Vytvořit novou složku'; + LANGcsEnterDirectoryName = 'Zadejte jmé_no složky:'; + + LANGcsOverwriteQuestion = 'Potvrzení přepsání'; + LANGcsOverwriteButton_Caption = '_Přepsat'; + LANGcsOverwriteAllButton_Caption = 'Přepsat _vše'; + LANGcsSkipButton_Caption = 'Pře_skočit'; + LANGcsOverwriteAllOlderButton_Caption = 'Přepsat sta_rší'; + LANGcsSkipAllButton_Caption = 'Přeskočit vš_e'; + LANGcsRenameButton_Caption = 'Přej_menovat'; + LANGcsAppendButton_Caption = 'Připoji_t'; + LANGcsRename = 'Přejmenovat'; + LANGcsRenameFile = 'Přejmenovat soubor ''%s'' na'; + LANGcsIgnoreButton_Caption = '_Ignorovat'; + + LANGcsProgress = 'Průběh operace'; + LANGcsCancel = '_Storno'; + LANGcsDelete = 'Mazání:'; + + LANGcsSpecifyFileType = 'Zvolte _typ souboru:'; + + LANGcsRemoveDirectory = 'Odstranit složku'; + LANGcsDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Opravdu si přejete vše smazat včetně vnořených složek?'; + LANGcsRetry = '_Opakovat'; + LANGcsDeleteButton_Caption = 'O_dstranit'; + LANGcsAll = '_Vše'; + + LANGcsCopyFilesSC = 'Kopírovat soubory:'; + LANGcsAppendQuestion = 'Opravdu si přejete připojit soubor ''%s'' k souboru ''%s''?'; + LANGcsPreparingList = 'Připravuje se seznam souborů...'; + + LANGcsYouMustSelectAValidFile = 'Musíte označit platný soubor!'; + LANGcsmiVerifyChecksums = '_Ověřit kontrolní součty'; + LANGcsVerifyChecksumsCaption = 'Ověřit kontrolní součty'; + LANGcsCheckButtonCaptionCheck = '_Ověřit'; + LANGcsCheckButtonCaptionStop = '_Stop'; + LANGcsFileListTooltip = '[?] - Dosud neověřeno'#10'[OK] - Kontrolní součet je správný'#10'[BAD] - Kontrolní součet je špatný'#10'[N/A] - Soubor není k dispozici'; + LANGcsFilenameColumnCaption = 'Soubor'; + LANGcsTheFileSYouAreTryingToOpenIsQuiteBig = 'Soubor ''%s'' který se pokoušíte načíst, je velký (%s bajtů). Nemusí se jednat o platný soubor s kontrolními součty.'#10#10'Přejete si pokračovat?'; + LANGcsAnErrorOccuredWhileInitializingMemoryBlock = 'Nastala chyba při alokaci místa v paměti. Pokuste se uvolnit paměť uzavřením několika aplikací a zkuste to znovu.'; + LANGcsAnErrorOccuredWhileOpeningFileSS = 'Nelze otevřít soubor ''%s'':'#10' %s'; + LANGcsAnErrorOccuredWhileReadingFileSS = 'Nelze číst ze souboru ''%s'':'#10' %s'; + LANGcsChecksumNotChecked = 'Stav: Nekontrolováno'; + LANGcsChecksumChecking = 'Stav: Probíhá kontrola...'; + LANGcsChecksumInterrupted = 'Stav: Přerušeno'; + LANGcsChecksumDOK = 'Stav: %d%% OK'; + + LANGcsmiCreateChecksumsCaption = '_Vytvořit kontrolní součty...'; + LANGcsYouMustSelectAtLeastOneFileToCalculateChecksum = 'Musíte označit alespoň jeden platný soubor, pro který chcete vytvořit kontrolní součty!'; + LANGcsCreateChecksumsCaption = 'Vytvořit kontrolní součty'; + LANGcsCCHKSUMPage1Text = 'Chystáte se vytvořit kontrolní součty pro'#10'označené soubory v panelu. Jestliže nejsou'#10'označeny všechny potřebné soubory,'#10'ukončete tohoto průvodce a zkuste to znovu.'; + LANGcsCCHKSUMPage4Text = 'Průvodce je připraven vytvořit kontrolní součty.'#10'Tato operace může trvat několik minut.'#10'Stiskněte Vpřed pro pokračování.'; + LANGcsCCHKSUMPage6Text = 'Během operace nastaly následující chyby:'; + LANGcsCCHKSUMPage7Text = 'Kontrolní součty jsou připraveny k použití.'#10#10'Stisknutím Dokončit ukončíte průvodce.'; + LANGcsCCHKSUMPage1Title = 'Příprava souborů'; + LANGcsCCHKSUMPage2Title = 'Vyberte typ součtového souboru'; + LANGcsCCHKSUMPage3Title = 'Zvolte jméno souboru'; + LANGcsCCHKSUMPage4Title = 'Připraveno pro operaci'; + LANGcsCCHKSUMPage5Title = 'Probíhá kontrola...'; + LANGcsCCHKSUMPage6Title = 'Chyba!'; + LANGcsCCHKSUMPage7Title = 'Dokončeno'; + LANGcsCCHKSUMSFVFile = 'soubor SFV'; + LANGcsCCHKSUMMD5sumFile = 'soubor MD5'; + LANGcsCCHKSUMFileName = '_Název souboru:'; + LANGcsCCHKSUMCreateSeparateChecksumFiles = 'Samostatné _soubory se součty'; + LANGcsCCHKSUMNowProcessingFileS = 'Kontroluje se soubor: %s'; + LANGcsCCHKSUMFinishCaption = '_Dokončit'; + LANGcsCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Opravdu si přejete přerušit kontrolu?'; + LANGcsCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Nastala chyba při otevírání souboru ''%s'': %s'#10; + LANGcsCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Nastala chyba při čtení souboru ''%s'': %s'#10; + LANGcsCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Nastala chyba při pokusu o zápis do souboru ''%s'': %s'#10; + + LANGcsAnErrorOccuredWhileWritingFileSS = 'Nelze zapisovat do souboru ''%s'':'#10' %s'; + LANGcsTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Cílový soubor ''%s'' existuje. Přejete si ho přepsat?'; + LANGcsTheTargetFileSCannotBeRemovedS = 'Cílový soubor ''%s'' nemohl být odstraněn: %s'; + LANGcsMergeCaption = 'Spojit'; + LANGcsPleaseInsertNextDiskOrGiveDifferentLocation = 'Prosím vložte další disk nebo zadejte jiné umístění:'; + LANGcsMergeOfSSucceeded = 'Spojení souboru ''%s'' bylo úspěšně dokončeno (správný kontrolní součet).'; + LANGcsWarningCreatedFileFailsCRCCheck = 'Upozornění: Vytvořený soubor nemá správný kontrolní součet!'; + LANGcsMergeOfSSucceeded_NoCRCFileAvailable = 'Spojení souboru ''%s'' bylo úspěšně dokončeno (kontrolní součet není k dispozici).'; + LANGcsMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Spojit ''%s'' a všechny soubory s navazujícími jmény do následujícího adresáře:'; + LANGcsMergeSC = 'Spojit:'; + LANGcsmiSplitFileCaption = '_Rozdělit soubor...'; + LANGcsmiMergeFilesCaption = 'S_pojit soubory...'; + + LANGcsSplitTheFileSToDirectory = '_Rozdělit soubor ''%s'' do cílového adresáře:'; + LANGcsSplitSC = 'Rozdělit:'; + LANGcsSplitFile = 'Rozdělit soubor'; + LANGcsBytesPerFile = '_Bajtů na soubor:'; + LANGcsAutomatic = 'Automaticky'; + LANGcsDeleteFilesOnTargetDisk = '_Smazat soubory na cílovém disku (vhodné pro vyjímatelné disky)'; + LANGcsSplitCaption = 'Rozdělit'; + LANGcsCannotOpenFileS = 'Nelze otevřít soubor ''%s'''; + LANGcsCannotSplitTheFileToMoreThan999Parts = 'Soubor nelze rozdělit do více než 999 částí!'; + LANGcsThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'V cílovém adresáři se nacházejí tyto soubory:'#10'%s'#10'Přejete si je smazat?'; + LANGcsThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'V cílovém adresáři se nachází %d souborů. Přejete si je smazat?'; + LANGcsAnErrorOccuredWhileOperationS = 'Při provádění operace nastala chyba : %s'; + LANGcsSplitOfSSucceeded = 'Rozdělení souboru ''%s'' bylo úspěšně dokončeno.'; + LANGcsSplitOfSFailed = 'Rozdělení souboru ''%s'' nebylo úspěšné!'; + + LANGcsmnuShow_Caption = '_Zobrazení'; + LANGcsmiShowDotFiles_Caption = 'Zobrazit _skryté soubory'; + LANGcsTheFileYouAreTryingToOpenIsQuiteBig = 'Soubor, který se pokoušíte načíst, je velký. Otevřením v externí aplikaci (např. gedit) může dojít ke zpomalení reakcí systému.'#10'Přejete si pokračovat?'; + LANGcsCannotExecuteSPleaseCheckTheConfiguration = 'Nelze spustit ''%s''. Prosím zkontrolujte nastavení.'; + LANGcsEdit = 'Upravit'; + LANGcsEnterFilenameToEdit = 'Zad_ejte jméno souboru, který chcete upravit:'; + + LANGcsmnuSettings_Caption = 'Nas_tavení'; + LANGcsmiFileTypes_Caption = '_Typy souborů...'; + LANGcsThereIsNoApplicationAssociatedWithS = 'Žádná aplikace není přiřazena k souboru "%s".'#10#10'Přejete si otevřít dialog s nastavením akcí k typům souborů?'; + LANGcsErrorExecutingCommand = 'Zadaný příkaz nelze vykonat!'; + LANGcsEditFileTypesCaption = 'Nastavení přiřazení'; + LANGcsTitleLabel_Caption = 'Typy souborů'; + LANGcsExtensionsColumn = 'Přípony'; + LANGcsDescriptionColumn = 'Popis'; + LANGcsFileTypesList = 'Seznam typů souborů'; + LANGcsActionName = 'Název akce'; + LANGcsCommand = 'Příkaz'; + LANGcsSetDefaultActionButton_Caption = '_Nastavit jako výchozí'; + LANGcsRunInTerminalCheckBox_Caption = 'Spustit v _terminálu'; + LANGcsAutodetectCheckBox_Caption = 'Autodetekce _okenní aplikace'; + LANGcsBrowseButton_Caption = '_Prohledat...'; + LANGcsCommandLabel_Caption = 'Pří_kaz:'; + LANGcsDescriptionLabel_Caption = 'Náz_ev akce:'; + LANGcsFNameExtLabel_Caption = 'Při_dat typ:'; + LANGcsNotebookPageExtensions = 'Typ souboru'; + LANGcsNotebookPageActions = 'Akce'; + LANGcsDefault = ' (výchozí)'; + LANGcsCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Nelze uložit seznam typů souborů, protože jiný proces mezitím uložený seznam změnil.'; + + LANGcsDefaultColor = 'Výchozí _barva'; + LANGcsIcon = '_Ikona:'; + LANGcsBrowseForIcon = 'Vyhledat ikonu'; + LANGcsSelectFileTypeColor = 'Zvolit barvu typu souborů'; + LANGcsColor = 'Ba_rva:'; + + LANGcsmiChangePermissions_Caption = 'Změnit oprá_vnění...'; + LANGcsmiChangeOwner_Caption = 'Změnit v_lastníka/skupinu...'; + LANGcsmiCreateSymlink_Caption = 'Vytvořit od_kaz...'; + LANGcsmiEditSymlink_Caption = '_Upravit odkaz...'; + LANGcsChmodProgress = 'Změna oprávnění:'; + LANGcsChownProgress = 'Změna vlastníka:'; + LANGcsYouMustSelectAValidSymbolicLink = 'Musíte vybrat platný odkaz!'; + LANGcsPopupRunS = 'Spus_tit %s'; + LANGcsPopupOpenS = '_Otevřít %s'; + LANGcsPopupGoUp = 'Přejít d_o nadřazeného adresáře'; + LANGcsPopupOpenWithS = 'Otevřít v %s'; + LANGcsPopupDefault = ' (výchozí)'; + LANGcsPopupOpenWith = '_Otevřít v...'; + LANGcsPopupViewFile = '_Zobrazit soubor'; + LANGcsPopupEditFile = 'Upravit _soubor'; + LANGcsPopupMakeSymlink = 'Vytvořit od_kaz'; + LANGcsPopupRename = '_Přejmenovat'; + LANGcsPopupDelete = 'O_dstranit'; + LANGcsDialogChangePermissions = 'Změnit oprávnění'; + LANGcsCouldNotBeChmoddedS = 'nelze změnit oprávnění: %s'; + LANGcsDialogChangeOwner = 'Změnit vlastníka/skupinu'; + LANGcsCouldNotBeChownedS = 'nelze změnit vlastníka: %s'; + LANGcsDialogMakeSymlink = 'Vytvořit odkaz'; + LANGcsDialogEditSymlink = 'Upravit odkaz'; + LANGcsFEditSymlink_Caption = 'Upravit symbolický odkaz'; + LANGcsFEditSymlink_SymbolicLinkFilename = '_Název odkazu:'; + LANGcsFEditSymlink_SymbolicLinkPointsTo = 'Odkaz _ukazuje na:'; + + LANGcsFChmod_Caption = 'Oprávnění'; + LANGcsFChmod_PermissionFrame = 'Příznaky oprávnění'; + LANGcsFChmod_FileFrame = 'Soubor'; + LANGcsFChmod_ApplyRecursivelyFor = 'Použít _opakovaně pro'; + LANGcsFChmod_miAllFiles = 'Všechny soubory a adresáře'; + LANGcsFChmod_miDirectories = 'Pouze pro adresáře'; + LANGcsFChmod_OctalLabel = 'Čí_selné vyjádření:'; + LANGcsFChmod_SUID = 'SUID - Nastavit ID uživatele při spuštění'; + LANGcsFChmod_SGID = 'SGID - Nastavit ID skupiny při spuštění'; + LANGcsFChmod_Sticky = 'bit ''sticky'''; + LANGcsFChmod_RUSR = 'RUSR - Čtení vlastníkem'; + LANGcsFChmod_WUSR = 'WUSR - Zápis vlastníkem'; + LANGcsFChmod_XUSR = 'XUSR - Spouštění vlastníkem'; + LANGcsFChmod_RGRP = 'RGRP - Čtení skupinou'; + LANGcsFChmod_WGRP = 'WGRP - Zápis skupinou'; + LANGcsFChmod_XGRP = 'XGRP - Spouštění skupinou'; + LANGcsFChmod_ROTH = 'ROTH - Čtení ostatními'; + LANGcsFChmod_WOTH = 'WOTH - Zápis ostatními'; + LANGcsFChmod_XOTH = 'XOTH - Spouštění ostatními'; + LANGcsFChmod_TextLabel = 'Textové vyjádření: %s'; + LANGcsFChmod_FileLabel = 'Zvolený soubor: %s'#10'Textové vyjádření: %s'#10 + + 'Číselné vyjádření: %d'#10'Vlastník: %s'#10 + + 'Skupina: %s'; + + LANGcsFChown_Caption = 'Změnit vlastníka/skupinu'; + LANGcsFChown_OwnerFrame = 'Vlastník'; + LANGcsFChown_GroupFrame = 'Název skupiny'; + LANGcsFChown_FileFrame = 'Soubor'; + LANGcsFChown_ApplyRecursively = 'Použít _opakovaně'; + + LANGcsFSymlink_Caption = 'Vytvořit symbolický odkaz'; + LANGcsFSymlink_ExistingFilename = '_Existující soubor (na který se bude odkazovat):'; + LANGcsFSymlink_SymlinkFilename = '_Název odkazu:'; + + LANGcsmnuBookmarks_Caption = 'Záložk_y'; + LANGcsmiAddBookmark_Caption = 'Přidat záložku'; + LANGcsmiEditBookmarks_Caption = 'Upravit záložky'; + LANGcsBookmarkPopupDelete_Caption = '_Smazat'; + LANGcsmiPreferences_Caption = '_Nastavení...'; + LANGcsTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Adresář který se pokoušíte přidat již existuje v seznamu záložek'; + LANGcsSomeOtherInstanceChanged = 'V některé další spuštěné instanci programu bylo změněno nastavení. Přejete si použít nové nastavení i pro aktuální okno?'#10#10'Upozornění: Pokud nepovolíte provedení změn, bude toto nové nastavení přepsáno při ukončení programu!'; + + LANGcsPreferences_Caption = 'Nastavení aplikace'; + LANGcsPreferences_TitleLabel_Caption = 'Nastavení aplikace'; + LANGcsPreferences_GeneralPage = 'Obecné'; + LANGcsPreferences_FontsPage = 'Písma'; + LANGcsPreferences_ColorsPage = 'Barvy'; + LANGcsPreferences_RowHeight = 'Výš_ka řádku:'; + LANGcsPreferences_NumHistoryItems = 'Položek v _historii příkazové řádky:'; + LANGcsPreferences_Default = 'Výchozí'; + LANGcsPreferences_ClearReadonlyAttribute = '_Odstranit atribut jen pro čtení při kopírování z CD-ROM'; + LANGcsPreferences_DisableMouseRenaming = 'Zakázat _rychlé přejmenování myší'; + LANGcsPreferences_ShowFiletypeIconsInList = 'Zobrazit přidružené _ikony typů souborů '; + LANGcsPreferences_ExternalAppsLabel = 'Externí programy'; + LANGcsPreferences_Viewer = '_Prohlížeč:'; + LANGcsPreferences_Editor = '_Editor:'; + LANGcsPreferences_Terminal = '_Terminál:'; + LANGcsPreferences_ListFont = 'Písmo v panelech:'; + LANGcsPreferences_Change = '_Změnit...'; + LANGcsPreferences_UseDefaultFont = 'Použít _výchozí písmo'; + LANGcsPreferences_Foreground = 'Text'; + LANGcsPreferences_Background = 'Pozadí'; + LANGcsPreferences_NormalItem = 'Normální položky:'; + LANGcsPreferences_SetToDefaultToUseGTKThemeColors = 'Při výchozím nastavení se použije barva aktuálního tématu systému GTK'; + LANGcsPreferences_Cursor = 'Kurzor:'; + LANGcsPreferences_InactiveItem = 'Neaktivní položky:'; + LANGcsPreferences_SelectedItem = 'Označené položky:'; + LANGcsPreferences_LinkItem = 'Symbolické odkazy:'; + LANGcsPreferences_LinkItemHint = 'Při výchozím nastavení se použije barva normálních položek'; + LANGcsPreferences_DotFileItem = 'Skryté soubory:'; + LANGcsPreferences_DotFileItemHint = 'Při výchozím nastavení se použije barva normálních položek'; + LANGcsPreferences_BrowseForApplication = 'Zvolit aplikaci'; + LANGcsPreferences_DefaultS = 'Výchozí: %s'; + LANGcsPreferences_SelectFont = 'Zvolit písmo'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGcsBookmarkButton_Tooltip = 'Zobrazit záložky'; + LANGcsUpButton_Tooltip = 'Přesunout se o adresář výš'; + LANGcsRootButton_Tooltip = 'Přesunout se do kořenového adresáře (/)'; + LANGcsHomeButton_Tooltip = 'Přesunout se do domovského adresáře (/home/user)'; + LANGcsLeftEqualButton_Tooltip = 'Změnit adresář v pravém panelu na aktuální'; + LANGcsRightEqualButton_Tooltip = 'Změnit adresář v levém panelu na aktuální'; + LANGcsmiShowDirectorySizes_Caption = 'Spočítat obsazený prostor'; + LANGcsmiTargetSource_Caption = 'Cílový adresář = Aktuální adresář'; + LANGcsFileTypeDirectory = 'Adresáře'; + LANGcsFileTypeFile = 'Soubory'; + LANGcsFileTypeMetafile = 'Společná položka'; + LANGcsPreferencesPanelsPage = 'Panely'; + LANGcsPreferencesApplicationsPage = 'Aplikace'; + LANGcsPreferencesExperimentalPage = 'Experimentální funkce'; + LANGcsPreferencesSelectAllDirectoriesCheckBox_Caption = 'Při hromadném označování zahrnout i _adresáře'; + LANGcsPreferencesNewStyleAltOCheckBox_Caption = 'No_vý styl Alt+O'; + LANGcsPreferencesNewStyleAltOCheckBox_Tooltip = 'Při přepnutí nemění aktuální adresář'; + LANGcsPreferencesShowFuncButtonsCheckBox_Caption = 'Zobrazit _funkční tlačítka (spodní lišta)'; + LANGcsPreferencesSizeFormatLabel_Caption = 'For_mát čísel:'; + LANGcsPreferencesmiSizeFormat1 = 'Systémový'; + LANGcsPreferencesmiSizeFormat6 = 'Dynamický'; + LANGcsPreferencesAutodetectXApp = 'Autodetekce X aplikace'; + LANGcsPreferencesAlwaysRunInTerminal = 'Spustit v terminálu'; + LANGcsPreferencesNeverRunInTerminal = 'Nespouštět v terminálu'; + LANGcsPreferencesCmdLineBehaviourLabel_Caption = 'Spouštění z _příkazové řádky:'; + LANGcsPreferencesFeatures = 'Funkce'; + LANGcsPreferencesDisableMouseRename_Tooltip = 'Pro rychlé přejmenování můžete vždy použít klávesovou kombinaci Shift+F6 i při zakázané této volbě'; + LANGcsPreferencesDisableFileTipsCheckBox_Caption = 'Zakázat plovoucí okno s plným _jménem souboru'; + LANGcsPreferencesDisableFileTipsCheckBox_Tooltip = 'Nezobrazovat plovoucí okno s plným jménem souboru jestliže je název souboru/adresáře v panelu zkrácený'; + LANGcsPreferencesShow = 'Zobrazení'; + LANGcsPreferencesDirsInBoldCheckBox_Caption = 'Adresáře _tučným fontem'; + LANGcsPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Nezobrazovat _hranaté závorky v názvech adresářů'; + LANGcsPreferencesOctalPermissionsCheckBox_Caption = 'Zobrazit _oprávnění číselně'; + LANGcsPreferencesOctalPermissionsCheckBox_Tooltip = 'Zobrazit oprávnění souboru/adresáře v číselné formě'; + LANGcsPreferencesMovement = 'Pohyb v panelech'; + LANGcsPreferencesLynxLikeMotionCheckBox_Caption = 'Pohyb ve stylu prohlížeče _Lynx'; + LANGcsPreferencesInsertMovesDownCheckBox_Caption = 'In_sert posune kurzor dolů'; + LANGcsPreferencesSpaceMovesDownCheckBox_Caption = '_Mezerník posune kurzor dolů'; + LANGcsPreferencesViewer = 'Prohlížeč'; + LANGcsPreferencesCommandSC = 'Příkaz:'; + LANGcsPreferencesUseInternalViewer = 'Použít _interní prohlížeč'; + LANGcsPreferencesEditor = 'Editor'; + LANGcsPreferencesTerminal = 'Terminál'; + LANGcsPreferencesExperimentalFeatures = 'Experimentální funkce'; + LANGcsPreferencesExperimentalWarningLabel_Caption = 'Varování: Tyto funkce jsou momentálně ve vývoji a není zaručena jejich bezchybná funkčnost. Používejte jen na vlastní nebezpečí!'; + LANGcsPreferencesFocusRefreshCheckBox_Caption = 'P_rovést znovunačtení panelů při vstupu do okna aplikace'; + LANGcsPreferencesFocusRefreshCheckBox_Tooltip = 'Tato operace trvá delší dobu v závislosti na počtu souborů v panelech'; + LANGcsPreferencesWMCompatModeCheckBox_Caption = 'Mód _kompatibility s okenními manažery'; + LANGcsPreferencesWMCompatModeCheckBox_Tooltip = 'Použijte v případě potíží s některými okenními manažery (např. IceWM neprovádí maximalizaci okna korektně)'; + LANGcsPreferencesCompatUseLibcSystemCheckBox_Caption = 'Použít funkci libc _system() pro spouštění procesů'; + LANGcsPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Použijte v případě potíží se zamrznutím nebo pády aplikace při spouštění programů'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGcsmiSearchCaption2 = '_Vyhledat soubory...'; + LANGcsmiNoMounterBarCaption = 'Nez_obrazovat pruh disků'; + LANGcsmiShowOneMounterBarCaption = 'Zobrazit _jeden pruh disků'; + LANGcsmiShowTwoMounterBarCaption = 'Zobrazit _dva pruhy disků'; + LANGcsmnuNetworkCaption = 'S_íť'; + LANGcsmiConnectionsCaption = '_Správce připojení...'; + LANGcsmiOpenConnectionCaption = '_Připojit se...'; + LANGcsmiQuickConnectCaption = '_Rychlé připojení...'; + LANGcsmnuPluginsCaption = '_Moduly'; + LANGcsmiTestPluginCaption = '_Test modulu...'; + LANGcsmiMounterSettingsCaption = 'Nastavení pruhu _disků...'; + LANGcsmiColumnsCaption = 'Nastavení sloup_ců...'; + LANGcsmiSavePositionCaption = '_Uložit pozici'; + LANGcsmiMountCaption = '_Připojit'; + LANGcsmiUmountCaption = '_Odpojit'; + LANGcsmiEjectCaption = '_Vysunout'; + LANGcsmiDuplicateTabCaption = '_Otevřít nový panel'; + LANGcsmiCloseTabCaption = '_Zavřít aktuální panel'; + LANGcsmiCloseAllTabsCaption = 'Zavřít _všechny panely'; + LANGcsCannotDetermineDestinationEngine = 'Nelze určit cílový adresář. Prosím zkontrolujte zadanou cestu a zkuste to znovu.'; + LANGcsCannotLoadFile = 'Nelze otevřít soubor ''%s''. Prosím zkontrolujte oprávnění a zkuste to znovu.'; + LANGcsMountPointDevice = 'Přípojný bod: %s'#10'Zařízení: %s'; + LANGcsMountSC = 'Připojit:'; + LANGcsNoPluginsFound = 'Modul nenalezen'; + LANGcsPluginAbout = 'O modulu...'; + LANGcsCouldntOpenURI = 'Nepodařilo se otevřít vzdálené připojení. Prosím zkontrolujte platnost adresy a přístupová práva.'; + LANGcsPluginAboutInside = 'Modul: %s'#10#10'%s'#10'%s'; + LANGcsAreYouSureCloseAllTabs = 'Opravdu si přejete zavřít všechny ostatní panely?'; + LANGcsCouldntOpenURIArchive = 'Nepodařilo se otevřít archív, pravděpodobně bude poškozen. Prosím zkontrolujte soubor a přístupová práva.'; + LANGcsThereIsNoModuleAvailable = 'Nelze nalézt odpovídající modul potřebný pro otevření tohoto spojení. Prosím zkontrolujte aktivní moduly.'; + LANGcsIgnoreError = 'Opravdu si přejete ignorovat tuto chybu? Zdrojový soubor bude smazán'; + LANGcsErrorMount = 'Nastala chyba při připojování zařízení ''%s'':'#10#10; + LANGcsErrorUmount = 'Nastala chyba při odpojování zařízení ''%s'':'#10#10; + LANGcsErrorEject = 'Nastala chyba při vysouvání zařízení ''%s'':'#10#10; + + LANGcsMounterPrefs_Caption = 'Nastavení panelu disků'; + LANGcsMounterPrefs_TitleLabelCaption = 'Nastavení panelu disků'; + LANGcsMounterPrefs_ListViewFrameCaption = 'Přípojné body'; + LANGcsMounterPrefs_MountName = 'Název'; + LANGcsMounterPrefs_MountPoint = 'Přípojný bod'; + LANGcsMounterPrefs_Device = 'Zařízení'; + LANGcsMounterPrefs_MoveUpButtonTooltip = 'Přesunout nahoru'; + LANGcsMounterPrefs_MoveDownButtonTooltip = 'Přesunout dolů'; + LANGcsMounterPrefs_UseFSTabDefaultsCheckBox = 'Použít _systémový seznam přípojných bodů'; + LANGcsMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Je-li tato možnost aktivní, použije se seznam přípojných bodů ze systémového souboru /etc/fstab'; + LANGcsMounterPrefs_ToggleModeCheckBox = 'Zamáčklá tlačítka _disků u připojených zařízení'; + LANGcsMounterPrefs_ToggleModeCheckBoxTooltip = 'Je-li tato položka aktivní, zůstanou tlačítka v panelu zamáčklá v případě, že je zařízení připojeno. Kliknutím zařízení odpojíte, příp. vysunete'; + LANGcsMounterPrefs_PropertiesFrameCaption = 'Vlastnosti přípojného bodu'; + LANGcsMounterPrefs_DisplayTextLabelCaption = '_Název:'; + LANGcsMounterPrefs_MountPointLabelCaption = 'Přípojný _bod:'; + LANGcsMounterPrefs_MountDeviceLabelCaption = '_Zařízení:'; + LANGcsMounterPrefs_DeviceTypeLabelCaption = 'T_yp zařízení:'; + LANGcsMounterPrefs_miLocalDiskCaption = 'Místní disk'; + LANGcsMounterPrefs_miRemovableCaption = 'Výměnný disk'; + LANGcsMounterPrefs_miCDCaption = 'CD/DVD jednotka'; + LANGcsMounterPrefs_miFloppyCaption = 'Disketová mechanika'; + LANGcsMounterPrefs_miNetworkCaption = 'Síťový prostředek'; + LANGcsMounterPrefs_MountCommandLabelCaption = 'Příkaz pro _připojení:'; + LANGcsMounterPrefs_UmountCommandLabelCaption = 'Příkaz pro _odpojení:'; + LANGcsMounterPrefs_MountCommandEntryTooltip = 'Syntaxe: použijte %dev místo zařízení a %dir pro cestu přípojného bodu. V případě, že nepoužíváte nestandardní příkaz pro připojení zařízení, nechte toto pole nevyplněné.'#10 + 'Upozornění: nepoužívejte příkazy vyžadující vstupy z klávesnice uživatele, program je nedokáže obsloužit!'#10'Příklad: smbmount %dev %dir -o username=netuser,password=heslo'; + LANGcsMounterPrefs_UmountCommandEntryTooltip = 'Syntaxe: použijte %dev místo zařízení a %dir pro cestu přípojného bodu. V případě, že nepoužíváte nestandardní příkaz pro odpojení zařízení, nechte toto pole nevyplněné.'#10'Příklad: smbumount %dir'; + LANGcsMounterPrefs_IconLabelCaption = '_Ikona:'; + + LANGcsConnMgr_Caption = 'Otevřít nové spojení'; + LANGcsConnMgr_ConnectButton = '_Připojit'; + LANGcsConnMgr_OpenConnection = 'Otevřít nové spojení'; + LANGcsConnMgr_NameColumn = 'Název'; + LANGcsConnMgr_URIColumn = 'Adresa'; + LANGcsConnMgr_AddConnectionButtonCaption = 'N_ové spojení...'; + LANGcsConnMgr_AddConnectionButtonTooltip = 'Vytvořit nové spojení'; + LANGcsConnMgr_EditButtonCaption = '_Upravit...'; + LANGcsConnMgr_EditButtonTooltip = 'Upravit vybrané spojení'; + LANGcsConnMgr_RemoveButtonCaption = 'O_dstranit'; + LANGcsConnMgr_RemoveButtonTooltip = 'Odstranit vybrané spojení'; + LANGcsConnMgr_DoYouWantDelete = 'Opravdu si přejete odstranit vybrané spojení ''%s''?'; + + LANGcsConnProp_FTP = 'FTP'; + LANGcsConnProp_SFTP = 'SFTP (ssh podsystém)'; + LANGcsConnProp_SMB = 'Sdílení v síti Windows (SMB)'; + LANGcsConnProp_HTTP = 'WebDAV (HTTP)'; + LANGcsConnProp_HTTPS = 'Zabezpečené WebDAV (HTTPS)'; + LANGcsConnProp_Other = 'Ostatní (prosím upřesněte v adrese)'; + LANGcsConnProp_Caption = 'Vlastnosti připojení'; + LANGcsConnProp_VFSModule = '_VFS modul:'; + LANGcsConnProp_URI = '_Adresa (URI):'; + LANGcsConnProp_URIEntryTooltip = 'Platná adresa URI by měla obsahovat řetězec typu služby a adresu síťového serveru'; + LANGcsConnProp_DetailedInformations = 'Upřesňující informace'; + LANGcsConnProp_Name = '_Název:'; + LANGcsConnProp_Server = 'Serve_r[:port]:'; + LANGcsConnProp_Username = 'Uživa_telské jméno:'; + LANGcsConnProp_UserNameEntryTooltip = 'Nevyplňujte, jedná-li se o anonymní přístup'; + LANGcsConnProp_Password = '_Heslo:'; + LANGcsConnProp_TargetDirectory = '_Cílový adresář:'; + LANGcsConnProp_ServiceType = 'Typ _služby:'; + LANGcsConnProp_MaskPassword = 'S_krýt heslo'; + LANGcsConnProp_MenuItemCaption = 'Výchozí (všsechny dostupné moduly)'; + + LANGcsConnLogin_Caption = 'Přihlášení'; + LANGcsConnLogin_Login = 'Přihlášení'; + LANGcsConnLogin_ExperimentalWarningLabelCaption = 'Pro přístup k prostředku %s musíte být přihlášeni'; + LANGcsConnLogin_Username = '_Uživatelské jméno:'; + LANGcsConnLogin_Password = '_Heslo:'; + LANGcsConnLogin_AnonymousCheckButton = '_Anonymní přístup'; + + LANGcsColumns_Caption = 'Nastavení sloupců hlavního panelu'; + LANGcsColumns_Title = 'Nastavení sloupců panelu'; + LANGcsColumns_MoveUpButtonTooltip = 'Přesunout položku nahoru'; + LANGcsColumns_MoveDownButtonTooltip = 'Přesunout položku dolů'; + LANGcsColumns_TitlesLongName = 'Jméno'; + LANGcsColumns_TitlesLongNameExt = 'Jméno + typ'; + LANGcsColumns_TitlesLongExt = 'Typ'; + LANGcsColumns_TitlesLongSize = 'Velikost'; + LANGcsColumns_TitlesLongDateTime = 'Datum změny + čas změny'; + LANGcsColumns_TitlesLongDate = 'Datum poslední změny'; + LANGcsColumns_TitlesLongTime = 'Čas poslední změny'; + LANGcsColumns_TitlesLongUser = 'Uživatel'; + LANGcsColumns_TitlesLongGroup = 'Skupina'; + LANGcsColumns_TitlesLongAttr = 'Atributy'; + LANGcsColumns_TitlesShortName = 'Jméno'; + LANGcsColumns_TitlesShortNameExt = 'Jméno'; + LANGcsColumns_TitlesShortExt = 'Typ'; + LANGcsColumns_TitlesShortSize = 'Velikost'; + LANGcsColumns_TitlesShortDateTime = 'Datum'; + LANGcsColumns_TitlesShortDate = 'Datum'; + LANGcsColumns_TitlesShortTime = 'Čas'; + LANGcsColumns_TitlesShortUser = 'Uživatel'; + LANGcsColumns_TitlesShortGroup = 'Skupina'; + LANGcsColumns_TitlesShortAttr = 'Atrib.'; + + LANGcsTestPlugin_Caption = 'Test VFS modulu'; + LANGcsTestPlugin_Title = 'Test VFS modulu'; + LANGcsTestPlugin_ExperimentalWarningLabelCaption = 'Varování: Podystém virtuálního souborového systému (VFS) a integrované moduly jsou momentálně ve vývoji a mohou obsahovat kritické chyby'; + LANGcsTestPlugin_Plugin = '_Modul:'; + LANGcsTestPlugin_Command = '_Adresa:'; + LANGcsTestPlugin_Username = '_Uživatel:'; + LANGcsTestPlugin_Password = '_Heslo:'; + LANGcsTestPlugin_AnonymousCheckButton = '_Anonymní přístup (bez volání funkce VFSLogin)'; + LANGcsTestPlugin_NoPluginsFound = 'Žádný modul není k dispozici'; + + LANGcsRemoteWait_Caption = 'Probíhá operace'; + LANGcsRemoteWait_OperationInProgress = 'Aplikace nyní zpracovává váš požadavek, prosím o strpení...'; + LANGcsRemoteWait_ItemsFound = 'Nalezených položek: %d'; + + LANGcsSearch_Bytes = 'bajtů'; + LANGcsSearch_kB = 'kB'; + LANGcsSearch_MB = 'MB'; + LANGcsSearch_days = 'dnech'; + LANGcsSearch_weeks = 'týdnech'; + LANGcsSearch_months = 'měsícech'; + LANGcsSearch_years = 'letech'; + LANGcsSearch_Caption = 'Vyhledat soubory'; + LANGcsSearch_General = 'Obecné'; + LANGcsSearch_Advanced = 'Upřesnění'; + LANGcsSearch_SearchResults = '_Výsledky hledání:'; + LANGcsSearch_SearchFor = '_Najít:'; + LANGcsSearch_FileMaskEntryTooltip = 'Tip: Použijte středník pro oddělení více hledaných výrazů'; + LANGcsSearch_SearchIn = 'Hledat _v:'; + LANGcsSearch_SearchArchivesCheckButton = 'Prohledávat _archívy'; + LANGcsSearch_FindText = 'Najít _text:'; + LANGcsSearch_FindTextEntryTooltip = 'Nechte toto pole nevyplněné, nechcete-li vyhledávat text v souboru'#10'Upozornění: řetězce jsou v kódování UTF-8'; + LANGcsSearch_CaseSensitiveCheckButton = '_Rozlišovat velká a malá písmena'; + LANGcsSearch_StayCurrentFSCheckButton = 'Vyhledávat i na připojených _zařízeních'; + LANGcsSearch_CaseSensitiveMatchCheckButton = 'Rozlišovat vel_ká a malá písmena'; + LANGcsSearch_Size = 'Velikost'; + LANGcsSearch_Date = 'Datum'; + LANGcsSearch_BiggerThan = '_Větší než'; + LANGcsSearch_SmallerThan = '_Menší než'; + LANGcsSearch_ModifiedBetweenRadioButton = '_Změněno mezi daty'; + LANGcsSearch_NotModifiedAfterRadioButton = '_Nebylo změněno po datu'; + LANGcsSearch_ModifiedLastRadioButton = 'Změněno v po_sledních'; + LANGcsSearch_ModifiedNotLastRadionButton = 'Nezměněn_o v posledních'; + LANGcsSearch_ModifiedBetweenEntry1 = '"Prosím použijte tento formát data:" c'; + LANGcsSearch_ViewButtonCaption = 'Prohlížet sou_bor'; + LANGcsSearch_NewSearchButtonCaption = 'Nové hle_dání'; + LANGcsSearch_GoToFileButtonCaption = 'Přejít na so_ubor'; + LANGcsSearch_FeedToListboxButtonCaption = 'Nap_lnit hlavní panel'; + LANGcsSearch_StatusSC = 'Stav:'; + LANGcsSearch_Ready = 'Připraveno.'; + LANGcsSearch_PreparingToSearch = 'Příprava hledání.'; + LANGcsSearch_SearchInProgress = 'Probíhá vyhledávání:'; + LANGcsSearch_UserCancelled = 'Přerušeno uživatelem.'; + LANGcsSearch_SearchFinished = 'Vyhledávání dokončeno'; + LANGcsSearch_FilesFound = 'Nalezeno %d souborů'; + LANGcsSearch_And = 'a'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGcsCloseOpenConnection = 'Pokoušíte se otevřít druhé spojení přes další aktivní spojení. Pokračováním bude původní spojení uzavřeno a nahrazeno novým.'#10#10'Přejete si pokračovat?'; + LANGcsDuplicateTabWarning = 'Pokoušíte se otevřít nový panel obsahující otevřené vzdálené spojení. Tato operace nemůže být provedena, protože duplikace spojení není podporováno. Nový panel bude přesměrován na lokální souborový systém.'; + LANGcsDontShowAgain = '_Příště tento dotaz nezobrazovat'; + LANGcsSwitchOtherPanelWarning = 'Pokoušíte se otevřít adresář vzdáleného spojení v druhém panelu. Tato operace nemůže být provedena, protože duplikace spojení není podporováno.'; + LANGcsOpenConnectionsWarning = 'V panelu stále existují otevřená spojení. Ukončením aplikace budou odpojeny.'#10#10'Přejete si aplikaci opravdu ukončit?'; + LANGcsmiDisconnect_Caption = 'O_dpojit'; + LANGcsDisconnectButton_Tooltip = 'Odpojit aktuální spojení'; + LANGcsLeaveArchiveButton_Tooltip = 'Zavřít archiv'; + LANGcsOpenTerminalButton_Tooltip = 'Otevře nové terminálové okno v aktuálním adresáři'; + LANGcsOpenTerminalButton_Caption = 'Te_rminál'; + LANGcsShowTextUIDsCheckBox_Caption = 'Zobrazit vlastníka a sk_upinu textově'; + LANGcsShowTextUIDsCheckBox_Tooltip = 'Použít textové vyjádření vlastníka a skupiny namísto číselné formy (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGcsmiNewTab_Caption = 'Nový _panel'; + LANGcsFilePopupMenu_Properties = 'Vl_astnosti'; + LANGcsCommandEntry_Tooltip = 'Použijte ''%s'' jako zástupce pro jméno souboru/adresáře'; + LANGcsmiFiles_Caption = 'Pouze pro soubory'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGcsPasswordButton_Tooltip = 'Archív je zabezpečen heslem.'#10'Kliknutím nastavíte heslo.'; + LANGcsHandleRunFromArchive_Bytes = 'bajtů'; + LANGcsHandleRunFromArchive_FileTypeDesc_Unknown = '(není k dispozici)'; + LANGcsHandleRunFromArchive_NotAssociated = '(bez asociace)'; + LANGcsHandleRunFromArchive_SelfExecutable = '(spustitelný)'; + LANGcsHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Nepodařilo se vytvořit adresář "%s" pro dočasné soubory: %s.'#10#10'Zkontrolujte prosím zadanou cestu a operaci opakujte.'; + LANGcsFRunFromVFS_Caption = 'Vlastnosti souboru'; + LANGcsFRunFromVFS_TitleLabel = 'Vlastnosti'; + LANGcsFRunFromVFS_FileNameLabel = 'Název souboru:'; + LANGcsFRunFromVFS_FileTypeLabel = 'Typ souboru:'; + LANGcsFRunFromVFS_SizeLabel = 'Velikost:'; + LANGcsFRunFromVFS_PackedSizeLabel = 'Komprimovaná velikost:'; + LANGcsFRunFromVFS_DateLabel = 'Datum změny:'; + LANGcsFRunFromVFS_InfoLabel = 'Zobrazení souborů přímo z archívu není možné. Klepnutím na tlačítka níže se vámi vybrané soubory (resp. celý archív) rozbalí do dočasného adresáře, z nějž je lze jednoduše otevřít ve zvolené aplikaci.' + + #10'Všechny dočasné soubory budou smazány při ukončení aplikace Tux Commander.'; + LANGcsFRunFromVFS_OpensWithLabel = 'Otevřít v:'; + LANGcsFRunFromVFS_ExecuteButton = 'E_xtrahovat a otevřít'; + LANGcsFRunFromVFS_ExecuteAllButton = 'Extrahovat _vše a otevřít'; + LANGcsFSetPassword_Caption = 'Heslo archívu'; + LANGcsFSetPassword_Label1_Caption = 'Zadejte prosím heslo'; + LANGcsFSetPassword_Label2_Caption = 'Pro přístup a práci s obsahem archívu je potřeba zadat heslo'; + LANGcsFSetPassword_ShowPasswordCheckButton = 'Od_krýt heslo'; + + + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGcsF2Button_Caption; + LANGF3Button_Caption := LANGcsF3Button_Caption; + LANGF4Button_Caption := LANGcsF4Button_Caption; + LANGF5Button_Caption := LANGcsF5Button_Caption; + LANGF6Button_Caption := LANGcsF6Button_Caption; + LANGF7Button_Caption := LANGcsF7Button_Caption; + LANGF8Button_Caption := LANGcsF8Button_Caption; + + LANGmnuFile_Caption := LANGcsmnuFile_Caption; + LANGmnuMark_Caption := LANGcsmnuMark_Caption; + LANGmnuCommands_Caption := LANGcsmnuCommands_Caption; + LANGmnuHelp_Caption := LANGcsmnuHelp_Caption; + LANGmiExit_Caption := LANGcsmiExit_Caption; + LANGmiSelectGroup_Caption := LANGcsmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGcsmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGcsmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGcsmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGcsmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGcsmiRefresh_Caption; + LANGmiAbout_Caption := LANGcsmiAbout_Caption; + + LANGColumn1_Caption := LANGcsColumn1_Caption; + LANGColumn2_Caption := LANGcsColumn2_Caption; + LANGColumn3_Caption := LANGcsColumn3_Caption; + LANGColumn4_Caption := LANGcsColumn4_Caption; + LANGColumn5_Caption := LANGcsColumn5_Caption; + + LANGExpandSelection := LANGcsExpandSelection; + LANGShrinkSelection := LANGcsShrinkSelection; + LANGNoMatchesFound := LANGcsNoMatchesFound; + LANGNoFilesSelected := LANGcsNoFilesSelected; + LANGSelectedFilesDirectories := LANGcsSelectedFilesDirectories; + LANGDirectoryS := LANGcsDirectoryS; + LANGFileS := LANGcsFileS; + LANGDoYouReallyWantToDeleteTheS := LANGcsDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGcsDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGcsCopyFiles; + LANGMoveRenameFiles := LANGcsMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGcsCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGcsMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGcsCopySC; + LANGMoveRenameSC := LANGcsMoveRenameSC; + + LANGQuickFind := LANGcsQuickFind; + + LANGAboutString := LANGcsAboutString; + LANGAboutStringGnome := LANGcsAboutStringGnome; + LANGDiskStatFmt := LANGcsDiskStatFmt; + LANGDiskStatVolNameFmt := LANGcsDiskStatVolNameFmt; + LANGStatusLineFmt := LANGcsStatusLineFmt; + LANGPanelStrings[False] := LANGcsPanelStrings[False]; + LANGPanelStrings[True] := LANGcsPanelStrings[True]; + LANGDIR := LANGcsDIR; + LANGErrorGettingListingForSPanel := LANGcsErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGcsErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGcsErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGcsErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGcsTheFileDirectory; + LANGCouldNotBeDeleted := LANGcsCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGcsCouldNotBeDeletedS; + LANGUserCancelled := LANGcsUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGcsTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGcsCannotCopyFile; + LANGCopyError := LANGcsCopyError; + LANGMoveError := LANGcsMoveError; + LANGOverwriteS := LANGcsOverwriteS; + LANGWithFileS := LANGcsWithFileS; + LANGOvewriteSBytesS := LANGcsOvewriteSBytesS; + LANGTheFile := LANGcsTheFile; + LANGCopy := LANGcsCopy; + LANGMove := LANGcsMove; + LANGTheDirectory := LANGcsTheDirectory; + LANGTheSymbolicLink := LANGcsTheSymbolicLink; + LANGCannotMoveFile := LANGcsCannotMoveFile; + LANGCouldNotBeCreated := LANGcsCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGcsCouldNotBeCreatedS; + LANGFromS := LANGcsFromS; + LANGToS := LANGcsToS; + LANGCannotCopyFileToItself := LANGcsCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGcsMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGcsCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGcsCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGcsCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGcsCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGcsCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGcsCannotWriteToDestinationFile; + + LANGUnknownException := LANGcsUnknownException; + LANGNoAccess := LANGcsNoAccess; + LANGUnknownError := LANGcsUnknownError; + + LANGCreateANewDirectory := LANGcsCreateANewDirectory; + LANGEnterDirectoryName := LANGcsEnterDirectoryName; + + LANGOverwriteQuestion := LANGcsOverwriteQuestion; + LANGOverwriteButton_Caption := LANGcsOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGcsOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGcsSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGcsOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGcsSkipAllButton_Caption; + LANGRenameButton_Caption := LANGcsRenameButton_Caption; + LANGAppendButton_Caption := LANGcsAppendButton_Caption; + LANGRename := LANGcsRename; + LANGRenameFile := LANGcsRenameFile; + LANGIgnoreButton_Caption := LANGcsIgnoreButton_Caption; + + LANGProgress := LANGcsProgress; + LANGCancel := LANGcsCancel; + LANGDelete := LANGcsDelete; + + LANGSpecifyFileType := LANGcsSpecifyFileType; + + LANGRemoveDirectory := LANGcsRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGcsDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGcsRetry; + LANGDeleteButton_Caption := LANGcsDeleteButton_Caption; + LANGAll := LANGcsAll; + + LANGCopyFilesSC := LANGcsCopyFilesSC; + LANGAppendQuestion := LANGcsAppendQuestion; + LANGPreparingList := LANGcsPreparingList; + + LANGYouMustSelectAValidFile := LANGcsYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGcsmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGcsVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGcsCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGcsCheckButtonCaptionStop; + LANGFileListTooltip := LANGcsFileListTooltip; + LANGFilenameColumnCaption := LANGcsFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGcsTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGcsAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGcsAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGcsAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGcsChecksumNotChecked; + LANGChecksumChecking := LANGcsChecksumChecking; + LANGChecksumInterrupted := LANGcsChecksumInterrupted; + LANGChecksumDOK := LANGcsChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGcsmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGcsYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGcsCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGcsCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGcsCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGcsCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGcsCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGcsCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGcsCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGcsCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGcsCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGcsCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGcsCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGcsCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGcsCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGcsCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGcsCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGcsCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGcsCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGcsCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGcsCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGcsCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGcsCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGcsCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGcsAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGcsTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGcsTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGcsMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGcsPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGcsMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGcsWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGcsMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGcsMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGcsMergeSC; + LANGmiSplitFileCaption := LANGcsmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGcsmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGcsSplitTheFileSToDirectory; + LANGSplitSC := LANGcsSplitSC; + LANGSplitFile := LANGcsSplitFile; + LANGBytesPerFile := LANGcsBytesPerFile; + LANGAutomatic := LANGcsAutomatic; + LANGDeleteFilesOnTargetDisk := LANGcsDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGcsSplitCaption; + LANGCannotOpenFileS := LANGcsCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGcsCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGcsThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGcsThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGcsAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGcsSplitOfSSucceeded; + LANGSplitOfSFailed := LANGcsSplitOfSFailed; + + LANGmnuShow_Caption := LANGcsmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGcsmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGcsTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGcsCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGcsEdit; + LANGEnterFilenameToEdit := LANGcsEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGcsmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGcsmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGcsThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGcsErrorExecutingCommand; + LANGEditFileTypesCaption := LANGcsEditFileTypesCaption; + LANGTitleLabel_Caption := LANGcsTitleLabel_Caption; + LANGExtensionsColumn := LANGcsExtensionsColumn; + LANGDescriptionColumn := LANGcsDescriptionColumn; + LANGFileTypesList := LANGcsFileTypesList; + LANGActionName := LANGcsActionName; + LANGCommand := LANGcsCommand; + LANGSetDefaultActionButton_Caption := LANGcsSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGcsRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGcsAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGcsBrowseButton_Caption; + LANGCommandLabel_Caption := LANGcsCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGcsDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGcsFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGcsNotebookPageExtensions; + LANGNotebookPageActions := LANGcsNotebookPageActions; + LANGDefault := LANGcsDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGcsCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGcsDefaultColor; + LANGIcon := LANGcsIcon; + LANGBrowseForIcon := LANGcsBrowseForIcon; + LANGSelectFileTypeColor := LANGcsSelectFileTypeColor; + LANGColor := LANGcsColor; + + LANGmiChangePermissions_Caption := LANGcsmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGcsmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGcsmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGcsmiEditSymlink_Caption; + LANGChmodProgress := LANGcsChmodProgress; + LANGChownProgress := LANGcsChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGcsYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGcsPopupRunS; + LANGPopupOpenS := LANGcsPopupOpenS; + LANGPopupGoUp := LANGcsPopupGoUp; + LANGPopupOpenWithS := LANGcsPopupOpenWithS; + LANGPopupDefault := LANGcsPopupDefault; + LANGPopupOpenWith := LANGcsPopupOpenWith; + LANGPopupViewFile := LANGcsPopupViewFile; + LANGPopupEditFile := LANGcsPopupEditFile; + LANGPopupMakeSymlink := LANGcsPopupMakeSymlink; + LANGPopupRename := LANGcsPopupRename; + LANGPopupDelete := LANGcsPopupDelete; + LANGDialogChangePermissions := LANGcsDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGcsCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGcsDialogChangeOwner; + LANGCouldNotBeChownedS := LANGcsCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGcsDialogMakeSymlink; + LANGDialogEditSymlink := LANGcsDialogEditSymlink; + LANGFEditSymlink_Caption := LANGcsFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGcsFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGcsFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGcsFChmod_Caption; + LANGFChmod_PermissionFrame := LANGcsFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGcsFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGcsFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGcsFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGcsFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGcsFChmod_OctalLabel; + LANGFChmod_SUID := LANGcsFChmod_SUID; + LANGFChmod_SGID := LANGcsFChmod_SGID; + LANGFChmod_Sticky := LANGcsFChmod_Sticky; + LANGFChmod_RUSR := LANGcsFChmod_RUSR; + LANGFChmod_WUSR := LANGcsFChmod_WUSR; + LANGFChmod_XUSR := LANGcsFChmod_XUSR; + LANGFChmod_RGRP := LANGcsFChmod_RGRP; + LANGFChmod_WGRP := LANGcsFChmod_WGRP; + LANGFChmod_XGRP := LANGcsFChmod_XGRP; + LANGFChmod_ROTH := LANGcsFChmod_ROTH; + LANGFChmod_WOTH := LANGcsFChmod_WOTH; + LANGFChmod_XOTH := LANGcsFChmod_XOTH; + LANGFChmod_TextLabel := LANGcsFChmod_TextLabel; + LANGFChmod_FileLabel := LANGcsFChmod_FileLabel; + LANGFChown_Caption := LANGcsFChown_Caption; + LANGFChown_OwnerFrame := LANGcsFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGcsFChown_GroupFrame; + LANGFChown_FileFrame := LANGcsFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGcsFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGcsFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGcsFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGcsFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGcsmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGcsmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGcsmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGcsBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGcsmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGcsTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGcsSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGcsPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGcsPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGcsPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGcsPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGcsPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGcsPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGcsPreferences_NumHistoryItems; + LANGPreferences_Default := LANGcsPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGcsPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGcsPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGcsPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGcsPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGcsPreferences_Viewer; + LANGPreferences_Editor := LANGcsPreferences_Editor; + LANGPreferences_Terminal := LANGcsPreferences_Terminal; + LANGPreferences_ListFont := LANGcsPreferences_ListFont; + LANGPreferences_Change := LANGcsPreferences_Change; + LANGPreferences_UseDefaultFont := LANGcsPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGcsPreferences_Foreground; + LANGPreferences_Background := LANGcsPreferences_Background; + LANGPreferences_NormalItem := LANGcsPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGcsPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGcsPreferences_Cursor; + LANGPreferences_InactiveItem := LANGcsPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGcsPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGcsPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGcsPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGcsPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGcsPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGcsPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGcsPreferences_DefaultS; + LANGPreferences_SelectFont := LANGcsPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGcsBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGcsUpButton_Tooltip; + LANGRootButton_Tooltip := LANGcsRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGcsHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGcsLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGcsRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGcsmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGcsmiTargetSource_Caption; + LANGFileTypeDirectory := LANGcsFileTypeDirectory; + LANGFileTypeFile := LANGcsFileTypeFile; + LANGFileTypeMetafile := LANGcsFileTypeMetafile; + LANGPreferencesPanelsPage := LANGcsPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGcsPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGcsPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGcsPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGcsPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGcsPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGcsPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGcsPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGcsPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGcsPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGcsPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGcsPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGcsPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGcsPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGcsPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGcsPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGcsPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGcsPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGcsPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGcsPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGcsPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGcsPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGcsPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGcsPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGcsPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGcsPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGcsPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGcsPreferencesViewer; + LANGPreferencesCommandSC := LANGcsPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGcsPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGcsPreferencesEditor; + LANGPreferencesTerminal := LANGcsPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGcsPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGcsPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGcsPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGcsPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGcsPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGcsPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGcsPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGcsPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGcsmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGcsmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGcsmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGcsmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGcsmnuNetworkCaption; + LANGmiConnectionsCaption := LANGcsmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGcsmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGcsmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGcsmnuPluginsCaption; + LANGmiTestPluginCaption := LANGcsmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGcsmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGcsmiColumnsCaption; + LANGmiSavePositionCaption := LANGcsmiSavePositionCaption; + LANGmiMountCaption := LANGcsmiMountCaption; + LANGmiUmountCaption := LANGcsmiUmountCaption; + LANGmiEjectCaption := LANGcsmiEjectCaption; + LANGmiDuplicateTabCaption := LANGcsmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGcsmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGcsmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGcsCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGcsCannotLoadFile; + LANGMountPointDevice := LANGcsMountPointDevice; + LANGMountSC := LANGcsMountSC; + LANGNoPluginsFound := LANGcsNoPluginsFound; + LANGPluginAbout := LANGcsPluginAbout; + LANGCouldntOpenURI := LANGcsCouldntOpenURI; + LANGPluginAboutInside := LANGcsPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGcsAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGcsCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGcsThereIsNoModuleAvailable; + LANGIgnoreError := LANGcsIgnoreError; + LANGErrorMount := LANGcsErrorMount; + LANGErrorUmount := LANGcsErrorUmount; + LANGErrorEject := LANGcsErrorEject; + + LANGMounterPrefs_Caption := LANGcsMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGcsMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGcsMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGcsMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGcsMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGcsMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGcsMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGcsMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGcsMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGcsMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGcsMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGcsMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGcsMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGcsMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGcsMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGcsMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGcsMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGcsMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGcsMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGcsMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGcsMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGcsMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGcsMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGcsMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGcsMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGcsMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGcsMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGcsConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGcsConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGcsConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGcsConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGcsConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGcsConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGcsConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGcsConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGcsConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGcsConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGcsConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGcsConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGcsConnProp_FTP; + LANGConnProp_SFTP := LANGcsConnProp_SFTP; + LANGConnProp_SMB := LANGcsConnProp_SMB; + LANGConnProp_HTTP := LANGcsConnProp_HTTP; + LANGConnProp_HTTPS := LANGcsConnProp_HTTPS; + LANGConnProp_Other := LANGcsConnProp_Other; + LANGConnProp_Caption := LANGcsConnProp_Caption; + LANGConnProp_VFSModule := LANGcsConnProp_VFSModule; + LANGConnProp_URI := LANGcsConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGcsConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGcsConnProp_DetailedInformations; + LANGConnProp_Name := LANGcsConnProp_Name; + LANGConnProp_Server := LANGcsConnProp_Server; + LANGConnProp_Username := LANGcsConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGcsConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGcsConnProp_Password; + LANGConnProp_TargetDirectory := LANGcsConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGcsConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGcsConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGcsConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGcsConnLogin_Caption; + LANGConnLogin_Login := LANGcsConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGcsConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGcsConnLogin_Username; + LANGConnLogin_Password := LANGcsConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGcsConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGcsColumns_Caption; + LANGColumns_Title := LANGcsColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGcsColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGcsColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGcsColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGcsColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGcsColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGcsColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGcsColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGcsColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGcsColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGcsColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGcsColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGcsColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGcsColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGcsColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGcsColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGcsColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGcsColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGcsColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGcsColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGcsColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGcsColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGcsColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGcsTestPlugin_Caption; + LANGTestPlugin_Title := LANGcsTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGcsTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGcsTestPlugin_Plugin; + LANGTestPlugin_Command := LANGcsTestPlugin_Command; + LANGTestPlugin_Username := LANGcsTestPlugin_Username; + LANGTestPlugin_Password := LANGcsTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGcsTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGcsTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGcsRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGcsRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGcsRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGcsSearch_Bytes; + LANGSearch_kB := LANGcsSearch_kB; + LANGSearch_MB := LANGcsSearch_MB; + LANGSearch_days := LANGcsSearch_days; + LANGSearch_weeks := LANGcsSearch_weeks; + LANGSearch_months := LANGcsSearch_months; + LANGSearch_years := LANGcsSearch_years; + LANGSearch_Caption := LANGcsSearch_Caption; + LANGSearch_General := LANGcsSearch_General; + LANGSearch_Advanced := LANGcsSearch_Advanced; + LANGSearch_SearchResults := LANGcsSearch_SearchResults; + LANGSearch_SearchFor := LANGcsSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGcsSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGcsSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGcsSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGcsSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGcsSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGcsSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGcsSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGcsSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGcsSearch_Size; + LANGSearch_Date := LANGcsSearch_Date; + LANGSearch_BiggerThan := LANGcsSearch_BiggerThan; + LANGSearch_SmallerThan := LANGcsSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGcsSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGcsSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGcsSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGcsSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGcsSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGcsSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGcsSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGcsSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGcsSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGcsSearch_StatusSC; + LANGSearch_Ready := LANGcsSearch_Ready; + LANGSearch_PreparingToSearch := LANGcsSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGcsSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGcsSearch_UserCancelled; + LANGSearch_SearchFinished := LANGcsSearch_SearchFinished; + LANGSearch_FilesFound := LANGcsSearch_FilesFound; + LANGSearch_And := LANGcsSearch_And; + + LANGCloseOpenConnection := LANGcsCloseOpenConnection; + LANGDuplicateTabWarning := LANGcsDuplicateTabWarning; + LANGDontShowAgain := LANGcsDontShowAgain; + LANGSwitchOtherPanelWarning := LANGcsSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGcsOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGcsmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGcsDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGcsLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGcsOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGcsOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGcsShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGcsShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGcsmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGcsFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGcsCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGcsmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGcsPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGcsHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGcsHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGcsHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGcsHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGcsHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGcsFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGcsFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGcsFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGcsFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGcsFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGcsFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGcsFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGcsFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGcsFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGcsFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGcsFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGcsFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGcsFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGcsFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGcsFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('cz_CZ', @SetTranslation); + AddTranslation('CS', @SetTranslation); + AddTranslation('CZ', @SetTranslation); +end. diff --git a/translations/UTranslation_DE.pas b/translations/UTranslation_DE.pas new file mode 100644 index 0000000..f44b80a --- /dev/null +++ b/translations/UTranslation_DE.pas @@ -0,0 +1,1236 @@ +(* + Tux Commander - UTranslation_DE - German Localization constants + Copyright (C) 2004 Sven Laufersweiler + !! Currently unmaintained, new translator needed !! + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_DE; + +interface + +implementation + +uses ULocale; + +const LANGdeF2Button_Caption = 'F2 - Umbenenne'; + LANGdeF3Button_Caption = 'F3 - Ansehen'; + LANGdeF4Button_Caption = 'F4 - Bearbeiten'; + LANGdeF5Button_Caption = 'F5 - Kopieren'; + LANGdeF6Button_Caption = 'F6 - Verschieben'; + LANGdeF7Button_Caption = 'F7 - Verz. erstellen'; + LANGdeF8Button_Caption = 'F8 - Löschen'; + LANGdemnuFile_Caption = '_Datei'; + LANGdemnuMark_Caption = '_Markierung'; + LANGdemnuCommands_Caption = '_Befehle'; + LANGdemnuHelp_Caption = '_Hilfe'; + LANGdemiExit_Caption = 'B_eenden'; + LANGdemiSelectGroup_Caption = '_Gruppe auswählen...'; + LANGdemiUnselectGroup_Caption = 'Gruppenauswahl _rückgängig...'; + LANGdemiSelectAll_Caption = '_Alles auswählen'; + LANGdemiUnselectAll_Caption = '_Keine Auswahl'; + LANGdemiInvertSelection_Caption = 'Auswahl _umkehren'; + LANGdemiRefresh_Caption = '_Aktualisieren'; + LANGdemiAbout_Caption = 'Ü_ber...'; + LANGdeColumn1_Caption = 'Name'; + LANGdeColumn2_Caption = 'Erw.'; + LANGdeColumn3_Caption = 'Gräße'; + LANGdeColumn4_Caption = 'Datum'; + LANGdeColumn5_Caption = 'Attr'; + LANGdeExpandSelection = 'Auswahl aufblättern'; + LANGdeShrinkSelection = 'Auswahl zusammenschrumpfen'; + LANGdeNoMatchesFound = 'Keine Übereinstimmung gefunden'; + LANGdeNoFilesSelected = 'Keine Dateien ausgewählt!'; + LANGdeSelectedFilesDirectories = '%d Dateien/Verzeichnisse ausgewählt'; + LANGdeDirectoryS = 'Verzeichnis %s'; + LANGdeFileS = 'Datei %s'; + LANGdeDoYouReallyWantToDeleteTheS = 'Wollen Sie %s wirklich löschen?'; + LANGdeDoYouReallyWantToDeleteTheSS = 'Wollen Sie %s wirklich löschen?'#10'%s'; + LANGdeCopyFiles = 'Dateien kopieren'; + LANGdeMoveRenameFiles = 'Dateien verschieben/umbenennen'; + LANGdeCopyDFileDirectoriesTo = 'Kopiere %d Dateien/Verzeichnisse nach'; + LANGdeMoveRenameDFileDirectoriesTo = 'Verschieben/Umbenennen von %d Dateien/Verzeichnissen nach'; + LANGdeCopySC = 'Kopiere:'; + LANGdeMoveRenameSC = 'Verschiebe/Umbenennen:'; + LANGdeQuickFind = ' Schnellfinder:'; + LANGdeAboutString = 'Tux Commander'#10'Version %s'#10'Erstellungsdatum: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGdeAboutStringGnome = 'Version %s'#10'Erstellungsdatum: %s'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGdeDiskStatFmt = '%s von %s frei'; + LANGdeDiskStatVolNameFmt = '[%s] %s von %s frei'; + LANGdeStatusLineFmt = '%s von %s in %d von %d Dateien ausgewählt'; + LANGdePanelStrings : array[boolean] of string = ('Rechts', 'Links'); + LANGdeDIR = ''; + LANGdeErrorGettingListingForSPanel = 'Fehler beim Erhalten der Auflistung für %s Feld:'#10' %s'#10#10'Pfad = ''%s'''; + LANGdeErrorGettingListingForSPanelNoPath = 'Fehler beim Erhalten der Auflistung für %s Feld:'#10' %s'; + LANGdeErrorCreatingNewDirectorySInSPanel = 'Fehler beim Erstellen des neuen Verzeichnisses ''%s'' in %s Feld:'#10' %s'; + LANGdeErrorCreatingNewDirectorySInSPanelNoPath = 'Fehler beim Erstellen des neuen Verzeichnisses in %s Feld:'#10' %s'; + LANGdeTheFileDirectory = 'Die Datei/Das Verzeichniss'; + LANGdeCouldNotBeDeleted = 'kann nicht gelöscht werden'; + LANGdeCouldNotBeDeletedS = 'Kann nicht gelöscht werden: %s'; + LANGdeUserCancelled = 'Abbruch durch Benutzer!'; + LANGdeTheDirectorySIsNotEmpty = 'Das Verzeichnis %s ist nicht leer!'; + LANGdeCannotCopyFile = 'Kann Datei nicht kopieren'; + LANGdeCopyError = 'Fehler beim kopieren'; + LANGdeMoveError = 'Fehler beim verschieben'; + LANGdeOverwriteS = 'Überschreibe: %s'; + LANGdeWithFileS = 'mit Datei: %s'; + LANGdeOvewriteSBytesS = '%s bytes, %s'; + LANGdeTheFile = 'Die Datei'; + LANGdeCopy = 'Kopieren'; + LANGdeMove = 'Verschieben'; + LANGdeTheDirectory = 'Das Verzeichnis'; + LANGdeTheSymbolicLink = 'Der symbolische Link'; + LANGdeCannotMoveFile = 'Kann Datei nicht verschieben'; + LANGdeCouldNotBeCreated = 'kann nicht erstellt werden'; + LANGdeCouldNotBeCreatedS = 'kann nicht erstellt werden: %s'; + LANGdeFromS = 'Von: %s'; + LANGdeToS = 'Nach: %s'; + LANGdeCannotCopyFileToItself = 'Datei kann nicht auf sich selber kopiert werden'; + LANGdeMemoryAllocationFailed = 'Speicherallozierung schlug fehl:'; + LANGdeCannotOpenSourceFile = 'Kann Quelldatei nicht öffnen'; + LANGdeCannotOpenDestinationFile = 'Kann Zieldatei nicht öffnen'; + LANGdeCannotCloseDestinationFile = 'Kann Zieldatei nicht schließen'; + LANGdeCannotCloseSourceFile = 'Kann Quelldateii nicht schließen'; + LANGdeCannotReadFromSourceFile = 'Kann von Quelldatei nicht lesen'; + LANGdeCannotWriteToDestinationFile = 'Kann nicht in Zieldatei schreiben'; + LANGdeUnknownException = 'Unbekannter Ausnahmefehler'; + LANGdeNoAccess = 'Kein Zugriff'; + LANGdeUnknownError = 'Unbekannter Fehler'; + LANGdeCreateANewDirectory = 'Erstelle neues Verzeichnis'; + LANGdeEnterDirectoryName = 'Gebe _Verzeichnisnamen ein:'; + LANGdeOverwriteQuestion = 'Überschreibe Frage'; + LANGdeOverwriteButton_Caption = '_Überschreiben'; + LANGdeOverwriteAllButton_Caption = 'Überschreibe _alles'; + LANGdeSkipButton_Caption = '_Überspringe'; + LANGdeOverwriteAllOlderButton_Caption = 'Überschreibe alles _was älter'; + LANGdeSkipAllButton_Caption = 'Ü_berspringe alles'; + LANGdeRenameButton_Caption = '_Umbenennen'; + LANGdeAppendButton_Caption = 'A_nhängen'; + LANGdeRename = 'Umbenennen'; + LANGdeRenameFile = 'Datei ''%s'' umbenennen nach'; + LANGdeIgnoreButton_Caption = '_Ignorieren'; + LANGdeProgress = 'Fortschritt'; + LANGdeCancel = '_Abbruch'; + LANGdeDelete = 'Lösche:'; + LANGdeSpecifyFileType = '_Spezifiziere Dateityp:'; + LANGdeRemoveDirectory = 'Verschiebe Verzeichnis'; + LANGdeDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Wollen Sie es mit allen Datei und Unterverzeichnissen löschen?'; + LANGdeRetry = '_Wiederholen'; + LANGdeDeleteButton_Caption = '_Löschen'; + LANGdeAll = '_Alles'; + LANGdeCopyFilesSC = 'Dateien kopieren:'; + LANGdeAppendQuestion = 'Sind Sie sicher, daß Sie die Datei ''%s'' an Datei ''%s'' anhängen wollen?'; + LANGdePreparingList = 'Bereite Liste vor...'; + LANGdeYouMustSelectAValidFile = 'Sie müssen ein gültige Datei auswählen!'; + LANGdemiVerifyChecksums = '_Prüfe Checksumme'; + LANGdeVerifyChecksumsCaption = 'Prüfe Checksumme'; + LANGdeCheckButtonCaptionCheck = '_Prüfen'; + LANGdeCheckButtonCaptionStop = '_Stop'; + LANGdeFileListTooltip = '[?] - Nicht kontrolliert'#10'[OK] Checksumme richtig'#10'[BAD] - Checksumme falsch'#10'[N/A] Datei nicht verfügbar'; + LANGdeFilenameColumnCaption = 'Dateiname'; + LANGdeTheFileSYouAreTryingToOpenIsQuiteBig = 'Die Datei ''%s'', die Sie versuchen zu öffnen ist zu groß. Es kann möglicherweise eine ungültige Prüfsummendatei sein.'#10#10'Wollen Sie trotzdem laden?'; + LANGdeAnErrorOccuredWhileInitializingMemoryBlock = 'Es trat ein Fehler mit dem Speicher auf. Schließen Sie einige Programme und versuchen Sie es erneut.'; + LANGdeAnErrorOccuredWhileOpeningFileSS = 'Beim öffnen der Datei ''%s'' trat ein fehler auf:'#10' %s'; + LANGdeAnErrorOccuredWhileReadingFileSS = 'Beim lesen der Datei ''%s'' trat ein Fehler auf:'#10' %s'; + LANGdeChecksumNotChecked = 'Status: Nicht geprüft'; + LANGdeChecksumChecking = 'Status: Prüfe...'; + LANGdeChecksumInterrupted = 'Status: Unterbrochen'; + LANGdeChecksumDOK = 'Status: %d%% OK'; + LANGdemiCreateChecksumsCaption = '_Erstelle Checksummen...'; + LANGdeYouMustSelectAtLeastOneFileToCalculateChecksum = 'Sie müssen mindestens eine Datei ausgewählt haben, um Checksummen zu berechnen!'; + LANGdeCreateChecksumsCaption = 'Erstelle Checksummen'; + LANGdeCCHKSUMPage1Text = 'Sie werden Prüfsummen für die ausgewählten'#10'Dateien erstellen. Wenn Sie noch nicht alle'#10'Dateine ausgewählt haben, schließen sie diesen Dialog'#10'und wählen Sie weitere Dateien aus.'; + LANGdeCCHKSUMPage4Text = 'Der Druide ist bereit die Checksummen für Ihre'#10'ausgewählten Dateien zu erstellen. Dieser Vorgang kann ein paar Minuten dauern.'#10'Um Fortzufahren klicken Sie auf "Weiter".'; + LANGdeCCHKSUMPage6Text = 'Beim Erstellen der Checksummen traten Fehler auf:'; + LANGdeCCHKSUMPage7Text = 'Das Erstellen der Checksummen ist beendet und '#10' Ihre Dateien sind bereit.'#10#10'Zum Beenden klicke auf "Beenden".'; + LANGdeCCHKSUMPage1Title = 'Vorbereiten der Dateien zur Checksummenberechnung'; + LANGdeCCHKSUMPage2Title = 'Wählen Sie den Prüfsummen Dateityp aus'; + LANGdeCCHKSUMPage3Title = 'Dateiname auswählen'; + LANGdeCCHKSUMPage4Title = 'Bereit zum prüfen'; + LANGdeCCHKSUMPage5Title = 'Ausführung...'; + LANGdeCCHKSUMPage6Title = 'Fehler!'; + LANGdeCCHKSUMPage7Title = 'Fertig'; + LANGdeCCHKSUMSFVFile = 'SFV Datei'; + LANGdeCCHKSUMMD5sumFile = 'MD5sum Datei'; + LANGdeCCHKSUMFileName = 'Datei_name:'; + LANGdeCCHKSUMCreateSeparateChecksumFiles = 'Erstelle _separate Prüfsummendateien'; + LANGdeCCHKSUMNowProcessingFileS = 'Verarbeite jetzt Datei: %s'; + LANGdeCCHKSUMFinishCaption = '_Fertig'; + LANGdeCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Wollen Sie wirklich die Bearbeitung abbrechen?'; + LANGdeCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Beim Öffnen der Datei ''%s'' trat ein Fehler auf: %s'#10; + LANGdeCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Beim Lesen der Datei ''%s'' trat ein Fehler auf: %s'#10; + LANGdeCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Beim Schreiben der Datei ''%s'' trat ein Fehler auf: %s'#10; + LANGdeAnErrorOccuredWhileWritingFileSS = 'Beim Schreiben der Datei ''%s'' trat ein Fehler auf:'#10' %s'; + LANGdeTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Die Zieldatei ''%s'' existiert bereits. Soll diese überschrieben werden?'; + LANGdeTheTargetFileSCannotBeRemovedS = 'Die Zieldatei ''%s'' kann nicht entfernt werden: %s'; + LANGdeMergeCaption = 'Zusammenfügen'; + LANGdePleaseInsertNextDiskOrGiveDifferentLocation = 'Nächste Diskette einlegen, oder anderen Ort auswählen:'; + LANGdeMergeOfSSucceeded = 'Zusammenfügen von ''%s'' erfolgreich (CRC Checksumme OK).'; + LANGdeWarningCreatedFileFailsCRCCheck = 'Warnung: CRC-Check für neue Datei schlug fehl!'; + LANGdeMergeOfSSucceeded_NoCRCFileAvailable = 'Zusammenfügen von ''%s'' erfolgreich (keine CRC-Datei verfügbar).'; + LANGdeMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Zusammenfügen von ''%s'' und alle Dateien mit aufsteigenden Namen in folgendes Verzeichnis:'; + LANGdeMergeSC = 'Zusammenfügen:'; + LANGdemiSplitFileCaption = 'Dateien _teilen...'; + LANGdemiMergeFilesCaption = 'Dateien _verbinden...'; + LANGdeSplitTheFileSToDirectory = '_Teile die Datei ''%s'' ins Verzeichnis:'; + LANGdeSplitSC = 'Teilen:'; + LANGdeSplitFile = 'Datei teilen'; + LANGdeBytesPerFile = '_Bytes pro Datei:'; + LANGdeAutomatic = 'Automatisch'; + LANGdeDeleteFilesOnTargetDisk = '_Lüsche Dateien auf Zieldiskette (verwendbar für entfernbare Medien)'; + LANGdeSplitCaption = 'Teilen'; + LANGdeCannotOpenFileS = 'Kann Datei ''%s'' nicht öffnen'; + LANGdeCannotSplitTheFileToMoreThan999Parts = 'Kann die Datei nicht in mehr als 999 Teile aufteilen!'; + LANGdeThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Es befinden sich einige Dateien im Zielverzeichnis:'#10'%s'#10'Wollen Sie diese löschen?'; + LANGdeThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Es sind %d Dateien im Zielverzeichnis. Wollen Sie diese löschen?'; + LANGdeAnErrorOccuredWhileOperationS = 'Während folgender Operation trat ein Fehler auf: %s'; + LANGdeSplitOfSSucceeded = '''%s'' erfolgreich geteilt.'; + LANGdeSplitOfSFailed = 'Das Teilen von ''%s'' schlug fehl!'; + LANGdemnuShow_Caption = 'An_zeigen'; + LANGdemiShowDotFiles_Caption = 'Zeige _versteckte Dateien'; + LANGdeTheFileYouAreTryingToOpenIsQuiteBig = 'Die Datei, die Sie versuchen zu öffnen, ist sehr groß. Das Laden der Datei mit einer externen Anwendung (wie gedit) kann eine Verlangsamung des Systems verursachen.'#10'Wollen Sie fortfahren?'; + LANGdeCannotExecuteSPleaseCheckTheConfiguration = 'Kann ''%s'' nicht ausführen. Bitte prüfen Sie die Konfiguration, oder setzen Sie die korrekte Verknüpfung zum Dateityp.'; + LANGdeEdit = 'Bearbeiten'; + LANGdeEnterFilenameToEdit = '_Eingabe des zu editierenden Dateinamens:'; + + LANGdemnuSettings_Caption = 'Eins_tellungen'; + LANGdemiFileTypes_Caption = 'Date_itypen...'; + LANGdeThereIsNoApplicationAssociatedWithS = 'Es ist kein Programm mit "%s" verknüpft.'#10#10'Sie können Tux Commander konfigurieren um Programm mit Dateitypen zu verknüpfen. Wollen Sie jetzt ein Programm mit diesem Dateityp verknüpfen?'; + LANGdeErrorExecutingCommand = 'Fehler beim Ausführen des Befehls!'; + LANGdeEditFileTypesCaption = 'Bearbeiten der Dateitypen'; + LANGdeTitleLabel_Caption = 'Konfiguration der Dateitypen'; + LANGdeExtensionsColumn = 'Erweiterungen'; + LANGdeDescriptionColumn = 'Beschreibung'; + LANGdeFileTypesList = 'Dateitypenliste'; + LANGdeActionName = 'Aktionsname'; + LANGdeCommand = 'Befehl'; + LANGdeSetDefaultActionButton_Caption = 'Als _Standard setzen'; + LANGdeRunInTerminalCheckBox_Caption = 'Im _Terminal ausführen'; + LANGdeAutodetectCheckBox_Caption = '_GUI Programm automatisch erkennen'; + LANGdeBrowseButton_Caption = '_Browse...'; + LANGdeCommandLabel_Caption = 'Be_fehl:'; + LANGdeDescriptionLabel_Caption = 'B_schreibung:'; + LANGdeFNameExtLabel_Caption = 'Hi_nzufügen:'; + LANGdeNotebookPageExtensions = 'Dateityp'; + LANGdeNotebookPageActions = 'Aktionen'; + LANGdeDefault = ' (Standard)'; + LANGdeCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Kann die Dateityp-Verknüpfung nicht speichern, weil ein anderer Prozess diesen aktualisiert hat während dieses Programm läuft.'; + LANGdeDefaultColor = 'St_andard Farbe'; + LANGdeIcon = '_Icon:'; + LANGdeBrowseForIcon = 'Nach Icon suchen'; + LANGdeSelectFileTypeColor = 'Dateitypenfarbe auswählen'; + LANGdeColor = 'Fa_rbe:'; + + LANGdemiChangePermissions_Caption = 'Be_rechtigungen ändern...'; + LANGdemiChangeOwner_Caption = '_Eigentümer/Gruppe ändern...'; + LANGdemiCreateSymlink_Caption = 'Symbolischen _Link erstellen...'; + LANGdemiEditSymlink_Caption = '_Symbolischen Link bearbeiten...'; + LANGdeChmodProgress = 'Berechtigungen ändern:'; + LANGdeChownProgress = 'Eigentümer ändern:'; + LANGdeYouMustSelectAValidSymbolicLink = 'Sie müssen einen zulässigen symbolischen Link auswählen!'; + LANGdePopupRunS = 'A_usführen %s'; + LANGdePopupOpenS = 'Ö_ffnen %s'; + LANGdePopupGoUp = '_Aufwärts'; + LANGdePopupOpenWithS = 'Öffnen _mit %s'; + LANGdePopupDefault = ' (Standard)'; + LANGdePopupOpenWith = 'Ö_ffnen mit...'; + LANGdePopupViewFile = '_Datei ansehen'; + LANGdePopupEditFile = 'D_atei bearbeiten'; + LANGdePopupMakeSymlink = 'S_ymbolischen Link erstellen'; + LANGdePopupRename = '_Umbenennen'; + LANGdePopupDelete = '_Löschen'; + LANGdeDialogChangePermissions = 'Berechtigungen ändern'; + LANGdeCouldNotBeChmoddedS = 'could not be chmodded: %s'; + LANGdeDialogChangeOwner = 'Eigentümer ändern'; + LANGdeCouldNotBeChownedS = 'Kann Eigentümer nicht ändern: %s'; + LANGdeDialogMakeSymlink = 'Symbolischen Link erstellen'; + LANGdeDialogEditSymlink = 'Symbolischen Link bearbeiten'; + LANGdeFEditSymlink_Caption = 'Symbolischen Link bearbeiten'; + LANGdeFEditSymlink_SymbolicLinkFilename = '_Symbolischer Verbindungs-Dateiname:'; + LANGdeFEditSymlink_SymbolicLinkPointsTo = 'Symbolicher Link _zeigt auf:'; + + LANGdeFChmod_Caption = 'Zugangsberechtigungen'; + LANGdeFChmod_PermissionFrame = 'Berechtigungen'; + LANGdeFChmod_FileFrame = 'Datei'; + LANGdeFChmod_ApplyRecursivelyFor = '_Rrekursiv anlegen für'; + LANGdeFChmod_miAllFiles = 'Alle Dateien und Verzeichnisse'; + LANGdeFChmod_miDirectories = 'nur Verzeichnisse'; + LANGdeFChmod_OctalLabel = '_Oktal:'; + LANGdeFChmod_SUID = 'SUID - Setze Benutzer-ID auf Ausführung ein'; + LANGdeFChmod_SGID = 'SGID - Setze Gruppen-ID auf Ausführung ein'; + LANGdeFChmod_Sticky = 'Sticky bit'; + LANGdeFChmod_RUSR = 'RUSR - Eigentümer hat Leserecht'; + LANGdeFChmod_WUSR = 'WUSR - Eigentümer hat Schreibrecht'; + LANGdeFChmod_XUSR = 'XUSR - Ausführung/Suchen durch Eigentümer'; + LANGdeFChmod_RGRP = 'RGRP - Gruppe hat Leserecht'; + LANGdeFChmod_WGRP = 'WGRP - Gruppe hat Schreibrecht'; + LANGdeFChmod_XGRP = 'XGRP - Ausführung/Suchen durch Gruppe'; + LANGdeFChmod_ROTH = 'ROTH - Andere haben Leserecht'; + LANGdeFChmod_WOTH = 'WOTH - Andere haben Schreibrecht'; + LANGdeFChmod_XOTH = 'XOTH - Ausführung/Suchen durch andere'; + LANGdeFChmod_TextLabel = 'Text: %s'; + LANGdeFChmod_FileLabel = 'Datei: %s'#10'Text: %s'#10 + + 'Oktal: %d'#10'Eigentuemer: %s'#10 + + 'Gruppe: %s'; + + LANGdeFChown_Caption = 'Eigentümer/Gruppe ändern'; + LANGdeFChown_OwnerFrame = 'Benutzername'; + LANGdeFChown_GroupFrame = 'Gruppenname'; + LANGdeFChown_FileFrame = 'Datei'; + LANGdeFChown_ApplyRecursively = '_Rekursiv zuweisen'; + + LANGdeFSymlink_Caption = 'Symbolischen Link erstellen'; + LANGdeFSymlink_ExistingFilename = '_Existierenden Dateinamen (Dateiname symbolischer Link zeigt auf):'; + LANGdeFSymlink_SymlinkFilename = '_Symbolischer Verbindungs-Dateiname:'; + + LANGdemnuBookmarks_Caption = '_Lesezeichen'; + LANGdemiAddBookmark_Caption = 'Lesezeichen hinzufügen'; + LANGdemiEditBookmarks_Caption = 'Lesezeichen bearbeiten'; + LANGdeBookmarkPopupDelete_Caption = '_Löschen'; + LANGdemiPreferences_Caption = '_Einstellungen...'; + LANGdeTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Das aktuelle Verzeichnis is bereits in der Liste der Lesezeichen enthalten'; + LANGdeSomeOtherInstanceChanged = 'Eine andere Instanz von Tux-Commander hat die Einstellungen geändert. Möchten Sie die neuen Einstellungen übernehmen?'#10#10'Warnung: Wenn Sie Nein drücken, werden die Einstellungen dieser Instanz überschrieben'' Verlassen!'; + + LANGdePreferences_Caption = 'Einstellungen'; + LANGdePreferences_TitleLabel_Caption = 'Programm Einstellungen'; + LANGdePreferences_GeneralPage = 'Allgemein'; + LANGdePreferences_FontsPage = 'Schriften'; + LANGdePreferences_ColorsPage = 'Farben'; + LANGdePreferences_RowHeight = 'Zeilen_höhe:'; + LANGdePreferences_NumHistoryItems = '_Kommandozeilen history Eintragungen:'; + LANGdePreferences_Default = 'Vorgabe'; + LANGdePreferences_ClearReadonlyAttribute = 'Lösche _NurLesen-Attribute wenn von CD-ROM kopiert wird'; + LANGdePreferences_DisableMouseRenaming = 'Umbenennen mit _Maus abschalten '; + LANGdePreferences_ShowFiletypeIconsInList = 'Zeige _Dateitypenbilder'; + LANGdePreferences_ExternalAppsLabel = 'Externe Programme'; + LANGdePreferences_Viewer = '_Betrachter:'; + LANGdePreferences_Editor = '_Editor:'; + LANGdePreferences_Terminal = '_Terminal:'; + LANGdePreferences_ListFont = 'Liste der Schriften:'; + LANGdePreferences_Change = 'Ãndern...'; + LANGdePreferences_UseDefaultFont = 'Benutze _Standardschriftsatz'; + LANGdePreferences_Foreground = 'Vordergrund'; + LANGdePreferences_Background = 'Hintergrund'; + LANGdePreferences_NormalItem = 'Normale Elemente:'; + LANGdePreferences_SetToDefaultToUseGTKThemeColors = 'Verwende standardmäßig GTK-Thema Farben'; + LANGdePreferences_Cursor = 'Cursor:'; + LANGdePreferences_InactiveItem = 'Nicht aktives Element:'; + LANGdePreferences_SelectedItem = 'Aktives Element:'; + LANGdePreferences_LinkItem = 'Symbolische Verknüpfungen:'; + LANGdePreferences_LinkItemHint = 'Verwende standardmäßig die Standardelementfarbe für Symbolische Verknüpfungen'; + LANGdePreferences_DotFileItem = 'Versteckte Dateien:'; + LANGdePreferences_DotFileItemHint = 'Verwende standardmäßig die Standardelementfarbe für versteckte Dateien'; + LANGdePreferences_BrowseForApplication = 'Nach Programm suchen'; + LANGdePreferences_DefaultS = 'Standard: %s'; + LANGdePreferences_SelectFont = 'Schriftfont auswählen'; + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGdeBookmarkButton_Tooltip = 'Zeige Lesezeichen'; + LANGdeUpButton_Tooltip = 'Gehe eine Verzeichnisebene höher'; + LANGdeRootButton_Tooltip = 'Gehe zum Wurzelverzeichnis (/)'; + LANGdeHomeButton_Tooltip = 'Gehe zum Benutzerverzeichnis (/home/user)'; + LANGdeLeftEqualButton_Tooltip = 'Wechsle rechte Verzeichnistafel zum selben Verzeichnis'; + LANGdeRightEqualButton_Tooltip = 'Wechsle linke Verzeichnistafel zum selben Verzeichnis'; + LANGdemiShowDirectorySizes_Caption = 'Zeige V_erzeichnisgröße'; + LANGdemiTargetSource_Caption = 'Ziel = Quelle'; + LANGdeFileTypeDirectory = 'Verzeichnis'; + LANGdeFileTypeFile = 'Datei'; + LANGdeFileTypeMetafile = 'Dies ist ein allgemeines Meta-Item'; + LANGdePreferencesPanelsPage = 'Tafel'; + LANGdePreferencesApplicationsPage = 'Programme'; + LANGdePreferencesExperimentalPage = 'Experimentell'; + LANGdePreferencesSelectAllDirectoriesCheckBox_Caption = 'Wenn alles ausgewählt, auch Verzeichnisse auswählen'; + LANGdePreferencesNewStyleAltOCheckBox_Caption = '_Neuer Stil Alt+O'; + LANGdePreferencesNewStyleAltOCheckBox_Tooltip = 'Bleibe in demselben Verzeichnis wenn durch drücken von Strg/Alt-0 die andere Verzeichnistafel wechselt'; + LANGdePreferencesShowFuncButtonsCheckBox_Caption = 'Zeige Funktions_tasten Schaltflächen'; + LANGdePreferencesSizeFormatLabel_Caption = '_Größenformat:'; + LANGdePreferencesmiSizeFormat1 = 'System'; + LANGdePreferencesmiSizeFormat6 = 'Gruppiert'; + LANGdePreferencesAutodetectXApp = 'Automatisch X-Programm feststellen'; + LANGdePreferencesAlwaysRunInTerminal = 'Immer im Terminal ausführen'; + LANGdePreferencesNeverRunInTerminal = 'Niemals im Terminal ausführen'; + LANGdePreferencesCmdLineBehaviourLabel_Caption = 'Von der Kommandozeile _ausführen:'; + LANGdePreferencesFeatures = 'Eigenschaften'; + LANGdePreferencesDisableMouseRename_Tooltip = 'Sie können eine schnell Umbenenung dürchführen, indem Sie Shift+F6 drücken'; + LANGdePreferencesDisableFileTipsCheckBox_Caption = 'Keine _Tooltips für Dateien'; + LANGdePreferencesDisableFileTipsCheckBox_Tooltip = 'Wenn Text in einer Spalte unvollständig ist, dann keine Tooltips im Verzeichnisfeld anzeigen'; + LANGdePreferencesShow = 'Zeige'; + LANGdePreferencesDirsInBoldCheckBox_Caption = 'Verzeichnisse _fett'; + LANGdePreferencesDisableDirectoryBracketsCheckBox_Caption = 'Keine eckigen _Klammer für Verzeichnisse'; + LANGdePreferencesOctalPermissionsCheckBox_Caption = 'Zeige Rechte _oktal'; + LANGdePreferencesOctalPermissionsCheckBox_Tooltip = 'Zeige Datei-/Verzeichnisrechte als Zahl anstelle von Text (-rw-rw-rw-)'; + LANGdePreferencesMovement = 'Bewegung'; + LANGdePreferencesLynxLikeMotionCheckBox_Caption = '_Lynx ähnliche Bewegung '; + LANGdePreferencesInsertMovesDownCheckBox_Caption = '_Einfügen bewegt nach unten'; + LANGdePreferencesSpaceMovesDownCheckBox_Caption = '_Leertaste bewegt nach unten'; + LANGdePreferencesViewer = 'Betrachter'; + LANGdePreferencesCommandSC = 'Befehl:'; + LANGdePreferencesUseInternalViewer = 'Benutze _internen Betrachter'; + LANGdePreferencesEditor = 'Editor'; + LANGdePreferencesTerminal = 'Terminal'; + LANGdePreferencesExperimentalFeatures = 'Experimentelle Eigenschaften'; + LANGdePreferencesExperimentalWarningLabel_Caption = 'Warning: Diese Eigenschaften sind noch in der Entwicklung und könnten nicht korrekt funktionieren. Benutzung geschieht auf eigene Gefahr!'; + LANGdePreferencesFocusRefreshCheckBox_Caption = 'Wenn Fenster Fokus erhält, Auffrischung veranlassen'; + LANGdePreferencesFocusRefreshCheckBox_Tooltip = 'Vereichnisfeld wird im Moment sehr langsam aufgefrischt'; + LANGdePreferencesWMCompatModeCheckBox_Caption = '_WM Kompatibilitäts modus'; + LANGdePreferencesWMCompatModeCheckBox_Tooltip = 'Verwendung, wenn eineige Windows-Manager Probleme verursachen (z.B. IceWM kann Fenstermaximierung nicht richtig durchführen)'; + LANGdePreferencesCompatUseLibcSystemCheckBox_Caption = 'Verwendung von Libc _system() um Programme zu starten'; + LANGdePreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Verwendung, falls das starten externen Programme ein einfieren, oder einen Absturz verursacht'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGdemiSearchCaption2 = '_Search...'; + LANGdemiNoMounterBarCaption = 'Do_n''t show mounter bar'; + LANGdemiShowOneMounterBarCaption = 'Show _one mounter bar'; + LANGdemiShowTwoMounterBarCaption = 'Show _two mounter bars'; + LANGdemnuNetworkCaption = 'N_etwork'; + LANGdemiConnectionsCaption = '_Connections...'; + LANGdemiOpenConnectionCaption = '_Open connection...'; + LANGdemiQuickConnectCaption = '_Quick connect...'; + LANGdemnuPluginsCaption = 'Pl_ugins'; + LANGdemiTestPluginCaption = '_Test plugin...'; + LANGdemiMounterSettingsCaption = '_Mounter Settings...'; + LANGdemiColumnsCaption = 'P_anel Columns...'; + LANGdemiSavePositionCaption = '_Save position'; + LANGdemiMountCaption = '_Mount'; + LANGdemiUmountCaption = '_Umount'; + LANGdemiEjectCaption = '_Eject'; + LANGdemiDuplicateTabCaption = 'Duplicate current tab'; + LANGdemiCloseTabCaption = 'Close current tab'; + LANGdemiCloseAllTabsCaption = 'Close all tabs'; + LANGdeCannotDetermineDestinationEngine = 'Cannot determine destination engine. Please enter correct path and try it again.'; + LANGdeCannotLoadFile = 'Cannot load file ''%s''. Please check the permissions.'; + LANGdeMountPointDevice = 'Mount Point: %s'#10'Device: %s'; + LANGdeMountSC = 'Mount:'; + LANGdeNoPluginsFound = 'No plugins found'; + LANGdePluginAbout = 'About...'; + LANGdeCouldntOpenURI = 'Couldn''t open the URI specified. Please check the consistency of the resource identifier and the access permission.'; + LANGdePluginAboutInside = 'Plugin: %s'#10#10'%s'#10'%s'; + LANGdeAreYouSureCloseAllTabs = 'Are you sure you want to close all inactive tabs?'; + LANGdeCouldntOpenURIArchive = 'Couldn''t open the archive. Please check consistency and access permissions.'; + LANGdeThereIsNoModuleAvailable = 'There are no VFS modules available that can handle this connection'; + LANGdeIgnoreError = 'Do you really want to ignore the error? The source file will be then deleted'; + LANGdeErrorMount = 'There was an error while mounting the device ''%s'':'#10#10; + LANGdeErrorUmount = 'There was an error while umounting the device ''%s'':'#10#10; + LANGdeErrorEject = 'There was an error while ejecting the device ''%s'':'#10#10; + + LANGdeMounterPrefs_Caption = 'Mounter Settings'; + LANGdeMounterPrefs_TitleLabelCaption = 'Mounter Settings'; + LANGdeMounterPrefs_ListViewFrameCaption = 'Mounter'; + LANGdeMounterPrefs_MountName = 'Mount Name'; + LANGdeMounterPrefs_MountPoint = 'Mount Point'; + LANGdeMounterPrefs_Device = 'Device'; + LANGdeMounterPrefs_MoveUpButtonTooltip = 'Move item up'; + LANGdeMounterPrefs_MoveDownButtonTooltip = 'Move item down'; + LANGdeMounterPrefs_UseFSTabDefaultsCheckBox = 'Use _fstab default items'; + LANGdeMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'By checking this, the mounter bar will be filled by default items found in the /etc/fstab (system mountlist file)'; + LANGdeMounterPrefs_ToggleModeCheckBox = 'Buttons stay _down when mounted'; + LANGdeMounterPrefs_ToggleModeCheckBoxTooltip = 'When checked, the mounter buttons will stay down if the device is mounted; another click will cause umounting them (eject in this case)'; + LANGdeMounterPrefs_PropertiesFrameCaption = 'Mounter item properties'; + LANGdeMounterPrefs_DisplayTextLabelCaption = 'Displayed _Text:'; + LANGdeMounterPrefs_MountPointLabelCaption = 'Mount _Point:'; + LANGdeMounterPrefs_MountDeviceLabelCaption = '_Device:'; + LANGdeMounterPrefs_DeviceTypeLabelCaption = 'Device T_ype:'; + LANGdeMounterPrefs_miLocalDiskCaption = 'Local disk'; + LANGdeMounterPrefs_miRemovableCaption = 'Removable'; + LANGdeMounterPrefs_miCDCaption = 'CD/DVD drive'; + LANGdeMounterPrefs_miFloppyCaption = 'Floppy drive'; + LANGdeMounterPrefs_miNetworkCaption = 'Network'; + LANGdeMounterPrefs_MountCommandLabelCaption = 'Mount _Command:'; + LANGdeMounterPrefs_UmountCommandLabelCaption = 'Umount C_ommand:'; + LANGdeMounterPrefs_MountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default mount'#10'Note: beware of interactive commands, tuxcmd could freeze!'#10'Example: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGdeMounterPrefs_UmountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default umount'#10'Example: smbumount $dir'; + LANGdeMounterPrefs_IconLabelCaption = '_Icon:'; + + LANGdeConnMgr_Caption = 'Open New Connection'; + LANGdeConnMgr_ConnectButton = 'Co_nnect'; + LANGdeConnMgr_OpenConnection = 'Open Connection'; + LANGdeConnMgr_NameColumn = 'Name'; + LANGdeConnMgr_URIColumn = 'URI'; + LANGdeConnMgr_AddConnectionButtonCaption = '_Add site...'; + LANGdeConnMgr_AddConnectionButtonTooltip = 'Add new connection'; + LANGdeConnMgr_EditButtonCaption = '_Edit...'; + LANGdeConnMgr_EditButtonTooltip = 'Edit selected connection'; + LANGdeConnMgr_RemoveButtonCaption = '_Remove site'; + LANGdeConnMgr_RemoveButtonTooltip = 'Delete selected connection'; + LANGdeConnMgr_DoYouWantDelete = 'Do you really want to delete the connection ''%s''?'; + + LANGdeConnProp_FTP = 'FTP'; + LANGdeConnProp_SFTP = 'SFTP (ssh subsystem)'; + LANGdeConnProp_SMB = 'Windows share (SMB)'; + LANGdeConnProp_HTTP = 'WebDAV (HTTP)'; + LANGdeConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGdeConnProp_Other = 'Other (please specify in URI)'; + LANGdeConnProp_Caption = 'Connection properties'; + LANGdeConnProp_VFSModule = '_VFS module:'; + LANGdeConnProp_URI = '_URI:'; + LANGdeConnProp_URIEntryTooltip = 'Correct URI should contain service type prefix and server address'; + LANGdeConnProp_DetailedInformations = 'Detailed informations'; + LANGdeConnProp_Name = '_Name:'; + LANGdeConnProp_Server = 'Ser_ver[:port]:'; + LANGdeConnProp_Username = 'Userna_me:'; + LANGdeConnProp_UserNameEntryTooltip = 'Leave blank for anonymous login'; + LANGdeConnProp_Password = '_Password:'; + LANGdeConnProp_TargetDirectory = 'Target _directory:'; + LANGdeConnProp_ServiceType = '_Service type:'; + LANGdeConnProp_MaskPassword = '_Mask password'; + LANGdeConnProp_MenuItemCaption = 'Default (all suitable modules)'; + + LANGdeConnLogin_Caption = 'Authentication required'; + LANGdeConnLogin_Login = 'Login'; + LANGdeConnLogin_ExperimentalWarningLabelCaption = 'You must log in to access %s'; + LANGdeConnLogin_Username = '_Username:'; + LANGdeConnLogin_Password = '_Password:'; + LANGdeConnLogin_AnonymousCheckButton = '_Anonymous'; + + LANGdeColumns_Caption = 'Panel Columns Settings'; + LANGdeColumns_Title = 'Panel Columns Settings'; + LANGdeColumns_MoveUpButtonTooltip = 'Move item up'; + LANGdeColumns_MoveDownButtonTooltip = 'Move item down'; + LANGdeColumns_TitlesLongName = 'Name'; + LANGdeColumns_TitlesLongNameExt = 'Name + Extension'; + LANGdeColumns_TitlesLongExt = 'Extension'; + LANGdeColumns_TitlesLongSize = 'Size'; + LANGdeColumns_TitlesLongDateTime = 'Date + Time'; + LANGdeColumns_TitlesLongDate = 'Date'; + LANGdeColumns_TitlesLongTime = 'Time'; + LANGdeColumns_TitlesLongUser = 'User'; + LANGdeColumns_TitlesLongGroup = 'Group'; + LANGdeColumns_TitlesLongAttr = 'Attributes'; + LANGdeColumns_TitlesShortName = 'Name'; + LANGdeColumns_TitlesShortNameExt = 'Name'; + LANGdeColumns_TitlesShortExt = 'Ext'; + LANGdeColumns_TitlesShortSize = 'Size'; + LANGdeColumns_TitlesShortDateTime = 'Date'; + LANGdeColumns_TitlesShortDate = 'Date'; + LANGdeColumns_TitlesShortTime = 'Time'; + LANGdeColumns_TitlesShortUser = 'User'; + LANGdeColumns_TitlesShortGroup = 'Group'; + LANGdeColumns_TitlesShortAttr = 'Attr'; + + LANGdeTestPlugin_Caption = 'Test VFS Plugin'; + LANGdeTestPlugin_Title = 'Test VFS Plugin'; + LANGdeTestPlugin_ExperimentalWarningLabelCaption = 'Warning: The VFS subsystem and its plugins are under heavy development and may contain bugs. Use this function under your own risk!'; + LANGdeTestPlugin_Plugin = '_Plugin:'; + LANGdeTestPlugin_Command = 'Co_mmand:'; + LANGdeTestPlugin_Username = '_Username:'; + LANGdeTestPlugin_Password = '_Password:'; + LANGdeTestPlugin_AnonymousCheckButton = '_Anonymous login (doesn''t call VFSLogin)'; + LANGdeTestPlugin_NoPluginsFound = 'No plugins found'; + + LANGdeRemoteWait_Caption = 'Operation in progress'; + LANGdeRemoteWait_OperationInProgress = 'Operation in progress, please be patient...'; + LANGdeRemoteWait_ItemsFound = 'Items found so far: %d'; + + LANGdeSearch_Bytes = 'Bytes'; + LANGdeSearch_kB = 'kB'; + LANGdeSearch_MB = 'MB'; + LANGdeSearch_days = 'days'; + LANGdeSearch_weeks = 'weeks'; + LANGdeSearch_months = 'months'; + LANGdeSearch_years = 'years'; + LANGdeSearch_Caption = 'Find Files'; + LANGdeSearch_General = 'General'; + LANGdeSearch_Advanced = 'Advanced'; + LANGdeSearch_SearchResults = 'Search _Results:'; + LANGdeSearch_SearchFor = 'Search _for:'; + LANGdeSearch_FileMaskEntryTooltip = 'Tip: Use colons (";") to specify multiple files to find'; + LANGdeSearch_SearchIn = 'Search _in:'; + LANGdeSearch_SearchArchivesCheckButton = 'Search _archives'; + LANGdeSearch_FindText = 'Find _text:'; + LANGdeSearch_FindTextEntryTooltip = 'Leave blank for no text matching'#10'Please note that we are using UTF-8 in GUI part'; + LANGdeSearch_CaseSensitiveCheckButton = 'Cas_e sensitive'; + LANGdeSearch_StayCurrentFSCheckButton = 'Include other files_ystems'; + LANGdeSearch_CaseSensitiveMatchCheckButton = 'Ca_se sensitive'; + LANGdeSearch_Size = 'Size'; + LANGdeSearch_Date = 'Date'; + LANGdeSearch_BiggerThan = '_Bigger than'; + LANGdeSearch_SmallerThan = '_Smaller than'; + LANGdeSearch_ModifiedBetweenRadioButton = '_Modified between'; + LANGdeSearch_NotModifiedAfterRadioButton = '_Not modified after'; + LANGdeSearch_ModifiedLastRadioButton = 'Mod_ified in the last'; + LANGdeSearch_ModifiedNotLastRadionButton = 'No_t modified in the last'; + LANGdeSearch_ModifiedBetweenEntry1 = '"Please use this date format:" c'; + LANGdeSearch_ViewButtonCaption = '_View file'; + LANGdeSearch_NewSearchButtonCaption = '_New search'; + LANGdeSearch_GoToFileButtonCaption = '_Go to file'; + LANGdeSearch_FeedToListboxButtonCaption = 'Feed to _listbox'; + LANGdeSearch_StatusSC = 'Status:'; + LANGdeSearch_Ready = 'Ready.'; + LANGdeSearch_PreparingToSearch = 'Preparing to search.'; + LANGdeSearch_SearchInProgress = 'Search in progress:'; + LANGdeSearch_UserCancelled = 'User cancelled.'; + LANGdeSearch_SearchFinished = 'Search finished'; + LANGdeSearch_FilesFound = '%d files found'; + LANGdeSearch_And = 'and'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGdeCloseOpenConnection = 'You''re trying to open new connection over the another active connection. By continuing, the previous connection will be closed and replaced by the new requested one.'#10#10'Do you want to continue?'; + LANGdeDuplicateTabWarning = 'You are trying to open a new tab from a remote directory. However, engine cloning is not supported. The directory in the new tab will point to a local filesystem.'; + LANGdeDontShowAgain = '_Don''t show this message again'; + LANGdeSwitchOtherPanelWarning = 'You are trying to open the remote directory in the opposite panel. However, engine cloning is not supported. The target directory will not be switched.'; + LANGdeOpenConnectionsWarning = 'There are some active connections opened in the panel. By closing the application, these connections will be disconnected.'#10#10'Do you want to continue quit?'; + LANGdemiDisconnect_Caption = '_Disconnect'; + LANGdeDisconnectButton_Tooltip = 'Disconnect active connection'; + LANGdeLeaveArchiveButton_Tooltip = 'Close current archive'; + LANGdeOpenTerminalButton_Tooltip = 'Opens a new terminal windows from the current directory'; + LANGdeOpenTerminalButton_Caption = 'Open Te_rminal'; + LANGdeShowTextUIDsCheckBox_Caption = 'Show text _UIDs'; + LANGdeShowTextUIDsCheckBox_Tooltip = 'Show textual User and Group informations instead of numbers (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGdemiNewTab_Caption = 'New folder _tab'; + LANGdeFilePopupMenu_Properties = '_Properties'; + LANGdeCommandEntry_Tooltip = 'Use %s as file/directory placeholder'; + LANGdemiFiles_Caption = 'Files only'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGdePasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGdeHandleRunFromArchive_Bytes = 'bytes'; + LANGdeHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGdeHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGdeHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGdeHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGdeFRunFromVFS_Caption = 'Packed file properties'; + LANGdeFRunFromVFS_TitleLabel = 'File Properties'; + LANGdeFRunFromVFS_FileNameLabel = 'File name:'; + LANGdeFRunFromVFS_FileTypeLabel = 'File type:'; + LANGdeFRunFromVFS_SizeLabel = 'Size:'; + LANGdeFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGdeFRunFromVFS_DateLabel = 'Modify date:'; + LANGdeFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGdeFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGdeFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGdeFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGdeFSetPassword_Caption = 'Set password'; + LANGdeFSetPassword_Label1_Caption = 'Password required'; + LANGdeFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGdeFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGdeF2Button_Caption; + LANGF3Button_Caption := LANGdeF3Button_Caption; + LANGF4Button_Caption := LANGdeF4Button_Caption; + LANGF5Button_Caption := LANGdeF5Button_Caption; + LANGF6Button_Caption := LANGdeF6Button_Caption; + LANGF7Button_Caption := LANGdeF7Button_Caption; + LANGF8Button_Caption := LANGdeF8Button_Caption; + + LANGmnuFile_Caption := LANGdemnuFile_Caption; + LANGmnuMark_Caption := LANGdemnuMark_Caption; + LANGmnuCommands_Caption := LANGdemnuCommands_Caption; + LANGmnuHelp_Caption := LANGdemnuHelp_Caption; + LANGmiExit_Caption := LANGdemiExit_Caption; + LANGmiSelectGroup_Caption := LANGdemiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGdemiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGdemiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGdemiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGdemiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGdemiRefresh_Caption; + LANGmiAbout_Caption := LANGdemiAbout_Caption; + + LANGColumn1_Caption := LANGdeColumn1_Caption; + LANGColumn2_Caption := LANGdeColumn2_Caption; + LANGColumn3_Caption := LANGdeColumn3_Caption; + LANGColumn4_Caption := LANGdeColumn4_Caption; + LANGColumn5_Caption := LANGdeColumn5_Caption; + + LANGExpandSelection := LANGdeExpandSelection; + LANGShrinkSelection := LANGdeShrinkSelection; + LANGNoMatchesFound := LANGdeNoMatchesFound; + LANGNoFilesSelected := LANGdeNoFilesSelected; + LANGSelectedFilesDirectories := LANGdeSelectedFilesDirectories; + LANGDirectoryS := LANGdeDirectoryS; + LANGFileS := LANGdeFileS; + LANGDoYouReallyWantToDeleteTheS := LANGdeDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGdeDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGdeCopyFiles; + LANGMoveRenameFiles := LANGdeMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGdeCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGdeMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGdeCopySC; + LANGMoveRenameSC := LANGdeMoveRenameSC; + + LANGQuickFind := LANGdeQuickFind; + + LANGAboutString := LANGdeAboutString; + LANGAboutStringGnome := LANGdeAboutStringGnome; + LANGDiskStatFmt := LANGdeDiskStatFmt; + LANGDiskStatVolNameFmt := LANGdeDiskStatVolNameFmt; + LANGStatusLineFmt := LANGdeStatusLineFmt; + LANGPanelStrings[False] := LANGdePanelStrings[False]; + LANGPanelStrings[True] := LANGdePanelStrings[True]; + LANGDIR := LANGdeDIR; + LANGErrorGettingListingForSPanel := LANGdeErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGdeErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGdeErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGdeErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGdeTheFileDirectory; + LANGCouldNotBeDeleted := LANGdeCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGdeCouldNotBeDeletedS; + LANGUserCancelled := LANGdeUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGdeTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGdeCannotCopyFile; + LANGCopyError := LANGdeCopyError; + LANGMoveError := LANGdeMoveError; + LANGOverwriteS := LANGdeOverwriteS; + LANGWithFileS := LANGdeWithFileS; + LANGOvewriteSBytesS := LANGdeOvewriteSBytesS; + LANGTheFile := LANGdeTheFile; + LANGCopy := LANGdeCopy; + LANGMove := LANGdeMove; + LANGTheDirectory := LANGdeTheDirectory; + LANGTheSymbolicLink := LANGdeTheSymbolicLink; + LANGCannotMoveFile := LANGdeCannotMoveFile; + LANGCouldNotBeCreated := LANGdeCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGdeCouldNotBeCreatedS; + LANGFromS := LANGdeFromS; + LANGToS := LANGdeToS; + LANGCannotCopyFileToItself := LANGdeCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGdeMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGdeCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGdeCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGdeCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGdeCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGdeCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGdeCannotWriteToDestinationFile; + + LANGUnknownException := LANGdeUnknownException; + LANGNoAccess := LANGdeNoAccess; + LANGUnknownError := LANGdeUnknownError; + + LANGCreateANewDirectory := LANGdeCreateANewDirectory; + LANGEnterDirectoryName := LANGdeEnterDirectoryName; + + LANGOverwriteQuestion := LANGdeOverwriteQuestion; + LANGOverwriteButton_Caption := LANGdeOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGdeOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGdeSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGdeOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGdeSkipAllButton_Caption; + LANGRenameButton_Caption := LANGdeRenameButton_Caption; + LANGAppendButton_Caption := LANGdeAppendButton_Caption; + LANGRename := LANGdeRename; + LANGRenameFile := LANGdeRenameFile; + LANGIgnoreButton_Caption := LANGdeIgnoreButton_Caption; + + LANGProgress := LANGdeProgress; + LANGCancel := LANGdeCancel; + LANGDelete := LANGdeDelete; + + LANGSpecifyFileType := LANGdeSpecifyFileType; + + LANGRemoveDirectory := LANGdeRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGdeDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGdeRetry; + LANGDeleteButton_Caption := LANGdeDeleteButton_Caption; + LANGAll := LANGdeAll; + + LANGCopyFilesSC := LANGdeCopyFilesSC; + LANGAppendQuestion := LANGdeAppendQuestion; + LANGPreparingList := LANGdePreparingList; + + LANGYouMustSelectAValidFile := LANGdeYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGdemiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGdeVerifyChecksumsCaption; + + LANGCheckButtonCaptionCheck := LANGdeCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGdeCheckButtonCaptionStop; + LANGFileListTooltip := LANGdeFileListTooltip; + LANGFilenameColumnCaption := LANGdeFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGdeTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGdeAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGdeAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGdeAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGdeChecksumNotChecked; + LANGChecksumChecking := LANGdeChecksumChecking; + LANGChecksumInterrupted := LANGdeChecksumInterrupted; + LANGChecksumDOK := LANGdeChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGdemiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGdeYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGdeCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGdeCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGdeCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGdeCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGdeCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGdeCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGdeCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGdeCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGdeCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGdeCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGdeCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGdeCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGdeCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGdeCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGdeCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGdeCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGdeCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGdeCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGdeCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGdeCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGdeCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGdeCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGdeAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGdeTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGdeTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGdeMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGdePleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGdeMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGdeWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGdeMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGdeMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGdeMergeSC; + LANGmiSplitFileCaption := LANGdemiSplitFileCaption; + LANGmiMergeFilesCaption := LANGdemiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGdeSplitTheFileSToDirectory; + LANGSplitSC := LANGdeSplitSC; + LANGSplitFile := LANGdeSplitFile; + LANGBytesPerFile := LANGdeBytesPerFile; + LANGAutomatic := LANGdeAutomatic; + LANGDeleteFilesOnTargetDisk := LANGdeDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGdeSplitCaption; + LANGCannotOpenFileS := LANGdeCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGdeCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGdeThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGdeThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGdeAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGdeSplitOfSSucceeded; + LANGSplitOfSFailed := LANGdeSplitOfSFailed; + + LANGmnuShow_Caption := LANGdemnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGdemiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGdeTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGdeCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGdeEdit; + LANGEnterFilenameToEdit := LANGdeEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGdemnuSettings_Caption; + LANGmiFileTypes_Caption := LANGdemiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGdeThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGdeErrorExecutingCommand; + LANGEditFileTypesCaption := LANGdeEditFileTypesCaption; + LANGTitleLabel_Caption := LANGdeTitleLabel_Caption; + LANGExtensionsColumn := LANGdeExtensionsColumn; + LANGDescriptionColumn := LANGdeDescriptionColumn; + LANGFileTypesList := LANGdeFileTypesList; + LANGActionName := LANGdeActionName; + LANGCommand := LANGdeCommand; + LANGSetDefaultActionButton_Caption := LANGdeSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGdeRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGdeAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGdeBrowseButton_Caption; + LANGCommandLabel_Caption := LANGdeCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGdeDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGdeFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGdeNotebookPageExtensions; + LANGNotebookPageActions := LANGdeNotebookPageActions; + LANGDefault := LANGdeDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGdeCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGdeDefaultColor; + LANGIcon := LANGdeIcon; + LANGBrowseForIcon := LANGdeBrowseForIcon; + LANGSelectFileTypeColor := LANGdeSelectFileTypeColor; + LANGColor := LANGdeColor; + + LANGmiChangePermissions_Caption := LANGdemiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGdemiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGdemiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGdemiEditSymlink_Caption; + LANGChmodProgress := LANGdeChmodProgress; + LANGChownProgress := LANGdeChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGdeYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGdePopupRunS; + LANGPopupOpenS := LANGdePopupOpenS; + LANGPopupGoUp := LANGdePopupGoUp; + LANGPopupOpenWithS := LANGdePopupOpenWithS; + LANGPopupDefault := LANGdePopupDefault; + LANGPopupOpenWith := LANGdePopupOpenWith; + LANGPopupViewFile := LANGdePopupViewFile; + LANGPopupEditFile := LANGdePopupEditFile; + LANGPopupMakeSymlink := LANGdePopupMakeSymlink; + LANGPopupRename := LANGdePopupRename; + LANGPopupDelete := LANGdePopupDelete; + LANGDialogChangePermissions := LANGdeDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGdeCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGdeDialogChangeOwner; + LANGCouldNotBeChownedS := LANGdeCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGdeDialogMakeSymlink; + LANGDialogEditSymlink := LANGdeDialogEditSymlink; + LANGFEditSymlink_Caption := LANGdeFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGdeFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGdeFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGdeFChmod_Caption; + LANGFChmod_PermissionFrame := LANGdeFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGdeFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGdeFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGdeFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGdeFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGdeFChmod_OctalLabel; + LANGFChmod_SUID := LANGdeFChmod_SUID; + LANGFChmod_SGID := LANGdeFChmod_SGID; + LANGFChmod_Sticky := LANGdeFChmod_Sticky; + LANGFChmod_RUSR := LANGdeFChmod_RUSR; + LANGFChmod_WUSR := LANGdeFChmod_WUSR; + LANGFChmod_XUSR := LANGdeFChmod_XUSR; + LANGFChmod_RGRP := LANGdeFChmod_RGRP; + LANGFChmod_WGRP := LANGdeFChmod_WGRP; + LANGFChmod_XGRP := LANGdeFChmod_XGRP; + LANGFChmod_ROTH := LANGdeFChmod_ROTH; + LANGFChmod_WOTH := LANGdeFChmod_WOTH; + LANGFChmod_XOTH := LANGdeFChmod_XOTH; + LANGFChmod_TextLabel := LANGdeFChmod_TextLabel; + LANGFChmod_FileLabel := LANGdeFChmod_FileLabel; + LANGFChown_Caption := LANGdeFChown_Caption; + LANGFChown_OwnerFrame := LANGdeFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGdeFChown_GroupFrame; + LANGFChown_FileFrame := LANGdeFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGdeFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGdeFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGdeFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGdeFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGdemnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGdemiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGdemiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGdeBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGdemiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGdeTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGdeSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGdePreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGdePreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGdePreferences_GeneralPage; + LANGPreferences_FontsPage := LANGdePreferences_FontsPage; + LANGPreferences_ColorsPage := LANGdePreferences_ColorsPage; + LANGPreferences_RowHeight := LANGdePreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGdePreferences_NumHistoryItems; + LANGPreferences_Default := LANGdePreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGdePreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGdePreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGdePreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGdePreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGdePreferences_Viewer; + LANGPreferences_Editor := LANGdePreferences_Editor; + LANGPreferences_Terminal := LANGdePreferences_Terminal; + LANGPreferences_ListFont := LANGdePreferences_ListFont; + LANGPreferences_Change := LANGdePreferences_Change; + LANGPreferences_UseDefaultFont := LANGdePreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGdePreferences_Foreground; + LANGPreferences_Background := LANGdePreferences_Background; + LANGPreferences_NormalItem := LANGdePreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGdePreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGdePreferences_Cursor; + LANGPreferences_InactiveItem := LANGdePreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGdePreferences_SelectedItem; + LANGPreferences_LinkItem := LANGdePreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGdePreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGdePreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGdePreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGdePreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGdePreferences_DefaultS; + LANGPreferences_SelectFont := LANGdePreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGdeBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGdeUpButton_Tooltip; + LANGRootButton_Tooltip := LANGdeRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGdeHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGdeLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGdeRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGdemiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGdemiTargetSource_Caption; + LANGFileTypeDirectory := LANGdeFileTypeDirectory; + LANGFileTypeFile := LANGdeFileTypeFile; + LANGFileTypeMetafile := LANGdeFileTypeMetafile; + LANGPreferencesPanelsPage := LANGdePreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGdePreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGdePreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGdePreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGdePreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGdePreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGdePreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGdePreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGdePreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGdePreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGdePreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGdePreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGdePreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGdePreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGdePreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGdePreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGdePreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGdePreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGdePreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGdePreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGdePreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGdePreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGdePreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGdePreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGdePreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGdePreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGdePreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGdePreferencesViewer; + LANGPreferencesCommandSC := LANGdePreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGdePreferencesUseInternalViewer; + LANGPreferencesEditor := LANGdePreferencesEditor; + LANGPreferencesTerminal := LANGdePreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGdePreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGdePreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGdePreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGdePreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGdePreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGdePreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGdePreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGdePreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGdemiSearchCaption2; + LANGmiNoMounterBarCaption := LANGdemiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGdemiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGdemiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGdemnuNetworkCaption; + LANGmiConnectionsCaption := LANGdemiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGdemiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGdemiQuickConnectCaption; + LANGmnuPluginsCaption := LANGdemnuPluginsCaption; + LANGmiTestPluginCaption := LANGdemiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGdemiMounterSettingsCaption; + LANGmiColumnsCaption := LANGdemiColumnsCaption; + LANGmiSavePositionCaption := LANGdemiSavePositionCaption; + LANGmiMountCaption := LANGdemiMountCaption; + LANGmiUmountCaption := LANGdemiUmountCaption; + LANGmiEjectCaption := LANGdemiEjectCaption; + LANGmiDuplicateTabCaption := LANGdemiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGdemiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGdemiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGdeCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGdeCannotLoadFile; + LANGMountPointDevice := LANGdeMountPointDevice; + LANGMountSC := LANGdeMountSC; + LANGNoPluginsFound := LANGdeNoPluginsFound; + LANGPluginAbout := LANGdePluginAbout; + LANGCouldntOpenURI := LANGdeCouldntOpenURI; + LANGPluginAboutInside := LANGdePluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGdeAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGdeCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGdeThereIsNoModuleAvailable; + LANGIgnoreError := LANGdeIgnoreError; + LANGErrorMount := LANGdeErrorMount; + LANGErrorUmount := LANGdeErrorUmount; + LANGErrorEject := LANGdeErrorEject; + + LANGMounterPrefs_Caption := LANGdeMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGdeMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGdeMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGdeMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGdeMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGdeMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGdeMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGdeMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGdeMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGdeMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGdeMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGdeMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGdeMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGdeMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGdeMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGdeMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGdeMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGdeMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGdeMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGdeMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGdeMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGdeMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGdeMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGdeMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGdeMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGdeMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGdeMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGdeConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGdeConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGdeConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGdeConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGdeConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGdeConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGdeConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGdeConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGdeConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGdeConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGdeConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGdeConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGdeConnProp_FTP; + LANGConnProp_SFTP := LANGdeConnProp_SFTP; + LANGConnProp_SMB := LANGdeConnProp_SMB; + LANGConnProp_HTTP := LANGdeConnProp_HTTP; + LANGConnProp_HTTPS := LANGdeConnProp_HTTPS; + LANGConnProp_Other := LANGdeConnProp_Other; + LANGConnProp_Caption := LANGdeConnProp_Caption; + LANGConnProp_VFSModule := LANGdeConnProp_VFSModule; + LANGConnProp_URI := LANGdeConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGdeConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGdeConnProp_DetailedInformations; + LANGConnProp_Name := LANGdeConnProp_Name; + LANGConnProp_Server := LANGdeConnProp_Server; + LANGConnProp_Username := LANGdeConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGdeConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGdeConnProp_Password; + LANGConnProp_TargetDirectory := LANGdeConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGdeConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGdeConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGdeConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGdeConnLogin_Caption; + LANGConnLogin_Login := LANGdeConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGdeConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGdeConnLogin_Username; + LANGConnLogin_Password := LANGdeConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGdeConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGdeColumns_Caption; + LANGColumns_Title := LANGdeColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGdeColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGdeColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGdeColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGdeColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGdeColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGdeColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGdeColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGdeColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGdeColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGdeColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGdeColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGdeColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGdeColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGdeColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGdeColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGdeColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGdeColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGdeColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGdeColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGdeColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGdeColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGdeColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGdeTestPlugin_Caption; + LANGTestPlugin_Title := LANGdeTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGdeTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGdeTestPlugin_Plugin; + LANGTestPlugin_Command := LANGdeTestPlugin_Command; + LANGTestPlugin_Username := LANGdeTestPlugin_Username; + LANGTestPlugin_Password := LANGdeTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGdeTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGdeTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGdeRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGdeRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGdeRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGdeSearch_Bytes; + LANGSearch_kB := LANGdeSearch_kB; + LANGSearch_MB := LANGdeSearch_MB; + LANGSearch_days := LANGdeSearch_days; + LANGSearch_weeks := LANGdeSearch_weeks; + LANGSearch_months := LANGdeSearch_months; + LANGSearch_years := LANGdeSearch_years; + LANGSearch_Caption := LANGdeSearch_Caption; + LANGSearch_General := LANGdeSearch_General; + LANGSearch_Advanced := LANGdeSearch_Advanced; + LANGSearch_SearchResults := LANGdeSearch_SearchResults; + LANGSearch_SearchFor := LANGdeSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGdeSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGdeSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGdeSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGdeSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGdeSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGdeSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGdeSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGdeSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGdeSearch_Size; + LANGSearch_Date := LANGdeSearch_Date; + LANGSearch_BiggerThan := LANGdeSearch_BiggerThan; + LANGSearch_SmallerThan := LANGdeSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGdeSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGdeSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGdeSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGdeSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGdeSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGdeSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGdeSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGdeSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGdeSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGdeSearch_StatusSC; + LANGSearch_Ready := LANGdeSearch_Ready; + LANGSearch_PreparingToSearch := LANGdeSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGdeSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGdeSearch_UserCancelled; + LANGSearch_SearchFinished := LANGdeSearch_SearchFinished; + LANGSearch_FilesFound := LANGdeSearch_FilesFound; + LANGSearch_And := LANGdeSearch_And; + + LANGCloseOpenConnection := LANGdeCloseOpenConnection; + LANGDuplicateTabWarning := LANGdeDuplicateTabWarning; + LANGDontShowAgain := LANGdeDontShowAgain; + LANGSwitchOtherPanelWarning := LANGdeSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGdeOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGdemiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGdeDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGdeLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGdeOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGdeOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGdeShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGdeShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGdemiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGdeFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGdeCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGdemiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGdePasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGdeHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGdeHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGdeHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGdeHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGdeHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGdeFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGdeFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGdeFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGdeFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGdeFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGdeFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGdeFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGdeFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGdeFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGdeFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGdeFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGdeFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGdeFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGdeFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGdeFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('DE', @SetTranslation); + AddTranslation('de_DE', @SetTranslation); +end. + + diff --git a/translations/UTranslation_EN.pas b/translations/UTranslation_EN.pas new file mode 100644 index 0000000..9a562a2 --- /dev/null +++ b/translations/UTranslation_EN.pas @@ -0,0 +1,1267 @@ +(* + Tux Commander - UTranslation_EN - English Localization constants + Copyright (C) 2008 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_EN; + +(*************************************************************************** + * Info for translators: + - please use UTF-8 encoding when making translations, the whole GTK+ 2 + is using it to display non-ASCII characters properly + - please change the few lines at the bottom of this file to your + locale string (e.g. en_US for English translation) +***************************************************************************) + +interface + +implementation + +uses ULocale; + +const LANGenF2Button_Caption = 'F2 - Rename'; + LANGenF3Button_Caption = 'F3 - View'; + LANGenF4Button_Caption = 'F4 - Edit'; + LANGenF5Button_Caption = 'F5 - Copy'; + LANGenF6Button_Caption = 'F6 - Move'; + LANGenF7Button_Caption = 'F7 - MkDir'; + LANGenF8Button_Caption = 'F8 - Delete'; + + LANGenmnuFile_Caption = '_File'; + LANGenmnuMark_Caption = '_Mark'; + LANGenmnuCommands_Caption = '_Commands'; + LANGenmnuHelp_Caption = '_Help'; + LANGenmiExit_Caption = 'E_xit'; + LANGenmiSelectGroup_Caption = 'Select _Group...'; + LANGenmiUnselectGroup_Caption = '_Unselect Group...'; + LANGenmiSelectAll_Caption = '_Select All'; + LANGenmiUnselectAll_Caption = 'U_nselect All'; + LANGenmiInvertSelection_Caption = '_Invert Selection'; + LANGenmiRefresh_Caption = '_Refresh'; + LANGenmiAbout_Caption = '_About...'; + + LANGenColumn1_Caption = 'Name'; + LANGenColumn2_Caption = 'Ext'; + LANGenColumn3_Caption = 'Size'; + LANGenColumn4_Caption = 'Date'; + LANGenColumn5_Caption = 'Attr'; + + LANGenExpandSelection = 'Expand selection'; + LANGenShrinkSelection = 'Shrink selection'; + LANGenNoMatchesFound = 'No matches found'; + LANGenNoFilesSelected = 'No files selected!'; + LANGenSelectedFilesDirectories = '%d selected files/directories'; + LANGenDirectoryS = 'directory %s'; + LANGenFileS = 'file %s'; + LANGenDoYouReallyWantToDeleteTheS = 'Do you really want to delete the %s ?'; + LANGenDoYouReallyWantToDeleteTheSS = 'Do you really want to delete the %s ?'#10'%s'; + LANGenCopyFiles = 'Copy files'; + LANGenMoveRenameFiles = 'Move/Rename files'; + LANGenCopyDFileDirectoriesTo = 'Copy %d file/directories to'; + LANGenMoveRenameDFileDirectoriesTo = 'Move/Rename %d file/directories to'; + LANGenCopySC = 'Copy:'; + LANGenMoveRenameSC = 'Move/Rename:'; + + LANGenQuickFind = ' Quick Find:'; + + LANGenAboutString = 'Tux Commander'#10'Version %s'#10'Build date: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGenAboutStringGnome = 'version %s'#10'Build date: %s'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGenDiskStatFmt = '%s of %s free'; +// LANGenDiskStatFmt = '%s of %s free'; + LANGenDiskStatVolNameFmt = '[%s] %s of %s free'; +// LANGenDiskStatVolNameFmt = '[%s] %s of %s free'; +// LANGenDiskStatVolNameFmt = '[%s] %s of %s free'; + LANGenStatusLineFmt = '%s of %s in %d of %d files selected'; + LANGenPanelStrings : array[boolean] of string = ('right', 'left'); + + LANGenDIR = ''; + LANGenErrorGettingListingForSPanel = 'Error getting listing for %s panel:'#10' %s'#10#10'Path = ''%s'''; + LANGenErrorGettingListingForSPanelNoPath = 'Error getting listing for %s panel:'#10' %s'; + LANGenErrorCreatingNewDirectorySInSPanel = 'Error creating new directory ''%s'' in %s panel:'#10' %s'; + LANGenErrorCreatingNewDirectorySInSPanelNoPath = 'Error creating new directory in %s panel:'#10' %s'; + LANGenTheFileDirectory = 'The file/directory'; + LANGenCouldNotBeDeleted = 'could not be deleted'; + LANGenCouldNotBeDeletedS = 'could not be deleted: %s'; + LANGenUserCancelled = 'User cancelled!'; + LANGenTheDirectorySIsNotEmpty = 'The directory %s is not empty!'; + LANGenCannotCopyFile = 'Cannot copy file'; + LANGenCopyError = 'Copy error'; + LANGenMoveError = 'Move error'; + LANGenOverwriteS = 'Overwrite: %s'; + LANGenWithFileS = 'With file: %s'; + LANGenOvewriteSBytesS = '%s bytes, %s'; + LANGenTheFile = 'The file'; + LANGenCopy = 'Copy'; + LANGenMove = 'Move'; + LANGenTheDirectory = 'The directory'; + LANGenTheSymbolicLink = 'The symbolic link'; + LANGenCannotMoveFile = 'Cannot move file'; + LANGenCouldNotBeCreated = 'could not be created'; + LANGenCouldNotBeCreatedS = 'could not be created: %s'; + LANGenFromS = 'From: %s'; + LANGenToS = 'To: %s'; + LANGenCannotCopyFileToItself = 'Cannot copy file to itself'; + LANGenMemoryAllocationFailed = 'Memory allocation failed:'; + LANGenCannotOpenSourceFile = 'Cannot open source file'; + LANGenCannotOpenDestinationFile = 'Cannot open destination file'; + LANGenCannotCloseDestinationFile = 'Cannot close destination file'; + LANGenCannotCloseSourceFile = 'Cannot close source file'; + LANGenCannotReadFromSourceFile = 'Cannot read from source file'; + LANGenCannotWriteToDestinationFile = 'Cannot write to destination file'; + + LANGenUnknownException = 'Unknown Exception'; + LANGenNoAccess = 'No Access'; + LANGenUnknownError = 'Unknown Error'; + + LANGenCreateANewDirectory = 'Create a new directory'; + LANGenEnterDirectoryName = 'Enter _directory name:'; + + LANGenOverwriteQuestion = 'Overwrite question'; + LANGenOverwriteButton_Caption = '_Overwrite'; + LANGenOverwriteAllButton_Caption = 'Overwrite _all'; + LANGenSkipButton_Caption = '_Skip'; + LANGenOverwriteAllOlderButton_Caption = 'Overwrite all ol_der'; + LANGenSkipAllButton_Caption = 'S_kip all'; + LANGenRenameButton_Caption = '_Rename'; + LANGenAppendButton_Caption = 'A_ppend'; + LANGenRename = 'Rename'; + LANGenRenameFile = 'Rename file ''%s'' to'; + LANGenIgnoreButton_Caption = '_Ignore'; + + LANGenProgress = 'Progress'; + LANGenCancel = '_Cancel'; + LANGenDelete = 'Delete:'; + + LANGenSpecifyFileType = '_Specify file type:'; + + LANGenRemoveDirectory = 'Remove directory'; + LANGenDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Do you want to delete it with all its files and subdirectories?'; + LANGenRetry = '_Retry'; + LANGenDeleteButton_Caption = '_Delete'; + LANGenAll = '_All'; + + LANGenCopyFilesSC = 'Copy files:'; + LANGenAppendQuestion = 'Are you sure you want to append file ''%s'' to ''%s''?'; + LANGenPreparingList = 'Preparing list...'; + + LANGenYouMustSelectAValidFile = 'You must select a valid file!'; + LANGenmiVerifyChecksums = '_Verify checksums'; + LANGenVerifyChecksumsCaption = 'Verify checksums'; + LANGenCheckButtonCaptionCheck = '_Check'; + LANGenCheckButtonCaptionStop = '_Stop'; + LANGenFileListTooltip = '[?] - Not checked'#10'[OK] - Checksum OK'#10'[BAD] - Checksum BAD'#10'[N/A] - File not available'; + LANGenFilenameColumnCaption = 'Filename'; + LANGenTheFileSYouAreTryingToOpenIsQuiteBig = 'The file ''%s'' you are trying to open is quite big (%s bytes). It may not be a valid checksum file.'#10#10'Do you want to load it anyway?'; + LANGenAnErrorOccuredWhileInitializingMemoryBlock = 'An error occured while initializing memory block. Close some programs and try it again.'; + LANGenAnErrorOccuredWhileOpeningFileSS = 'An error occured while opening file ''%s'':'#10' %s'; + LANGenAnErrorOccuredWhileReadingFileSS = 'An error occured while reading file ''%s'':'#10' %s'; + LANGenChecksumNotChecked = 'Status: Not checked'; + LANGenChecksumChecking = 'Status: Checking...'; + LANGenChecksumInterrupted = 'Status: Interrupted'; + LANGenChecksumDOK = 'Status: %d%% OK'; + + LANGenmiCreateChecksumsCaption = '_Create checksums...'; + LANGenYouMustSelectAtLeastOneFileToCalculateChecksum = 'You must select at least one file to calculate checksum!'; + LANGenCreateChecksumsCaption = 'Create checksums'; + LANGenCCHKSUMPage1Text = 'You are going to make checksums for'#10'the selected files. If you didn''t selected'#10'all files you want, close this druid and'#10'select more files.'; + LANGenCCHKSUMPage4Text = 'The druid is ready to make checksums for your'#10'selected files. This operation can take a few minutes.'#10'Press Forward to continue.'; + LANGenCCHKSUMPage6Text = 'There were errors making the checksum:'; + LANGenCCHKSUMPage7Text = 'The checksum creation is finished and'#10'your files are ready.'#10#10'Click "Finish" to exit.'; + LANGenCCHKSUMPage1Title = 'Prepare files for checksum'; + LANGenCCHKSUMPage2Title = 'Select checksums file type'; + LANGenCCHKSUMPage3Title = 'Choose filename'; + LANGenCCHKSUMPage4Title = 'Ready to check'; + LANGenCCHKSUMPage5Title = 'Processing...'; + LANGenCCHKSUMPage6Title = 'Error!'; + LANGenCCHKSUMPage7Title = 'Finished'; + LANGenCCHKSUMSFVFile = 'SFV File'; + LANGenCCHKSUMMD5sumFile = 'MD5sum File'; + LANGenCCHKSUMFileName = 'File _Name:'; + LANGenCCHKSUMCreateSeparateChecksumFiles = 'Create _separate checksum files'; + LANGenCCHKSUMNowProcessingFileS = 'Now processing file: %s'; + LANGenCCHKSUMFinishCaption = '_Finish'; + LANGenCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Are you sure you want to abort the processing?'; + LANGenCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'An error occured while opening file ''%s'': %s'#10; + LANGenCCHKSUMAnErrorOccuredWhileReadingFileSS = 'An error occured while reading file ''%s'': %s'#10; + LANGenCCHKSUMAnErrorOccuredWhileWritingFileSS = 'An error occured while writing file ''%s'': %s'#10; + + LANGenAnErrorOccuredWhileWritingFileSS = 'An error occured while writing file ''%s'':'#10' %s'; + LANGenTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'The target file ''%s'' already exists. Do you want to overwrite it?'; + LANGenTheTargetFileSCannotBeRemovedS = 'The target file ''%s'' cannot be removed: %s'; + LANGenMergeCaption = 'Merge'; + LANGenPleaseInsertNextDiskOrGiveDifferentLocation = 'Please insert next disk, or give different location:'; + LANGenMergeOfSSucceeded = 'Merge of ''%s'' succeeded (CRC checksum OK).'; + LANGenWarningCreatedFileFailsCRCCheck = 'Warning: Created file fails CRC check!'; + LANGenMergeOfSSucceeded_NoCRCFileAvailable = 'Merge of ''%s'' succeeded (no CRC file available).'; + LANGenMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Merge ''%s'' and all files with ascending names to the following directory:'; + LANGenMergeSC = 'Merge:'; + LANGenmiSplitFileCaption = '_Split File...'; + LANGenmiMergeFilesCaption = '_Merge Files...'; + + LANGenSplitTheFileSToDirectory = '_Split the file ''%s'' to directory:'; + LANGenSplitSC = 'Split:'; + LANGenSplitFile = 'Split File'; + LANGenBytesPerFile = '_Bytes per file:'; + LANGenAutomatic = 'Automatic'; + LANGenDeleteFilesOnTargetDisk = '_Delete files on target disk (usable for removable media)'; + LANGenSplitCaption = 'Split'; + LANGenCannotOpenFileS = 'Cannot open file ''%s'''; + LANGenCannotSplitTheFileToMoreThan999Parts = 'Cannot split the file to more than 999 parts!'; + LANGenThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'There are some files in the target directory:'#10'%s'#10'Do you want to delete them?'; + LANGenThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'There are %d files in the target directory. Do you want to delete them?'; + LANGenAnErrorOccuredWhileOperationS = 'An error occured while operation: %s'; + LANGenSplitOfSSucceeded = 'Split of ''%s'' succeeded.'; + LANGenSplitOfSFailed = 'Split of ''%s'' failed!'; + + LANGenmnuShow_Caption = 'Sho_w'; + LANGenmiShowDotFiles_Caption = 'Show _dot files'; + LANGenTheFileYouAreTryingToOpenIsQuiteBig = 'The file you are trying to open is quite big. Loading it in an externel application (such as gedit) can cause system slowdown.'#10'Do you want to continue?'; + LANGenCannotExecuteSPleaseCheckTheConfiguration = 'Cannot execute ''%s''. Please check the configuration or set the file type association correctly.'; + LANGenEdit = 'Edit'; + LANGenEnterFilenameToEdit = '_Enter filename to edit:'; + + LANGenmnuSettings_Caption = 'Se_ttings'; + LANGenmiFileTypes_Caption = 'File _types...'; + LANGenThereIsNoApplicationAssociatedWithS = 'There is no application associated with "%s".'#10#10'You can configure Tux Commander to associate applications with file types. Do you want to associate an application with this file type now?'; + LANGenErrorExecutingCommand = 'Error executing command!'; + LANGenEditFileTypesCaption = 'Edit File Types'; + LANGenTitleLabel_Caption = 'File Types Configuration'; + LANGenExtensionsColumn = 'Extensions'; + LANGenDescriptionColumn = 'Description'; + LANGenFileTypesList = 'File types list'; + LANGenActionName = 'Action Name'; + LANGenCommand = 'Command'; + LANGenSetDefaultActionButton_Caption = '_Set as default'; + LANGenRunInTerminalCheckBox_Caption = 'Run in _Terminal'; + LANGenAutodetectCheckBox_Caption = 'Autodetect _GUI application'; + LANGenBrowseButton_Caption = '_Browse...'; + LANGenCommandLabel_Caption = 'Co_mmand:'; + LANGenDescriptionLabel_Caption = 'D_escription:'; + LANGenFNameExtLabel_Caption = 'A_dd extension:'; + LANGenNotebookPageExtensions = 'File type'; + LANGenNotebookPageActions = 'Actions'; + LANGenDefault = ' (default)'; + LANGenCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Cannot save file type associations, because other process has updated it while running this instance of application.'; + + LANGenDefaultColor = 'De_fault color'; + LANGenIcon = '_Icon:'; + LANGenBrowseForIcon = 'Browse for icon'; + LANGenSelectFileTypeColor = 'Select File Type Color'; + LANGenColor = 'Co_lor:'; + + LANGenmiChangePermissions_Caption = 'Change Per_missions...'; + LANGenmiChangeOwner_Caption = 'Change _Owner/Group...'; + LANGenmiCreateSymlink_Caption = 'Create Sym_link...'; + LANGenmiEditSymlink_Caption = '_Edit Symlink...'; + LANGenChmodProgress = 'Change permissions:'; + LANGenChownProgress = 'Change owner:'; + LANGenYouMustSelectAValidSymbolicLink = 'You must select a valid symbolic link!'; + LANGenPopupRunS = 'E_xecute %s'; + LANGenPopupOpenS = 'O_pen %s'; + LANGenPopupGoUp = '_Go up'; + LANGenPopupOpenWithS = 'Open with %s'; + LANGenPopupDefault = ' (default)'; + LANGenPopupOpenWith = 'O_pen with...'; + LANGenPopupViewFile = '_View file'; + LANGenPopupEditFile = 'Ed_it file'; + LANGenPopupMakeSymlink = 'Make _symlink'; + LANGenPopupRename = '_Rename'; + LANGenPopupDelete = '_Delete'; + LANGenDialogChangePermissions = 'Change permissions'; + LANGenCouldNotBeChmoddedS = 'could not be chmodded: %s'; + LANGenDialogChangeOwner = 'Change owner'; + LANGenCouldNotBeChownedS = 'could not be chowned: %s'; + LANGenDialogMakeSymlink = 'Make symlink'; + LANGenDialogEditSymlink = 'Edit symlink'; + LANGenFEditSymlink_Caption = 'Edit symbolic link'; + LANGenFEditSymlink_SymbolicLinkFilename = '_Symbolic link filename:'; + LANGenFEditSymlink_SymbolicLinkPointsTo = 'Symbolic link points _to:'; + + LANGenFChmod_Caption = 'Access Permissions'; + LANGenFChmod_PermissionFrame = 'Permissions'; + LANGenFChmod_FileFrame = 'File'; + LANGenFChmod_ApplyRecursivelyFor = 'Apply _recursively for'; + LANGenFChmod_miAllFiles = 'All files and directories'; + LANGenFChmod_miDirectories = 'Directories only'; + LANGenFChmod_OctalLabel = '_Octal:'; + LANGenFChmod_SUID = 'SUID - Set user ID on execution'; + LANGenFChmod_SGID = 'SGID - Set group ID on execution'; + LANGenFChmod_Sticky = 'Sticky bit'; + LANGenFChmod_RUSR = 'RUSR - Read by owner'; + LANGenFChmod_WUSR = 'WUSR - Write by owner'; + LANGenFChmod_XUSR = 'XUSR - Execute/Search by owner'; + LANGenFChmod_RGRP = 'RGRP - Read by group'; + LANGenFChmod_WGRP = 'WGRP - Write by group'; + LANGenFChmod_XGRP = 'XGRP - Execute/Search by group'; + LANGenFChmod_ROTH = 'ROTH - Read by others'; + LANGenFChmod_WOTH = 'WOTH - Write by others'; + LANGenFChmod_XOTH = 'XOTH - Execute/Search by others'; + LANGenFChmod_TextLabel = 'Text: %s'; + LANGenFChmod_FileLabel = 'File: %s'#10'Text: %s'#10 + + 'Octal: %d'#10'Owner: %s'#10 + + 'Group: %s'; + + LANGenFChown_Caption = 'Change owner/group'; + LANGenFChown_OwnerFrame = 'User name'; + LANGenFChown_GroupFrame = 'Group name'; + LANGenFChown_FileFrame = 'File'; + LANGenFChown_ApplyRecursively = 'Apply _recursively'; + + LANGenFSymlink_Caption = 'Create symbolic link'; + LANGenFSymlink_ExistingFilename = '_Existing filename (filename symlink will point to):'; + LANGenFSymlink_SymlinkFilename = '_Symbolic link filename:'; + + LANGenmnuBookmarks_Caption = '_Bookmarks'; + LANGenmiAddBookmark_Caption = 'Add Bookmark'; + LANGenmiEditBookmarks_Caption = 'Edit Bookmarks'; + LANGenBookmarkPopupDelete_Caption = '_Delete'; + LANGenmiPreferences_Caption = '_Preferences...'; + LANGenTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'The current directory already exists in the bookmarks list'; + LANGenSomeOtherInstanceChanged = 'Some other instance of Tux Commander changed the configuration. Do you want to apply the new settings?'#10#10'Warning: If you press No at this point, the configuration will be overwritten on this instance'' exit!'; + + LANGenPreferences_Caption = 'Preferences'; + LANGenPreferences_TitleLabel_Caption = 'Application Preferences'; + LANGenPreferences_GeneralPage = 'General'; + LANGenPreferences_FontsPage = 'Fonts'; + LANGenPreferences_ColorsPage = 'Colors'; + LANGenPreferences_RowHeight = 'Row _height:'; + LANGenPreferences_NumHistoryItems = 'Co_mmandline history items:'; + LANGenPreferences_Default = '_Default'; + LANGenPreferences_ClearReadonlyAttribute = 'Clear _readonly attribute when copying from CD-ROM'; + LANGenPreferences_DisableMouseRenaming = 'Disable _mouse renaming'; + LANGenPreferences_ShowFiletypeIconsInList = 'Show _filetype icons'; + LANGenPreferences_ExternalAppsLabel = 'External programs'; + LANGenPreferences_Viewer = '_Viewer:'; + LANGenPreferences_Editor = '_Editor:'; + LANGenPreferences_Terminal = '_Terminal:'; + LANGenPreferences_ListFont = 'List Font:'; + LANGenPreferences_Change = 'Change...'; + LANGenPreferences_UseDefaultFont = 'Use _default font'; + LANGenPreferences_Foreground = 'Foreground'; + LANGenPreferences_Background = 'Background'; + LANGenPreferences_NormalItem = 'Normal Item:'; + LANGenPreferences_SetToDefaultToUseGTKThemeColors = 'Set to default to use GTK theme colors'; + LANGenPreferences_Cursor = 'Cursor:'; + LANGenPreferences_InactiveItem = 'Inactive Item:'; + LANGenPreferences_SelectedItem = 'Selected Item:'; + LANGenPreferences_LinkItem = 'Symbolic links:'; + LANGenPreferences_LinkItemHint = 'Set to default to show symlinks using default normal item colors'; + LANGenPreferences_DotFileItem = 'Dot files:'; + LANGenPreferences_DotFileItemHint = 'Set to default to show dot-files using default normal item colors'; + LANGenPreferences_BrowseForApplication = 'Browse for application'; + LANGenPreferences_DefaultS = 'Default: %s'; + LANGenPreferences_SelectFont = 'Select font'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGenBookmarkButton_Tooltip = 'Show bookmarks'; + LANGenUpButton_Tooltip = 'Go to the upper directory'; + LANGenRootButton_Tooltip = 'Go to the root directory (/)'; + LANGenHomeButton_Tooltip = 'Go to the home directory (/home/user)'; + LANGenLeftEqualButton_Tooltip = 'Switch the right panel to the same directory'; + LANGenRightEqualButton_Tooltip = 'Switch the left panel to the same directory'; + LANGenmiShowDirectorySizes_Caption = 'Show d_irectory sizes'; + LANGenmiTargetSource_Caption = 'Target = S_ource'; + LANGenFileTypeDirectory = 'Directory'; + LANGenFileTypeFile = 'File'; + LANGenFileTypeMetafile = 'This is a common meta-item'; + LANGenPreferencesPanelsPage = 'Panels'; + LANGenPreferencesApplicationsPage = 'Applications'; + LANGenPreferencesExperimentalPage = 'Experimental'; + LANGenPreferencesSelectAllDirectoriesCheckBox_Caption = 'Select _also directories when selecting all'; + LANGenPreferencesNewStyleAltOCheckBox_Caption = '_New style Alt+O'; + LANGenPreferencesNewStyleAltOCheckBox_Tooltip = 'Stay in the same directory when switching directory opposite panel by pressing Ctrl/Alt+O'; + LANGenPreferencesShowFuncButtonsCheckBox_Caption = 'Show function _key buttons'; + LANGenPreferencesSizeFormatLabel_Caption = '_Size format:'; + LANGenPreferencesmiSizeFormat1 = 'System'; + LANGenPreferencesmiSizeFormat6 = 'Grouped'; + LANGenPreferencesAutodetectXApp = 'Autodetect X app'; + LANGenPreferencesAlwaysRunInTerminal = 'Always run in terminal'; + LANGenPreferencesNeverRunInTerminal = 'Never run in terminal'; + LANGenPreferencesCmdLineBehaviourLabel_Caption = '_Executing from commandline:'; + LANGenPreferencesFeatures = 'Features'; + LANGenPreferencesDisableMouseRename_Tooltip = 'You can still perform quick-rename by pressing Shift+F6'; + LANGenPreferencesDisableFileTipsCheckBox_Caption = 'Disable file _tooltips'; + LANGenPreferencesDisableFileTipsCheckBox_Tooltip = 'Don''t show panel tooltips if the text in a comlumn is truncated'; + LANGenPreferencesShow = 'Show'; + LANGenPreferencesDirsInBoldCheckBox_Caption = 'Directories in _bold'; + LANGenPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Hide directory b_rackets'; + LANGenPreferencesOctalPermissionsCheckBox_Caption = 'Show _octal permissions'; + LANGenPreferencesOctalPermissionsCheckBox_Tooltip = 'Show file/directory permissions as a number instead of text form (-rw-rw-rw-)'; + LANGenPreferencesMovement = 'Movement'; + LANGenPreferencesLynxLikeMotionCheckBox_Caption = '_Lynx-like motion'; + LANGenPreferencesInsertMovesDownCheckBox_Caption = '_Insert moves down'; + LANGenPreferencesSpaceMovesDownCheckBox_Caption = '_Space moves down'; + LANGenPreferencesViewer = 'Viewer'; + LANGenPreferencesCommandSC = 'Command:'; + LANGenPreferencesUseInternalViewer = 'Use _internal viewer'; + LANGenPreferencesEditor = 'Editor'; + LANGenPreferencesTerminal = 'Terminal'; + LANGenPreferencesExperimentalFeatures = 'Experimental features'; + LANGenPreferencesExperimentalWarningLabel_Caption = 'Warning: These features are currently under development and may not work properly. Use them at your own risk!'; + LANGenPreferencesFocusRefreshCheckBox_Caption = 'Perform _refresh on window focus'; + LANGenPreferencesFocusRefreshCheckBox_Tooltip = 'Very slow panel refreshing at this moment'; + LANGenPreferencesWMCompatModeCheckBox_Caption = '_WM Compatibility mode'; + LANGenPreferencesWMCompatModeCheckBox_Tooltip = 'Use if you have some window manager issues (for example IceWM doesn''t perform window maximize correctly)'; + LANGenPreferencesCompatUseLibcSystemCheckBox_Caption = 'Use libc _system() for executing programs'; + LANGenPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Use in case of freeze or crash problems when launching external applications'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGenmiSearchCaption2 = '_Search...'; + LANGenmiNoMounterBarCaption = 'Do_n''t show mounter bar'; + LANGenmiShowOneMounterBarCaption = 'Show _one mounter bar'; + LANGenmiShowTwoMounterBarCaption = 'Show _two mounter bars'; + LANGenmnuNetworkCaption = 'N_etwork'; + LANGenmiConnectionsCaption = '_Connections...'; + LANGenmiOpenConnectionCaption = '_Open connection...'; + LANGenmiQuickConnectCaption = '_Quick connect...'; + LANGenmnuPluginsCaption = 'Pl_ugins'; + LANGenmiTestPluginCaption = '_Test plugin...'; + LANGenmiMounterSettingsCaption = '_Mounter Settings...'; + LANGenmiColumnsCaption = 'P_anel Columns...'; + LANGenmiSavePositionCaption = '_Save position'; + LANGenmiMountCaption = '_Mount'; + LANGenmiUmountCaption = '_Umount'; + LANGenmiEjectCaption = '_Eject'; + LANGenmiDuplicateTabCaption = 'Duplicate current tab'; + LANGenmiCloseTabCaption = 'Close current tab'; + LANGenmiCloseAllTabsCaption = 'Close all tabs'; + LANGenCannotDetermineDestinationEngine = 'Cannot determine destination engine. Please enter correct path and try it again.'; + LANGenCannotLoadFile = 'Cannot load file ''%s''. Please check the permissions.'; + LANGenMountPointDevice = 'Mount Point: %s'#10'Device: %s'; + LANGenMountSC = 'Mount:'; + LANGenNoPluginsFound = 'No plugins found'; + LANGenPluginAbout = 'About...'; + LANGenCouldntOpenURI = 'Couldn''t open the URI specified. Please check the consistency of the resource identifier and the access permission.'; + LANGenPluginAboutInside = 'Plugin: %s'#10#10'%s'#10'%s'; + LANGenAreYouSureCloseAllTabs = 'Are you sure you want to close all inactive tabs?'; + LANGenCouldntOpenURIArchive = 'Couldn''t open the archive. Please check consistency and access permissions.'; + LANGenThereIsNoModuleAvailable = 'There are no VFS modules available that can handle this connection'; + LANGenIgnoreError = 'Do you really want to ignore the error? The source file will be then deleted'; + LANGenErrorMount = 'There was an error while mounting the device ''%s'':'#10#10; + LANGenErrorUmount = 'There was an error while umounting the device ''%s'':'#10#10; + LANGenErrorEject = 'There was an error while ejecting the device ''%s'':'#10#10; + + LANGenMounterPrefs_Caption = 'Mounter Settings'; + LANGenMounterPrefs_TitleLabelCaption = 'Mounter Settings'; + LANGenMounterPrefs_ListViewFrameCaption = 'Mounter'; + LANGenMounterPrefs_MountName = 'Mount Name'; + LANGenMounterPrefs_MountPoint = 'Mount Point'; + LANGenMounterPrefs_Device = 'Device'; + LANGenMounterPrefs_MoveUpButtonTooltip = 'Move item up'; + LANGenMounterPrefs_MoveDownButtonTooltip = 'Move item down'; + LANGenMounterPrefs_UseFSTabDefaultsCheckBox = 'Use _fstab default items'; + LANGenMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'By checking this, the mounter bar will be filled by default items found in the /etc/fstab (system mountlist file)'; + LANGenMounterPrefs_ToggleModeCheckBox = 'Buttons stay _down when mounted'; + LANGenMounterPrefs_ToggleModeCheckBoxTooltip = 'When checked, the mounter buttons will stay down if the device is mounted; another click will cause umounting them (eject in this case)'; + LANGenMounterPrefs_PropertiesFrameCaption = 'Mounter item properties'; + LANGenMounterPrefs_DisplayTextLabelCaption = 'Displayed _Text:'; + LANGenMounterPrefs_MountPointLabelCaption = 'Mount _Point:'; + LANGenMounterPrefs_MountDeviceLabelCaption = '_Device:'; + LANGenMounterPrefs_DeviceTypeLabelCaption = 'Device T_ype:'; + LANGenMounterPrefs_miLocalDiskCaption = 'Local disk'; + LANGenMounterPrefs_miRemovableCaption = 'Removable'; + LANGenMounterPrefs_miCDCaption = 'CD/DVD drive'; + LANGenMounterPrefs_miFloppyCaption = 'Floppy drive'; + LANGenMounterPrefs_miNetworkCaption = 'Network'; + LANGenMounterPrefs_MountCommandLabelCaption = 'Mount _Command:'; + LANGenMounterPrefs_UmountCommandLabelCaption = 'Umount C_ommand:'; + LANGenMounterPrefs_MountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default mount'#10'Note: beware of interactive commands, tuxcmd could freeze!'#10'Example: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGenMounterPrefs_UmountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default umount'#10'Example: smbumount $dir'; + LANGenMounterPrefs_IconLabelCaption = '_Icon:'; + + LANGenConnMgr_Caption = 'Open New Connection'; + LANGenConnMgr_ConnectButton = 'Co_nnect'; + LANGenConnMgr_OpenConnection = 'Open Connection'; + LANGenConnMgr_NameColumn = 'Name'; + LANGenConnMgr_URIColumn = 'URI'; + LANGenConnMgr_AddConnectionButtonCaption = '_Add site...'; + LANGenConnMgr_AddConnectionButtonTooltip = 'Add new connection'; + LANGenConnMgr_EditButtonCaption = '_Edit...'; + LANGenConnMgr_EditButtonTooltip = 'Edit selected connection'; + LANGenConnMgr_RemoveButtonCaption = '_Remove site'; + LANGenConnMgr_RemoveButtonTooltip = 'Delete selected connection'; + LANGenConnMgr_DoYouWantDelete = 'Do you really want to delete the connection ''%s''?'; + + LANGenConnProp_FTP = 'FTP'; + LANGenConnProp_SFTP = 'SFTP (ssh subsystem)'; + LANGenConnProp_SMB = 'Windows share (SMB)'; + LANGenConnProp_HTTP = 'WebDAV (HTTP)'; + LANGenConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGenConnProp_Other = 'Other (please specify in URI)'; + LANGenConnProp_Caption = 'Connection properties'; + LANGenConnProp_VFSModule = '_VFS module:'; + LANGenConnProp_URI = '_URI:'; + LANGenConnProp_URIEntryTooltip = 'Correct URI should contain service type prefix and server address'; + LANGenConnProp_DetailedInformations = 'Detailed informations'; + LANGenConnProp_Name = '_Name:'; + LANGenConnProp_Server = 'Ser_ver[:port]:'; + LANGenConnProp_Username = 'Userna_me:'; + LANGenConnProp_UserNameEntryTooltip = 'Leave blank for anonymous login'; + LANGenConnProp_Password = '_Password:'; + LANGenConnProp_TargetDirectory = 'Target _directory:'; + LANGenConnProp_ServiceType = '_Service type:'; + LANGenConnProp_MaskPassword = '_Mask password'; + LANGenConnProp_MenuItemCaption = 'Default (all suitable modules)'; + + LANGenConnLogin_Caption = 'Authentication required'; + LANGenConnLogin_Login = 'Login'; + LANGenConnLogin_ExperimentalWarningLabelCaption = 'You must log in to access %s'; + LANGenConnLogin_Username = '_Username:'; + LANGenConnLogin_Password = '_Password:'; + LANGenConnLogin_AnonymousCheckButton = '_Anonymous'; + + LANGenColumns_Caption = 'Panel Columns Settings'; + LANGenColumns_Title = 'Panel Columns Settings'; + LANGenColumns_MoveUpButtonTooltip = 'Move item up'; + LANGenColumns_MoveDownButtonTooltip = 'Move item down'; + LANGenColumns_TitlesLongName = 'Name'; + LANGenColumns_TitlesLongNameExt = 'Name + Extension'; + LANGenColumns_TitlesLongExt = 'Extension'; + LANGenColumns_TitlesLongSize = 'Size'; + LANGenColumns_TitlesLongDateTime = 'Date + Time'; + LANGenColumns_TitlesLongDate = 'Date'; + LANGenColumns_TitlesLongTime = 'Time'; + LANGenColumns_TitlesLongUser = 'User'; + LANGenColumns_TitlesLongGroup = 'Group'; + LANGenColumns_TitlesLongAttr = 'Attributes'; + LANGenColumns_TitlesShortName = 'Name'; + LANGenColumns_TitlesShortNameExt = 'Name'; + LANGenColumns_TitlesShortExt = 'Ext'; + LANGenColumns_TitlesShortSize = 'Size'; + LANGenColumns_TitlesShortDateTime = 'Date'; + LANGenColumns_TitlesShortDate = 'Date'; + LANGenColumns_TitlesShortTime = 'Time'; + LANGenColumns_TitlesShortUser = 'User'; + LANGenColumns_TitlesShortGroup = 'Group'; + LANGenColumns_TitlesShortAttr = 'Attr'; + + LANGenTestPlugin_Caption = 'Test VFS Plugin'; + LANGenTestPlugin_Title = 'Test VFS Plugin'; + LANGenTestPlugin_ExperimentalWarningLabelCaption = 'Warning: The VFS subsystem and its plugins are under heavy development and may contain bugs. Use this function under your own risk!'; + LANGenTestPlugin_Plugin = '_Plugin:'; + LANGenTestPlugin_Command = 'Co_mmand:'; + LANGenTestPlugin_Username = '_Username:'; + LANGenTestPlugin_Password = '_Password:'; + LANGenTestPlugin_AnonymousCheckButton = '_Anonymous login (doesn''t call VFSLogin)'; + LANGenTestPlugin_NoPluginsFound = 'No plugins found'; + + LANGenRemoteWait_Caption = 'Operation in progress'; + LANGenRemoteWait_OperationInProgress = 'Operation in progress, please be patient...'; + LANGenRemoteWait_ItemsFound = 'Items found so far: %d'; + + LANGenSearch_Bytes = 'Bytes'; + LANGenSearch_kB = 'kB'; + LANGenSearch_MB = 'MB'; + LANGenSearch_days = 'days'; + LANGenSearch_weeks = 'weeks'; + LANGenSearch_months = 'months'; + LANGenSearch_years = 'years'; + LANGenSearch_Caption = 'Find Files'; + LANGenSearch_General = 'General'; + LANGenSearch_Advanced = 'Advanced'; + LANGenSearch_SearchResults = 'Search _Results:'; + LANGenSearch_SearchFor = 'Search _for:'; + LANGenSearch_FileMaskEntryTooltip = 'Tip: Use colons (";") to specify multiple files to find'; + LANGenSearch_SearchIn = 'Search _in:'; + LANGenSearch_SearchArchivesCheckButton = 'Search _archives'; + LANGenSearch_FindText = 'Find _text:'; + LANGenSearch_FindTextEntryTooltip = 'Leave blank for no text matching'#10'Please note that we are using UTF-8 in GUI part'; + LANGenSearch_CaseSensitiveCheckButton = 'Cas_e sensitive'; + LANGenSearch_StayCurrentFSCheckButton = 'Include other files_ystems'; + LANGenSearch_CaseSensitiveMatchCheckButton = 'Ca_se sensitive'; + LANGenSearch_Size = 'Size'; + LANGenSearch_Date = 'Date'; + LANGenSearch_BiggerThan = '_Bigger than'; + LANGenSearch_SmallerThan = '_Smaller than'; + LANGenSearch_ModifiedBetweenRadioButton = '_Modified between'; + LANGenSearch_NotModifiedAfterRadioButton = '_Not modified after'; + LANGenSearch_ModifiedLastRadioButton = 'Mod_ified in the last'; + LANGenSearch_ModifiedNotLastRadionButton = 'No_t modified in the last'; + LANGenSearch_ModifiedBetweenEntry1 = '"Please use this date format:" c'; + LANGenSearch_ViewButtonCaption = '_View file'; + LANGenSearch_NewSearchButtonCaption = '_New search'; + LANGenSearch_GoToFileButtonCaption = '_Go to file'; + LANGenSearch_FeedToListboxButtonCaption = 'Feed to _listbox'; + LANGenSearch_StatusSC = 'Status:'; + LANGenSearch_Ready = 'Ready.'; + LANGenSearch_PreparingToSearch = 'Preparing to search.'; + LANGenSearch_SearchInProgress = 'Search in progress:'; + LANGenSearch_UserCancelled = 'User cancelled.'; + LANGenSearch_SearchFinished = 'Search finished'; + LANGenSearch_FilesFound = '%d files found'; + LANGenSearch_And = 'and'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGenCloseOpenConnection = 'You''re trying to open new connection over the another active connection. By continuing, the previous connection will be closed and replaced by the new requested one.'#10#10'Do you want to continue?'; + LANGenDuplicateTabWarning = 'You are trying to open a new tab from a remote directory. However, engine cloning is not supported. The directory in the new tab will point to a local filesystem.'; + LANGenDontShowAgain = '_Don''t show this message again'; + LANGenSwitchOtherPanelWarning = 'You are trying to open the remote directory in the opposite panel. However, engine cloning is not supported. The target directory will not be switched.'; + LANGenOpenConnectionsWarning = 'There are some active connections opened in the panel. By closing the application, these connections will be disconnected.'#10#10'Do you want to continue quit?'; + LANGenmiDisconnect_Caption = '_Disconnect'; + LANGenDisconnectButton_Tooltip = 'Disconnect active connection'; + LANGenLeaveArchiveButton_Tooltip = 'Close current archive'; + LANGenOpenTerminalButton_Tooltip = 'Opens a new terminal windows from the current directory'; + LANGenOpenTerminalButton_Caption = 'Open Te_rminal'; + LANGenShowTextUIDsCheckBox_Caption = 'Show text _UIDs'; + LANGenShowTextUIDsCheckBox_Tooltip = 'Show textual User and Group informations instead of numbers (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGenmiNewTab_Caption = 'New folder _tab'; + LANGenFilePopupMenu_Properties = '_Properties'; + LANGenCommandEntry_Tooltip = 'Use %s as file/directory placeholder'; + LANGenmiFiles_Caption = 'Files only'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGenPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGenHandleRunFromArchive_Bytes = 'bytes'; + LANGenHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGenHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGenHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGenHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGenFRunFromVFS_Caption = 'Packed file properties'; + LANGenFRunFromVFS_TitleLabel = 'File Properties'; + LANGenFRunFromVFS_FileNameLabel = 'File name:'; + LANGenFRunFromVFS_FileTypeLabel = 'File type:'; + LANGenFRunFromVFS_SizeLabel = 'Size:'; + LANGenFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGenFRunFromVFS_DateLabel = 'Modify date:'; + LANGenFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGenFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGenFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGenFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGenFSetPassword_Caption = 'Set password'; + LANGenFSetPassword_Label1_Caption = 'Password required'; + LANGenFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGenFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGenF2Button_Caption; + LANGF3Button_Caption := LANGenF3Button_Caption; + LANGF4Button_Caption := LANGenF4Button_Caption; + LANGF5Button_Caption := LANGenF5Button_Caption; + LANGF6Button_Caption := LANGenF6Button_Caption; + LANGF7Button_Caption := LANGenF7Button_Caption; + LANGF8Button_Caption := LANGenF8Button_Caption; + + LANGmnuFile_Caption := LANGenmnuFile_Caption; + LANGmnuMark_Caption := LANGenmnuMark_Caption; + LANGmnuCommands_Caption := LANGenmnuCommands_Caption; + LANGmnuHelp_Caption := LANGenmnuHelp_Caption; + LANGmiExit_Caption := LANGenmiExit_Caption; + LANGmiSelectGroup_Caption := LANGenmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGenmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGenmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGenmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGenmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGenmiRefresh_Caption; + LANGmiAbout_Caption := LANGenmiAbout_Caption; + + LANGColumn1_Caption := LANGenColumn1_Caption; + LANGColumn2_Caption := LANGenColumn2_Caption; + LANGColumn3_Caption := LANGenColumn3_Caption; + LANGColumn4_Caption := LANGenColumn4_Caption; + LANGColumn5_Caption := LANGenColumn5_Caption; + + LANGExpandSelection := LANGenExpandSelection; + LANGShrinkSelection := LANGenShrinkSelection; + LANGNoMatchesFound := LANGenNoMatchesFound; + LANGNoFilesSelected := LANGenNoFilesSelected; + LANGSelectedFilesDirectories := LANGenSelectedFilesDirectories; + LANGDirectoryS := LANGenDirectoryS; + LANGFileS := LANGenFileS; + LANGDoYouReallyWantToDeleteTheS := LANGenDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGenDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGenCopyFiles; + LANGMoveRenameFiles := LANGenMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGenCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGenMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGenCopySC; + LANGMoveRenameSC := LANGenMoveRenameSC; + + LANGQuickFind := LANGenQuickFind; + + LANGAboutString := LANGenAboutString; + LANGAboutStringGnome := LANGenAboutStringGnome; + LANGDiskStatFmt := LANGenDiskStatFmt; + LANGDiskStatVolNameFmt := LANGenDiskStatVolNameFmt; + LANGStatusLineFmt := LANGenStatusLineFmt; + LANGPanelStrings[False] := LANGenPanelStrings[False]; + LANGPanelStrings[True] := LANGenPanelStrings[True]; + LANGDIR := LANGenDIR; + LANGErrorGettingListingForSPanel := LANGenErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGenErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGenErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGenErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGenTheFileDirectory; + LANGCouldNotBeDeleted := LANGenCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGenCouldNotBeDeletedS; + LANGUserCancelled := LANGenUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGenTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGenCannotCopyFile; + LANGCopyError := LANGenCopyError; + LANGMoveError := LANGenMoveError; + LANGOverwriteS := LANGenOverwriteS; + LANGWithFileS := LANGenWithFileS; + LANGOvewriteSBytesS := LANGenOvewriteSBytesS; + LANGTheFile := LANGenTheFile; + LANGCopy := LANGenCopy; + LANGMove := LANGenMove; + LANGTheDirectory := LANGenTheDirectory; + LANGTheSymbolicLink := LANGenTheSymbolicLink; + LANGCannotMoveFile := LANGenCannotMoveFile; + LANGCouldNotBeCreated := LANGenCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGenCouldNotBeCreatedS; + LANGFromS := LANGenFromS; + LANGToS := LANGenToS; + LANGCannotCopyFileToItself := LANGenCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGenMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGenCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGenCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGenCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGenCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGenCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGenCannotWriteToDestinationFile; + + LANGUnknownException := LANGenUnknownException; + LANGNoAccess := LANGenNoAccess; + LANGUnknownError := LANGenUnknownError; + + LANGCreateANewDirectory := LANGenCreateANewDirectory; + LANGEnterDirectoryName := LANGenEnterDirectoryName; + + LANGOverwriteQuestion := LANGenOverwriteQuestion; + LANGOverwriteButton_Caption := LANGenOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGenOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGenSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGenOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGenSkipAllButton_Caption; + LANGRenameButton_Caption := LANGenRenameButton_Caption; + LANGAppendButton_Caption := LANGenAppendButton_Caption; + LANGRename := LANGenRename; + LANGRenameFile := LANGenRenameFile; + LANGIgnoreButton_Caption := LANGenIgnoreButton_Caption; + + LANGProgress := LANGenProgress; + LANGCancel := LANGenCancel; + LANGDelete := LANGenDelete; + + LANGSpecifyFileType := LANGenSpecifyFileType; + + LANGRemoveDirectory := LANGenRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGenDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGenRetry; + LANGDeleteButton_Caption := LANGenDeleteButton_Caption; + LANGAll := LANGenAll; + + LANGCopyFilesSC := LANGenCopyFilesSC; + LANGAppendQuestion := LANGenAppendQuestion; + LANGPreparingList := LANGenPreparingList; + + LANGYouMustSelectAValidFile := LANGenYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGenmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGenVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGenCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGenCheckButtonCaptionStop; + LANGFileListTooltip := LANGenFileListTooltip; + LANGFilenameColumnCaption := LANGenFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGenTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGenAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGenAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGenAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGenChecksumNotChecked; + LANGChecksumChecking := LANGenChecksumChecking; + LANGChecksumInterrupted := LANGenChecksumInterrupted; + LANGChecksumDOK := LANGenChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGenmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGenYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGenCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGenCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGenCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGenCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGenCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGenCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGenCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGenCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGenCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGenCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGenCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGenCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGenCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGenCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGenCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGenCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGenCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGenCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGenCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGenCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGenCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGenCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGenAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGenTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGenTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGenMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGenPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGenMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGenWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGenMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGenMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGenMergeSC; + LANGmiSplitFileCaption := LANGenmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGenmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGenSplitTheFileSToDirectory; + LANGSplitSC := LANGenSplitSC; + LANGSplitFile := LANGenSplitFile; + LANGBytesPerFile := LANGenBytesPerFile; + LANGAutomatic := LANGenAutomatic; + LANGDeleteFilesOnTargetDisk := LANGenDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGenSplitCaption; + LANGCannotOpenFileS := LANGenCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGenCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGenThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGenThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGenAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGenSplitOfSSucceeded; + LANGSplitOfSFailed := LANGenSplitOfSFailed; + + LANGmnuShow_Caption := LANGenmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGenmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGenTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGenCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGenEdit; + LANGEnterFilenameToEdit := LANGenEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGenmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGenmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGenThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGenErrorExecutingCommand; + LANGEditFileTypesCaption := LANGenEditFileTypesCaption; + LANGTitleLabel_Caption := LANGenTitleLabel_Caption; + LANGExtensionsColumn := LANGenExtensionsColumn; + LANGDescriptionColumn := LANGenDescriptionColumn; + LANGFileTypesList := LANGenFileTypesList; + LANGActionName := LANGenActionName; + LANGCommand := LANGenCommand; + LANGSetDefaultActionButton_Caption := LANGenSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGenRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGenAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGenBrowseButton_Caption; + LANGCommandLabel_Caption := LANGenCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGenDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGenFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGenNotebookPageExtensions; + LANGNotebookPageActions := LANGenNotebookPageActions; + LANGDefault := LANGenDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGenCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGenDefaultColor; + LANGIcon := LANGenIcon; + LANGBrowseForIcon := LANGenBrowseForIcon; + LANGSelectFileTypeColor := LANGenSelectFileTypeColor; + LANGColor := LANGenColor; + + LANGmiChangePermissions_Caption := LANGenmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGenmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGenmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGenmiEditSymlink_Caption; + LANGChmodProgress := LANGenChmodProgress; + LANGChownProgress := LANGenChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGenYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGenPopupRunS; + LANGPopupOpenS := LANGenPopupOpenS; + LANGPopupGoUp := LANGenPopupGoUp; + LANGPopupOpenWithS := LANGenPopupOpenWithS; + LANGPopupDefault := LANGenPopupDefault; + LANGPopupOpenWith := LANGenPopupOpenWith; + LANGPopupViewFile := LANGenPopupViewFile; + LANGPopupEditFile := LANGenPopupEditFile; + LANGPopupMakeSymlink := LANGenPopupMakeSymlink; + LANGPopupRename := LANGenPopupRename; + LANGPopupDelete := LANGenPopupDelete; + LANGDialogChangePermissions := LANGenDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGenCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGenDialogChangeOwner; + LANGCouldNotBeChownedS := LANGenCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGenDialogMakeSymlink; + LANGDialogEditSymlink := LANGenDialogEditSymlink; + LANGFEditSymlink_Caption := LANGenFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGenFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGenFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGenFChmod_Caption; + LANGFChmod_PermissionFrame := LANGenFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGenFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGenFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGenFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGenFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGenFChmod_OctalLabel; + LANGFChmod_SUID := LANGenFChmod_SUID; + LANGFChmod_SGID := LANGenFChmod_SGID; + LANGFChmod_Sticky := LANGenFChmod_Sticky; + LANGFChmod_RUSR := LANGenFChmod_RUSR; + LANGFChmod_WUSR := LANGenFChmod_WUSR; + LANGFChmod_XUSR := LANGenFChmod_XUSR; + LANGFChmod_RGRP := LANGenFChmod_RGRP; + LANGFChmod_WGRP := LANGenFChmod_WGRP; + LANGFChmod_XGRP := LANGenFChmod_XGRP; + LANGFChmod_ROTH := LANGenFChmod_ROTH; + LANGFChmod_WOTH := LANGenFChmod_WOTH; + LANGFChmod_XOTH := LANGenFChmod_XOTH; + LANGFChmod_TextLabel := LANGenFChmod_TextLabel; + LANGFChmod_FileLabel := LANGenFChmod_FileLabel; + LANGFChown_Caption := LANGenFChown_Caption; + LANGFChown_OwnerFrame := LANGenFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGenFChown_GroupFrame; + LANGFChown_FileFrame := LANGenFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGenFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGenFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGenFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGenFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGenmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGenmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGenmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGenBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGenmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGenTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGenSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGenPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGenPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGenPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGenPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGenPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGenPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGenPreferences_NumHistoryItems; + LANGPreferences_Default := LANGenPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGenPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGenPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGenPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGenPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGenPreferences_Viewer; + LANGPreferences_Editor := LANGenPreferences_Editor; + LANGPreferences_Terminal := LANGenPreferences_Terminal; + LANGPreferences_ListFont := LANGenPreferences_ListFont; + LANGPreferences_Change := LANGenPreferences_Change; + LANGPreferences_UseDefaultFont := LANGenPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGenPreferences_Foreground; + LANGPreferences_Background := LANGenPreferences_Background; + LANGPreferences_NormalItem := LANGenPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGenPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGenPreferences_Cursor; + LANGPreferences_InactiveItem := LANGenPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGenPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGenPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGenPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGenPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGenPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGenPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGenPreferences_DefaultS; + LANGPreferences_SelectFont := LANGenPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGenBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGenUpButton_Tooltip; + LANGRootButton_Tooltip := LANGenRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGenHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGenLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGenRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGenmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGenmiTargetSource_Caption; + LANGFileTypeDirectory := LANGenFileTypeDirectory; + LANGFileTypeFile := LANGenFileTypeFile; + LANGFileTypeMetafile := LANGenFileTypeMetafile; + LANGPreferencesPanelsPage := LANGenPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGenPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGenPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGenPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGenPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGenPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGenPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGenPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGenPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGenPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGenPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGenPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGenPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGenPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGenPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGenPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGenPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGenPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGenPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGenPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGenPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGenPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGenPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGenPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGenPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGenPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGenPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGenPreferencesViewer; + LANGPreferencesCommandSC := LANGenPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGenPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGenPreferencesEditor; + LANGPreferencesTerminal := LANGenPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGenPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGenPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGenPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGenPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGenPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGenPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGenPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGenPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGenmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGenmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGenmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGenmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGenmnuNetworkCaption; + LANGmiConnectionsCaption := LANGenmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGenmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGenmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGenmnuPluginsCaption; + LANGmiTestPluginCaption := LANGenmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGenmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGenmiColumnsCaption; + LANGmiSavePositionCaption := LANGenmiSavePositionCaption; + LANGmiMountCaption := LANGenmiMountCaption; + LANGmiUmountCaption := LANGenmiUmountCaption; + LANGmiEjectCaption := LANGenmiEjectCaption; + LANGmiDuplicateTabCaption := LANGenmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGenmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGenmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGenCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGenCannotLoadFile; + LANGMountPointDevice := LANGenMountPointDevice; + LANGMountSC := LANGenMountSC; + LANGNoPluginsFound := LANGenNoPluginsFound; + LANGPluginAbout := LANGenPluginAbout; + LANGCouldntOpenURI := LANGenCouldntOpenURI; + LANGPluginAboutInside := LANGenPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGenAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGenCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGenThereIsNoModuleAvailable; + LANGIgnoreError := LANGenIgnoreError; + LANGErrorMount := LANGenErrorMount; + LANGErrorUmount := LANGenErrorUmount; + LANGErrorEject := LANGenErrorEject; + + LANGMounterPrefs_Caption := LANGenMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGenMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGenMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGenMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGenMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGenMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGenMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGenMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGenMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGenMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGenMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGenMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGenMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGenMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGenMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGenMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGenMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGenMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGenMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGenMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGenMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGenMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGenMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGenMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGenMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGenMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGenMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGenConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGenConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGenConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGenConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGenConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGenConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGenConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGenConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGenConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGenConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGenConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGenConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGenConnProp_FTP; + LANGConnProp_SFTP := LANGenConnProp_SFTP; + LANGConnProp_SMB := LANGenConnProp_SMB; + LANGConnProp_HTTP := LANGenConnProp_HTTP; + LANGConnProp_HTTPS := LANGenConnProp_HTTPS; + LANGConnProp_Other := LANGenConnProp_Other; + LANGConnProp_Caption := LANGenConnProp_Caption; + LANGConnProp_VFSModule := LANGenConnProp_VFSModule; + LANGConnProp_URI := LANGenConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGenConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGenConnProp_DetailedInformations; + LANGConnProp_Name := LANGenConnProp_Name; + LANGConnProp_Server := LANGenConnProp_Server; + LANGConnProp_Username := LANGenConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGenConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGenConnProp_Password; + LANGConnProp_TargetDirectory := LANGenConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGenConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGenConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGenConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGenConnLogin_Caption; + LANGConnLogin_Login := LANGenConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGenConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGenConnLogin_Username; + LANGConnLogin_Password := LANGenConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGenConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGenColumns_Caption; + LANGColumns_Title := LANGenColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGenColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGenColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGenColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGenColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGenColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGenColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGenColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGenColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGenColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGenColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGenColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGenColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGenColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGenColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGenColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGenColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGenColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGenColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGenColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGenColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGenColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGenColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGenTestPlugin_Caption; + LANGTestPlugin_Title := LANGenTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGenTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGenTestPlugin_Plugin; + LANGTestPlugin_Command := LANGenTestPlugin_Command; + LANGTestPlugin_Username := LANGenTestPlugin_Username; + LANGTestPlugin_Password := LANGenTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGenTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGenTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGenRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGenRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGenRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGenSearch_Bytes; + LANGSearch_kB := LANGenSearch_kB; + LANGSearch_MB := LANGenSearch_MB; + LANGSearch_days := LANGenSearch_days; + LANGSearch_weeks := LANGenSearch_weeks; + LANGSearch_months := LANGenSearch_months; + LANGSearch_years := LANGenSearch_years; + LANGSearch_Caption := LANGenSearch_Caption; + LANGSearch_General := LANGenSearch_General; + LANGSearch_Advanced := LANGenSearch_Advanced; + LANGSearch_SearchResults := LANGenSearch_SearchResults; + LANGSearch_SearchFor := LANGenSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGenSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGenSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGenSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGenSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGenSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGenSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGenSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGenSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGenSearch_Size; + LANGSearch_Date := LANGenSearch_Date; + LANGSearch_BiggerThan := LANGenSearch_BiggerThan; + LANGSearch_SmallerThan := LANGenSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGenSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGenSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGenSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGenSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGenSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGenSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGenSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGenSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGenSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGenSearch_StatusSC; + LANGSearch_Ready := LANGenSearch_Ready; + LANGSearch_PreparingToSearch := LANGenSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGenSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGenSearch_UserCancelled; + LANGSearch_SearchFinished := LANGenSearch_SearchFinished; + LANGSearch_FilesFound := LANGenSearch_FilesFound; + LANGSearch_And := LANGenSearch_And; + + LANGCloseOpenConnection := LANGenCloseOpenConnection; + LANGDuplicateTabWarning := LANGenDuplicateTabWarning; + LANGDontShowAgain := LANGenDontShowAgain; + LANGSwitchOtherPanelWarning := LANGenSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGenOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGenmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGenDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGenLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGenOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGenOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGenShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGenShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGenmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGenFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGenCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGenmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGenPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGenHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGenHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGenHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGenHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGenHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGenFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGenFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGenFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGenFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGenFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGenFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGenFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGenFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGenFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGenFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGenFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGenFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGenFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGenFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGenFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('US', @SetTranslation); + AddTranslation('EN', @SetTranslation); + AddTranslation('en_US', @SetTranslation); + AddTranslation('C', @SetTranslation); // Please don't add this line to your translations, it is default "C" locale (of course English) +end. diff --git a/translations/UTranslation_ES.pas b/translations/UTranslation_ES.pas new file mode 100644 index 0000000..72d7b8d --- /dev/null +++ b/translations/UTranslation_ES.pas @@ -0,0 +1,1253 @@ +(* + Tux Commander - UTranslation_ES - Spanish Localization constants + Copyright (C) 2007 Daniel Areiza + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_ES; + +interface + +implementation + +uses ULocale; + +const LANGesF2Button_Caption = 'F2 - Renombrar'; + LANGesF3Button_Caption = 'F3 - Ver'; + LANGesF4Button_Caption = 'F4 - Editar'; + LANGesF5Button_Caption = 'F5 - Copiar'; + LANGesF6Button_Caption = 'F6 - Mover'; + LANGesF7Button_Caption = 'F7 - MkDir'; + LANGesF8Button_Caption = 'F8 - Eliminar'; + + LANGesmnuFile_Caption = '_Archivo'; + LANGesmnuMark_Caption = '_Seleccionar'; + LANGesmnuCommands_Caption = '_Comandos'; + LANGesmnuHelp_Caption = 'A_yuda'; + LANGesmiExit_Caption = 'Sa_lir'; + LANGesmiSelectGroup_Caption = 'Seleccionar _Grupo...'; + LANGesmiUnselectGroup_Caption = '_Deseleccionar Grupo...'; + LANGesmiSelectAll_Caption = '_Seleccionar Todo'; + LANGesmiUnselectAll_Caption = 'D_eseleccinar Todo'; + LANGesmiInvertSelection_Caption = '_Invertir Selección'; + LANGesmiRefresh_Caption = '_Actualizar'; + LANGesmiAbout_Caption = '_Acerca...'; + + LANGesColumn1_Caption = 'Nombre'; + LANGesColumn2_Caption = 'Ext'; + LANGesColumn3_Caption = 'Tamaño'; + LANGesColumn4_Caption = 'Fecha'; + LANGesColumn5_Caption = 'Atrib'; + + LANGesExpandSelection = 'Expandir selección'; + LANGesShrinkSelection = 'Restringir selección'; + LANGesNoMatchesFound = 'No se encontró nada'; + LANGesNoFilesSelected = '¡No hay archivos seleccionados!'; + LANGesSelectedFilesDirectories = '%d archivos/directorios seleccionados'; + LANGesDirectoryS = 'directorio %s'; + LANGesFileS = 'archivo %s'; + LANGesDoYouReallyWantToDeleteTheS = '¿Realmente desea eliminar el %s?'; + LANGesDoYouReallyWantToDeleteTheSS = '¿Realmente desea eliminar %s?'#10'%s'; + LANGesCopyFiles = 'Copiar archivos'; + LANGesMoveRenameFiles = 'Mover/Renombrar archivos'; + LANGesCopyDFileDirectoriesTo = 'Copiar %d archivo/directorios a'; + LANGesMoveRenameDFileDirectoriesTo = 'Mover/Renombrar %d archivo/directorios a'; + LANGesCopySC = 'Copiar:'; + LANGesMoveRenameSC = 'Mover/Renombrar:'; + + LANGesQuickFind = 'Búsqueda rápida:'; + + LANGesAboutString = 'Tux Commander'#10'Version %s'#10'Build date: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGesAboutStringGnome = 'version %s'#10'Build date: %s'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGesDiskStatFmt = '%s de %s libres'; + LANGesDiskStatVolNameFmt = '[%s] %s de %s libres'; + LANGesStatusLineFmt = '%s de %s en %d de %d archivos seleccionados'; + LANGesPanelStrings : array[boolean] of string = ('derecho', 'izquierdo'); + + LANGesDIR = ''; + LANGesErrorGettingListingForSPanel = 'Ha ocurrido un error listando el panel %s:'#10' %s'#10#10'Ruta = ''%s'''; + LANGesErrorGettingListingForSPanelNoPath = 'Error listando el panel %s:'#10' %s'; + LANGesErrorCreatingNewDirectorySInSPanel = 'Error creando el nuevo directorio ''%s'' en el panel %s:'#10' %s'; + LANGesErrorCreatingNewDirectorySInSPanelNoPath = 'Error creando el nuevo directorio en el panel %s:'#10' %s'; + LANGesTheFileDirectory = 'El archivo/directorio'; + LANGesCouldNotBeDeleted = 'no se puede eliminar'; + LANGesCouldNotBeDeletedS = 'no se puede eliminar: %s'; + LANGesUserCancelled = '¡Cancelado por el usuario!'; + LANGesTheDirectorySIsNotEmpty = '¡El directorio %s no esta vacío!'; + LANGesCannotCopyFile = 'No se puede copiar el archivo'; + LANGesCopyError = 'Ha ocurrido un error copiando'; + LANGesMoveError = 'Ha ocurrido un error moviendo'; + LANGesOverwriteS = 'Sobrescribir: %s'; + LANGesWithFileS = 'Con el archivo: %s'; + LANGesOvewriteSBytesS = '%s bytes, %s'; + LANGesTheFile = 'El archivo'; + LANGesCopy = 'Copiar'; + LANGesMove = 'Mover'; + LANGesTheDirectory = 'El directorio'; + LANGesTheSymbolicLink = 'El enlace simbólico'; + LANGesCannotMoveFile = 'No se puede mover el archivo'; + LANGesCouldNotBeCreated = 'no se pudo crear'; + LANGesCouldNotBeCreatedS = 'no se pudo crear: %s'; + LANGesFromS = 'Desde: %s'; + LANGesToS = 'Hasta: %s'; + LANGesCannotCopyFileToItself = 'No se puede copiar el archivo a si mismo'; + LANGesMemoryAllocationFailed = 'Fallo de alocación de memoria:'; + LANGesCannotOpenSourceFile = 'No se puede abrir el archivo de origen'; + LANGesCannotOpenDestinationFile = 'No se puede abrir el archivo de destino'; + LANGesCannotCloseDestinationFile = 'No se puede cerrar el archivo de destino'; + LANGesCannotCloseSourceFile = 'No se puede cerrar el archivo de origen'; + LANGesCannotReadFromSourceFile = 'No se puede leer el archivo de origen'; + LANGesCannotWriteToDestinationFile = 'No se puede escribir el archivo de destino'; + + LANGesUnknownException = 'Excepción Desconocida'; + LANGesNoAccess = 'No Hay Acceso'; + LANGesUnknownError = 'Error Desconocido'; + + LANGesCreateANewDirectory = 'Crear directorio'; + LANGesEnterDirectoryName = 'Introduzca el nombre del _directorio:'; + + LANGesOverwriteQuestion = 'Advertencia'; + LANGesOverwriteButton_Caption = '_Sobrescribir'; + LANGesOverwriteAllButton_Caption = 'Sobrescribir t_odo'; + LANGesSkipButton_Caption = 'S_altar'; + LANGesOverwriteAllOlderButton_Caption = 'Sobrescribir lo vi_ejo'; + LANGesSkipAllButton_Caption = 'Sal_tar todo'; + LANGesRenameButton_Caption = '_Renombrar'; + LANGesAppendButton_Caption = 'Aña_dir'; + LANGesRename = 'Renombrar'; + LANGesRenameFile = 'Renombrar el archivo ''%s'' a'; + LANGesIgnoreButton_Caption = '_Ignorar'; + + LANGesProgress = 'Progreso'; + LANGesCancel = '_Cancelar'; + LANGesDelete = 'Eliminar:'; + + LANGesSpecifyFileType = 'E_specificar tipo de archivo:'; + + LANGesRemoveDirectory = 'Eliminar directorio'; + LANGesDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = '¿Lo quiere eliminar con todos sus archivos y subdirectorios?'; + LANGesRetry = '_Reintentar'; + LANGesDeleteButton_Caption = '_Eliminar'; + LANGesAll = '_Todo'; + + LANGesCopyFilesSC = 'Copiar archivos:'; + LANGesAppendQuestion = '¿Esta seguro que quiere añadir el archivo ''%s'' a ''%s''?'; + LANGesPreparingList = 'Preparando lista...'; + + LANGesYouMustSelectAValidFile = 'Debe seleccionar un archivo valido'; + LANGesmiVerifyChecksums = '_Verificar checksums'; + LANGesVerifyChecksumsCaption = 'Verificar checksums'; + LANGesCheckButtonCaptionCheck = '_Seleccionar'; + LANGesCheckButtonCaptionStop = '_Parar'; + LANGesFileListTooltip = '[?] - No seleccionado'#10'[OK] - Checksum OK'#10'[Malo] - Checksum Malo'#10'[N/A] - Archivo no disponible'; + LANGesFilenameColumnCaption = 'Nombre de archivo'; + LANGesTheFileSYouAreTryingToOpenIsQuiteBig = 'El archivo ''%s'', que esta tratando de abrir es muy grande (%s bytes). Puede que no sea un archivo valido.'#10#10'¿Lo desea abrir de todas formas?'; + LANGesAnErrorOccuredWhileInitializingMemoryBlock = 'Ha ocurrido un error mientras se inicializaba el bloque de memoria. Cierre algunas aplicaciones e intente de nuevo.'; + LANGesAnErrorOccuredWhileOpeningFileSS = 'Ha ocurrido un error abriendo el archivo ''%s'':'#10' %s'; + LANGesAnErrorOccuredWhileReadingFileSS = 'Ha ocurrido un error leyendo el archivo ''%s'':'#10' %s'; + LANGesChecksumNotChecked = 'Estado: No seleccionado'; + LANGesChecksumChecking = 'Estado: Comprobando...'; + LANGesChecksumInterrupted = 'Estado: Interrumpido'; + LANGesChecksumDOK = 'Estado: %d%% OK'; + + LANGesmiCreateChecksumsCaption = '_Crear checksums...'; + LANGesYouMustSelectAtLeastOneFileToCalculateChecksum = '¡Debe de seleccionar al menos un archivo para calcular el checksum!'; + LANGesCreateChecksumsCaption = 'Crear checksums'; + LANGesCCHKSUMPage1Text = 'Va a crear los checksums para'#10'los archivos seleccionados. Si no ha seleccionado'#10'todos los archivos que desea, cierre esta ventana y'#10'seleccione más archivos.'; + LANGesCCHKSUMPage4Text = 'El programa esta listo para crear los checksums de'#10'los archivos seleccionados. Esta operacion puede tardar unos minutos.'#10'Presione Siguiente para continuar.'; + LANGesCCHKSUMPage6Text = 'Hubo errores creando el/los checksum:'; + LANGesCCHKSUMPage7Text = 'La creación del checksum a finalizado, y'#10'los archivos estan listos.'#10#10'Presione Finalizar para salir.'; + LANGesCCHKSUMPage1Title = 'Preparar archivos'; + LANGesCCHKSUMPage2Title = 'Seleccione el tipo de archivo'; + LANGesCCHKSUMPage3Title = 'Elige nombre de archivo'; + LANGesCCHKSUMPage4Title = 'Listos'; + LANGesCCHKSUMPage5Title = 'Procesando...'; + LANGesCCHKSUMPage6Title = '¡Error!'; + LANGesCCHKSUMPage7Title = 'Finalizado'; + LANGesCCHKSUMSFVFile = 'Archivo SFV'; + LANGesCCHKSUMMD5sumFile = 'Archivo MD5sum'; + LANGesCCHKSUMFileName = '_Nombre de archivo:'; + LANGesCCHKSUMCreateSeparateChecksumFiles = 'Crear archivos _individuales'; + LANGesCCHKSUMNowProcessingFileS = 'Procesando archivo: %s'; + LANGesCCHKSUMFinishCaption = '_Finalizar'; + LANGesCCHKSUMAreYouSureYouWantToAbortTheProcessing = '¿Esta seguro que desea cancelarlo?'; + LANGesCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Ha ocurrido un error abriendo el archivo ''%s'': %s'#10; + LANGesCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Ha ocurrido un error leyendo el archivo ''%s'': %s'#10; + LANGesCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Ha ocurrido un error escribiendo el archivo ''%s'': %s'#10; + + LANGesAnErrorOccuredWhileWritingFileSS = 'Ha ocurrido un error escribiendo el archivo ''%s'':'#10' %s'; + LANGesTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'El archivo de destino ''%s'' ya existe. ¿Lo desea sobrescribir?'; + LANGesTheTargetFileSCannotBeRemovedS = 'El archivo de destino ''%s'' no se puede eliminar: %s'; + LANGesMergeCaption = 'Unir'; + LANGesPleaseInsertNextDiskOrGiveDifferentLocation = 'Por favor inserte un nuevo disco, o una ruta diferente:'; + LANGesMergeOfSSucceeded = 'Unión de ''%s'' exitosa (CRC checksum OK).'; + LANGesWarningCreatedFileFailsCRCCheck = 'Advertencia: ¡El archivo creado falla la comprobación CRC!'; + LANGesMergeOfSSucceeded_NoCRCFileAvailable = 'Unión de ''%s'' exitosa (no esta disponible el archivo CRC).'; + LANGesMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Unir ''%s'' y todos los archivos con nombres ascendentes al siguiente directorio:'; + LANGesMergeSC = 'Unir:'; + LANGesmiSplitFileCaption = '_Dividir archivo...'; + LANGesmiMergeFilesCaption = '_Unir archivos...'; + + LANGesSplitTheFileSToDirectory = '_Dividir el archivo ''%s'' al directorio:'; + LANGesSplitSC = 'Dividir:'; + LANGesSplitFile = 'Dividir archivo'; + LANGesBytesPerFile = '_Bytes por archivo:'; + LANGesAutomatic = 'Automático'; + LANGesDeleteFilesOnTargetDisk = '_Eliminar archivos en el disco de destino (útil para discos extraibles)'; + LANGesSplitCaption = 'Dividir'; + LANGesCannotOpenFileS = 'No se puede abrir el archivo ''%s'''; + LANGesCannotSplitTheFileToMoreThan999Parts = '¡No se puede dividir el archivo en más de 999 partes!'; + LANGesThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Hay algunos archivos en el directorio de destino:'#10'%s'#10'¿Los desea eliminar?'; + LANGesThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Hay %d archivos en el directorio de destino. ¿Los quiere eliminar?'; + LANGesAnErrorOccuredWhileOperationS = 'Ha ocurrido un error: %s'; + LANGesSplitOfSSucceeded = 'División de ''%s'' exitosa.'; + LANGesSplitOfSFailed = '¡División de ''%s'' fallida!'; + + LANGesmnuShow_Caption = '_Ver'; + LANGesmiShowDotFiles_Caption = 'Ver archiv_os ocultos'; + LANGesTheFileYouAreTryingToOpenIsQuiteBig = 'El archivo que esta tratando de abrir es muy grande. Abrirlo en una aplicación externa (como gedit) puede causar que el sistema se torne lento.'#10'¿Desea continuar?'; + LANGesCannotExecuteSPleaseCheckTheConfiguration = 'No se puede ejecutar ''%s''. Por favor compruebe la configuración o asigne correctamente el tipo de archivo.'; + LANGesEdit = 'Editar'; + LANGesEnterFilenameToEdit = '_Ingrese el nombre de archivo a editar:'; + + LANGesmnuSettings_Caption = 'C_onfiguración'; + LANGesmiFileTypes_Caption = '_Tipos de archivo...'; + LANGesThereIsNoApplicationAssociatedWithS = 'No hay una aplicación asociada con "%s".'#10#10'Puede configurar Tux Commander para asociar aplicaciones con los diferentes tipos de archivo. ¿Desea asociar una aplicación con este tipo de archivo?'; + LANGesErrorExecutingCommand = '¡Error ejecutando el comando!'; + LANGesEditFileTypesCaption = 'Editar Tipos de Archivo'; + LANGesTitleLabel_Caption = 'Configuración de Tipos de Archivo'; + LANGesExtensionsColumn = 'Extensión'; + LANGesDescriptionColumn = 'Descripción'; + LANGesFileTypesList = 'Lista de tipos de archivo'; + LANGesActionName = 'Nombre de la acción'; + LANGesCommand = 'Comando'; + LANGesSetDefaultActionButton_Caption = '_Valor predeterminado'; + LANGesRunInTerminalCheckBox_Caption = 'Lanzar en _Terminal'; + LANGesAutodetectCheckBox_Caption = 'Auto detectar aplicación _GUI'; + LANGesBrowseButton_Caption = '_Buscar...'; + LANGesCommandLabel_Caption = 'Co_mando:'; + LANGesDescriptionLabel_Caption = 'D_escripción:'; + LANGesFNameExtLabel_Caption = 'A_gregar extensión:'; + LANGesNotebookPageExtensions = 'Tipo de archivo'; + LANGesNotebookPageActions = 'Acción'; + LANGesDefault = ' (predeterminado)'; + LANGesCannotSaveFileTypeAssociationsBecauseOtherProcess = 'No se puede guardar el archivo de asociación, porque otro proceso lo ha actualizado.'; + + LANGesDefaultColor = 'Color p_redeterminado'; + LANGesIcon = '_Icono:'; + LANGesBrowseForIcon = 'Buscar icono'; + LANGesSelectFileTypeColor = 'Seleccionar color para el tipo de archivo'; + LANGesColor = 'Co_lor:'; + + LANGesmiChangePermissions_Caption = 'Cambiar Per_misos...'; + LANGesmiChangeOwner_Caption = 'Cambiar Dueño/Grupo...'; + LANGesmiCreateSymlink_Caption = 'Crear enlace simbólico...'; + LANGesmiEditSymlink_Caption = '_Editar enlace simbólico...'; + LANGesChmodProgress = 'Cambiar permisos:'; + LANGesChownProgress = 'Cambiar dueño:'; + LANGesYouMustSelectAValidSymbolicLink = '¡Debe seleccionar un enlace simbólico valido!'; + LANGesPopupRunS = 'E_jecutar %s'; + LANGesPopupOpenS = 'A_brir %s'; + LANGesPopupGoUp = '_Subir'; + LANGesPopupOpenWithS = 'Abrir con %s'; + LANGesPopupDefault = ' (predeterminado)'; + LANGesPopupOpenWith = 'A_brir con...'; + LANGesPopupViewFile = '_Ver archivo'; + LANGesPopupEditFile = 'Ed_itar archivo'; + LANGesPopupMakeSymlink = 'Crear enlace simbólico'; + LANGesPopupRename = '_Renombrar'; + LANGesPopupDelete = '_Eliminar'; + LANGesDialogChangePermissions = 'Cambiar permisos'; + LANGesCouldNotBeChmoddedS = 'No se pudo cambiar los permisos: %s'; + LANGesDialogChangeOwner = 'Cambiar dueño'; + LANGesCouldNotBeChownedS = 'No se pudo cambiar de dueño: %s'; + LANGesDialogMakeSymlink = 'Crear enlace simbólico'; + LANGesDialogEditSymlink = 'Editar enlace simbólico'; + LANGesFEditSymlink_Caption = 'Editar enlace simbólico'; + LANGesFEditSymlink_SymbolicLinkFilename = 'Nombre del enlace _simbólico:'; + LANGesFEditSymlink_SymbolicLinkPointsTo = 'El enlace simbólico apun_ta a:'; + + LANGesFChmod_Caption = 'Permisos de Acceso'; + LANGesFChmod_PermissionFrame = 'Permisos'; + LANGesFChmod_FileFrame = 'Archivo'; + LANGesFChmod_ApplyRecursivelyFor = 'Aplicar _recursivamente para'; + LANGesFChmod_miAllFiles = 'Todos los archivos y carpetas'; + LANGesFChmod_miDirectories = 'Solo directorios'; + LANGesFChmod_OctalLabel = '_Octal:'; + LANGesFChmod_SUID = 'SUID - Asignar ID de usuario al ejecutar'; + LANGesFChmod_SGID = 'SGID - Asignar ID de grupo al ejecutar'; + LANGesFChmod_Sticky = 'Sticky bit'; + LANGesFChmod_RUSR = 'RUSR - Leer por dueño'; + LANGesFChmod_WUSR = 'WUSR - Escribir por dueño'; + LANGesFChmod_XUSR = 'XUSR - Ejecutar/buscar por dueño'; + LANGesFChmod_RGRP = 'RGRP - Leer por grupo'; + LANGesFChmod_WGRP = 'WGRP - Escribir por grupo'; + LANGesFChmod_XGRP = 'XGRP - Ejecutar/buscar por grupo'; + LANGesFChmod_ROTH = 'ROTH - Leer por otros'; + LANGesFChmod_WOTH = 'WOTH - Escribir por otros'; + LANGesFChmod_XOTH = 'XOTH - Ejecutar/buscar por otros'; + LANGesFChmod_TextLabel = 'Texto: %s'; + LANGesFChmod_FileLabel = 'Archivo: %s'#10'Texto: %s'#10 + + 'Octal: %d'#10'Dueño: %s'#10 + + 'Grupo: %s'; + + LANGesFChown_Caption = 'Cambiar dueño/grupo'; + LANGesFChown_OwnerFrame = 'Nombre de usuario'; + LANGesFChown_GroupFrame = 'Nombre del grupo'; + LANGesFChown_FileFrame = 'Archivo'; + LANGesFChown_ApplyRecursively = 'Aplicar _recursivamente'; + + LANGesFSymlink_Caption = 'Crear enlace simbólico'; + LANGesFSymlink_ExistingFilename = 'Nombre de archivo _existente (nombre de archivo al cual el enlace simbólico apuntara):'; + LANGesFSymlink_SymlinkFilename = 'Nombre del enlace _simbólico:'; + + LANGesmnuBookmarks_Caption = '_Favoritos'; + LANGesmiAddBookmark_Caption = 'Agregar Favorito'; + LANGesmiEditBookmarks_Caption = 'Editar Favoritos'; + LANGesBookmarkPopupDelete_Caption = 'E_liminar'; + LANGesmiPreferences_Caption = '_Preferencias...'; + LANGesTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'El directorio actual ya existe en la lista de favoritos'; + LANGesSomeOtherInstanceChanged = 'Una segunda instancia de Tux Commander a cambiado la configución. ¿Desea aplicar la nueva configuración?'#10#10'Advertencia: Si presiona No en este punto, la configuración se sobrescribirá en esta instancia'; + + LANGesPreferences_Caption = 'Preferencias de la Aplicación'; + LANGesPreferences_TitleLabel_Caption = 'Preferencias'; + LANGesPreferences_GeneralPage = 'General'; + LANGesPreferences_FontsPage = 'Fuentes'; + LANGesPreferences_ColorsPage = 'Colores'; + LANGesPreferences_RowHeight = '_Altura del cuadro:'; + LANGesPreferences_NumHistoryItems = 'Ele_mentos en el historial:'; + LANGesPreferences_Default = 'P_redeterminado'; + LANGesPreferences_ClearReadonlyAttribute = 'Borrar el atributo de solo lectura cuando se copia desde el CD-ROM'; + LANGesPreferences_DisableMouseRenaming = 'Deshabilitar renombrar con el _mouse'; + LANGesPreferences_ShowFiletypeIconsInList = 'Mostrar iconos del tipo de archivo'; + LANGesPreferences_ExternalAppsLabel = 'Programas Externos'; + LANGesPreferences_Viewer = '_Visor:'; + LANGesPreferences_Editor = '_Editor:'; + LANGesPreferences_Terminal = '_Terminal:'; + LANGesPreferences_ListFont = 'Fuente:'; + LANGesPreferences_Change = 'Cambiar...'; + LANGesPreferences_UseDefaultFont = 'Usar fuente _predeterminada'; + LANGesPreferences_Foreground = 'Foreground'; + LANGesPreferences_Background = 'Background'; + LANGesPreferences_NormalItem = 'Item Normal:'; + LANGesPreferences_SetToDefaultToUseGTKThemeColors = 'Aplicar lo predeterminado para usar los colores del tema GTK'; + LANGesPreferences_Cursor = 'Cursor:'; + LANGesPreferences_InactiveItem = 'Item Inactivo::'; + LANGesPreferences_SelectedItem = 'Item Seleccionado:'; + LANGesPreferences_LinkItem = 'Enlaces simbólicos:'; + LANGesPreferences_LinkItemHint = 'Aplicar lo predeterminado para mostrar los enlaces simbólicos usando los colores de los ítems normales'; + LANGesPreferences_DotFileItem = 'Archivos ocultos:'; + LANGesPreferences_DotFileItemHint = 'Aplicar lo predeterminado para mostrar los archivos ocultos usando los colores de los ítems normales'; + LANGesPreferences_BrowseForApplication = 'Buscar aplicación'; + LANGesPreferences_DefaultS = 'Predeterminado: %s'; + LANGesPreferences_SelectFont = 'Seleccionar fuente'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGesBookmarkButton_Tooltip = 'Mostrar favoritos'; + LANGesUpButton_Tooltip = 'Ir al directorio anterior'; + LANGesRootButton_Tooltip = 'Ir al directrio root (/)'; + LANGesHomeButton_Tooltip = 'Ir al directorio de usuario (/home/user)'; + LANGesLeftEqualButton_Tooltip = 'Cambiar el panel derecho al mismo directorio'; + LANGesRightEqualButton_Tooltip = 'Cambiar el panel izquierdo al mismo directorio'; + LANGesmiShowDirectorySizes_Caption = 'Mostar tamaño de los d_irectorios'; + LANGesmiTargetSource_Caption = '_Destino = Origen'; + LANGesFileTypeDirectory = 'Directorio'; + LANGesFileTypeFile = 'Archivo'; + LANGesFileTypeMetafile = 'Esto es un meta-ítem común'; + LANGesPreferencesPanelsPage = 'Paneles'; + LANGesPreferencesApplicationsPage = 'Aplicaciones'; + LANGesPreferencesExperimentalPage = 'Experimental'; + LANGesPreferencesSelectAllDirectoriesCheckBox_Caption = 'Seleccionar directorios _también cuando se selecciona todo'; + LANGesPreferencesNewStyleAltOCheckBox_Caption = '_Nuevo estilo Alt+O'; + LANGesPreferencesNewStyleAltOCheckBox_Tooltip = 'Mantenerse en el mismo directorio cuando se cambia el directorio del panel contrario al presionar Ctrl/Alt+O'; + LANGesPreferencesShowFuncButtonsCheckBox_Caption = 'Mostrar los atajos de las _teclas'; + LANGesPreferencesSizeFormatLabel_Caption = 'Formato del T_amaño:'; + LANGesPreferencesmiSizeFormat1 = 'Sistema'; + LANGesPreferencesmiSizeFormat6 = 'Agrupado'; + LANGesPreferencesAutodetectXApp = 'Auto detectar la aplicación'; + LANGesPreferencesAlwaysRunInTerminal = 'Siempre lanzar en terminal'; + LANGesPreferencesNeverRunInTerminal = 'Nunca lanzar en terminal'; + LANGesPreferencesCmdLineBehaviourLabel_Caption = '_Ejecutar desde la línea de comandos:'; + LANGesPreferencesFeatures = 'Preferencias'; + LANGesPreferencesDisableMouseRename_Tooltip = 'Aun podrá hacer un renombramiento rápido presionando Shift+F6'; + LANGesPreferencesDisableFileTipsCheckBox_Caption = 'Deshabilitar _tooltips'; + LANGesPreferencesDisableFileTipsCheckBox_Tooltip = 'No mostrar los tooltips del panel si el texto en una columna esta truncado'; + LANGesPreferencesShow = 'Ver'; + LANGesPreferencesDirsInBoldCheckBox_Caption = 'Directorios _resaltados'; + LANGesPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Deshabilitar los b_rackets de los directorios'; + LANGesPreferencesOctalPermissionsCheckBox_Caption = 'Mostrar permisos en _octal'; + LANGesPreferencesOctalPermissionsCheckBox_Tooltip = 'Mostrar permisos de archivo/directorio como un numero en vez de la forma de texto (-rw-rw-rw-)'; + LANGesPreferencesMovement = 'Movimiento'; + LANGesPreferencesLynxLikeMotionCheckBox_Caption = 'Movimiento como en _Lynx'; + LANGesPreferencesInsertMovesDownCheckBox_Caption = '_Insertar desplaza hacia abajo'; + LANGesPreferencesSpaceMovesDownCheckBox_Caption = 'E_spaciadora desplaza hacia abajo'; + LANGesPreferencesViewer = 'Visor'; + LANGesPreferencesCommandSC = 'Comando:'; + LANGesPreferencesUseInternalViewer = 'Usar visor _interno'; + LANGesPreferencesEditor = 'Editor'; + LANGesPreferencesTerminal = 'Terminal'; + LANGesPreferencesExperimentalFeatures = 'Preferencias Experimentales'; + LANGesPreferencesExperimentalWarningLabel_Caption = 'Advertencia: Estas opciones están actualmente en desarrollo y puede que no funcionen correctamente. ¡Uselas bajo su propio riesgo!'; + LANGesPreferencesFocusRefreshCheckBox_Caption = '_Actualizar cuando se enfoque la ventana'; + LANGesPreferencesFocusRefreshCheckBox_Tooltip = 'Actualización de los paneles muy lenta en este momento'; + LANGesPreferencesWMCompatModeCheckBox_Caption = 'Compatibilidad con _WM'; + LANGesPreferencesWMCompatModeCheckBox_Tooltip = 'Uselo si tiene problemas con su administrador de ventanas (por ejemplo IceWM no maximiza correctamente)'; + LANGesPreferencesCompatUseLibcSystemCheckBox_Caption = 'Usar la librería libc del _sistema() para ejecutar programas'; + LANGesPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Usar en caso de congelamientos o problemas de bloqueo cuando se lanza una aplicación externa'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGesmiSearchCaption2 = '_Buscar...'; + LANGesmiNoMounterBarCaption = '_No mostrar la barra de montajes'; + LANGesmiShowOneMounterBarCaption = 'Mostrar _una barra de montaje'; + LANGesmiShowTwoMounterBarCaption = 'Mostrar _dos barras de montaje'; + LANGesmnuNetworkCaption = 'R_ed'; + LANGesmiConnectionsCaption = '_Conexiones...'; + LANGesmiOpenConnectionCaption = '_Abrir conexión...'; + LANGesmiQuickConnectCaption = 'Conexión _rápida...'; + LANGesmnuPluginsCaption = 'Pl_ugins'; + LANGesmiTestPluginCaption = '_Probar plugin...'; + LANGesmiMounterSettingsCaption = '_Montajes...'; + LANGesmiColumnsCaption = 'Columnas del P_anel...'; + LANGesmiSavePositionCaption = '_Salvar posición'; + LANGesmiMountCaption = '_Montar'; + LANGesmiUmountCaption = '_Desmontar'; + LANGesmiEjectCaption = '_Ejecutar'; + LANGesmiDuplicateTabCaption = 'Duplicar tab actual'; + LANGesmiCloseTabCaption = 'Cerrar tab actual'; + LANGesmiCloseAllTabsCaption = 'Cerrar todos los tabs'; + LANGesCannotDetermineDestinationEngine = 'No se puede determinar la maquina de destino. Por favor ingrese la ruta correcta e intente de nuevo.'; + LANGesCannotLoadFile = 'No se puede cargar el archivo ''%s''. Por favor revise los permisos.'; + LANGesMountPointDevice = 'Punto de montaje: %s'#10'Dispositivo: %s'; + LANGesMountSC = 'Montar:'; + LANGesNoPluginsFound = 'No se encontraron plugins'; + LANGesPluginAbout = 'Acerca...'; + LANGesCouldntOpenURI = 'No se puede abrir el URI especificado. Por favor revise la consistencia y los permisos de acceso.'; + LANGesPluginAboutInside = 'Plugin: %s'#10#10'%s'#10'%s'; + LANGesAreYouSureCloseAllTabs = '¿Esta seguro que desea cerrar todos los tabs inactivos?'; + LANGesCouldntOpenURIArchive = 'No se puede abrir el archivo. Por favor revise la consistencia y los permisos de acceso.'; + LANGesThereIsNoModuleAvailable = 'No hay módulos VFS disponibles que puedan realizar esta conexión'; + LANGesIgnoreError = '¿Esta seguro que desea ignorar el error? El archivo de origen será eliminado'; + LANGesErrorMount = 'Ocurrió un error montando el dispositivo ''%s'':'#10#10; + LANGesErrorUmount = 'Ocurrió un error desmontando el dispositivo ''%s'':'#10#10; + LANGesErrorEject = 'Ocurrió un error ejecutando el dispositivo ''%s'':'#10#10; + + LANGesMounterPrefs_Caption = 'Configuración de Montajes'; + LANGesMounterPrefs_TitleLabelCaption = 'Configuración de Montajes'; + LANGesMounterPrefs_ListViewFrameCaption = 'Montajes'; + LANGesMounterPrefs_MountName = 'Nombre del Montaje'; + LANGesMounterPrefs_MountPoint = 'Punto del Montaje'; + LANGesMounterPrefs_Device = 'Dispositivo'; + LANGesMounterPrefs_MoveUpButtonTooltip = 'Mover arriba'; + LANGesMounterPrefs_MoveDownButtonTooltip = 'Mover abajo'; + LANGesMounterPrefs_UseFSTabDefaultsCheckBox = 'Usar _fstab como predeterminado'; + LANGesMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Seleccionando esto, la barra de montaje mostrara los dispositivos encontrados en /etc/fstab (archivo de montajes del sistema)'; + LANGesMounterPrefs_ToggleModeCheckBox = 'Los botones permanecen presionados cuando se monta'; + LANGesMounterPrefs_ToggleModeCheckBoxTooltip = 'Seleccionándolo, los botones de montaje permanecerán presionados si el dispositivo es montado; Otro click lo desmontara (ejecutara en este caso)'; + LANGesMounterPrefs_PropertiesFrameCaption = 'Propiedades del montaje'; + LANGesMounterPrefs_DisplayTextLabelCaption = '_Texto Mostrado:'; + LANGesMounterPrefs_MountPointLabelCaption = '_Punto de Montaje:'; + LANGesMounterPrefs_MountDeviceLabelCaption = '_Dispositivo:'; + LANGesMounterPrefs_DeviceTypeLabelCaption = 'T_ipo de Dispositivo:'; + LANGesMounterPrefs_miLocalDiskCaption = 'Disco local'; + LANGesMounterPrefs_miRemovableCaption = 'Removible'; + LANGesMounterPrefs_miCDCaption = 'CD/DVD'; + LANGesMounterPrefs_miFloppyCaption = 'Floppy'; + LANGesMounterPrefs_miNetworkCaption = 'Red'; + LANGesMounterPrefs_MountCommandLabelCaption = '_Comando Montaje:'; + LANGesMounterPrefs_UmountCommandLabelCaption = 'C_omando desmontaje:'; + LANGesMounterPrefs_MountCommandEntryTooltip = 'Sintaxis: utilice %dev para sustituir el dispositivo y %dir para el punto de montaje o deje en blanco para el montaje predeterminado'#10+'Nota: tenga cuidado con estos comandos, ¡tuxcmd puede congelarce!'#10'Ejemplo: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGesMounterPrefs_UmountCommandEntryTooltip = 'Sintaxis: utilice %dev para sustituir el dispositivo y %dir para el punto de montaje o deje en blanco para el desmontaje predeterminado'#10'Ejemplo: smbumount $dir'; + LANGesMounterPrefs_IconLabelCaption = '_Icono:'; + + LANGesConnMgr_Caption = 'Abrir Nueva Conexión'; + LANGesConnMgr_ConnectButton = 'Co_nectar'; + LANGesConnMgr_OpenConnection = 'Abrir Conexión'; + LANGesConnMgr_NameColumn = 'Nombre'; + LANGesConnMgr_URIColumn = 'URI'; + LANGesConnMgr_AddConnectionButtonCaption = '_Agregar sitio...'; + LANGesConnMgr_AddConnectionButtonTooltip = 'Agregar nueva conexión'; + LANGesConnMgr_EditButtonCaption = '_Editar...'; + LANGesConnMgr_EditButtonTooltip = 'Editar conexión seleccionada'; + LANGesConnMgr_RemoveButtonCaption = '_Remover sitio'; + LANGesConnMgr_RemoveButtonTooltip = 'Eliminar conexión seleccionada'; + LANGesConnMgr_DoYouWantDelete = '¿Realmente desea eliminar la conexión ''%s''?'; + + LANGesConnProp_FTP = 'FTP'; + LANGesConnProp_SFTP = 'SFTP (subsistema ssh)'; + LANGesConnProp_SMB = 'Carpeta compartida Windows (SMB)'; + LANGesConnProp_HTTP = 'WebDAV (HTTP)'; + LANGesConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGesConnProp_Other = 'Otro (por favor especificarlo en URI)'; + LANGesConnProp_Caption = 'Propiedades de conexión'; + LANGesConnProp_VFSModule = 'Modulo _VFS:'; + LANGesConnProp_URI = '_URI:'; + LANGesConnProp_URIEntryTooltip = 'Una correcta URI debe contener el prefijo del tipo de servicio y dirección del servidor'; + LANGesConnProp_DetailedInformations = 'Información detallada'; + LANGesConnProp_Name = '_Nombre:'; + LANGesConnProp_Server = 'Ser_vidor[:puerto]:'; + LANGesConnProp_Username = 'No_mbre de Usuario:'; + LANGesConnProp_UserNameEntryTooltip = 'Dejar en blanco para un login anónimo'; + LANGesConnProp_Password = '_Contraseña:'; + LANGesConnProp_TargetDirectory = '_Directorio de destino:'; + LANGesConnProp_ServiceType = 'Tipo de _Servicio:'; + LANGesConnProp_MaskPassword = '_Ocultar Contraseña'; + LANGesConnProp_MenuItemCaption = 'Predeterminado (todos los módulos)'; + + LANGesConnLogin_Caption = 'Autentificación requerida'; + LANGesConnLogin_Login = 'Login'; + LANGesConnLogin_ExperimentalWarningLabelCaption = 'Debe estar identificado para acceder a %s'; + LANGesConnLogin_Username = 'Nombre de _Usuario:'; + LANGesConnLogin_Password = '_Contraseña:'; + LANGesConnLogin_AnonymousCheckButton = '_Anónimo'; + + LANGesColumns_Caption = 'Configuración de Columnas del Panel'; + LANGesColumns_Title = 'Configuración de Columnas del Panel'; + LANGesColumns_MoveUpButtonTooltip = 'Mover arriba'; + LANGesColumns_MoveDownButtonTooltip = 'Mover abajo'; + LANGesColumns_TitlesLongName = 'Nombre'; + LANGesColumns_TitlesLongNameExt = 'Nombre + Extensión'; + LANGesColumns_TitlesLongExt = 'Extensión'; + LANGesColumns_TitlesLongSize = 'Tamaño'; + LANGesColumns_TitlesLongDateTime = 'Fecha + Hora'; + LANGesColumns_TitlesLongDate = 'Fecha'; + LANGesColumns_TitlesLongTime = 'Hora'; + LANGesColumns_TitlesLongUser = 'Usuario'; + LANGesColumns_TitlesLongGroup = 'Grupo'; + LANGesColumns_TitlesLongAttr = 'Atributos'; + LANGesColumns_TitlesShortName = 'Nombre'; + LANGesColumns_TitlesShortNameExt = 'Nombre'; + LANGesColumns_TitlesShortExt = 'Ext'; + LANGesColumns_TitlesShortSize = 'Tamaño'; + LANGesColumns_TitlesShortDateTime = 'Fecha'; + LANGesColumns_TitlesShortDate = 'Fecha'; + LANGesColumns_TitlesShortTime = 'Hora'; + LANGesColumns_TitlesShortUser = 'Usuario'; + LANGesColumns_TitlesShortGroup = 'Grupo'; + LANGesColumns_TitlesShortAttr = 'Atrib'; + + LANGesTestPlugin_Caption = 'Probar Plugin VFS'; + LANGesTestPlugin_Title = 'Probar Plugin VFS'; + LANGesTestPlugin_ExperimentalWarningLabelCaption = 'Advertencia: El subsistema VFS y sus plugins están bajo desarrollo y pueden contener errores. ¡Use esta función bajo su propio riesgo!'; + LANGesTestPlugin_Plugin = '_Plugin:'; + LANGesTestPlugin_Command = 'Co_mando:'; + LANGesTestPlugin_Username = 'Nombre de _Usuario:'; + LANGesTestPlugin_Password = '_Contraseña:'; + LANGesTestPlugin_AnonymousCheckButton = 'Login _Anónimo (no utiliza VFSLogin)'; + LANGesTestPlugin_NoPluginsFound = 'No se encontraron plugins'; + + LANGesRemoteWait_Caption = 'Operación en progreso'; + LANGesRemoteWait_OperationInProgress = 'Operación en progreso, por favor aguarde...'; + LANGesRemoteWait_ItemsFound = 'Items encontrados: %d'; + + LANGesSearch_Bytes = 'Bytes'; + LANGesSearch_kB = 'kB'; + LANGesSearch_MB = 'MB'; + LANGesSearch_days = 'días'; + LANGesSearch_weeks = 'semanas'; + LANGesSearch_months = 'meses'; + LANGesSearch_years = 'años'; + LANGesSearch_Caption = 'Buscar Archivos'; + LANGesSearch_General = 'General'; + LANGesSearch_Advanced = 'Avanzado'; + LANGesSearch_SearchResults = '_Resultados de búsqueda:'; + LANGesSearch_SearchFor = '_Buscar:'; + LANGesSearch_FileMaskEntryTooltip = 'Sugerencia: Si desea buscar múltiples archivos, separelos por ";"'; + LANGesSearch_SearchIn = 'Buscar _en:'; + LANGesSearch_SearchArchivesCheckButton = 'Buscar _archivos'; + LANGesSearch_FindText = 'Buscar _texto:'; + LANGesSearch_FindTextEntryTooltip = 'Dejar en blanco para no buscar texto'#10'Por favor note que estamos usando UTF-8 en la parte del GUI'; + LANGesSearch_CaseSensitiveCheckButton = 'Coincidir mayúscu_las y minúsculas'; + LANGesSearch_StayCurrentFSCheckButton = 'Incluir otros archivos de s_istema'; + LANGesSearch_CaseSensitiveMatchCheckButton = 'Coinci_dir mayúsculas y minúsculas'; + LANGesSearch_Size = 'Tamaño'; + LANGesSearch_Date = 'Fecha'; + LANGesSearch_BiggerThan = '_Mayor que'; + LANGesSearch_SmallerThan = 'Me_nor que'; + LANGesSearch_ModifiedBetweenRadioButton = 'M_odificado entre'; + LANGesSearch_NotModifiedAfterRadioButton = 'No modificado _después de'; + LANGesSearch_ModifiedLastRadioButton = 'Mod_ificado en los ultimos'; + LANGesSearch_ModifiedNotLastRadionButton = 'No modi_ficado en los ultimos'; + LANGesSearch_ModifiedBetweenEntry1 = '"Por favor use este tipo de formato:" c'; + LANGesSearch_ViewButtonCaption = '_Ver archivo'; + LANGesSearch_NewSearchButtonCaption = '_Nueva búsqueda'; + LANGesSearch_GoToFileButtonCaption = '_Ir al archivo'; + LANGesSearch_FeedToListboxButtonCaption = 'Feed to _listbox'; + LANGesSearch_StatusSC = 'Estado:'; + LANGesSearch_Ready = 'Preparado.'; + LANGesSearch_PreparingToSearch = 'Preparándose para buscar.'; + LANGesSearch_SearchInProgress = 'Búsqueda en progreso:'; + LANGesSearch_UserCancelled = 'Cancelado por el usuario.'; + LANGesSearch_SearchFinished = 'Búsqueda finalizada'; + LANGesSearch_FilesFound = '%d archivos encontrados'; + LANGesSearch_And = 'y'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGesCloseOpenConnection = 'Esta tratando de hacer una nueva conexión sobre otra conexión activa. Si continua, la conexión anterior será cerrada y reemplazada por la nueva.'#10#10'¿Desea continuar?'; + LANGesDuplicateTabWarning = 'Esta tratando de abrir un nuevo tab desde un directorio remoto. Sin embargo, la clonación no esta soportada. El directorio del nuevo tab apuntara a un sistema de archivos local.'; + LANGesDontShowAgain = '_No mostrar este mensaje de nuevo'; + LANGesSwitchOtherPanelWarning = 'Esta tratando de abrir el directorio remoto en el panel opuesto. Sin embargo, la clonación no esta soportada. El directorio de destino no será cambiado.'; + LANGesOpenConnectionsWarning = 'Hay algunas conexiones activas en el panel abierto. Cerrando la aplicación, estas conexiones serán cerradas.'#10#10'¿Desea salir?'; + LANGesmiDisconnect_Caption = '_Desconectar'; + LANGesDisconnectButton_Tooltip = 'Desconectar conexión activa'; + LANGesLeaveArchiveButton_Tooltip = 'Cierra archivo actual'; + LANGesOpenTerminalButton_Tooltip = 'Abre una nueva terminal desde el directorio actual'; + LANGesOpenTerminalButton_Caption = 'Abrir Te_rminal'; + LANGesShowTextUIDsCheckBox_Caption = 'Mostrar _UIDs en texto'; + LANGesShowTextUIDsCheckBox_Tooltip = 'Muestra la información de Usuario y Grupo en forma de texto en vez de números (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGesmiNewTab_Caption = 'Nuevo _tab'; + LANGesFilePopupMenu_Properties = '_Propiedades'; + LANGesCommandEntry_Tooltip = 'Usar %s como el archivo/directorio contenedor'; + LANGesmiFiles_Caption = 'Solo archivos'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGesPasswordButton_Tooltip = 'El archivo necesitara contraseña.'#10'Haga click para asignarla'; + LANGesHandleRunFromArchive_Bytes = 'bytes'; + LANGesHandleRunFromArchive_FileTypeDesc_Unknown = '(desconocido)'; + LANGesHandleRunFromArchive_NotAssociated = '(sin aplicación asociada)'; + LANGesHandleRunFromArchive_SelfExecutable = '(auto-ejecutable)'; + LANGesHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'No se pudo crear el directorio temporal "%s": %s.'#10#10'Por favor verifique la configuración del directorio temporal e intente de nuevo.'; + LANGesFRunFromVFS_Caption = 'Propiedades del archivo comprimido'; + LANGesFRunFromVFS_TitleLabel = 'Propiedades del archivo'; + LANGesFRunFromVFS_FileNameLabel = 'Nombre del archivo:'; + LANGesFRunFromVFS_FileTypeLabel = 'Tipo de archivo:'; + LANGesFRunFromVFS_SizeLabel = 'Tamaño:'; + LANGesFRunFromVFS_PackedSizeLabel = 'Tamaño comprimido:'; + LANGesFRunFromVFS_DateLabel = 'Fecha de modificación:'; + LANGesFRunFromVFS_InfoLabel = 'Abrir los archivos directamente no está soportado. Haciendo click en los botones bajo el archivo (todos los archivos respectivamente) será extraído a un directorio temporal. Los archivos temporales serán eliminados cuando cierre Tux Commander.'; + LANGesFRunFromVFS_OpensWithLabel = 'Abrir con:'; + LANGesFRunFromVFS_ExecuteButton = 'E_xtraer y abrir'; + LANGesFRunFromVFS_ExecuteAllButton = 'Extraer _todo y abrir'; + LANGesFSetPassword_Caption = 'Asignar contraseña'; + LANGesFSetPassword_Label1_Caption = 'Se necesita contraseña'; + LANGesFSetPassword_Label2_Caption = 'El archivo esta encriptado y necesita de una contraseña para poder extraer la información'; + LANGesFSetPassword_ShowPasswordCheckButton = '_Mostrar contraseña'; + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGesF2Button_Caption; + LANGF3Button_Caption := LANGesF3Button_Caption; + LANGF4Button_Caption := LANGesF4Button_Caption; + LANGF5Button_Caption := LANGesF5Button_Caption; + LANGF6Button_Caption := LANGesF6Button_Caption; + LANGF7Button_Caption := LANGesF7Button_Caption; + LANGF8Button_Caption := LANGesF8Button_Caption; + + LANGmnuFile_Caption := LANGesmnuFile_Caption; + LANGmnuMark_Caption := LANGesmnuMark_Caption; + LANGmnuCommands_Caption := LANGesmnuCommands_Caption; + LANGmnuHelp_Caption := LANGesmnuHelp_Caption; + LANGmiExit_Caption := LANGesmiExit_Caption; + LANGmiSelectGroup_Caption := LANGesmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGesmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGesmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGesmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGesmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGesmiRefresh_Caption; + LANGmiAbout_Caption := LANGesmiAbout_Caption; + + LANGColumn1_Caption := LANGesColumn1_Caption; + LANGColumn2_Caption := LANGesColumn2_Caption; + LANGColumn3_Caption := LANGesColumn3_Caption; + LANGColumn4_Caption := LANGesColumn4_Caption; + LANGColumn5_Caption := LANGesColumn5_Caption; + + LANGExpandSelection := LANGesExpandSelection; + LANGShrinkSelection := LANGesShrinkSelection; + LANGNoMatchesFound := LANGesNoMatchesFound; + LANGNoFilesSelected := LANGesNoFilesSelected; + LANGSelectedFilesDirectories := LANGesSelectedFilesDirectories; + LANGDirectoryS := LANGesDirectoryS; + LANGFileS := LANGesFileS; + LANGDoYouReallyWantToDeleteTheS := LANGesDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGesDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGesCopyFiles; + LANGMoveRenameFiles := LANGesMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGesCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGesMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGesCopySC; + LANGMoveRenameSC := LANGesMoveRenameSC; + + LANGQuickFind := LANGesQuickFind; + + LANGAboutString := LANGesAboutString; + LANGAboutStringGnome := LANGesAboutStringGnome; + LANGDiskStatFmt := LANGesDiskStatFmt; + LANGDiskStatVolNameFmt := LANGesDiskStatVolNameFmt; + LANGStatusLineFmt := LANGesStatusLineFmt; + LANGPanelStrings[False] := LANGesPanelStrings[False]; + LANGPanelStrings[True] := LANGesPanelStrings[True]; + LANGDIR := LANGesDIR; + LANGErrorGettingListingForSPanel := LANGesErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGesErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGesErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGesErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGesTheFileDirectory; + LANGCouldNotBeDeleted := LANGesCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGesCouldNotBeDeletedS; + LANGUserCancelled := LANGesUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGesTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGesCannotCopyFile; + LANGCopyError := LANGesCopyError; + LANGMoveError := LANGesMoveError; + LANGOverwriteS := LANGesOverwriteS; + LANGWithFileS := LANGesWithFileS; + LANGOvewriteSBytesS := LANGesOvewriteSBytesS; + LANGTheFile := LANGesTheFile; + LANGCopy := LANGesCopy; + LANGMove := LANGesMove; + LANGTheDirectory := LANGesTheDirectory; + LANGTheSymbolicLink := LANGesTheSymbolicLink; + LANGCannotMoveFile := LANGesCannotMoveFile; + LANGCouldNotBeCreated := LANGesCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGesCouldNotBeCreatedS; + LANGFromS := LANGesFromS; + LANGToS := LANGesToS; + LANGCannotCopyFileToItself := LANGesCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGesMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGesCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGesCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGesCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGesCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGesCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGesCannotWriteToDestinationFile; + + LANGUnknownException := LANGesUnknownException; + LANGNoAccess := LANGesNoAccess; + LANGUnknownError := LANGesUnknownError; + + LANGCreateANewDirectory := LANGesCreateANewDirectory; + LANGEnterDirectoryName := LANGesEnterDirectoryName; + + LANGOverwriteQuestion := LANGesOverwriteQuestion; + LANGOverwriteButton_Caption := LANGesOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGesOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGesSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGesOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGesSkipAllButton_Caption; + LANGRenameButton_Caption := LANGesRenameButton_Caption; + LANGAppendButton_Caption := LANGesAppendButton_Caption; + LANGRename := LANGesRename; + LANGRenameFile := LANGesRenameFile; + LANGIgnoreButton_Caption := LANGesIgnoreButton_Caption; + + LANGProgress := LANGesProgress; + LANGCancel := LANGesCancel; + LANGDelete := LANGesDelete; + + LANGSpecifyFileType := LANGesSpecifyFileType; + + LANGRemoveDirectory := LANGesRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGesDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGesRetry; + LANGDeleteButton_Caption := LANGesDeleteButton_Caption; + LANGAll := LANGesAll; + + LANGCopyFilesSC := LANGesCopyFilesSC; + LANGAppendQuestion := LANGesAppendQuestion; + LANGPreparingList := LANGesPreparingList; + + LANGYouMustSelectAValidFile := LANGesYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGesmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGesVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGesCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGesCheckButtonCaptionStop; + LANGFileListTooltip := LANGesFileListTooltip; + LANGFilenameColumnCaption := LANGesFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGesTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGesAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGesAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGesAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGesChecksumNotChecked; + LANGChecksumChecking := LANGesChecksumChecking; + LANGChecksumInterrupted := LANGesChecksumInterrupted; + LANGChecksumDOK := LANGesChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGesmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGesYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGesCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGesCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGesCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGesCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGesCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGesCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGesCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGesCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGesCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGesCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGesCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGesCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGesCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGesCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGesCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGesCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGesCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGesCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGesCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGesCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGesCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGesCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGesAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGesTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGesTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGesMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGesPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGesMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGesWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGesMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGesMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGesMergeSC; + LANGmiSplitFileCaption := LANGesmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGesmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGesSplitTheFileSToDirectory; + LANGSplitSC := LANGesSplitSC; + LANGSplitFile := LANGesSplitFile; + LANGBytesPerFile := LANGesBytesPerFile; + LANGAutomatic := LANGesAutomatic; + LANGDeleteFilesOnTargetDisk := LANGesDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGesSplitCaption; + LANGCannotOpenFileS := LANGesCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGesCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGesThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGesThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGesAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGesSplitOfSSucceeded; + LANGSplitOfSFailed := LANGesSplitOfSFailed; + + LANGmnuShow_Caption := LANGesmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGesmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGesTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGesCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGesEdit; + LANGEnterFilenameToEdit := LANGesEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGesmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGesmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGesThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGesErrorExecutingCommand; + LANGEditFileTypesCaption := LANGesEditFileTypesCaption; + LANGTitleLabel_Caption := LANGesTitleLabel_Caption; + LANGExtensionsColumn := LANGesExtensionsColumn; + LANGDescriptionColumn := LANGesDescriptionColumn; + LANGFileTypesList := LANGesFileTypesList; + LANGActionName := LANGesActionName; + LANGCommand := LANGesCommand; + LANGSetDefaultActionButton_Caption := LANGesSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGesRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGesAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGesBrowseButton_Caption; + LANGCommandLabel_Caption := LANGesCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGesDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGesFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGesNotebookPageExtensions; + LANGNotebookPageActions := LANGesNotebookPageActions; + LANGDefault := LANGesDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGesCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGesDefaultColor; + LANGIcon := LANGesIcon; + LANGBrowseForIcon := LANGesBrowseForIcon; + LANGSelectFileTypeColor := LANGesSelectFileTypeColor; + LANGColor := LANGesColor; + + LANGmiChangePermissions_Caption := LANGesmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGesmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGesmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGesmiEditSymlink_Caption; + LANGChmodProgress := LANGesChmodProgress; + LANGChownProgress := LANGesChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGesYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGesPopupRunS; + LANGPopupOpenS := LANGesPopupOpenS; + LANGPopupGoUp := LANGesPopupGoUp; + LANGPopupOpenWithS := LANGesPopupOpenWithS; + LANGPopupDefault := LANGesPopupDefault; + LANGPopupOpenWith := LANGesPopupOpenWith; + LANGPopupViewFile := LANGesPopupViewFile; + LANGPopupEditFile := LANGesPopupEditFile; + LANGPopupMakeSymlink := LANGesPopupMakeSymlink; + LANGPopupRename := LANGesPopupRename; + LANGPopupDelete := LANGesPopupDelete; + LANGDialogChangePermissions := LANGesDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGesCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGesDialogChangeOwner; + LANGCouldNotBeChownedS := LANGesCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGesDialogMakeSymlink; + LANGDialogEditSymlink := LANGesDialogEditSymlink; + LANGFEditSymlink_Caption := LANGesFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGesFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGesFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGesFChmod_Caption; + LANGFChmod_PermissionFrame := LANGesFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGesFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGesFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGesFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGesFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGesFChmod_OctalLabel; + LANGFChmod_SUID := LANGesFChmod_SUID; + LANGFChmod_SGID := LANGesFChmod_SGID; + LANGFChmod_Sticky := LANGesFChmod_Sticky; + LANGFChmod_RUSR := LANGesFChmod_RUSR; + LANGFChmod_WUSR := LANGesFChmod_WUSR; + LANGFChmod_XUSR := LANGesFChmod_XUSR; + LANGFChmod_RGRP := LANGesFChmod_RGRP; + LANGFChmod_WGRP := LANGesFChmod_WGRP; + LANGFChmod_XGRP := LANGesFChmod_XGRP; + LANGFChmod_ROTH := LANGesFChmod_ROTH; + LANGFChmod_WOTH := LANGesFChmod_WOTH; + LANGFChmod_XOTH := LANGesFChmod_XOTH; + LANGFChmod_TextLabel := LANGesFChmod_TextLabel; + LANGFChmod_FileLabel := LANGesFChmod_FileLabel; + LANGFChown_Caption := LANGesFChown_Caption; + LANGFChown_OwnerFrame := LANGesFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGesFChown_GroupFrame; + LANGFChown_FileFrame := LANGesFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGesFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGesFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGesFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGesFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGesmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGesmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGesmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGesBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGesmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGesTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGesSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGesPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGesPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGesPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGesPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGesPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGesPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGesPreferences_NumHistoryItems; + LANGPreferences_Default := LANGesPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGesPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGesPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGesPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGesPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGesPreferences_Viewer; + LANGPreferences_Editor := LANGesPreferences_Editor; + LANGPreferences_Terminal := LANGesPreferences_Terminal; + LANGPreferences_ListFont := LANGesPreferences_ListFont; + LANGPreferences_Change := LANGesPreferences_Change; + LANGPreferences_UseDefaultFont := LANGesPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGesPreferences_Foreground; + LANGPreferences_Background := LANGesPreferences_Background; + LANGPreferences_NormalItem := LANGesPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGesPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGesPreferences_Cursor; + LANGPreferences_InactiveItem := LANGesPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGesPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGesPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGesPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGesPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGesPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGesPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGesPreferences_DefaultS; + LANGPreferences_SelectFont := LANGesPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGesBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGesUpButton_Tooltip; + LANGRootButton_Tooltip := LANGesRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGesHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGesLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGesRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGesmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGesmiTargetSource_Caption; + LANGFileTypeDirectory := LANGesFileTypeDirectory; + LANGFileTypeFile := LANGesFileTypeFile; + LANGFileTypeMetafile := LANGesFileTypeMetafile; + LANGPreferencesPanelsPage := LANGesPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGesPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGesPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGesPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGesPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGesPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGesPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGesPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGesPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGesPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGesPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGesPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGesPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGesPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGesPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGesPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGesPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGesPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGesPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGesPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGesPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGesPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGesPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGesPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGesPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGesPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGesPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGesPreferencesViewer; + LANGPreferencesCommandSC := LANGesPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGesPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGesPreferencesEditor; + LANGPreferencesTerminal := LANGesPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGesPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGesPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGesPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGesPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGesPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGesPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGesPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGesPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGesmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGesmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGesmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGesmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGesmnuNetworkCaption; + LANGmiConnectionsCaption := LANGesmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGesmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGesmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGesmnuPluginsCaption; + LANGmiTestPluginCaption := LANGesmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGesmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGesmiColumnsCaption; + LANGmiSavePositionCaption := LANGesmiSavePositionCaption; + LANGmiMountCaption := LANGesmiMountCaption; + LANGmiUmountCaption := LANGesmiUmountCaption; + LANGmiEjectCaption := LANGesmiEjectCaption; + LANGmiDuplicateTabCaption := LANGesmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGesmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGesmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGesCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGesCannotLoadFile; + LANGMountPointDevice := LANGesMountPointDevice; + LANGMountSC := LANGesMountSC; + LANGNoPluginsFound := LANGesNoPluginsFound; + LANGPluginAbout := LANGesPluginAbout; + LANGCouldntOpenURI := LANGesCouldntOpenURI; + LANGPluginAboutInside := LANGesPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGesAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGesCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGesThereIsNoModuleAvailable; + LANGIgnoreError := LANGesIgnoreError; + LANGErrorMount := LANGesErrorMount; + LANGErrorUmount := LANGesErrorUmount; + LANGErrorEject := LANGesErrorEject; + + LANGMounterPrefs_Caption := LANGesMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGesMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGesMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGesMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGesMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGesMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGesMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGesMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGesMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGesMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGesMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGesMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGesMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGesMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGesMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGesMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGesMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGesMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGesMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGesMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGesMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGesMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGesMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGesMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGesMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGesMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGesMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGesConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGesConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGesConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGesConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGesConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGesConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGesConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGesConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGesConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGesConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGesConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGesConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGesConnProp_FTP; + LANGConnProp_SFTP := LANGesConnProp_SFTP; + LANGConnProp_SMB := LANGesConnProp_SMB; + LANGConnProp_HTTP := LANGesConnProp_HTTP; + LANGConnProp_HTTPS := LANGesConnProp_HTTPS; + LANGConnProp_Other := LANGesConnProp_Other; + LANGConnProp_Caption := LANGesConnProp_Caption; + LANGConnProp_VFSModule := LANGesConnProp_VFSModule; + LANGConnProp_URI := LANGesConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGesConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGesConnProp_DetailedInformations; + LANGConnProp_Name := LANGesConnProp_Name; + LANGConnProp_Server := LANGesConnProp_Server; + LANGConnProp_Username := LANGesConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGesConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGesConnProp_Password; + LANGConnProp_TargetDirectory := LANGesConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGesConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGesConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGesConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGesConnLogin_Caption; + LANGConnLogin_Login := LANGesConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGesConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGesConnLogin_Username; + LANGConnLogin_Password := LANGesConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGesConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGesColumns_Caption; + LANGColumns_Title := LANGesColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGesColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGesColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGesColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGesColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGesColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGesColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGesColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGesColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGesColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGesColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGesColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGesColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGesColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGesColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGesColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGesColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGesColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGesColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGesColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGesColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGesColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGesColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGesTestPlugin_Caption; + LANGTestPlugin_Title := LANGesTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGesTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGesTestPlugin_Plugin; + LANGTestPlugin_Command := LANGesTestPlugin_Command; + LANGTestPlugin_Username := LANGesTestPlugin_Username; + LANGTestPlugin_Password := LANGesTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGesTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGesTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGesRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGesRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGesRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGesSearch_Bytes; + LANGSearch_kB := LANGesSearch_kB; + LANGSearch_MB := LANGesSearch_MB; + LANGSearch_days := LANGesSearch_days; + LANGSearch_weeks := LANGesSearch_weeks; + LANGSearch_months := LANGesSearch_months; + LANGSearch_years := LANGesSearch_years; + LANGSearch_Caption := LANGesSearch_Caption; + LANGSearch_General := LANGesSearch_General; + LANGSearch_Advanced := LANGesSearch_Advanced; + LANGSearch_SearchResults := LANGesSearch_SearchResults; + LANGSearch_SearchFor := LANGesSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGesSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGesSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGesSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGesSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGesSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGesSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGesSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGesSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGesSearch_Size; + LANGSearch_Date := LANGesSearch_Date; + LANGSearch_BiggerThan := LANGesSearch_BiggerThan; + LANGSearch_SmallerThan := LANGesSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGesSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGesSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGesSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGesSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGesSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGesSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGesSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGesSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGesSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGesSearch_StatusSC; + LANGSearch_Ready := LANGesSearch_Ready; + LANGSearch_PreparingToSearch := LANGesSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGesSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGesSearch_UserCancelled; + LANGSearch_SearchFinished := LANGesSearch_SearchFinished; + LANGSearch_FilesFound := LANGesSearch_FilesFound; + LANGSearch_And := LANGesSearch_And; + + LANGCloseOpenConnection := LANGesCloseOpenConnection; + LANGDuplicateTabWarning := LANGesDuplicateTabWarning; + LANGDontShowAgain := LANGesDontShowAgain; + LANGSwitchOtherPanelWarning := LANGesSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGesOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGesmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGesDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGesLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGesOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGesOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGesShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGesShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGesmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGesFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGesCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGesmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGesPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGesHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGesHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGesHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGesHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGesHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGesFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGesFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGesFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGesFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGesFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGesFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGesFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGesFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGesFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGesFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGesFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGesFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGesFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGesFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGesFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('ES', @SetTranslation); + AddTranslation('es_ES', @SetTranslation); +end. + diff --git a/translations/UTranslation_FR.pas b/translations/UTranslation_FR.pas new file mode 100644 index 0000000..46051b4 --- /dev/null +++ b/translations/UTranslation_FR.pas @@ -0,0 +1,1254 @@ +(* + Tux Commander - UTranslation_FR - French Localization constants + Copyright (C) 2004 by Marie-Agnes Pauchet-Le Hericy + 2007 by Stanislas Zeller + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_FR; + +interface + +implementation + +uses ULocale; + +const LANGfrF2Button_Caption = 'F2 - Renommer'; + LANGfrF3Button_Caption = 'F3 - Voir'; + LANGfrF4Button_Caption = 'F4 - Editer'; + LANGfrF5Button_Caption = 'F5 - Copier'; + LANGfrF6Button_Caption = 'F6 - Déplacer'; + LANGfrF7Button_Caption = 'F7 - Créer Rép.'; + LANGfrF8Button_Caption = 'F8 - Supprimer'; + + LANGfrmnuFile_Caption = '_Fichier'; + LANGfrmnuMark_Caption = '_Sélection'; + LANGfrmnuCommands_Caption = '_Commandes'; + LANGfrmnuHelp_Caption = '_Aide'; + LANGfrmiExit_Caption = '_Quitter'; + LANGfrmiSelectGroup_Caption = 'Sélectionner le _Groupe...'; + LANGfrmiUnselectGroup_Caption = '_Désélectionner le groupe...'; + LANGfrmiSelectAll_Caption = '_Sélectionner Tout'; + LANGfrmiUnselectAll_Caption = 'Désélectionner _Tout'; + LANGfrmiInvertSelection_Caption = '_Inverser la sélection'; + LANGfrmiRefresh_Caption = '_Rafraîchir'; + LANGfrmiAbout_Caption = '_A propos...'; + + LANGfrColumn1_Caption = 'Nom'; + LANGfrColumn2_Caption = 'Ext'; + LANGfrColumn3_Caption = 'Taille'; + LANGfrColumn4_Caption = 'Date'; + LANGfrColumn5_Caption = 'Attr'; + + LANGfrExpandSelection = 'Etendre la sélection'; + LANGfrShrinkSelection = 'Réduire la sélection'; + LANGfrNoMatchesFound = 'Aucune correspondance trouvée'; + LANGfrNoFilesSelected = 'Pas de fichier selectionné!'; + LANGfrSelectedFilesDirectories = '%d fichier(s)/répertoire(s) sélectionné(s)'; + LANGfrDirectoryS = 'répertoire %s'; + LANGfrFileS = 'fichier %s'; + LANGfrDoYouReallyWantToDeleteTheS = 'Voulez-vous vraiment supprimer le %s ?'; + LANGfrDoYouReallyWantToDeleteTheSS = 'Voulez-vous vraiment supprimer %s ?'#10'%s'; + LANGfrCopyFiles = 'Copier les fichiers'; + LANGfrMoveRenameFiles = 'Déplacer/Renommer les fichiers'; + LANGfrCopyDFileDirectoriesTo = 'Copier %d les fichiers/répertoires vers'; + LANGfrMoveRenameDFileDirectoriesTo = 'Déplacer/Renommer %d fichier(s)/répertoire(s) vers'; + LANGfrCopySC = 'Copier :'; + LANGfrMoveRenameSC = 'Déplacer/Renommer :'; + + LANGfrQuickFind = ' Recherche rapide '; + + LANGfrAboutString = 'Tux Commander'#10'Version %s'#10'date de fabrication : %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'Adresse de courriel : tbzatek@users.sourceforge.net'#10'site internet: http://tuxcmd.sourceforge.net/'; + LANGfrAboutStringGnome = 'version %s'#10'date de fabrication : %s'#10'site internet : http ://tuxcmd.sourceforge.net/'; + LANGfrDiskStatFmt = '%s de %s de libre'; + LANGfrDiskStatVolNameFmt = '[%s] %s de %s de libre'; + LANGfrStatusLineFmt = '%s de %s dans %d de %d fichiers sélectionnés'; + LANGfrPanelStrings : array[boolean] of string = ('droite', 'gauche'); + + LANGfrDIR = ''; + LANGfrErrorGettingListingForSPanel = 'liste impossible à obtenir dans le volet de %s :'#10' %s'#10#10'chemin = ''%s'''; + LANGfrErrorGettingListingForSPanelNoPath = 'liste impossible à obtenir dans le volet de %s :'#10' %s'; + LANGfrErrorCreatingNewDirectorySInSPanel = 'Impossible de créer un nouveau répertoire dans le volet de ''%s'' %s :'#10' %s'; + LANGfrErrorCreatingNewDirectorySInSPanelNoPath = 'Impossible de créer un nouveau répertoire dans le volet de %s :'#10' %s'; + LANGfrTheFileDirectory = 'Le fichier/répertoire'; + LANGfrCouldNotBeDeleted = 'n''a pas pu être supprimé'; + LANGfrCouldNotBeDeletedS = 'n''a pas pu être supprimé : %s'; + LANGfrUserCancelled = 'Annulation par l''utilisateur!'; + LANGfrTheDirectorySIsNotEmpty = 'Le répertoire %s n''est pas vide!'; + LANGfrCannotCopyFile = 'le fichier ne peut pas être copié'; + LANGfrCopyError = 'Erreur de copie'; + LANGfrMoveError = 'Erreur de déplacement'; + LANGfrOverwriteS = 'Ecraser : %s'; + LANGfrWithFileS = 'Avec fichier : %s'; + LANGfrOvewriteSBytesS = '%s octets, %s'; + LANGfrTheFile = 'Le Fichier'; + LANGfrCopy = 'Copier'; + LANGfrMove = 'Déplacer'; + LANGfrTheDirectory = 'Le répertoire'; + LANGfrTheSymbolicLink = 'Le lien symbolique'; + LANGfrCannotMoveFile = 'Le fichier ne peut être déplacé'; + LANGfrCouldNotBeCreated = 'ne peut pas être créé'; + LANGfrCouldNotBeCreatedS = 'ne peut pas être créé : %s'; + LANGfrFromS = 'De : %s'; + LANGfrToS = 'A: %s'; + LANGfrCannotCopyFileToItself = 'Impossible de copier le fichier sur lui-même'; + LANGfrMemoryAllocationFailed = 'Echec d''allocation de mémoire :'; + LANGfrCannotOpenSourceFile = 'Le fichier source n''a pas pu être ouvert'; + LANGfrCannotOpenDestinationFile = 'Le fichier cible n''a pas pu être ouvert'; + LANGfrCannotCloseDestinationFile = 'Le fichier cible n''a pas pu être fermé'; + LANGfrCannotCloseSourceFile = 'Le fichier source n''a pas pu être ouvert'; + LANGfrCannotReadFromSourceFile = 'Le fichier source n''a pas pu être lu'; + LANGfrCannotWriteToDestinationFile = 'on ne peut pas écrire dans le fichier cible'; + + LANGfrUnknownException = 'Exception Inconnue'; + LANGfrNoAccess = 'Pas d''accès'; + LANGfrUnknownError = 'Erreur inconnue'; + + LANGfrCreateANewDirectory = 'Créer un nouveau répertoire'; + LANGfrEnterDirectoryName = 'Entrer le nom du _répertoire :'; + + LANGfrOverwriteQuestion = 'Confirmation de suppression'; + LANGfrOverwriteButton_Caption = '_Ecrasement'; + LANGfrOverwriteAllButton_Caption = 'Tout _écraser'; + LANGfrSkipButton_Caption = '_Sauter'; + LANGfrOverwriteAllOlderButton_Caption = 'Ecraser tous les anciens'; + LANGfrSkipAllButton_Caption = 'Tout sauter'; + LANGfrRenameButton_Caption = '_Renommer'; + LANGfrAppendButton_Caption = 'A_jouter'; + LANGfrRename = 'Renommer'; + LANGfrRenameFile = 'Renommer le fichier ''%s'' en'; + LANGfrIgnoreButton_Caption = '_Ignorer'; + + LANGfrProgress = 'Progression'; + LANGfrCancel = '_Annuler'; + LANGfrDelete = 'Supprimer :'; + + LANGfrSpecifyFileType = '_Spécifier le type de fichier :'; + + LANGfrRemoveDirectory = 'Supprimer le répertoire'; + LANGfrDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Voulez-vous le supprimer ainsi que tous ses fichiers et sous-répertoires?'; + LANGfrRetry = '_Réessayer'; + LANGfrDeleteButton_Caption = '_Supprimer'; + LANGfrAll = '_Tout'; + + LANGfrCopyFilesSC = 'Copier les fichiers :'; + LANGfrAppendQuestion = 'Etes-vous sûr de vouloir ajouter le fichier ''%s'' à ''%s''?'; + LANGfrPreparingList = 'Préparation de la liste...'; + + LANGfrYouMustSelectAValidFile = 'Vous devez sélectionner un fichier valide!'; + LANGfrmiVerifyChecksums = '_Vérifier les sommes de contrôle'; + LANGfrVerifyChecksumsCaption = 'Vérifier les sommes de contrôle'; + LANGfrCheckButtonCaptionCheck = '_Contrôler'; + LANGfrCheckButtonCaptionStop = '_Arrêter'; + LANGfrFileListTooltip = '[?] - Non contrôlé'#10'[OK] - Somme de contrôle OK'#10'[FAUX] - Somme de contrôle FAUX'#10'[N/A] - Fichier indisponible'; + LANGfrFilenameColumnCaption = 'nom de fichier'; + LANGfrTheFileSYouAreTryingToOpenIsQuiteBig = 'Le fichier ''%s'' que vous essayez d''ouvrir est assez gros (%s octets). Sa somme de contrôle est peut être invalide.'#10#10'Voulez-vous tout de même le charger?'; + LANGfrAnErrorOccuredWhileInitializingMemoryBlock = 'Une erreur est survenue à l''initialisation du bloc mémoire. Fermez des fichiers avant de réessayer.'; + LANGfrAnErrorOccuredWhileOpeningFileSS = 'Une erreur est survenue à l''ouverture du fichier ''%s'' :'#10' %s'; + LANGfrAnErrorOccuredWhileReadingFileSS = 'Une erreur est survenue à la lecture du fichier ''%s'' :'#10' %s'; + LANGfrChecksumNotChecked = 'Statut : Non contrôlé'; + LANGfrChecksumChecking = 'Statut : contrôle en cours...'; + LANGfrChecksumInterrupted = 'Statut : Interrompu'; + LANGfrChecksumDOK = 'Statut : %d%% OK'; + + LANGfrmiCreateChecksumsCaption = '_Créer les sommes de contrôle...'; + LANGfrYouMustSelectAtLeastOneFileToCalculateChecksum = 'Vous devez sélectionner au moins un fichier pour pouvoir calculer la somme de contrôle!'; + LANGfrCreateChecksumsCaption = 'Créer les sommes de contrôle'; + LANGfrCCHKSUMPage1Text = 'Vous allez créer les sommes de contrôle pour'#10'les fichiers sélectionnés. Si vous n''avez pas sélectionné'#10'tous les fichiers souhaités, fermez cet assistant et'#10'sélectionnez d''autres fichiers'; + LANGfrCCHKSUMPage4Text = 'tout est prêt pour effectuer les sommes de contrôle pour vos'#10'fichiers sélectionnés. Ceci peut prendre quelques minutes.'#10'Cliquez sur suivant pour continuer.'; + LANGfrCCHKSUMPage6Text = 'Il y a eu des erreurs dans le calcul des sommes de contrôle :'; + LANGfrCCHKSUMPage7Text = 'La création de la somme de contrôle est terminée et'#10'vos fichiers sont prêts.'#10#10'Cliquer sur "Terminé" pour sortir.'; + LANGfrCCHKSUMPage1Title = 'Préparer les fichiers pour le calcul des sommes de contrôle'; + LANGfrCCHKSUMPage2Title = 'Sélectionner le type de somme de contrôle'; + LANGfrCCHKSUMPage3Title = 'Choisir le nom de fichier'; + LANGfrCCHKSUMPage4Title = 'prêt à contrôler'; + LANGfrCCHKSUMPage5Title = 'En cours...'; + LANGfrCCHKSUMPage6Title = 'Erreur!'; + LANGfrCCHKSUMPage7Title = 'Terminé'; + LANGfrCCHKSUMSFVFile = 'Fichier SFV '; + LANGfrCCHKSUMMD5sumFile = 'Fichier MD5sum'; + LANGfrCCHKSUMFileName = '_Nom de fichier :'; + LANGfrCCHKSUMCreateSeparateChecksumFiles = 'Créer des fichiers séparés de sommes de contrôle'; + LANGfrCCHKSUMNowProcessingFileS = 'En cours : %s'; + LANGfrCCHKSUMFinishCaption = '_Terminé'; + LANGfrCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Etes-vous sûr de vouloir annuler le processus?'; + LANGfrCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Une erreur est survenue lors de l''ouverture du fichier ''%s'' : %s'#10; + LANGfrCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Une erreur est survenue lors de la lecture du fichier ''%s'' : %s'#10; + LANGfrCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Une erreur est survenue lors de l''écriture du fichier ''%s'' : %s'#10; + + LANGfrAnErrorOccuredWhileWritingFileSS = 'Une erreur est survenue lors de l''écriture du fichier ''%s'' :'#10' %s'; + LANGfrTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Le fichier cible ''%s'' existe déjà. Voulez-vous l''écraser?'; + LANGfrTheTargetFileSCannotBeRemovedS = 'Le fichier cible ''%s''ne peut-être supprimé : %s'; + LANGfrMergeCaption = 'Fusionner'; + LANGfrPleaseInsertNextDiskOrGiveDifferentLocation = 'Veuillez insérer une nouvelle disquette ou préciser une autre destination :'; + LANGfrMergeOfSSucceeded = 'Fusion de ''%s'' réussie (Somme de contrôle CRC OK).'; + LANGfrWarningCreatedFileFailsCRCCheck = 'Attention : Le fichier créé ne répond pas au contrôle CRC !'; + LANGfrMergeOfSSucceeded_NoCRCFileAvailable = 'Fusion de ''%s'' réussie (pas de fichier CRC disponible).'; + LANGfrMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Fusionner ''%s'' et tous les fichiers avec noms d''ordre croissant dans le répertoire suivant:'; + LANGfrMergeSC = 'Fusionner :'; + LANGfrmiSplitFileCaption = '_Découper fichier...'; + LANGfrmiMergeFilesCaption = '_Fusionner fichiers...'; + + LANGfrSplitTheFileSToDirectory = '_Découper le fichier ''%s'' dans le répertoire :'; + LANGfrSplitSC = 'Découper :'; + LANGfrSplitFile = 'Découper le fichier'; + LANGfrBytesPerFile = '_Octets par fichier :'; + LANGfrAutomatic = 'Automatique'; + LANGfrDeleteFilesOnTargetDisk = '_Supprimer les fichiers sur la cible (pour les supports amovibles)'; + LANGfrSplitCaption = 'Découper'; + LANGfrCannotOpenFileS = 'Le fichier ne peut être ouvert ''%s'''; + LANGfrCannotSplitTheFileToMoreThan999Parts = 'Le fichier ne peut être découpé en plus de 999 parties!'; + LANGfrThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Il y a des fichiers dans le répertoire cible :'#10'%s'#10'Voulez-vous les supprimer?'; + LANGfrThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Il y a %d fichiers dans le répertoire cible. Voulez-vous les supprimer?'; + LANGfrAnErrorOccuredWhileOperationS = 'Une erreur est survenue pendant l''opération : %s'; + LANGfrSplitOfSSucceeded = 'Le découpage ''%s'' a réussi.'; + LANGfrSplitOfSFailed = 'Le découpage''%s'' a échoué!'; + + LANGfrmnuShow_Caption = 'Mon_trer'; + LANGfrmiShowDotFiles_Caption = '_Montrer les fichiers .dot '; + LANGfrTheFileYouAreTryingToOpenIsQuiteBig = 'Le fichier que vous essayez d''ouvrir est assez gros. Le charger dans une application externe (par ex. gedit) peut ralentir le système.'#10'Voulez-vous continuer?'; + LANGfrCannotExecuteSPleaseCheckTheConfiguration = 'Exécution impossible ''%s''. Veuillez vérifier la configuration ou définir correctement le type de fichier associé.'; + LANGfrEdit = 'Editer'; + LANGfrEnterFilenameToEdit = '_Entrer le nom de fichier à éditer :'; + + LANGfrmnuSettings_Caption = 'Co_nfiguration'; + LANGfrmiFileTypes_Caption = '_Types de fichiers...'; + LANGfrThereIsNoApplicationAssociatedWithS = 'Il n''y a pas d''application associée avec "%s".'#10#10'Vous pouvez configurer Tux Commander pour associer les applications avec les différents types de fichier. Voulez-vous associer une application avec ce type maintenant ?'; + LANGfrErrorExecutingCommand = 'Erreur en éxécutant la commande !'; + LANGfrEditFileTypesCaption = 'Editer les types de fichier'; + LANGfrTitleLabel_Caption = 'Configuration des types de fichier'; + LANGfrExtensionsColumn = 'Extensions'; + LANGfrDescriptionColumn = 'Description'; + LANGfrFileTypesList = 'Liste des types de fichier'; + LANGfrActionName = 'Nom action'; + LANGfrCommand = 'Commande'; + LANGfrSetDefaultActionButton_Caption = '_Définir comme par défaut'; + LANGfrRunInTerminalCheckBox_Caption = 'Exécuter dans un terminal'; + LANGfrAutodetectCheckBox_Caption = 'Autodétecter _l''application GUI'; + LANGfrBrowseButton_Caption = 'N_aviguer...'; + LANGfrCommandLabel_Caption = 'Co_mmande :'; + LANGfrDescriptionLabel_Caption = 'D_escription :'; + LANGfrFNameExtLabel_Caption = 'Ajouter extension :'; + LANGfrNotebookPageExtensions = 'type de fichier'; + LANGfrNotebookPageActions = 'Actions'; + LANGfrDefault = ' (par defaut)'; + LANGfrCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Les associations d''application avec les types de fichier ne peuvent être sauvagardées, parce que qu''une modification de ce fichier a entre temps été faite par un autre processus .'; + + LANGfrDefaultColor = 'couleur par défaut'; + LANGfrIcon = '_Icône :'; + LANGfrBrowseForIcon = 'Rechercher une icône'; + LANGfrSelectFileTypeColor = 'Sélectionner la couleur du type de fichier'; + LANGfrColor = 'Cou_leur :'; + + LANGfrmiChangePermissions_Caption = 'Changer les _autorisations...'; + LANGfrmiChangeOwner_Caption = 'Changer le _propriétaire/Groupe...'; + LANGfrmiCreateSymlink_Caption = 'Créer un _lien Symbolique...'; + LANGfrmiEditSymlink_Caption = '_Editer un lien Symbolique...'; + LANGfrChmodProgress = 'Changer les autorisations :'; + LANGfrChownProgress = 'Changer le propriétaire :'; + LANGfrYouMustSelectAValidSymbolicLink = 'Vous devez sélectionner un lien symbolique valide!'; + LANGfrPopupRunS = 'E_xecuter %s'; + LANGfrPopupOpenS = 'Ouvrir %s'; + LANGfrPopupGoUp = 'Remonter'; + LANGfrPopupOpenWithS = 'Ouvrir avec %s'; + LANGfrPopupDefault = ' (par défaut)'; + LANGfrPopupOpenWith = 'Ouvrir avec...'; + LANGfrPopupViewFile = 'Afficher le fichier'; + LANGfrPopupEditFile = 'Ed_iter le fichier'; + LANGfrPopupMakeSymlink = 'Créer un lien symbolique'; + LANGfrPopupRename = '_Renommer'; + LANGfrPopupDelete = '_Supprimer'; + LANGfrDialogChangePermissions = 'Changer les autorisations'; + LANGfrCouldNotBeChmoddedS = 'Ne peut pas changer les autorisations : %s'; + LANGfrDialogChangeOwner = 'Changer le propriétaire'; + LANGfrCouldNotBeChownedS = 'Ne peut pas changer le propriétaire : %s'; + LANGfrDialogMakeSymlink = 'Créer le lien symbolique'; + LANGfrDialogEditSymlink = 'Editer le lien symbolique'; + LANGfrFEditSymlink_Caption = 'Editer le lien symbolique'; + LANGfrFEditSymlink_SymbolicLinkFilename = 'Nom du lien symbolique :'; + LANGfrFEditSymlink_SymbolicLinkPointsTo = 'Le lien symbolique pointe vers :'; + + LANGfrFChmod_Caption = 'Autorisations d''accès'; + LANGfrFChmod_PermissionFrame = 'Autorisations'; + LANGfrFChmod_FileFrame = 'Fichier'; + LANGfrFChmod_ApplyRecursivelyFor = 'Appliquer récursivement'; + LANGfrFChmod_miAllFiles = 'Tous les fichiers et répertoires'; + LANGfrFChmod_miDirectories = 'Répertoires seulement'; + LANGfrFChmod_OctalLabel = '_Octal :'; + LANGfrFChmod_SUID = 'SUID - Exécution sous l''identifiant du propriétaire'; + LANGfrFChmod_SGID = 'SGID - Exécution sous l''identifiant de groupe du propriétaire'; + LANGfrFChmod_Sticky = 'Sticky bit'; + LANGfrFChmod_RUSR = 'RUSR - Lecture par le propriétaire'; + LANGfrFChmod_WUSR = 'WUSR - Ecriture par le propriétaire'; + LANGfrFChmod_XUSR = 'XUSR - Exécution/recherche par le propriétaire'; + LANGfrFChmod_RGRP = 'RGRP - Lecture par le groupe'; + LANGfrFChmod_WGRP = 'WGRP - Ecriture par le groupe'; + LANGfrFChmod_XGRP = 'XGRP - Exécution/recherche par le groupe'; + LANGfrFChmod_ROTH = 'ROTH - Lecture par les autres'; + LANGfrFChmod_WOTH = 'WOTH - Ecriture par les autres'; + LANGfrFChmod_XOTH = 'XOTH - Exécution/recherche par les autres'; + LANGfrFChmod_TextLabel = 'Texte : %s'; + LANGfrFChmod_FileLabel = 'Fichier : %s'#10'Texte : %s'#10 + + 'Octal : %d'#10'Propriétaire : %s'#10 + + 'Groupe : %s'; + + LANGfrFChown_Caption = 'Changer le propriétaire/groupe'; + LANGfrFChown_OwnerFrame = 'Nom d''utilisateur'; + LANGfrFChown_GroupFrame = 'Nom de groupe'; + LANGfrFChown_FileFrame = 'Fichier'; + LANGfrFChown_ApplyRecursively = 'Appliquer récursivement'; + + LANGfrFSymlink_Caption = 'Créer le lien symbolique'; + LANGfrFSymlink_ExistingFilename = 'Nom du fichier existant (vers lequel va pointer le lien symbolique) :'; + LANGfrFSymlink_SymlinkFilename = 'Nom du lien symbolique :'; + + LANGfrmnuBookmarks_Caption = '_Marque-pages'; + LANGfrmiAddBookmark_Caption = 'Ajouter un marque-page'; + LANGfrmiEditBookmarks_Caption = 'Editer les marque-pages'; + LANGfrBookmarkPopupDelete_Caption = 'Supprimer'; + LANGfrmiPreferences_Caption = '_Préférences...'; + LANGfrTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'le répertoire courant existe déjà dans la liste des marque-pages'; + LANGfrSomeOtherInstanceChanged = 'une autre instance de Tux Commander a déjà modifié la configuration. Voulez-vous appliquer les nouveaux paramètres?'#10#10'Attention : si vous cliquez sur NON maintenant, la configuration sera écrasée pour cette instance'' sortie!'; + + LANGfrPreferences_Caption = 'Préférences'; + LANGfrPreferences_TitleLabel_Caption = ' Préférences de l''application'; + LANGfrPreferences_GeneralPage = 'Général'; + LANGfrPreferences_FontsPage = 'Polices'; + LANGfrPreferences_ColorsPage = 'Couleurs'; + LANGfrPreferences_RowHeight = 'Hauteur de ligne :'; + LANGfrPreferences_NumHistoryItems = 'Eléments d''historique de la ligne de commande :'; + LANGfrPreferences_Default = 'par défaut'; + LANGfrPreferences_ClearReadonlyAttribute = 'Effacer l''attribut de lecture seule lors d''une copie à partir d''un CD-ROM'; + LANGfrPreferences_DisableMouseRenaming = 'Désactiver renommer avec la souris'; + LANGfrPreferences_ShowFiletypeIconsInList = 'Montrer les icônes de type de fichier'; + LANGfrPreferences_ExternalAppsLabel = ' programmes externes'; + LANGfrPreferences_Viewer = '_Visualiseur :'; + LANGfrPreferences_Editor = '_Editeur :'; + LANGfrPreferences_Terminal = '_Terminal :'; + LANGfrPreferences_ListFont = 'Liste de Polices :'; + LANGfrPreferences_Change = 'Changer...'; + LANGfrPreferences_UseDefaultFont = 'Utiliser _la fonte par défaut'; + LANGfrPreferences_Foreground = 'Avant-plan'; + LANGfrPreferences_Background = 'Arrière-plan'; + LANGfrPreferences_NormalItem = 'Elément Normal :'; + LANGfrPreferences_SetToDefaultToUseGTKThemeColors = 'Utiliser par défaut le thème GTK'; + LANGfrPreferences_Cursor = 'Curseur :'; + LANGfrPreferences_InactiveItem = 'Elément inactif :'; + LANGfrPreferences_SelectedItem = 'Elément sélectionné :'; + LANGfrPreferences_LinkItem = 'liens symboliques :'; + LANGfrPreferences_LinkItemHint = 'afficher par défaut les liens symboliques dans la couleur des éléments normaux'; + LANGfrPreferences_DotFileItem = 'Fichiers cachés :'; + LANGfrPreferences_DotFileItemHint = 'Afficher par défaut les fichiers cachés dans la couleur des éléments normaux'; + LANGfrPreferences_BrowseForApplication = 'Rechercher l''application'; + LANGfrPreferences_DefaultS = 'par défaut : %s'; + LANGfrPreferences_SelectFont = 'Sélectionner la fonte'; + +(*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGfrBookmarkButton_Tooltip = 'Afficher les marque-pages'; + LANGfrUpButton_Tooltip = 'Aller au répertoire parent'; + LANGfrRootButton_Tooltip = 'Aller au répertoire racine (/)'; + LANGfrHomeButton_Tooltip = 'Aller au répertoire home (/home/user)'; + LANGfrLeftEqualButton_Tooltip = 'Afficher le même répertoire dans le volet de droite'; + LANGfrRightEqualButton_Tooltip = 'Afficher le même répertoire dans le volet de gauche'; + LANGfrmiShowDirectorySizes_Caption = 'Afficher la taille des répertoires'; + LANGfrmiTargetSource_Caption = 'Cible = Source'; + LANGfrFileTypeDirectory = 'Répertoire'; + LANGfrFileTypeFile = 'Fichier'; + LANGfrFileTypeMetafile = 'Ceci est une méta-donnée générale'; + LANGfrPreferencesPanelsPage = 'Volets'; + LANGfrPreferencesApplicationsPage = 'Applications'; + LANGfrPreferencesExperimentalPage = 'Expérimental'; + LANGfrPreferencesSelectAllDirectoriesCheckBox_Caption = '"Sélectionner tout" inclut les répertoires'; + LANGfrPreferencesNewStyleAltOCheckBox_Caption = '_New style Alt+O'; + LANGfrPreferencesNewStyleAltOCheckBox_Tooltip = 'Rester dans le même répertoire si vous clonez ce répertoire dans le panel opposé en pressant Ctrl/Alt+O'; + LANGfrPreferencesShowFuncButtonsCheckBox_Caption = 'Afficher les boutons de touches de fonction'; + LANGfrPreferencesSizeFormatLabel_Caption = 'Format de taille:'; + LANGfrPreferencesmiSizeFormat1 = 'Système'; + LANGfrPreferencesmiSizeFormat6 = 'Groupé'; + LANGfrPreferencesAutodetectXApp = 'Autodétecter X app'; + LANGfrPreferencesAlwaysRunInTerminal = 'Toujours exécuter dans un terminal'; + LANGfrPreferencesNeverRunInTerminal = 'Ne jamais exécuter dans un terminal'; + LANGfrPreferencesCmdLineBehaviourLabel_Caption = 'Exécution à partir d''une ligne de commande:'; + LANGfrPreferencesFeatures = 'Fonctionnalités'; + LANGfrPreferencesDisableMouseRename_Tooltip = 'Vous pouvez utiliser Shift+F6 pour faire un renommage rapide'; + LANGfrPreferencesDisableFileTipsCheckBox_Caption = 'Désactiver les infobulles pour les fichiers'; + LANGfrPreferencesDisableFileTipsCheckBox_Tooltip = 'Ne pas afficher l''infobulle si le texte dans la colonne est tronqué'; + LANGfrPreferencesShow = 'Afficher'; + LANGfrPreferencesDirsInBoldCheckBox_Caption = 'Répertoires en gras'; + LANGfrPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Supprimer les crochets pour les répertoires'; + LANGfrPreferencesOctalPermissionsCheckBox_Caption = 'Afficher les autorisations en octal'; + LANGfrPreferencesOctalPermissionsCheckBox_Tooltip = 'Afficher les autorisations des fichiers/répertoires sous forme de nombre au lieu d''un texte(-rw-rw-rw-)'; + LANGfrPreferencesMovement = 'Déplacement'; + LANGfrPreferencesLynxLikeMotionCheckBox_Caption = 'Déplacement style Lynx'; + LANGfrPreferencesInsertMovesDownCheckBox_Caption = 'Déplacement vers le bas après '; + LANGfrPreferencesSpaceMovesDownCheckBox_Caption = 'Déplacement vers le bas après '; + LANGfrPreferencesViewer = 'Visionneuse'; + LANGfrPreferencesCommandSC = 'Commande:'; + LANGfrPreferencesUseInternalViewer = 'Utiliser la visionneuse interne'; + LANGfrPreferencesEditor = 'Editeur'; + LANGfrPreferencesTerminal = 'Terminal'; + LANGfrPreferencesExperimentalFeatures = 'Fonctionnalités expérimentales'; + LANGfrPreferencesExperimentalWarningLabel_Caption = 'Attention : Ces fonctionnalités sont en cours de développement et peuvent ne pas fonctionner correctement. Utilisez-les à vos risques et périls!'; + LANGfrPreferencesFocusRefreshCheckBox_Caption = 'Rafraîchit la fenêtre qui a le focus'; + LANGfrPreferencesFocusRefreshCheckBox_Tooltip = 'Le rafraîchissement du volet est très lent'; + LANGfrPreferencesWMCompatModeCheckBox_Caption = 'Mode de compatibilité _WM '; + LANGfrPreferencesWMCompatModeCheckBox_Tooltip = 'A utiliser si vous avez des problèmes de gestionnaire de fenêtres (par exemple si IceWM ne maximise pas les fenêtres correctement)'; + LANGfrPreferencesCompatUseLibcSystemCheckBox_Caption = 'Utiliser libc _system() pour l''exécution de programmes'; + LANGfrPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'A utiliser en cas de problèmes de gel ou de crash au lancement d''applications externes'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGfrmiSearchCaption2 = '_Chercher...'; + LANGfrmiNoMounterBarCaption = 'Cacher la barre de montage'; + LANGfrmiShowOneMounterBarCaption = 'Show _one mounter bar' ; + LANGfrmiShowTwoMounterBarCaption = 'Show _two mounter bars' ; + LANGfrmnuNetworkCaption = 'Rés_eau'; + LANGfrmiConnectionsCaption = '_Connections...'; + LANGfrmiOpenConnectionCaption = '_Ouvrir une connection...'; + LANGfrmiQuickConnectCaption = 'Connection _rapide...'; + LANGfrmnuPluginsCaption = 'Greff_ons'; + LANGfrmiTestPluginCaption = '_Tester un greffon'; + LANGfrmiMounterSettingsCaption = '_Paramètres de montage...'; + LANGfrmiColumnsCaption = 'P_aramètres des panels...'; + LANGfrmiSavePositionCaption = '_Sauver la position'; + LANGfrmiMountCaption = '_Monter'; + LANGfrmiUmountCaption = '_Démonter'; + LANGfrmiEjectCaption = '_Ejecter'; + LANGfrmiDuplicateTabCaption = 'Dupliquer l''onglet courant'; + LANGfrmiCloseTabCaption = 'Fermer l''onglet courant'; + LANGfrmiCloseAllTabsCaption = 'Fermer tous les onglets'; + LANGfrCannotDetermineDestinationEngine = 'Impossible de déterminer la destination. Vérifiez l''emplacement et réessayez.'; + LANGfrCannotLoadFile = 'Impossible de charger le fichier ''%s''. Vérifiez les permissions.'; + LANGfrMountPointDevice = 'Point de Montage: %s'#10'Périphérique: %s'; + LANGfrMountSC = 'Montage:'; + LANGfrNoPluginsFound = 'Aucuns greffons trouvés'; + LANGfrPluginAbout = 'A Propos...'; + LANGfrCouldntOpenURI = 'Impossible d''ouvrir l''URI spécifié. Please check the consistency of the resource identifier and the access permission.'; + LANGfrPluginAboutInside = 'Greffon: %s'#10#10'%s'#10'%s'; + LANGfrAreYouSureCloseAllTabs = 'Etes vous sur de vouloir fermer tous les onglets inactifs?'; + LANGfrCouldntOpenURIArchive = 'Impossible d''ouvrir l''archive. Please check consistency and access permissions.'; + LANGfrThereIsNoModuleAvailable = 'Il n''y a aucuns modules disponibles pouvant charger cette connection'; + LANGfrIgnoreError = 'Voulez-vous vraiment ignorer cette erreur? Le fichier source sera ensuite effacé!'; + LANGfrErrorMount = 'Erreur détectée pendant le montage du périphérique ''%s'':'#10#10; + LANGfrErrorUmount = 'Erreur détectée pendant le démontage du périphérique ''%s'':'#10#10; + LANGfrErrorEject = 'Erreur détectée pendant l''éjection du périphérique ''%s'':'#10#10; + + LANGfrMounterPrefs_Caption = 'Paramètres de montage'; + LANGfrMounterPrefs_TitleLabelCaption = 'Paramètres de Montage'; + LANGfrMounterPrefs_ListViewFrameCaption = 'Montage'; + LANGfrMounterPrefs_MountName = 'Nom de Montage'; + LANGfrMounterPrefs_MountPoint = 'Point de Montage'; + LANGfrMounterPrefs_Device = 'Périphérique'; + LANGfrMounterPrefs_MoveUpButtonTooltip = 'Vers le haut'; + LANGfrMounterPrefs_MoveDownButtonTooltip = 'Vers le bas'; + LANGfrMounterPrefs_UseFSTabDefaultsCheckBox = 'Utiliser le fichier _fstab par défaut'; + LANGfrMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'En cochant cette case, la barre de montage sera configurée par défaut avec les entrées trouvées dans le fichier /etc/fstab (fichier de système de montage)'; + LANGfrMounterPrefs_ToggleModeCheckBox = 'Les boutons restent en position actif quan_d ils sont montés'; + LANGfrMounterPrefs_ToggleModeCheckBoxTooltip = 'Si activé, les boutons de la barre de montage resteront actifs si le périphérique est monté; Un autre click permettra de les démonter (éjecter dans ce cas)'; + LANGfrMounterPrefs_PropertiesFrameCaption = 'Propriétés'; + LANGfrMounterPrefs_DisplayTextLabelCaption = '_Texte Affiché:'; + LANGfrMounterPrefs_MountPointLabelCaption = '_Point de Montage:'; + LANGfrMounterPrefs_MountDeviceLabelCaption = 'Périphéri_que:'; + LANGfrMounterPrefs_DeviceTypeLabelCaption = 'T_ype:'; + LANGfrMounterPrefs_miLocalDiskCaption = 'Disque Dur'; + LANGfrMounterPrefs_miRemovableCaption = 'Removable'; + LANGfrMounterPrefs_miCDCaption = 'Lecteur CD/DVD'; + LANGfrMounterPrefs_miFloppyCaption = 'Lecteur de Disquette'; + LANGfrMounterPrefs_miNetworkCaption = 'Réseau'; + LANGfrMounterPrefs_MountCommandLabelCaption = '_Commande Montage:'; + LANGfrMounterPrefs_UmountCommandLabelCaption = 'C_ommande Démontage:'; + LANGfrMounterPrefs_MountCommandEntryTooltip = 'Syntaxe: utiliser %dev pour la substitution du périphérique et %dir pour le point de montage ou ne rien mettre pour le montage par défault'#10'Note: attention aux commandes, Tux Commander peut planter!' + + #10'Example: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGfrMounterPrefs_UmountCommandEntryTooltip = 'Syntaxe: utiliser %dev pour la substitution du périphérique et %dir pour le point de montage ou ne rien mettre pour le montage par défault'#10'Example: smbumount $dir'; + LANGfrMounterPrefs_IconLabelCaption = '_Icone:'; + + LANGfrConnMgr_Caption = 'Ouvrir une Nouvelle Connection'; + LANGfrConnMgr_ConnectButton = 'Co_nnecter'; + LANGfrConnMgr_OpenConnection = 'Ouvrir une Connection'; + LANGfrConnMgr_NameColumn = 'Nom'; + LANGfrConnMgr_URIColumn = 'URI'; + LANGfrConnMgr_AddConnectionButtonCaption = '_Ajouter'; + LANGfrConnMgr_AddConnectionButtonTooltip = 'Ajouter une nouvelle connection'; + LANGfrConnMgr_EditButtonCaption = '_Editer...'; + LANGfrConnMgr_EditButtonTooltip = 'Editer la connection sélectionnée'; + LANGfrConnMgr_RemoveButtonCaption = '_Supprimer'; + LANGfrConnMgr_RemoveButtonTooltip = 'Supprimer la connection sélectionnée'; + LANGfrConnMgr_DoYouWantDelete = 'Voulez vous vraiment supprimer cette connection ''%s''?'; + + LANGfrConnProp_FTP = 'FTP'; + LANGfrConnProp_SFTP = 'SFTP (ssh subsystem)'; + LANGfrConnProp_SMB = 'Windows (SMB)'; + LANGfrConnProp_HTTP = 'WebDAV (HTTP)'; + LANGfrConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGfrConnProp_Other = 'Autre (à spécifier dans l''URI)'; + LANGfrConnProp_Caption = 'Propriétés de la Connection'; + LANGfrConnProp_VFSModule = 'Module _VFS:'; + LANGfrConnProp_URI = '_URI:'; + LANGfrConnProp_URIEntryTooltip = 'Un URI valable doit contenir un préfixe de service et une adresse serveur'; + LANGfrConnProp_DetailedInformations = 'Informations détaillées'; + LANGfrConnProp_Name = '_Nom:'; + LANGfrConnProp_Server = 'Ser_veur[:port]:'; + LANGfrConnProp_Username = 'U_tilisateur:'; + LANGfrConnProp_UserNameEntryTooltip = 'Ne rien mettre pour les utilisateurs anonymes'; + LANGfrConnProp_Password = 'Mot de _Passe:'; + LANGfrConnProp_TargetDirectory = 'Répertoire _Cible:'; + LANGfrConnProp_ServiceType = '_Services:'; + LANGfrConnProp_MaskPassword = '_Masquer le mot de passe'; + LANGfrConnProp_MenuItemCaption = 'Défaut (tous les modules appropriés)'; + + LANGfrConnLogin_Caption = 'Authentication requis'; + LANGfrConnLogin_Login = 'Login'; + LANGfrConnLogin_ExperimentalWarningLabelCaption = 'You must log in to access %s'; + LANGfrConnLogin_Username = '_Utilisateur:'; + LANGfrConnLogin_Password = 'Mot de _Passe:'; + LANGfrConnLogin_AnonymousCheckButton = '_Anonyme'; + + LANGfrColumns_Caption = 'Paramètres des Panels'; + LANGfrColumns_Title = 'Paramètres des Panels'; + LANGfrColumns_MoveUpButtonTooltip = 'Vers le haut'; + LANGfrColumns_MoveDownButtonTooltip = 'Vers le bas'; + LANGfrColumns_TitlesLongName = 'Nom'; + LANGfrColumns_TitlesLongNameExt = 'Nom + Extension'; + LANGfrColumns_TitlesLongExt = 'Extension'; + LANGfrColumns_TitlesLongSize = 'Taille'; + LANGfrColumns_TitlesLongDateTime = 'Date + Heure'; + LANGfrColumns_TitlesLongDate = 'Date'; + LANGfrColumns_TitlesLongTime = 'Heure'; + LANGfrColumns_TitlesLongUser = 'Utilisateur'; + LANGfrColumns_TitlesLongGroup = 'Groupe'; + LANGfrColumns_TitlesLongAttr = 'Attributs'; + LANGfrColumns_TitlesShortName = 'Nom'; + LANGfrColumns_TitlesShortNameExt = 'Nom'; + LANGfrColumns_TitlesShortExt = 'Ext'; + LANGfrColumns_TitlesShortSize = 'Taille'; + LANGfrColumns_TitlesShortDateTime = 'Date'; + LANGfrColumns_TitlesShortDate = 'Date'; + LANGfrColumns_TitlesShortTime = 'Heure'; + LANGfrColumns_TitlesShortUser = 'Utilisateur'; + LANGfrColumns_TitlesShortGroup = 'Groupe'; + LANGfrColumns_TitlesShortAttr = 'Attr'; + + LANGfrTestPlugin_Caption = 'Tester un Greffon VFS'; + LANGfrTestPlugin_Title = 'Tester un Greffon VFS'; + LANGfrTestPlugin_ExperimentalWarningLabelCaption = 'Avertissement: Le sous-sytème VFS et ses greffons sont encore en développement et contiennent des bugs. utilisez cette fonction à votre propres risques!'; + LANGfrTestPlugin_Plugin = '_Greffon:'; + LANGfrTestPlugin_Command = 'Co_mmande:'; + LANGfrTestPlugin_Username = '_Utilisateur:'; + LANGfrTestPlugin_Password = 'Mot de _Passe:'; + LANGfrTestPlugin_AnonymousCheckButton = 'Login _Anonyme (n''appelle pas VFSLogin)'; + LANGfrTestPlugin_NoPluginsFound = 'Pas de greffons trouvés'; + + LANGfrRemoteWait_Caption = 'Opération en cours'; + LANGfrRemoteWait_OperationInProgress = 'Opération en cours, veuillez patienter...'; + LANGfrRemoteWait_ItemsFound = 'Résultats: %d'; + + LANGfrSearch_Bytes = 'Bytes'; + LANGfrSearch_kB = 'kB'; + LANGfrSearch_MB = 'MB'; + LANGfrSearch_days = 'jours'; + LANGfrSearch_weeks = 'semaines'; + LANGfrSearch_months = 'mois'; + LANGfrSearch_years = 'années'; + LANGfrSearch_Caption = 'Fichiers Trouvés'; + LANGfrSearch_General = 'General'; + LANGfrSearch_Advanced = 'Avancé'; + LANGfrSearch_SearchResults = '_Résultats:'; + LANGfrSearch_SearchFor = 'Chercher _pour:'; + LANGfrSearch_FileMaskEntryTooltip = 'Astuce: Utiliser un point-virgule (";") pour spécifier les fichiers multiples à trouver'; + LANGfrSearch_SearchIn = 'Chercher _dans:'; + LANGfrSearch_SearchArchivesCheckButton = 'Chercher _archives'; + LANGfrSearch_FindText = 'Trouver _texte:'; + LANGfrSearch_FindTextEntryTooltip = 'Une entrée vide permet de ne pas chercher un texte spécifique'#10'Veuillez noter que nous utilisons le codage UTF-8 dans l''interface graphique'; + LANGfrSearch_CaseSensitiveCheckButton = 'Cas_e sensitive'; + LANGfrSearch_StayCurrentFSCheckButton = 'Inclure d''autres systèmes de fichiers'; + LANGfrSearch_CaseSensitiveMatchCheckButton = 'Ca_se sensitive'; + LANGfrSearch_Size = 'Taille'; + LANGfrSearch_Date = 'Date'; + LANGfrSearch_BiggerThan = '_Plus grand que'; + LANGfrSearch_SmallerThan = 'P_lus petit que'; + LANGfrSearch_ModifiedBetweenRadioButton = '_Modifié entre'; + LANGfrSearch_NotModifiedAfterRadioButton = '_Non-modifié après'; + LANGfrSearch_ModifiedLastRadioButton = 'Modifié dans dernier'; + LANGfrSearch_ModifiedNotLastRadionButton = 'Non-modifié dans dernier'; + LANGfrSearch_ModifiedBetweenEntry1 = '"utilisez ce format de date:" c'; + LANGfrSearch_ViewButtonCaption = '_Voir'; + LANGfrSearch_NewSearchButtonCaption = '_Nouvelle'; + LANGfrSearch_GoToFileButtonCaption = '_Aller'; + LANGfrSearch_FeedToListboxButtonCaption = 'Ajou_ter'; + LANGfrSearch_StatusSC = 'Status:'; + LANGfrSearch_Ready = 'Prêt.'; + LANGfrSearch_PreparingToSearch = 'Recherche en préparation.'; + LANGfrSearch_SearchInProgress = 'Recherche en cours:'; + LANGfrSearch_UserCancelled = 'Annulation par l''utilisateur.'; + LANGfrSearch_SearchFinished = 'Recherche terminée'; + LANGfrSearch_FilesFound = '%d fichiers trouvés'; + LANGfrSearch_And = 'et'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGfrCloseOpenConnection = 'Vous essayez d''ouvrir une nouvelle connection sur une connection déjà existante. En continuant, la précédente connection sera fermée et remplacée par la nouvelle demandée.'#10#10'Souhaitez vous continuer?'; + LANGfrDuplicateTabWarning = 'Vous essayez d''ouvrir un nouvel onglet à partir d''un répertoire distant. Cependant, l''action n''est pas supportée. Le répertoire dans le nouvel onglet pointera ver un système de fichier local.'; + LANGfrDontShowAgain = '_Ne plus montrer ce message'; + LANGfrSwitchOtherPanelWarning = 'Vous essayez d''ouvrir un répertoire distant dans le panel opposé. Cependant, l''action n''est pas supportée. Le répertoire cible ne sera pas ouvert.'; + LANGfrOpenConnectionsWarning = 'Des connections actives sont ouvertes dans le panel. En fermant l''application, ces connections seront déconnectées.'#10#10'Souhaitez vous quitter?'; + LANGfrmiDisconnect_Caption = '_Déconnecter'; + LANGfrDisconnectButton_Tooltip = 'Déconnecter la connection active'; + LANGfrLeaveArchiveButton_Tooltip = 'Fermer l''archive courante'; + LANGfrOpenTerminalButton_Tooltip = 'Ouvrir un nouveau terminal dans le répertoire courant'; + LANGfrOpenTerminalButton_Caption = 'Te_rminal'; + LANGfrShowTextUIDsCheckBox_Caption = 'Voir Texte _UIDs'; + LANGfrShowTextUIDsCheckBox_Tooltip = 'Voir les informations textuelles d''Utilisateur et Groupe à la place des nombres (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGfrmiNewTab_Caption = 'Nouvel On_glet'; + LANGfrFilePopupMenu_Properties = '_Propriétés'; + LANGfrCommandEntry_Tooltip = 'Use %s as file/directory placeholder'; + LANGfrmiFiles_Caption = 'Fichiers seulement'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGfrPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGfrHandleRunFromArchive_Bytes = 'bytes'; + LANGfrHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGfrHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGfrHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGfrHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGfrFRunFromVFS_Caption = 'Packed file properties'; + LANGfrFRunFromVFS_TitleLabel = 'File Properties'; + LANGfrFRunFromVFS_FileNameLabel = 'File name:'; + LANGfrFRunFromVFS_FileTypeLabel = 'File type:'; + LANGfrFRunFromVFS_SizeLabel = 'Size:'; + LANGfrFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGfrFRunFromVFS_DateLabel = 'Modify date:'; + LANGfrFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGfrFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGfrFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGfrFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGfrFSetPassword_Caption = 'Set password'; + LANGfrFSetPassword_Label1_Caption = 'Password required'; + LANGfrFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGfrFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGfrF2Button_Caption; + LANGF3Button_Caption := LANGfrF3Button_Caption; + LANGF4Button_Caption := LANGfrF4Button_Caption; + LANGF5Button_Caption := LANGfrF5Button_Caption; + LANGF6Button_Caption := LANGfrF6Button_Caption; + LANGF7Button_Caption := LANGfrF7Button_Caption; + LANGF8Button_Caption := LANGfrF8Button_Caption; + + LANGmnuFile_Caption := LANGfrmnuFile_Caption; + LANGmnuMark_Caption := LANGfrmnuMark_Caption; + LANGmnuCommands_Caption := LANGfrmnuCommands_Caption; + LANGmnuHelp_Caption := LANGfrmnuHelp_Caption; + LANGmiExit_Caption := LANGfrmiExit_Caption; + LANGmiSelectGroup_Caption := LANGfrmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGfrmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGfrmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGfrmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGfrmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGfrmiRefresh_Caption; + LANGmiAbout_Caption := LANGfrmiAbout_Caption; + + LANGColumn1_Caption := LANGfrColumn1_Caption; + LANGColumn2_Caption := LANGfrColumn2_Caption; + LANGColumn3_Caption := LANGfrColumn3_Caption; + LANGColumn4_Caption := LANGfrColumn4_Caption; + LANGColumn5_Caption := LANGfrColumn5_Caption; + + LANGExpandSelection := LANGfrExpandSelection; + LANGShrinkSelection := LANGfrShrinkSelection; + LANGNoMatchesFound := LANGfrNoMatchesFound; + LANGNoFilesSelected := LANGfrNoFilesSelected; + LANGSelectedFilesDirectories := LANGfrSelectedFilesDirectories; + LANGDirectoryS := LANGfrDirectoryS; + LANGFileS := LANGfrFileS; + LANGDoYouReallyWantToDeleteTheS := LANGfrDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGfrDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGfrCopyFiles; + LANGMoveRenameFiles := LANGfrMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGfrCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGfrMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGfrCopySC; + LANGMoveRenameSC := LANGfrMoveRenameSC; + + LANGQuickFind := LANGfrQuickFind; + + LANGAboutString := LANGfrAboutString; + LANGAboutStringGnome := LANGfrAboutStringGnome; + LANGDiskStatFmt := LANGfrDiskStatFmt; + LANGDiskStatVolNameFmt := LANGfrDiskStatVolNameFmt; + LANGStatusLineFmt := LANGfrStatusLineFmt; + LANGPanelStrings[False] := LANGfrPanelStrings[False]; + LANGPanelStrings[True] := LANGfrPanelStrings[True]; + LANGDIR := LANGfrDIR; + LANGErrorGettingListingForSPanel := LANGfrErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGfrErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGfrErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGfrErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGfrTheFileDirectory; + LANGCouldNotBeDeleted := LANGfrCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGfrCouldNotBeDeletedS; + LANGUserCancelled := LANGfrUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGfrTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGfrCannotCopyFile; + LANGCopyError := LANGfrCopyError; + LANGMoveError := LANGfrMoveError; + LANGOverwriteS := LANGfrOverwriteS; + LANGWithFileS := LANGfrWithFileS; + LANGOvewriteSBytesS := LANGfrOvewriteSBytesS; + LANGTheFile := LANGfrTheFile; + LANGCopy := LANGfrCopy; + LANGMove := LANGfrMove; + LANGTheDirectory := LANGfrTheDirectory; + LANGTheSymbolicLink := LANGfrTheSymbolicLink; + LANGCannotMoveFile := LANGfrCannotMoveFile; + LANGCouldNotBeCreated := LANGfrCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGfrCouldNotBeCreatedS; + LANGFromS := LANGfrFromS; + LANGToS := LANGfrToS; + LANGCannotCopyFileToItself := LANGfrCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGfrMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGfrCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGfrCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGfrCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGfrCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGfrCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGfrCannotWriteToDestinationFile; + + LANGUnknownException := LANGfrUnknownException; + LANGNoAccess := LANGfrNoAccess; + LANGUnknownError := LANGfrUnknownError; + + LANGCreateANewDirectory := LANGfrCreateANewDirectory; + LANGEnterDirectoryName := LANGfrEnterDirectoryName; + + LANGOverwriteQuestion := LANGfrOverwriteQuestion; + LANGOverwriteButton_Caption := LANGfrOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGfrOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGfrSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGfrOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGfrSkipAllButton_Caption; + LANGRenameButton_Caption := LANGfrRenameButton_Caption; + LANGAppendButton_Caption := LANGfrAppendButton_Caption; + LANGRename := LANGfrRename; + LANGRenameFile := LANGfrRenameFile; + LANGIgnoreButton_Caption := LANGfrIgnoreButton_Caption; + + LANGProgress := LANGfrProgress; + LANGCancel := LANGfrCancel; + LANGDelete := LANGfrDelete; + + LANGSpecifyFileType := LANGfrSpecifyFileType; + + LANGRemoveDirectory := LANGfrRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGfrDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGfrRetry; + LANGDeleteButton_Caption := LANGfrDeleteButton_Caption; + LANGAll := LANGfrAll; + + LANGCopyFilesSC := LANGfrCopyFilesSC; + LANGAppendQuestion := LANGfrAppendQuestion; + LANGPreparingList := LANGfrPreparingList; + + LANGYouMustSelectAValidFile := LANGfrYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGfrmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGfrVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGfrCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGfrCheckButtonCaptionStop; + LANGFileListTooltip := LANGfrFileListTooltip; + LANGFilenameColumnCaption := LANGfrFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGfrTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGfrAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGfrAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGfrAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGfrChecksumNotChecked; + LANGChecksumChecking := LANGfrChecksumChecking; + LANGChecksumInterrupted := LANGfrChecksumInterrupted; + LANGChecksumDOK := LANGfrChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGfrmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGfrYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGfrCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGfrCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGfrCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGfrCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGfrCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGfrCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGfrCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGfrCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGfrCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGfrCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGfrCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGfrCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGfrCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGfrCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGfrCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGfrCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGfrCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGfrCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGfrCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGfrCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGfrCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGfrCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGfrAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGfrTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGfrTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGfrMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGfrPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGfrMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGfrWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGfrMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGfrMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGfrMergeSC; + LANGmiSplitFileCaption := LANGfrmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGfrmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGfrSplitTheFileSToDirectory; + LANGSplitSC := LANGfrSplitSC; + LANGSplitFile := LANGfrSplitFile; + LANGBytesPerFile := LANGfrBytesPerFile; + LANGAutomatic := LANGfrAutomatic; + LANGDeleteFilesOnTargetDisk := LANGfrDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGfrSplitCaption; + LANGCannotOpenFileS := LANGfrCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGfrCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGfrThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGfrThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGfrAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGfrSplitOfSSucceeded; + LANGSplitOfSFailed := LANGfrSplitOfSFailed; + + LANGmnuShow_Caption := LANGfrmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGfrmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGfrTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGfrCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGfrEdit; + LANGenterFilenameToEdit := LANGfrEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGfrmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGfrmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGfrThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGfrErrorExecutingCommand; + LANGEditFileTypesCaption := LANGfrEditFileTypesCaption; + LANGTitleLabel_Caption := LANGfrTitleLabel_Caption; + LANGExtensionsColumn := LANGfrExtensionsColumn; + LANGDescriptionColumn := LANGfrDescriptionColumn; + LANGFileTypesList := LANGfrFileTypesList; + LANGActionName := LANGfrActionName; + LANGCommand := LANGfrCommand; + LANGSetDefaultActionButton_Caption := LANGfrSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGfrRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGfrAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGfrBrowseButton_Caption; + LANGCommandLabel_Caption := LANGfrCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGfrDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGfrFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGfrNotebookPageExtensions; + LANGNotebookPageActions := LANGfrNotebookPageActions; + LANGDefault := LANGfrDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGfrCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGfrDefaultColor; + LANGIcon := LANGfrIcon; + LANGBrowseForIcon := LANGfrBrowseForIcon; + LANGSelectFileTypeColor := LANGfrSelectFileTypeColor; + LANGColor := LANGfrColor; + + LANGmiChangePermissions_Caption := LANGfrmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGfrmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGfrmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGfrmiEditSymlink_Caption; + LANGChmodProgress := LANGfrChmodProgress; + LANGChownProgress := LANGfrChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGfrYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGfrPopupRunS; + LANGPopupOpenS := LANGfrPopupOpenS; + LANGPopupGoUp := LANGfrPopupGoUp; + LANGPopupOpenWithS := LANGfrPopupOpenWithS; + LANGPopupDefault := LANGfrPopupDefault; + LANGPopupOpenWith := LANGfrPopupOpenWith; + LANGPopupViewFile := LANGfrPopupViewFile; + LANGPopupEditFile := LANGfrPopupEditFile; + LANGPopupMakeSymlink := LANGfrPopupMakeSymlink; + LANGPopupRename := LANGfrPopupRename; + LANGPopupDelete := LANGfrPopupDelete; + LANGDialogChangePermissions := LANGfrDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGfrCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGfrDialogChangeOwner; + LANGCouldNotBeChownedS := LANGfrCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGfrDialogMakeSymlink; + LANGDialogEditSymlink := LANGfrDialogEditSymlink; + LANGFEditSymlink_Caption := LANGfrFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGfrFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGfrFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGfrFChmod_Caption; + LANGFChmod_PermissionFrame := LANGfrFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGfrFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGfrFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGfrFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGfrFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGfrFChmod_OctalLabel; + LANGFChmod_SUID := LANGfrFChmod_SUID; + LANGFChmod_SGID := LANGfrFChmod_SGID; + LANGFChmod_Sticky := LANGfrFChmod_Sticky; + LANGFChmod_RUSR := LANGfrFChmod_RUSR; + LANGFChmod_WUSR := LANGfrFChmod_WUSR; + LANGFChmod_XUSR := LANGfrFChmod_XUSR; + LANGFChmod_RGRP := LANGfrFChmod_RGRP; + LANGFChmod_WGRP := LANGfrFChmod_WGRP; + LANGFChmod_XGRP := LANGfrFChmod_XGRP; + LANGFChmod_ROTH := LANGfrFChmod_ROTH; + LANGFChmod_WOTH := LANGfrFChmod_WOTH; + LANGFChmod_XOTH := LANGfrFChmod_XOTH; + LANGFChmod_TextLabel := LANGfrFChmod_TextLabel; + LANGFChmod_FileLabel := LANGfrFChmod_FileLabel; + LANGFChown_Caption := LANGfrFChown_Caption; + LANGFChown_OwnerFrame := LANGfrFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGfrFChown_GroupFrame; + LANGFChown_FileFrame := LANGfrFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGfrFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGfrFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGfrFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGfrFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGfrmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGfrmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGfrmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGfrBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGfrmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGfrTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGfrSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGfrPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGfrPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGfrPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGfrPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGfrPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGfrPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGfrPreferences_NumHistoryItems; + LANGPreferences_Default := LANGfrPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGfrPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGfrPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGfrPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGfrPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGfrPreferences_Viewer; + LANGPreferences_Editor := LANGfrPreferences_Editor; + LANGPreferences_Terminal := LANGfrPreferences_Terminal; + LANGPreferences_ListFont := LANGfrPreferences_ListFont; + LANGPreferences_Change := LANGfrPreferences_Change; + LANGPreferences_UseDefaultFont := LANGfrPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGfrPreferences_Foreground; + LANGPreferences_Background := LANGfrPreferences_Background; + LANGPreferences_NormalItem := LANGfrPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGfrPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGfrPreferences_Cursor; + LANGPreferences_InactiveItem := LANGfrPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGfrPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGfrPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGfrPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGfrPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGfrPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGfrPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGfrPreferences_DefaultS; + LANGPreferences_SelectFont := LANGfrPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGfrBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGfrUpButton_Tooltip; + LANGRootButton_Tooltip := LANGfrRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGfrHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGfrLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGfrRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGfrmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGfrmiTargetSource_Caption; + LANGFileTypeDirectory := LANGfrFileTypeDirectory; + LANGFileTypeFile := LANGfrFileTypeFile; + LANGFileTypeMetafile := LANGfrFileTypeMetafile; + LANGPreferencesPanelsPage := LANGfrPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGfrPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGfrPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGfrPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGfrPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGfrPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGfrPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGfrPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGfrPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGfrPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGfrPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGfrPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGfrPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGfrPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGfrPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGfrPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGfrPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGfrPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGfrPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGfrPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGfrPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGfrPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGfrPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGfrPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGfrPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGfrPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGfrPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGfrPreferencesViewer; + LANGPreferencesCommandSC := LANGfrPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGfrPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGfrPreferencesEditor; + LANGPreferencesTerminal := LANGfrPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGfrPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGfrPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGfrPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGfrPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGfrPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGfrPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGfrPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGfrPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGfrmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGfrmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGfrmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGfrmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGfrmnuNetworkCaption; + LANGmiConnectionsCaption := LANGfrmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGfrmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGfrmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGfrmnuPluginsCaption; + LANGmiTestPluginCaption := LANGfrmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGfrmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGfrmiColumnsCaption; + LANGmiSavePositionCaption := LANGfrmiSavePositionCaption; + LANGmiMountCaption := LANGfrmiMountCaption; + LANGmiUmountCaption := LANGfrmiUmountCaption; + LANGmiEjectCaption := LANGfrmiEjectCaption; + LANGmiDuplicateTabCaption := LANGfrmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGfrmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGfrmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGfrCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGfrCannotLoadFile; + LANGMountPointDevice := LANGfrMountPointDevice; + LANGMountSC := LANGfrMountSC; + LANGNoPluginsFound := LANGfrNoPluginsFound; + LANGPluginAbout := LANGfrPluginAbout; + LANGCouldntOpenURI := LANGfrCouldntOpenURI; + LANGPluginAboutInside := LANGfrPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGfrAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGfrCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGfrThereIsNoModuleAvailable; + LANGIgnoreError := LANGfrIgnoreError; + LANGErrorMount := LANGfrErrorMount; + LANGErrorUmount := LANGfrErrorUmount; + LANGErrorEject := LANGfrErrorEject; + + LANGMounterPrefs_Caption := LANGfrMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGfrMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGfrMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGfrMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGfrMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGfrMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGfrMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGfrMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGfrMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGfrMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGfrMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGfrMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGfrMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGfrMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGfrMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGfrMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGfrMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGfrMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGfrMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGfrMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGfrMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGfrMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGfrMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGfrMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGfrMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGfrMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGfrMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGfrConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGfrConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGfrConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGfrConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGfrConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGfrConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGfrConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGfrConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGfrConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGfrConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGfrConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGfrConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGfrConnProp_FTP; + LANGConnProp_SFTP := LANGfrConnProp_SFTP; + LANGConnProp_SMB := LANGfrConnProp_SMB; + LANGConnProp_HTTP := LANGfrConnProp_HTTP; + LANGConnProp_HTTPS := LANGfrConnProp_HTTPS; + LANGConnProp_Other := LANGfrConnProp_Other; + LANGConnProp_Caption := LANGfrConnProp_Caption; + LANGConnProp_VFSModule := LANGfrConnProp_VFSModule; + LANGConnProp_URI := LANGfrConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGfrConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGfrConnProp_DetailedInformations; + LANGConnProp_Name := LANGfrConnProp_Name; + LANGConnProp_Server := LANGfrConnProp_Server; + LANGConnProp_Username := LANGfrConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGfrConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGfrConnProp_Password; + LANGConnProp_TargetDirectory := LANGfrConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGfrConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGfrConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGfrConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGfrConnLogin_Caption; + LANGConnLogin_Login := LANGfrConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGfrConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGfrConnLogin_Username; + LANGConnLogin_Password := LANGfrConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGfrConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGfrColumns_Caption; + LANGColumns_Title := LANGfrColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGfrColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGfrColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGfrColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGfrColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGfrColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGfrColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGfrColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGfrColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGfrColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGfrColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGfrColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGfrColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGfrColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGfrColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGfrColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGfrColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGfrColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGfrColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGfrColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGfrColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGfrColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGfrColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGfrTestPlugin_Caption; + LANGTestPlugin_Title := LANGfrTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGfrTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGfrTestPlugin_Plugin; + LANGTestPlugin_Command := LANGfrTestPlugin_Command; + LANGTestPlugin_Username := LANGfrTestPlugin_Username; + LANGTestPlugin_Password := LANGfrTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGfrTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGfrTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGfrRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGfrRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGfrRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGfrSearch_Bytes; + LANGSearch_kB := LANGfrSearch_kB; + LANGSearch_MB := LANGfrSearch_MB; + LANGSearch_days := LANGfrSearch_days; + LANGSearch_weeks := LANGfrSearch_weeks; + LANGSearch_months := LANGfrSearch_months; + LANGSearch_years := LANGfrSearch_years; + LANGSearch_Caption := LANGfrSearch_Caption; + LANGSearch_General := LANGfrSearch_General; + LANGSearch_Advanced := LANGfrSearch_Advanced; + LANGSearch_SearchResults := LANGfrSearch_SearchResults; + LANGSearch_SearchFor := LANGfrSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGfrSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGfrSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGfrSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGfrSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGfrSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGfrSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGfrSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGfrSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGfrSearch_Size; + LANGSearch_Date := LANGfrSearch_Date; + LANGSearch_BiggerThan := LANGfrSearch_BiggerThan; + LANGSearch_SmallerThan := LANGfrSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGfrSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGfrSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGfrSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGfrSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGfrSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGfrSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGfrSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGfrSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGfrSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGfrSearch_StatusSC; + LANGSearch_Ready := LANGfrSearch_Ready; + LANGSearch_PreparingToSearch := LANGfrSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGfrSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGfrSearch_UserCancelled; + LANGSearch_SearchFinished := LANGfrSearch_SearchFinished; + LANGSearch_FilesFound := LANGfrSearch_FilesFound; + LANGSearch_And := LANGfrSearch_And; + + LANGCloseOpenConnection := LANGfrCloseOpenConnection; + LANGDuplicateTabWarning := LANGfrDuplicateTabWarning; + LANGDontShowAgain := LANGfrDontShowAgain; + LANGSwitchOtherPanelWarning := LANGfrSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGfrOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGfrmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGfrDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGfrLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGfrOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGfrOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGfrShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGfrShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGfrmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGfrFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGfrCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGfrmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGfrPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGfrHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGfrHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGfrHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGfrHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGfrHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGfrFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGfrFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGfrFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGfrFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGfrFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGfrFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGfrFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGfrFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGfrFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGfrFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGfrFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGfrFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGfrFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGfrFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGfrFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('FR', @SetTranslation); + AddTranslation('fr_FR', @SetTranslation); +end. diff --git a/translations/UTranslation_HU.pas b/translations/UTranslation_HU.pas new file mode 100644 index 0000000..a9a72cc --- /dev/null +++ b/translations/UTranslation_HU.pas @@ -0,0 +1,1256 @@ +(* + Tux Commander - UTranslation_HU - Hungarian Localization constants + Copyright (C) 2007 Marian Kepesi + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_HU; + +interface + +implementation + +uses ULocale; + +const LANGhuF2Button_Caption = 'F2 - Átnevezés'; + LANGhuF3Button_Caption = 'F3 - Megtekintés'; + LANGhuF4Button_Caption = 'F4 - Módosítás'; + LANGhuF5Button_Caption = 'F5 - Másolás'; + LANGhuF6Button_Caption = 'F6 - Áthelyezés'; + LANGhuF7Button_Caption = 'F7 - Új könyvtár'; + LANGhuF8Button_Caption = 'F8 - Törlés'; + + LANGhumnuFile_Caption = '_Fájl'; + LANGhumnuMark_Caption = '_Kijelölés'; + LANGhumnuCommands_Caption = '_Utasítások'; + LANGhumnuHelp_Caption = '_Súgó'; + LANGhumiExit_Caption = 'Ki_lépés'; + LANGhumiSelectGroup_Caption = '_Csoport kijelölése...'; + LANGhumiUnselectGroup_Caption = 'Kijelölt fájl _visszavonása...'; + LANGhumiSelectAll_Caption = '_Mindent kijelöl'; + LANGhumiUnselectAll_Caption = 'Min_dent visszavon'; + LANGhumiInvertSelection_Caption = '_Inverz kijelölés'; + LANGhumiRefresh_Caption = 'Új_ratölt'; + LANGhumiAbout_Caption = '_Névjegy...'; + + LANGhuColumn1_Caption = 'Név'; + LANGhuColumn2_Caption = 'Kiterjesztés'; + LANGhuColumn3_Caption = 'Méret'; + LANGhuColumn4_Caption = 'Dátum'; + LANGhuColumn5_Caption = 'Attribútum'; + + LANGhuExpandSelection = 'Kiválasztás bövítese'; + LANGhuShrinkSelection = 'Kiválasztás szükítese'; + LANGhuNoMatchesFound = 'Nincs találat'; + LANGhuNoFilesSelected = 'Nincs megjelölve fájl!'; + LANGhuSelectedFilesDirectories = '%d kijelölt fájl/könyvtár'; + LANGhuDirectoryS = 'könyvtár %s'; + LANGhuFileS = 'fájl %s'; + LANGhuDoYouReallyWantToDeleteTheS = 'Valóban eltávolítani kívanja a %s -t?'; + LANGhuDoYouReallyWantToDeleteTheSS = 'Valóban eltávolítani kívanja a %s -t?'#10'%s'; + LANGhuCopyFiles = 'Fájlok másolása'; + LANGhuMoveRenameFiles = 'Fájlok áthelyezése/átnevezése'; + LANGhuCopyDFileDirectoriesTo = '%d fájl/könyvtár másolása ide:'; + LANGhuMoveRenameDFileDirectoriesTo = '%d fájl áthelyezése/átnevezése ide:'; + LANGhuCopySC = 'Másolni:'; + LANGhuMoveRenameSC = 'Áthelyezni/átnevezni'; + + LANGhuQuickFind = ' Kikeresni:'; + + LANGhuAboutString = 'Tux Commander'#10'Verzió %s'#10'Megírásának dátuma: %s'#10#10'Copyright (c) 2008 Tomáš Bžatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'WWW-lap: http://tuxcmd.sourceforge.net/'; + LANGhuAboutStringGnome = 'verzió %s'#10'Megírásának dátuma: %s'#10'WWW-lap: http://tuxcmd.sourceforge.net/'; + LANGhuDiskStatFmt = '%s a %s -ból szabad'; + LANGhuDiskStatVolNameFmt = '[%s] %s a %s-ból szabad'; + LANGhuStatusLineFmt = '%s a %s-ból és %d a %d fájlból kijelölve'; + LANGhuPanelStrings : array[boolean] of string = ('jobb','bal'); + + LANGhuDIR = ''; + LANGhuErrorGettingListingForSPanel = 'Könyvtár megnyitási hiba a %s ablakban:'#10' %s'#10#10'Útvonal = ''%s'''; + LANGhuErrorGettingListingForSPanelNoPath = 'Könyvtár megnyitási hiba a %s ablakban'#10' %s'; + LANGhuErrorCreatingNewDirectorySInSPanel = 'A ''%s'' könyvtárat nem lehet létrehozni a %s ablakban:'#10' %s'; + LANGhuErrorCreatingNewDirectorySInSPanelNoPath = 'A ''%s'' könyvtárat nem lehet létrehozni a %s ablakban:'#10' %s'; + LANGhuTheFileDirectory = 'Fájl/könyvtár'; + LANGhuCouldNotBeDeleted = 'nem sikerült törölni'; + LANGhuCouldNotBeDeletedS = 'nem sikerült törölni: %s'; + LANGhuUserCancelled = 'Operáció megszakítva!'; + LANGhuTheDirectorySIsNotEmpty = 'A %s könyvtár nem üres!'; + LANGhuCannotCopyFile = 'A fájl nem másolható'; + LANGhuCopyError = 'Másolási hiba'; + LANGhuMoveError = 'Áthelyezési hiba'; + LANGhuOverwriteS = 'Felülírni: %s'; + LANGhuWithFileS = 'a %s fájllal'; + LANGhuOvewriteSBytesS = '%s byte, %s'; + LANGhuTheFile = 'Fájl'; + LANGhuCopy = 'Másolás'; + LANGhuMove = 'Áthelyezés'; + LANGhuTheDirectory = 'Könyvtár'; + LANGhuTheSymbolicLink = 'Szimbolikus hivatkozás'; + LANGhuCannotMoveFile = 'Nem lehet áthelyezni a fájlot'; + LANGhuCouldNotBeCreated = 'nem sikerült létrehozni'; + LANGhuCouldNotBeCreatedS = 'nem sikerült létrehozni %s'; + LANGhuFromS = 'innen: %s'; + LANGhuToS = 'ide: %s'; + LANGhuCannotCopyFileToItself = 'A forrás- és célállomány megegyezik (ugyanaz)!'; + LANGhuMemoryAllocationFailed = 'Memória allokációs hiba:'; + LANGhuCannotOpenSourceFile = 'Nem sikerült megnyitni a forrásállományt'; + LANGhuCannotOpenDestinationFile = 'Nem sikerült megnyitni a célállományt'; + LANGhuCannotCloseDestinationFile = 'Nem sikerült bezárni a célállományt'; + LANGhuCannotCloseSourceFile = 'Nem sikerült bezárni a forrásállományt'; + LANGhuCannotReadFromSourceFile = 'A forrásállomány nem olvasható'; + LANGhuCannotWriteToDestinationFile = 'A célállomány nem írható'; + + LANGhuUnknownException = 'Ismeretlen hiba'; + LANGhuNoAccess = 'Hozzáférés elutasítva'; + LANGhuUnknownError = 'Ismeretlen hiba'; + + LANGhuCreateANewDirectory = 'Új könyvtár létrehozása'; + LANGhuEnterDirectoryName = 'Adja be a könyvtár _nevét:'; + + LANGhuOverwriteQuestion = 'Felülírás jóváhagyása'; + LANGhuOverwriteButton_Caption = '_Felülírni'; + LANGhuOverwriteAllButton_Caption = '_Mindet felülírni'; + LANGhuSkipButton_Caption = 'Á_tugorni'; + LANGhuOverwriteAllOlderButton_Caption = 'Minden _régebbi felülírása'; + LANGhuSkipAllButton_Caption = '_Kihagy mindent'; + LANGhuRenameButton_Caption = 'Átneve_zni'; + LANGhuAppendButton_Caption = '_Hozzácsatolni'; + LANGhuRename = 'Átnevezni'; + LANGhuRenameFile = 'A ''%s'' fájl átnevezése erre:'; + LANGhuIgnoreButton_Caption = '_Ignorálni'; + + LANGhuProgress = 'Müvelet folyamatban'; + LANGhuCancel = '_Storno'; + LANGhuDelete = 'Törlés:'; + + LANGhuSpecifyFileType = 'Válasszon fájl_típust:'; + + LANGhuRemoveDirectory = 'Könyvtárat eltávolítani'; + LANGhuDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Az alkönyvtárakkal együtt mindent kíván törölni?'; + LANGhuRetry = '_Megismételni'; + LANGhuDeleteButton_Caption = '_Eltávolítani'; + LANGhuAll = 'Minde_t'; + + LANGhuCopyFilesSC = 'A köv. fájlok másolása:'; + LANGhuAppendQuestion = 'Valóban kívánja a ''%s'' fájl ''%s'' fájlhoz való csatolását?'; + LANGhuPreparingList = 'Az állományok listája készül...'; + + LANGhuYouMustSelectAValidFile = 'Kérem, érvényes fájlot jelöljön meg!'; + LANGhumiVerifyChecksums = '_Checksum ellenörzése'; + LANGhuVerifyChecksumsCaption = 'Checksum ellenörzése'; + LANGhuCheckButtonCaptionCheck = '_Ellenörizni'; + LANGhuCheckButtonCaptionStop = '_Stop'; + LANGhuFileListTooltip = '[?] - Idáig nem ellenörzött'#10'[OK] - Checksum rendben'#10'[BAD] - Checksum-hiba'#10'[N/A] - A fájl nem elérhetö'; + LANGhuFilenameColumnCaption = 'Fájl'; + LANGhuTheFileSYouAreTryingToOpenIsQuiteBig = 'A ''%s''fájl, melyet olvasni próbál, túl nagy (%s bájtos). Érvénytelen Checksum elöfordulhat.'#10#10'Kívánja folytatni?'; + LANGhuAnErrorOccuredWhileInitializingMemoryBlock = 'Memória-allokációs hiba történt. Próbáljon meg több memóriát felszabadítani pár applikáció bezárásával, majd próbálja újra.'; + LANGhuAnErrorOccuredWhileOpeningFileSS = 'Nem lehet megnyitni a fájlot ''%s'':'#10' %s'; + LANGhuAnErrorOccuredWhileReadingFileSS = 'Nem lehet a fájlból olvasni ''%s'':'#10' %s'; + LANGhuChecksumNotChecked = 'Stav: Nincs ellenörizve'; + LANGhuChecksumChecking = 'Stav: Ellenörzés folyamatban...'; + LANGhuChecksumInterrupted = 'Stav: Megszakítva'; + LANGhuChecksumDOK = 'Állapot: %d%% OK'; + + LANGhumiCreateChecksumsCaption = '_Checksum létrehozása...'; + LANGhuYouMustSelectAtLeastOneFileToCalculateChecksum = 'Legalább egy érvényes fájlot meg kell jelölni a Checksum létrehozásához!'; + LANGhuCreateChecksumsCaption = 'Checksum létrehozása'; + LANGhuCCHKSUMPage1Text = 'Az ablakban megjelölt fájlok'#10' Checksum-jának létrehozására készül. Amennyiben '#10'nincs megjelölve az összes szükséges fájl,'#10'lépjen ki ebböl az ablakból és kezdje elölröl..'; + LANGhuCCHKSUMPage4Text = 'Checksum-ok létrehozására felkészülve.'#10'Ez a folyamat néhány percig is eltarthat..'#10'Folytatás a Tovább gomb lenyomásával..'; + LANGhuCCHKSUMPage6Text = 'A müvelet közben a köv. hibák történtek:'; + LANGhuCCHKSUMPage7Text = 'A Checksum-ok elkészültek.'#10#10'Ezt az ablakot a Befejez(Bezár) gombbal zárhatja be.'; + LANGhuCCHKSUMPage1Title = 'Fájl(ok) elökészítése'; + LANGhuCCHKSUMPage2Title = 'Válassza ki a kívánt Chechsum típusát'; + LANGhuCCHKSUMPage3Title = 'Válasszon fájlnevet'; + LANGhuCCHKSUMPage4Title = 'Müveletre felkészülve'; + LANGhuCCHKSUMPage5Title = 'Az ellenörzes folyamatban...'; + LANGhuCCHKSUMPage6Title = 'Hiba!'; + LANGhuCCHKSUMPage7Title = 'Végrehajtva'; + LANGhuCCHKSUMSFVFile = 'SFV fájl'; + LANGhuCCHKSUMMD5sumFile = 'MD5 fájl'; + LANGhuCCHKSUMFileName = '_Fájlnév:'; + LANGhuCCHKSUMCreateSeparateChecksumFiles = '_Különálló Checksum Fájlok'; + LANGhuCCHKSUMNowProcessingFileS = 'Ellenörzés alatt lévö fájl: %s'; + LANGhuCCHKSUMFinishCaption = '_Befejez'; + LANGhuCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Valóban meg kívánja szakítani az ellenörzést?'; + LANGhuCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Hiba történt a köv. fájl megnyitásakor: ''%s'': %s'#10; + LANGhuCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Hiba történt a köv. fájl olvasásakor: ''%s'': %s'#10; + LANGhuCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Hiba történt a köv. fájlba való írás során: ''%s'': %s'#10; + + LANGhuAnErrorOccuredWhileWritingFileSS = 'A köv. fájl nem írható ''%s'':'#10' %s'; + LANGhuTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'A ''%s'' célfájl már létezik. Kívánja felülírni?'; + LANGhuTheTargetFileSCannotBeRemovedS = 'A ''%s'' fájl nem távolítható el: %s'; + LANGhuMergeCaption = 'Összekötni'; + LANGhuPleaseInsertNextDiskOrGiveDifferentLocation = 'Kérem, helyezze be a köv. floppy-t, vagy adjon meg egy másik könyvtárat:'; + LANGhuMergeOfSSucceeded = 'A ''%s'' fájl összekapcsolása sikeresen végrehajtva (Checksum OK).'; + LANGhuWarningCreatedFileFailsCRCCheck = 'Figyelmeztetés: A létrehozott fájl Checksum-ja nem egyezik!'; + LANGhuMergeOfSSucceeded_NoCRCFileAvailable = 'A ''%s'' fájl összekapcsolása sikeresen végrehajtva (A Checksum nem hozzáférhetö).'; + LANGhuMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'A ''%s'' fájl és minden nevében hozzáfüzödö fájl összekapcsolása a köv. könyvtárba::'; + LANGhuMergeSC = 'Összekapcsol:'; + LANGhumiSplitFileCaption = 'Fájl da_rabolása...'; + LANGhumiMergeFilesCaption = 'Fájlok összeka_pcsolása...'; + + LANGhuSplitTheFileSToDirectory = 'A ''%s'' fájl szétda_rabolása a célkönyvtárba:'; + LANGhuSplitSC = 'Szétdarabol:'; + LANGhuSplitFile = 'Fájl darabolása'; + LANGhuBytesPerFile = '_Byte fájlonként:'; + LANGhuAutomatic = 'Automatikusan'; + LANGhuDeleteFilesOnTargetDisk = 'A fájlok törlé_se a céllemezen (kivehetö lemezek esetében alkalmas)'; + LANGhuSplitCaption = 'Szétdarabolás'; + LANGhuCannotOpenFileS = 'Nem lehet megnyitni a ''%s'' fájlot'; + LANGhuCannotSplitTheFileToMoreThan999Parts = 'A fájl max. 999 darabra metélhetö szét!'; + LANGhuThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'A célkönyvtárban a köv. fájlok találhatóak:'#10'%s'#10'Kívánja öket törölni?'; + LANGhuThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'A célkönyvtárban %d fáj található. Kívánja öket törölni?'; + LANGhuAnErrorOccuredWhileOperationS = 'Hiba a müvelet végrehajtásakor: %s'; + LANGhuSplitOfSSucceeded = 'A ''%s'' fájl darabolása sikeresen befejezve.'; + LANGhuSplitOfSFailed = 'A ''%s'' fájl darabolása sikertelen!'; + + LANGhumnuShow_Caption = '_Megjelenítés'; + LANGhumiShowDotFiles_Caption = 'Rejtett fájlok megjeleníté_se'; + LANGhuTheFileYouAreTryingToOpenIsQuiteBig = 'A beolvasni kívánt fájl nagy méretü. Külsö appplikacióban (pl. gedit) történö megjelenítése a redszer lelassulását okozhatja.'#10'Kívánja folytatni?'; + LANGhuCannotExecuteSPleaseCheckTheConfiguration = 'Nem indítható: ''%s''. Kérem, ellenörizze a beállításokat.'; + LANGhuEdit = 'Módosít'; + LANGhuEnterFilenameToEdit = 'Adja b_e a módosítani kívánt fájlnevet:'; + + LANGhumnuSettings_Caption = 'Beálli_tás'; + LANGhumiFileTypes_Caption = 'Fájl_típusok...'; + LANGhuThereIsNoApplicationAssociatedWithS = 'Egyetlen applikáció sincs a "%s" fájlhoz hozzárendelve.'#10#10'Kívánja a fájltípusokhoz hozzárendelt akciók dualógusának megnyitását?'; + LANGhuErrorExecutingCommand = 'Az utasítást nem lehet végrehajtani!'; + LANGhuEditFileTypesCaption = 'Hozzárendelés beállítása'; + LANGhuTitleLabel_Caption = 'Fájltípusok'; + LANGhuExtensionsColumn = 'Kiterjesztések'; + LANGhuDescriptionColumn = 'Leírás'; + LANGhuFileTypesList = 'Fájltípusok listája'; + LANGhuActionName = 'Az akció neve'; + LANGhuCommand = 'Utasítás'; + LANGhuSetDefaultActionButton_Caption = 'Kii_nduló állapot beállítása'; + LANGhuRunInTerminalCheckBox_Caption = 'Indí_tás a konzolban (terminál).'; + LANGhuAutodetectCheckBox_Caption = 'Graf. pr_ogram autodetekciója'; + LANGhuBrowseButton_Caption = 'Átkere_sni...'; + LANGhuCommandLabel_Caption = '_Utasítás:'; + LANGhuDescriptionLabel_Caption = 'Fájltí_pus leírása:'; + LANGhuFNameExtLabel_Caption = 'Uj Típus hozzáa_dása:'; + LANGhuNotebookPageExtensions = 'Fájltípus'; + LANGhuNotebookPageActions = 'Akció'; + LANGhuDefault = ' (Default)'; + LANGhuCannotSaveFileTypeAssociationsBecauseOtherProcess = 'A fájltípusok listája nem menthetö el, mert közben egy másik applikáció is megváltoztatta.'; + + LANGhuDefaultColor = 'Default _szín'; + LANGhuIcon = '_Ikon:'; + LANGhuBrowseForIcon = 'Ikon kersése'; + LANGhuSelectFileTypeColor = 'Fájltípus színének választása'; + LANGhuColor = 'Szí_n:'; + + LANGhumiChangePermissions_Caption = 'Jogok meg_változtatása...'; + LANGhumiChangeOwner_Caption = 'Tu_lajdonos/csoport megváltoztatása...'; + LANGhumiCreateSymlink_Caption = 'Hivat_kozás létrehozása...'; + LANGhumiEditSymlink_Caption = 'Hivatkozás mó_dosítasa...'; + LANGhuChmodProgress = 'Jog megváltoztatása'; + LANGhuChownProgress = 'Tulajdonos megváltoztatása:'; + LANGhuYouMustSelectAValidSymbolicLink = 'Válasszon érvényes hivatkozást!'; + LANGhuPopupRunS = 'Végrehaj_tani a %s -t'; + LANGhuPopupOpenS = '_Megnyitni a : %s -t'; + LANGhuPopupGoUp = 'Eggyel felje_bbi könyvtárra váltani'; + LANGhuPopupOpenWithS = 'Megnyitni ebben: %s'; + LANGhuPopupDefault = ' (default)'; + LANGhuPopupOpenWith = 'Meg_nyitni a...'; + LANGhuPopupViewFile = 'Fájl ábrá_zolása'; + LANGhuPopupEditFile = 'Fájl módo_sítása'; + LANGhuPopupMakeSymlink = 'Default _utasítás'; + LANGhuPopupRename = 'Átn_evezni'; + LANGhuPopupDelete = 'Eltá_volítanit'; + LANGhuDialogChangePermissions = 'Jogok meg_változtatása'; + LANGhuCouldNotBeChmoddedS = 'Nem lehet a jogokat megváltoztatni: %s'; + LANGhuDialogChangeOwner = 'Tu_lajdonos/csoport megváltoztatása'; + LANGhuCouldNotBeChownedS = 'Nem lehet a tulajdonost megváltoztatni: %s'; + LANGhuDialogMakeSymlink = 'Hivatkozás létrehozása'; + LANGhuDialogEditSymlink = 'Hivatkozás módosítasa'; + LANGhuFEditSymlink_Caption = 'Szimbolikus hivatkozás módositasa'; + LANGhuFEditSymlink_SymbolicLinkFilename = 'Hivatkozás _neve:'; + LANGhuFEditSymlink_SymbolicLinkPointsTo = 'A hivatkozás ide m_utat:'; + + LANGhuFChmod_Caption = 'Jogok'; + LANGhuFChmod_PermissionFrame = 'Jogosultságok betüi'; + LANGhuFChmod_FileFrame = 'Fájl'; + LANGhuFChmod_ApplyRecursivelyFor = 'Ismételten a_pplikálni ezeken:'; + LANGhuFChmod_miAllFiles = 'Minden fájl és könyvtár'; + LANGhuFChmod_miDirectories = 'Csak könyvtárak'; + LANGhuFChmod_OctalLabel = '_Számokkal való kifejezés:'; + LANGhuFChmod_SUID = 'SUID - Állomány tulajdonosának ID-je futtatáskor'; + LANGhuFChmod_SGID = 'SGID - Csoport ID-je a futtatáskor'; + LANGhuFChmod_Sticky = '''sticky'' bit'; + LANGhuFChmod_RUSR = 'RUSR - Olvasás a tulajdonos által'; + LANGhuFChmod_WUSR = 'WUSR - Írás a tulajdonos által'; + LANGhuFChmod_XUSR = 'XUSR - Futtatás a tulajdonos által'; + LANGhuFChmod_RGRP = 'RGRP - Olvasás a csoport által'; + LANGhuFChmod_WGRP = 'WGRP - Írás a csoport által'; + LANGhuFChmod_XGRP = 'XGRP - Futtatás a csoport által'; + LANGhuFChmod_ROTH = 'ROTH - Olvasás mások által'; + LANGhuFChmod_WOTH = 'WOTH - Írás mások által'; + LANGhuFChmod_XOTH = 'XOTH - Futtatás mások által'; + LANGhuFChmod_TextLabel = 'Szimbolikus kifejezés: %s'; + LANGhuFChmod_FileLabel = 'Választott fájl: %s'#10'Szimbolikus kifejezés: %s'#10 + + 'Számeli kifejezés: %d'#10'Tulajdonos: %s'#10 + + 'Csoport: %s'; + + LANGhuFChown_Caption = 'Tulajdonos/csoport megváltoztatása'; + LANGhuFChown_OwnerFrame = 'Tulajdonos'; + LANGhuFChown_GroupFrame = 'Csoport neve'; + LANGhuFChown_FileFrame = 'Fájl'; + LANGhuFChown_ApplyRecursively = 'Rekurzív _alkalmazás'; + + LANGhuFSymlink_Caption = 'Szimbolikus hivatkozás létrehozása'; + LANGhuFSymlink_ExistingFilename = 'Lét_ezö fájl (amire a hivatkozás mutat):'; + LANGhuFSymlink_SymlinkFilename = 'A hivatkozás _neve:'; + + LANGhumnuBookmarks_Caption = 'Kön_yvjelzök'; + LANGhumiAddBookmark_Caption = 'Könyvjelzö hozzáadása'; + LANGhumiEditBookmarks_Caption = 'Könyvjelzö módosítása'; + LANGhuBookmarkPopupDelete_Caption = '_Törölni'; + LANGhumiPreferences_Caption = '_Beállítások...'; + LANGhuTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'A létrehozni kívánt könyvtár már létezik a listában.'; + LANGhuSomeOtherInstanceChanged = 'Egy másik futtatás során megváltoztak a program beallításai. Kívanja az új beállításokat ' + + 'használni az aktuális ablakra vonatkozóan?'#10#10'Figyelmeztetés: Amennyiben nem engedélyezi a változások akceptálását, ez az új beállítás felül lesz írva az applikáció bezárásakor.'; + + LANGhuPreferences_Caption = 'Applikáció beállítása'; + LANGhuPreferences_TitleLabel_Caption = 'Applikáció beállítása'; + LANGhuPreferences_GeneralPage = 'Általános'; + LANGhuPreferences_FontsPage = 'Betütípus'; + LANGhuPreferences_ColorsPage = 'Színek'; + LANGhuPreferences_RowHeight = 'Sorma_gasság:'; + LANGhuPreferences_NumHistoryItems = 'Bejegyzések száma a "Command Line _History"-ban:'; + LANGhuPreferences_Default = 'Default'; + LANGhuPreferences_ClearReadonlyAttribute = 'A "Csak _olvas" attribútum eltávolítása CD-ROM-ról való másoláskor'; + LANGhuPreferences_DisableMouseRenaming = 'Egérrel tö_rténö gyors átnevezés tiltása'; + LANGhuPreferences_ShowFiletypeIconsInList = 'Fájltípusok standard _ikonjainak ábrázolása'; + LANGhuPreferences_ExternalAppsLabel = 'Külsö applikációk'; + LANGhuPreferences_Viewer = '_Viewer:'; + LANGhuPreferences_Editor = '_Editor:'; + LANGhuPreferences_Terminal = '_Konzol:'; + LANGhuPreferences_ListFont = 'Az ablakok betütípusa:'; + LANGhuPreferences_Change = 'Válto_tatni...'; + LANGhuPreferences_UseDefaultFont = 'Default _betütípus használata'; + LANGhuPreferences_Foreground = 'Szöveg'; + LANGhuPreferences_Background = 'Háttér'; + LANGhuPreferences_NormalItem = 'Standard elemek:'; + LANGhuPreferences_SetToDefaultToUseGTKThemeColors = 'A kiindulási beállítások esetében az aktuális GTK Theme színei lesznek alkalmazva'; + LANGhuPreferences_Cursor = 'Kurzor:'; + LANGhuPreferences_InactiveItem = 'Nem aktív elemek:'; + LANGhuPreferences_SelectedItem = 'Kijelölt elemek:'; + LANGhuPreferences_LinkItem = 'Szimbolikus hivatkozások:'; + LANGhuPreferences_LinkItemHint = 'A kiindulási beállításokkor a norm. elemek színei lesznek alkalmazva'; + LANGhuPreferences_DotFileItem = 'Rejtett fájlok:'; + LANGhuPreferences_DotFileItemHint = 'A kiindulási beállításokkor a norm. elemek színei lesznek alkalmazva'; + LANGhuPreferences_BrowseForApplication = 'Applikáció választása'; + LANGhuPreferences_DefaultS = 'Default: %s'; + LANGhuPreferences_SelectFont = 'Betütípus választása'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGhuBookmarkButton_Tooltip = 'Könyvjelzök ábrázolása'; + LANGhuUpButton_Tooltip = 'Egy könyvtárral feljebb lépni'; + LANGhuRootButton_Tooltip = 'Ugrás a gyökérkönyvtárba (/)'; + LANGhuHomeButton_Tooltip = 'Ugrás a felhasználói könyvtárba (/home/user)'; + LANGhuLeftEqualButton_Tooltip = 'A jobb ablak-beli könyvtár változtatása az aktuálisra'; + LANGhuRightEqualButton_Tooltip = 'A bal ablak-beli könyvtár változtatása az aktuálisra'; + LANGhumiShowDirectorySizes_Caption = 'Elfoglalt t_erület számítása'; + LANGhumiTargetSource_Caption = 'Célkönyv_tár = Aktuális könyvtár'; + LANGhuFileTypeDirectory = 'Könyvtárak'; + LANGhuFileTypeFile = 'Fájlok'; + LANGhuFileTypeMetafile = 'Közös meta-elem'; + LANGhuPreferencesPanelsPage = 'Ablakok'; + LANGhuPreferencesApplicationsPage = 'Applikációk'; + LANGhuPreferencesExperimentalPage = 'Experimentális funkciók'; + LANGhuPreferencesSelectAllDirectoriesCheckBox_Caption = 'Tömeges bejelöléskor _a könyvtárakat is belefoglalni'; + LANGhuPreferencesNewStyleAltOCheckBox_Caption = 'Új s_tílus Alt+O'; + LANGhuPreferencesNewStyleAltOCheckBox_Tooltip = 'Átkapcsoláskor nem változik az aktuális könyvtár'; + LANGhuPreferencesShowFuncButtonsCheckBox_Caption = '_Funkció-billentyük ábrázolása (alsó lista)'; + LANGhuPreferencesSizeFormatLabel_Caption = 'Számok for_mátuma:'; + LANGhuPreferencesmiSizeFormat1 = 'Rendszer'; + LANGhuPreferencesmiSizeFormat6 = 'Dinamikus'; + LANGhuPreferencesAutodetectXApp = 'X applikációk autodetekciója'; + LANGhuPreferencesAlwaysRunInTerminal = 'Konzol-béli indítás'; + LANGhuPreferencesNeverRunInTerminal = 'Ne indítsd a konzolban'; + LANGhuPreferencesCmdLineBehaviourLabel_Caption = 'Utasítássorból tö_rténö indítás:'; + LANGhuPreferencesFeatures = 'Funkció'; + LANGhuPreferencesDisableMouseRename_Tooltip = 'Gyors átnevezéshez használható a Shift+F6 bill.-kombináció e választás letiltásakor'; + LANGhuPreferencesDisableFileTipsCheckBox_Caption = 'Tipp-box tiltása a fá_jl teljes nevével'; + LANGhuPreferencesDisableFileTipsCheckBox_Tooltip = 'Tipp-box tiltása a fájl teljes nevével, amennyiben a fájl/könyvtár neve az ablakban rövidítetve van.'; + LANGhuPreferencesShow = 'Ábrázolás'; + LANGhuPreferencesDirsInBoldCheckBox_Caption = 'Könyvtárak vastag be_tüvel'; + LANGhuPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Könyvtárnevek ábrázolása szögletes zárójel nélkül'; + LANGhuPreferencesOctalPermissionsCheckBox_Caption = 'Jogok megjelenítése szám_okkal'; + LANGhuPreferencesOctalPermissionsCheckBox_Tooltip = 'Könyvtárakra és fájlokra vonatkozó jogosultságok megjelenítése számokkal'; + LANGhuPreferencesMovement = 'Ugrálás az ablakokban'; + LANGhuPreferencesLynxLikeMotionCheckBox_Caption = 'Ugrálás a _Lynx böngészö stílusában'; + LANGhuPreferencesInsertMovesDownCheckBox_Caption = 'Az In_sert lefelé mozgatja a kurzort'; + LANGhuPreferencesSpaceMovesDownCheckBox_Caption = 'A szóköz bill. lefelé _mozgatja a kurzort '; + LANGhuPreferencesViewer = 'Böngészö'; + LANGhuPreferencesCommandSC = 'Utasítás:'; + LANGhuPreferencesUseInternalViewer = 'Belsö _böngészö használata'; + LANGhuPreferencesEditor = 'Editor'; + LANGhuPreferencesTerminal = 'Konzol'; + LANGhuPreferencesExperimentalFeatures = 'Experimentáis funkciók'; + LANGhuPreferencesExperimentalWarningLabel_Caption = 'Figyelmeztetés: Ezek a funkciók fejlesztés alatt állnak és hibamentes müködésük nem biztosított. Használja öket saját felelösségére!'; + LANGhuPreferencesFocusRefreshCheckBox_Caption = 'A panelok új_raolvasása az applikáció ablakjaiba lépéskor'; + LANGhuPreferencesFocusRefreshCheckBox_Tooltip = 'Ez a müvelet hosszabb ideig tart az ablakban lévö allományok számától függöen'; + LANGhuPreferencesWMCompatModeCheckBox_Caption = '_Kompatibilitás ablakkezelökkel'; + LANGhuPreferencesWMCompatModeCheckBox_Tooltip = 'Használjuk ablakkezelökkel felálló nehézségek esetén (pl. IceWM nem maximalizálja helyesen az ablakot)'; + LANGhuPreferencesCompatUseLibcSystemCheckBox_Caption = 'A libc _system() funkció használata proces-ek indításához'; + LANGhuPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Használjuk programindítási nehézségek vagy fagyások esetén'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGhumiSearchCaption2 = '_Fájlok keresése..'; + LANGhumiNoMounterBarCaption = 'Lemezek sávját ne ábrázolja'; + LANGhumiShowOneMounterBarCaption = 'Lemezek 1 sávját ábrázolja'; + LANGhumiShowTwoMounterBarCaption = 'Lemezek 2 sávját ábrázolja'; + LANGhumnuNetworkCaption = 'Hálóza_t'; + LANGhumiConnectionsCaption = 'Kapc_solat - kezelö...'; + LANGhumiOpenConnectionCaption = 'Ka_pcsolódni...'; + LANGhumiQuickConnectCaption = 'Gyo_rs kapcsolódás...'; + LANGhumnuPluginsCaption = '_Modulok'; + LANGhumiTestPluginCaption = 'Modulok ellenör_zése...'; + LANGhumiMounterSettingsCaption = 'Lemezek sávjának beállítása...'; + LANGhumiColumnsCaption = 'Oszlopo_k beállítása...'; + LANGhumiSavePositionCaption = 'Pozíció mentése'; + LANGhumiMountCaption = 'Ka_pcsolódni'; + LANGhumiUmountCaption = 'Lekapcs_olódni'; + LANGhumiEjectCaption = '_Eject'; + LANGhumiDuplicateTabCaption = 'Ú_j ablak megnyitása '; + LANGhumiCloseTabCaption = 'Aktuális ablak be_zárása'; + LANGhumiCloseAllTabsCaption = 'Minden ablak bezárá_sa'; + LANGhuCannotDetermineDestinationEngine = 'A célkönyvtár nem elérhetö. Kérem, ellenörizze az utat, majd próbálja újra.'; + LANGhuCannotLoadFile = 'Nem megnyitható a ''%s'' fájl. Kérem, ellenörizze a jogokat, majd próbálja újra.'; + LANGhuMountPointDevice = 'Csatlakozási pont: %s'#10'Berendezés: %s'; + LANGhuMountSC = 'Csatlakozás:'; + LANGhuNoPluginsFound = 'A modul nincs meg'; + LANGhuPluginAbout = 'A modulról...'; + LANGhuCouldntOpenURI = 'Nem sikerült a távoli kapcsolat létrehozása. Kérem, ellenörizze a címet és a jogokat.'; + LANGhuPluginAboutInside = 'Modul: %s'#10#10'%s'#10'%s'; + LANGhuAreYouSureCloseAllTabs = 'Valóban be kívánja zárni az összes többi ablakot?'; + LANGhuCouldntOpenURIArchive = 'Az archívumot nem sikerült megnyitni, valószínüleg meg van sérülve. Kérem, ellenörizze a címet és a jogokat.'; + LANGhuThereIsNoModuleAvailable = 'A kapcsolat megnyitásához szükséges modult nem találtam. Kérem, ellenörizze az aktív modulokat. '; + LANGhuIgnoreError = 'Valóban figyelmen kívül kívánja hagyni ezt a hibát? A forrásfájl törölve lesz.'; + LANGhuErrorMount = 'A berendezés bejelentkezésekor hiba történt ''%s'':'#10#10; + LANGhuErrorUmount = 'A berendezés lejelentkezésekor hiba történt ''%s'':'#10#10; + LANGhuErrorEject = 'A berendezés kiemelésekor hiba történt''%s'':'#10#10; + + LANGhuMounterPrefs_Caption = 'A lemezek ablakjainak beállítása'; + LANGhuMounterPrefs_TitleLabelCaption = 'A lemezek ablakjainak beállítása'; + LANGhuMounterPrefs_ListViewFrameCaption = 'Kapcsolódási pontok'; + LANGhuMounterPrefs_MountName = 'Név'; + LANGhuMounterPrefs_MountPoint = 'Mount point'; + LANGhuMounterPrefs_Device = 'Berendezés'; + LANGhuMounterPrefs_MoveUpButtonTooltip = 'Mozgatás felfele'; + LANGhuMounterPrefs_MoveDownButtonTooltip = 'Mozgatás lefele'; + LANGhuMounterPrefs_UseFSTabDefaultsCheckBox = 'A kapc_solódási pontok rendszer-listájának használata'; + LANGhuMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Amennyiben ez a lehetöség aktív, a kapcsolódási pontok rendszer-listája kerül használatra az /etc/fstab rendszerfájlból'; + LANGhuMounterPrefs_ToggleModeCheckBox = 'A lemezek kapcsolói benyomva maradnak '; + LANGhuMounterPrefs_ToggleModeCheckBoxTooltip = 'Amennyiben ez a lehetöség aktív, a panel gombjai benyomva maradnak, ha a berendezés jelen van. A berendezésre való kattintással azt lecsatlakoztatjuk, vagy kiemelhetjük.'; + LANGhuMounterPrefs_PropertiesFrameCaption = 'Csatlakozási pont tulajdonságai'; + LANGhuMounterPrefs_DisplayTextLabelCaption = '_Név:'; + LANGhuMounterPrefs_MountPointLabelCaption = 'Csatlakozási pont:'; + LANGhuMounterPrefs_MountDeviceLabelCaption = '_Berendezés:'; + LANGhuMounterPrefs_DeviceTypeLabelCaption = 'Berendezés tí_pusa:'; + LANGhuMounterPrefs_miLocalDiskCaption = 'Helyi lemez'; + LANGhuMounterPrefs_miRemovableCaption = 'Cserélhetö lemez'; + LANGhuMounterPrefs_miCDCaption = 'CD/DVD egység'; + LANGhuMounterPrefs_miFloppyCaption = 'Floppy egység'; + LANGhuMounterPrefs_miNetworkCaption = 'Hálózati eszköz'; + LANGhuMounterPrefs_MountCommandLabelCaption = 'Kapcsolódási parancs:'; + LANGhuMounterPrefs_UmountCommandLabelCaption = 'Lekapcsolódási parancs'; + LANGhuMounterPrefs_MountCommandEntryTooltip = 'Syntaxis: használjunk a %dev -t a berendezés helyett, es a %dir -t a távoli pont útjaként. Távoli berendezések nem standart utasításának használata esetében hagyjuk ezt a mezöt üresen.'#10 + + 'Figyelmeztetés: Ne használjunk oyan utasításokat, melyek billentyüzetröl való bemenetet kívánnak. A program nem tudja öket kezelni!'#10'Példa: smbmount %dev %dir -o username=netuser,password=jelszó'; + LANGhuMounterPrefs_UmountCommandEntryTooltip = 'Syntaxis: használjunk %dev -t a berendezés helyett, es a %dir -t a távoli pont útjaként. Távoli berendezések nem standart utasításának használata esetében hagyjuk ezt a mezöt üresen.'#10'Példa: smbumount $dir'; + LANGhuMounterPrefs_IconLabelCaption = '_Ikon:'; + + LANGhuConnMgr_Caption = 'Új kapcsolat megnyitása'; + LANGhuConnMgr_ConnectButton = '_Kapcsolódni'; + LANGhuConnMgr_OpenConnection = 'Új kapcsolat megnyitása'; + LANGhuConnMgr_NameColumn = 'Név'; + LANGhuConnMgr_URIColumn = 'Cím'; + LANGhuConnMgr_AddConnectionButtonCaption = 'Új kapcsolat...'; + LANGhuConnMgr_AddConnectionButtonTooltip = 'Új kapcsolat létrehozása'; + LANGhuConnMgr_EditButtonCaption = '_Módosítani...'; + LANGhuConnMgr_EditButtonTooltip = 'Kiválasztott kapcsolat módosítása'; + LANGhuConnMgr_RemoveButtonCaption = 'Eltávolítani'; + LANGhuConnMgr_RemoveButtonTooltip = 'Kiválasztott kapcsolat eltávolítása'; + LANGhuConnMgr_DoYouWantDelete = 'Valóban el akarja távolítani a(z) ''%s'' kapcsolatot?'; + + LANGhuConnProp_FTP = 'FTP'; + LANGhuConnProp_SFTP = 'SFTP (ssh alrendszer)'; + LANGhuConnProp_SMB = 'Megosztás Windows hálózatokban (SMB)'; + LANGhuConnProp_HTTP = 'WebDAV (HTTP)'; + LANGhuConnProp_HTTPS = 'Bebiztosított WebDAV (HTTPS)'; + LANGhuConnProp_Other = 'További (Kérem, pontosítsa a címben)'; + LANGhuConnProp_Caption = 'A kapcsolat tulajdonsága'; + LANGhuConnProp_VFSModule = '_VFS modul:'; + LANGhuConnProp_URI = '_Cím (URI):'; + LANGhuConnProp_URIEntryTooltip = 'Az érvényes URI címnek a hálózati server szolgálatának típusát és címét kellene tartalmaznia.'; + LANGhuConnProp_DetailedInformations = 'Pontosítási információk'; + LANGhuConnProp_Name = '_Név:'; + LANGhuConnProp_Server = 'Serve_r[:port]:'; + LANGhuConnProp_Username = 'Felhasználói név:'; + LANGhuConnProp_UserNameEntryTooltip = 'Nem kell kitölteni, amennyiben anonymus kiszolgálóról van szó.'; + LANGhuConnProp_Password = '_Jelszó:'; + LANGhuConnProp_TargetDirectory = '_Távoli könyvtár:'; + LANGhuConnProp_ServiceType = 'A _szolgáltatás típusa:'; + LANGhuConnProp_MaskPassword = 'Jelszó elrej_tése'; + LANGhuConnProp_MenuItemCaption = 'Default (Minden elérhetö modul)'; + + LANGhuConnLogin_Caption = 'Bejelentkezés'; + LANGhuConnLogin_Login = 'Bejelentkezés'; + LANGhuConnLogin_ExperimentalWarningLabelCaption = 'Az %s eszközhöz való hozzáféreshez be kell jelentkeznie'; + LANGhuConnLogin_Username = '_Felhasználói név:'; + LANGhuConnLogin_Password = '_Jelszó:'; + LANGhuConnLogin_AnonymousCheckButton = '_anonymus hozzáférés'; + + LANGhuColumns_Caption = 'A föablak oszlopainak beállítása'; + LANGhuColumns_Title = 'Az ablak oszlopainak beállítása'; + LANGhuColumns_MoveUpButtonTooltip = 'Mozgatás felfele'; + LANGhuColumns_MoveDownButtonTooltip = 'Mozgatás lefele'; + LANGhuColumns_TitlesLongName = 'Név'; + LANGhuColumns_TitlesLongNameExt = 'Név + típus'; + LANGhuColumns_TitlesLongExt = 'Típus'; + LANGhuColumns_TitlesLongSize = 'Méret'; + LANGhuColumns_TitlesLongDateTime = 'Változtatás dátuma + idöpontja'; + LANGhuColumns_TitlesLongDate = 'Utolsó változtatás dátuma'; + LANGhuColumns_TitlesLongTime = 'Utolsó változtatás idöpontja'; + LANGhuColumns_TitlesLongUser = 'Felhasználó'; + LANGhuColumns_TitlesLongGroup = 'Csoport'; + LANGhuColumns_TitlesLongAttr = 'Attribútum'; + LANGhuColumns_TitlesShortName = 'Név'; + LANGhuColumns_TitlesShortNameExt = 'Név'; + LANGhuColumns_TitlesShortExt = 'Típus'; + LANGhuColumns_TitlesShortSize = 'Méret'; + LANGhuColumns_TitlesShortDateTime = 'Dátum'; + LANGhuColumns_TitlesShortDate = 'Dátum'; + LANGhuColumns_TitlesShortTime = 'Idöpont'; + LANGhuColumns_TitlesShortUser = 'Felhaszn.'; + LANGhuColumns_TitlesShortGroup = 'Csoport'; + LANGhuColumns_TitlesShortAttr = 'Attr.'; + + LANGhuTestPlugin_Caption = 'VFS modul tesztje'; + LANGhuTestPlugin_Title = 'VFS modul tesztje'; + LANGhuTestPlugin_ExperimentalWarningLabelCaption = 'Figyelmeztetés: A virtuális fájlrendszer blokkja (VFS) és az integrált modulok jelenleg fejleszés alatt állnak, és kritikus hibákat is tartalmaz6nak'; + LANGhuTestPlugin_Plugin = '_Modul:'; + LANGhuTestPlugin_Command = '_Cím:'; + LANGhuTestPlugin_Username = '_Felhasználó:'; + LANGhuTestPlugin_Password = '_Jelszó:'; + LANGhuTestPlugin_AnonymousCheckButton = '_Anonymus kapcdsolat (a VFSLogin funkció hívása nélkül)'; + LANGhuTestPlugin_NoPluginsFound = 'Egyetlen modul sem hozzáférhetö.'; + + LANGhuRemoteWait_Caption = 'Müvelet folyamatban'; + LANGhuRemoteWait_OperationInProgress = 'Az applikació most dolgozza fel utasítását, türelmét kérem ...'; + LANGhuRemoteWait_ItemsFound = 'Találatok száma: %d'; + + LANGhuSearch_Bytes = 'Byte'; + LANGhuSearch_kB = 'kB'; + LANGhuSearch_MB = 'MB'; + LANGhuSearch_days = 'nap'; + LANGhuSearch_weeks = 'hét'; + LANGhuSearch_months = 'hónap'; + LANGhuSearch_years = 'év'; + LANGhuSearch_Caption = 'Fájlok keresése'; + LANGhuSearch_General = 'Általános'; + LANGhuSearch_Advanced = 'Pontosítás'; + LANGhuSearch_SearchResults = 'A keresés eredmé_nye:'; + LANGhuSearch_SearchFor = 'Keres_ni:'; + LANGhuSearch_FileMaskEntryTooltip = 'Tipp: Több keresett kifejezés esetében használjunk pontosvesszöt'; + LANGhuSearch_SearchIn = 'Keresés i_tt:'; + LANGhuSearch_SearchArchivesCheckButton = '_Archív böngészése'; + LANGhuSearch_FindText = 'Szöveg keresé_se:'; + LANGhuSearch_FindTextEntryTooltip = 'Hagyjuk ezt a mezöt üresen, ha nem akarunk szöveget keresni a fájlban'#10'Figyelmeztetés: a szövegek kódolása: UTF-8'; + LANGhuSearch_CaseSensitiveCheckButton = '_Kis- és nagybetük megkülönböztetése'; + LANGhuSearch_StayCurrentFSCheckButton = 'Külsö adattárokon s_zintén keres'; + LANGhuSearch_CaseSensitiveMatchCheckButton = 'Kis- és _nagybetük megkülönböztetése'; + LANGhuSearch_Size = 'Méret'; + LANGhuSearch_Date = 'Dátum'; + LANGhuSearch_BiggerThan = '_Nagyobb, mint'; + LANGhuSearch_SmallerThan = '_Kisebb, mint'; + LANGhuSearch_ModifiedBetweenRadioButton = '_Változtatás az intervallumban'; + LANGhuSearch_NotModifiedAfterRadioButton = '_Nem változott az idöpont után'; + LANGhuSearch_ModifiedLastRadioButton = 'Válto_zott az utolsó'; + LANGhuSearch_ModifiedNotLastRadionButton = 'Nem vá_ltozott az utolsó'; + LANGhuSearch_ModifiedBetweenEntry1 = '"Kérem, használja ezt a dátum-formát:" c'; + LANGhuSearch_ViewButtonCaption = 'Fájl me_gtekintése'; + LANGhuSearch_NewSearchButtonCaption = 'Új ke_resés'; + LANGhuSearch_GoToFileButtonCaption = 'Menj a _fájlra'; + LANGhuSearch_FeedToListboxButtonCaption = 'A föpanel _betöltése'; + LANGhuSearch_StatusSC = 'Állapot:'; + LANGhuSearch_Ready = 'Kész.'; + LANGhuSearch_PreparingToSearch = 'Keresés elökészítése.'; + LANGhuSearch_SearchInProgress = 'A keresés folyamatban:'; + LANGhuSearch_UserCancelled = 'Felhasználói megszakítás.'; + LANGhuSearch_SearchFinished = 'Keresési folyamat befejezödött.'; + LANGhuSearch_FilesFound = 'Talált fájlok száma: %d'; + LANGhuSearch_And = 'és'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGhuCloseOpenConnection = 'Új kapcsolatot probált létrehozni, miközben egy másik mar aktív. Ha folytatja, az elözö kapcsolat meg lesz szüntetve és az újjal helyettesitve.'#10#10'Kívánja folytatni?'; + LANGhuDuplicateTabWarning = 'Egy új Tab-ot probál megnyitni egy távoli könyvtárral. De ''engine cloning'' nem támogatott. Igy az új Tab könyvtára lokális fájlrenszerre mutat majd.'; + LANGhuDontShowAgain = 'Ne mutas_d még egyszer ezt az üzenetet'; + LANGhuSwitchOtherPanelWarning = 'A másik panelban egy távoli könyvtárat próbált megnyitni. De mivel ''engine cloning'' nem támogatott, így a célkönyvtár nem lesz megváltoztatva.'; + LANGhuOpenConnectionsWarning = 'A panel aktív kapcsolatot tartalmaz. Az applikáció bezárásával minden kapcsolat megszünik.'#10#10'Még mindig ki akar lépni?'; + LANGhumiDisconnect_Caption = 'Kapcsolat ol_dása'; + LANGhuDisconnectButton_Tooltip = 'Aktív kapcsolat oldása'; + LANGhuLeaveArchiveButton_Tooltip = 'Jelen archívum bezárása'; + LANGhuOpenTerminalButton_Tooltip = 'Új terminál-ablakot nyit az aktuális könyvtárból'; + LANGhuOpenTerminalButton_Caption = 'Te_rminal megnyitása'; + LANGhuShowTextUIDsCheckBox_Caption = 'Text _UIDs ábrázolása'; + LANGhuShowTextUIDsCheckBox_Tooltip = 'Szöveg alapú Felhasználói (User) és Csoport (Group) információk megjelenítése számok helyett (UID/GID)'; + + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGhumiNewTab_Caption = 'Új könyvtár- _tab'; + LANGhuFilePopupMenu_Properties = 'Tulajdonságok (_Properties)'; + LANGhuCommandEntry_Tooltip = 'Használj %s-t állomány/könyvtár placeholder-ként'; + LANGhumiFiles_Caption = 'Csak fájlok'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGhuPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGhuHandleRunFromArchive_Bytes = 'bytes'; + LANGhuHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGhuHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGhuHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGhuHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGhuFRunFromVFS_Caption = 'Packed file properties'; + LANGhuFRunFromVFS_TitleLabel = 'File Properties'; + LANGhuFRunFromVFS_FileNameLabel = 'File name:'; + LANGhuFRunFromVFS_FileTypeLabel = 'File type:'; + LANGhuFRunFromVFS_SizeLabel = 'Size:'; + LANGhuFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGhuFRunFromVFS_DateLabel = 'Modify date:'; + LANGhuFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGhuFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGhuFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGhuFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGhuFSetPassword_Caption = 'Set password'; + LANGhuFSetPassword_Label1_Caption = 'Password required'; + LANGhuFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGhuFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGhuF2Button_Caption; + LANGF3Button_Caption := LANGhuF3Button_Caption; + LANGF4Button_Caption := LANGhuF4Button_Caption; + LANGF5Button_Caption := LANGhuF5Button_Caption; + LANGF6Button_Caption := LANGhuF6Button_Caption; + LANGF7Button_Caption := LANGhuF7Button_Caption; + LANGF8Button_Caption := LANGhuF8Button_Caption; + + LANGmnuFile_Caption := LANGhumnuFile_Caption; + LANGmnuMark_Caption := LANGhumnuMark_Caption; + LANGmnuCommands_Caption := LANGhumnuCommands_Caption; + LANGmnuHelp_Caption := LANGhumnuHelp_Caption; + LANGmiExit_Caption := LANGhumiExit_Caption; + LANGmiSelectGroup_Caption := LANGhumiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGhumiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGhumiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGhumiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGhumiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGhumiRefresh_Caption; + LANGmiAbout_Caption := LANGhumiAbout_Caption; + + LANGColumn1_Caption := LANGhuColumn1_Caption; + LANGColumn2_Caption := LANGhuColumn2_Caption; + LANGColumn3_Caption := LANGhuColumn3_Caption; + LANGColumn4_Caption := LANGhuColumn4_Caption; + LANGColumn5_Caption := LANGhuColumn5_Caption; + + LANGExpandSelection := LANGhuExpandSelection; + LANGShrinkSelection := LANGhuShrinkSelection; + LANGNoMatchesFound := LANGhuNoMatchesFound; + LANGNoFilesSelected := LANGhuNoFilesSelected; + LANGSelectedFilesDirectories := LANGhuSelectedFilesDirectories; + LANGDirectoryS := LANGhuDirectoryS; + LANGFileS := LANGhuFileS; + LANGDoYouReallyWantToDeleteTheS := LANGhuDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGhuDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGhuCopyFiles; + LANGMoveRenameFiles := LANGhuMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGhuCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGhuMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGhuCopySC; + LANGMoveRenameSC := LANGhuMoveRenameSC; + + LANGQuickFind := LANGhuQuickFind; + + LANGAboutString := LANGhuAboutString; + LANGAboutStringGnome := LANGhuAboutStringGnome; + LANGDiskStatFmt := LANGhuDiskStatFmt; + LANGDiskStatVolNameFmt := LANGhuDiskStatVolNameFmt; + LANGStatusLineFmt := LANGhuStatusLineFmt; + LANGPanelStrings[False] := LANGhuPanelStrings[False]; + LANGPanelStrings[True] := LANGhuPanelStrings[True]; + LANGDIR := LANGhuDIR; + LANGErrorGettingListingForSPanel := LANGhuErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGhuErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGhuErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGhuErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGhuTheFileDirectory; + LANGCouldNotBeDeleted := LANGhuCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGhuCouldNotBeDeletedS; + LANGUserCancelled := LANGhuUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGhuTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGhuCannotCopyFile; + LANGCopyError := LANGhuCopyError; + LANGMoveError := LANGhuMoveError; + LANGOverwriteS := LANGhuOverwriteS; + LANGWithFileS := LANGhuWithFileS; + LANGOvewriteSBytesS := LANGhuOvewriteSBytesS; + LANGTheFile := LANGhuTheFile; + LANGCopy := LANGhuCopy; + LANGMove := LANGhuMove; + LANGTheDirectory := LANGhuTheDirectory; + LANGTheSymbolicLink := LANGhuTheSymbolicLink; + LANGCannotMoveFile := LANGhuCannotMoveFile; + LANGCouldNotBeCreated := LANGhuCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGhuCouldNotBeCreatedS; + LANGFromS := LANGhuFromS; + LANGToS := LANGhuToS; + LANGCannotCopyFileToItself := LANGhuCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGhuMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGhuCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGhuCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGhuCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGhuCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGhuCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGhuCannotWriteToDestinationFile; + + LANGUnknownException := LANGhuUnknownException; + LANGNoAccess := LANGhuNoAccess; + LANGUnknownError := LANGhuUnknownError; + + LANGCreateANewDirectory := LANGhuCreateANewDirectory; + LANGEnterDirectoryName := LANGhuEnterDirectoryName; + + LANGOverwriteQuestion := LANGhuOverwriteQuestion; + LANGOverwriteButton_Caption := LANGhuOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGhuOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGhuSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGhuOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGhuSkipAllButton_Caption; + LANGRenameButton_Caption := LANGhuRenameButton_Caption; + LANGAppendButton_Caption := LANGhuAppendButton_Caption; + LANGRename := LANGhuRename; + LANGRenameFile := LANGhuRenameFile; + LANGIgnoreButton_Caption := LANGhuIgnoreButton_Caption; + + LANGProgress := LANGhuProgress; + LANGCancel := LANGhuCancel; + LANGDelete := LANGhuDelete; + + LANGSpecifyFileType := LANGhuSpecifyFileType; + + LANGRemoveDirectory := LANGhuRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGhuDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGhuRetry; + LANGDeleteButton_Caption := LANGhuDeleteButton_Caption; + LANGAll := LANGhuAll; + + LANGCopyFilesSC := LANGhuCopyFilesSC; + LANGAppendQuestion := LANGhuAppendQuestion; + LANGPreparingList := LANGhuPreparingList; + + LANGYouMustSelectAValidFile := LANGhuYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGhumiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGhuVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGhuCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGhuCheckButtonCaptionStop; + LANGFileListTooltip := LANGhuFileListTooltip; + LANGFilenameColumnCaption := LANGhuFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGhuTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGhuAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGhuAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGhuAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGhuChecksumNotChecked; + LANGChecksumChecking := LANGhuChecksumChecking; + LANGChecksumInterrupted := LANGhuChecksumInterrupted; + LANGChecksumDOK := LANGhuChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGhumiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGhuYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGhuCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGhuCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGhuCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGhuCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGhuCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGhuCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGhuCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGhuCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGhuCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGhuCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGhuCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGhuCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGhuCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGhuCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGhuCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGhuCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGhuCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGhuCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGhuCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGhuCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGhuCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGhuCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGhuAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGhuTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGhuTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGhuMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGhuPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGhuMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGhuWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGhuMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGhuMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGhuMergeSC; + LANGmiSplitFileCaption := LANGhumiSplitFileCaption; + LANGmiMergeFilesCaption := LANGhumiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGhuSplitTheFileSToDirectory; + LANGSplitSC := LANGhuSplitSC; + LANGSplitFile := LANGhuSplitFile; + LANGBytesPerFile := LANGhuBytesPerFile; + LANGAutomatic := LANGhuAutomatic; + LANGDeleteFilesOnTargetDisk := LANGhuDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGhuSplitCaption; + LANGCannotOpenFileS := LANGhuCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGhuCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGhuThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGhuThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGhuAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGhuSplitOfSSucceeded; + LANGSplitOfSFailed := LANGhuSplitOfSFailed; + + LANGmnuShow_Caption := LANGhumnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGhumiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGhuTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGhuCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGhuEdit; + LANGEnterFilenameToEdit := LANGhuEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGhumnuSettings_Caption; + LANGmiFileTypes_Caption := LANGhumiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGhuThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGhuErrorExecutingCommand; + LANGEditFileTypesCaption := LANGhuEditFileTypesCaption; + LANGTitleLabel_Caption := LANGhuTitleLabel_Caption; + LANGExtensionsColumn := LANGhuExtensionsColumn; + LANGDescriptionColumn := LANGhuDescriptionColumn; + LANGFileTypesList := LANGhuFileTypesList; + LANGActionName := LANGhuActionName; + LANGCommand := LANGhuCommand; + LANGSetDefaultActionButton_Caption := LANGhuSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGhuRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGhuAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGhuBrowseButton_Caption; + LANGCommandLabel_Caption := LANGhuCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGhuDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGhuFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGhuNotebookPageExtensions; + LANGNotebookPageActions := LANGhuNotebookPageActions; + LANGDefault := LANGhuDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGhuCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGhuDefaultColor; + LANGIcon := LANGhuIcon; + LANGBrowseForIcon := LANGhuBrowseForIcon; + LANGSelectFileTypeColor := LANGhuSelectFileTypeColor; + LANGColor := LANGhuColor; + + LANGmiChangePermissions_Caption := LANGhumiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGhumiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGhumiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGhumiEditSymlink_Caption; + LANGChmodProgress := LANGhuChmodProgress; + LANGChownProgress := LANGhuChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGhuYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGhuPopupRunS; + LANGPopupOpenS := LANGhuPopupOpenS; + LANGPopupGoUp := LANGhuPopupGoUp; + LANGPopupOpenWithS := LANGhuPopupOpenWithS; + LANGPopupDefault := LANGhuPopupDefault; + LANGPopupOpenWith := LANGhuPopupOpenWith; + LANGPopupViewFile := LANGhuPopupViewFile; + LANGPopupEditFile := LANGhuPopupEditFile; + LANGPopupMakeSymlink := LANGhuPopupMakeSymlink; + LANGPopupRename := LANGhuPopupRename; + LANGPopupDelete := LANGhuPopupDelete; + LANGDialogChangePermissions := LANGhuDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGhuCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGhuDialogChangeOwner; + LANGCouldNotBeChownedS := LANGhuCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGhuDialogMakeSymlink; + LANGDialogEditSymlink := LANGhuDialogEditSymlink; + LANGFEditSymlink_Caption := LANGhuFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGhuFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGhuFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGhuFChmod_Caption; + LANGFChmod_PermissionFrame := LANGhuFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGhuFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGhuFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGhuFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGhuFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGhuFChmod_OctalLabel; + LANGFChmod_SUID := LANGhuFChmod_SUID; + LANGFChmod_SGID := LANGhuFChmod_SGID; + LANGFChmod_Sticky := LANGhuFChmod_Sticky; + LANGFChmod_RUSR := LANGhuFChmod_RUSR; + LANGFChmod_WUSR := LANGhuFChmod_WUSR; + LANGFChmod_XUSR := LANGhuFChmod_XUSR; + LANGFChmod_RGRP := LANGhuFChmod_RGRP; + LANGFChmod_WGRP := LANGhuFChmod_WGRP; + LANGFChmod_XGRP := LANGhuFChmod_XGRP; + LANGFChmod_ROTH := LANGhuFChmod_ROTH; + LANGFChmod_WOTH := LANGhuFChmod_WOTH; + LANGFChmod_XOTH := LANGhuFChmod_XOTH; + LANGFChmod_TextLabel := LANGhuFChmod_TextLabel; + LANGFChmod_FileLabel := LANGhuFChmod_FileLabel; + LANGFChown_Caption := LANGhuFChown_Caption; + LANGFChown_OwnerFrame := LANGhuFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGhuFChown_GroupFrame; + LANGFChown_FileFrame := LANGhuFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGhuFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGhuFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGhuFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGhuFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGhumnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGhumiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGhumiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGhuBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGhumiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGhuTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGhuSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGhuPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGhuPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGhuPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGhuPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGhuPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGhuPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGhuPreferences_NumHistoryItems; + LANGPreferences_Default := LANGhuPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGhuPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGhuPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGhuPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGhuPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGhuPreferences_Viewer; + LANGPreferences_Editor := LANGhuPreferences_Editor; + LANGPreferences_Terminal := LANGhuPreferences_Terminal; + LANGPreferences_ListFont := LANGhuPreferences_ListFont; + LANGPreferences_Change := LANGhuPreferences_Change; + LANGPreferences_UseDefaultFont := LANGhuPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGhuPreferences_Foreground; + LANGPreferences_Background := LANGhuPreferences_Background; + LANGPreferences_NormalItem := LANGhuPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGhuPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGhuPreferences_Cursor; + LANGPreferences_InactiveItem := LANGhuPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGhuPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGhuPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGhuPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGhuPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGhuPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGhuPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGhuPreferences_DefaultS; + LANGPreferences_SelectFont := LANGhuPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGhuBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGhuUpButton_Tooltip; + LANGRootButton_Tooltip := LANGhuRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGhuHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGhuLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGhuRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGhumiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGhumiTargetSource_Caption; + LANGFileTypeDirectory := LANGhuFileTypeDirectory; + LANGFileTypeFile := LANGhuFileTypeFile; + LANGFileTypeMetafile := LANGhuFileTypeMetafile; + LANGPreferencesPanelsPage := LANGhuPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGhuPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGhuPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGhuPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGhuPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGhuPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGhuPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGhuPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGhuPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGhuPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGhuPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGhuPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGhuPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGhuPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGhuPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGhuPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGhuPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGhuPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGhuPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGhuPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGhuPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGhuPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGhuPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGhuPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGhuPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGhuPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGhuPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGhuPreferencesViewer; + LANGPreferencesCommandSC := LANGhuPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGhuPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGhuPreferencesEditor; + LANGPreferencesTerminal := LANGhuPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGhuPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGhuPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGhuPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGhuPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGhuPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGhuPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGhuPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGhuPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGhumiSearchCaption2; + LANGmiNoMounterBarCaption := LANGhumiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGhumiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGhumiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGhumnuNetworkCaption; + LANGmiConnectionsCaption := LANGhumiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGhumiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGhumiQuickConnectCaption; + LANGmnuPluginsCaption := LANGhumnuPluginsCaption; + LANGmiTestPluginCaption := LANGhumiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGhumiMounterSettingsCaption; + LANGmiColumnsCaption := LANGhumiColumnsCaption; + LANGmiSavePositionCaption := LANGhumiSavePositionCaption; + LANGmiMountCaption := LANGhumiMountCaption; + LANGmiUmountCaption := LANGhumiUmountCaption; + LANGmiEjectCaption := LANGhumiEjectCaption; + LANGmiDuplicateTabCaption := LANGhumiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGhumiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGhumiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGhuCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGhuCannotLoadFile; + LANGMountPointDevice := LANGhuMountPointDevice; + LANGMountSC := LANGhuMountSC; + LANGNoPluginsFound := LANGhuNoPluginsFound; + LANGPluginAbout := LANGhuPluginAbout; + LANGCouldntOpenURI := LANGhuCouldntOpenURI; + LANGPluginAboutInside := LANGhuPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGhuAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGhuCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGhuThereIsNoModuleAvailable; + LANGIgnoreError := LANGhuIgnoreError; + LANGErrorMount := LANGhuErrorMount; + LANGErrorUmount := LANGhuErrorUmount; + LANGErrorEject := LANGhuErrorEject; + + LANGMounterPrefs_Caption := LANGhuMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGhuMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGhuMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGhuMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGhuMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGhuMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGhuMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGhuMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGhuMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGhuMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGhuMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGhuMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGhuMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGhuMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGhuMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGhuMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGhuMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGhuMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGhuMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGhuMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGhuMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGhuMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGhuMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGhuMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGhuMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGhuMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGhuMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGhuConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGhuConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGhuConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGhuConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGhuConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGhuConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGhuConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGhuConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGhuConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGhuConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGhuConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGhuConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGhuConnProp_FTP; + LANGConnProp_SFTP := LANGhuConnProp_SFTP; + LANGConnProp_SMB := LANGhuConnProp_SMB; + LANGConnProp_HTTP := LANGhuConnProp_HTTP; + LANGConnProp_HTTPS := LANGhuConnProp_HTTPS; + LANGConnProp_Other := LANGhuConnProp_Other; + LANGConnProp_Caption := LANGhuConnProp_Caption; + LANGConnProp_VFSModule := LANGhuConnProp_VFSModule; + LANGConnProp_URI := LANGhuConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGhuConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGhuConnProp_DetailedInformations; + LANGConnProp_Name := LANGhuConnProp_Name; + LANGConnProp_Server := LANGhuConnProp_Server; + LANGConnProp_Username := LANGhuConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGhuConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGhuConnProp_Password; + LANGConnProp_TargetDirectory := LANGhuConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGhuConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGhuConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGhuConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGhuConnLogin_Caption; + LANGConnLogin_Login := LANGhuConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGhuConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGhuConnLogin_Username; + LANGConnLogin_Password := LANGhuConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGhuConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGhuColumns_Caption; + LANGColumns_Title := LANGhuColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGhuColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGhuColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGhuColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGhuColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGhuColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGhuColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGhuColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGhuColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGhuColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGhuColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGhuColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGhuColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGhuColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGhuColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGhuColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGhuColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGhuColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGhuColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGhuColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGhuColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGhuColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGhuColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGhuTestPlugin_Caption; + LANGTestPlugin_Title := LANGhuTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGhuTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGhuTestPlugin_Plugin; + LANGTestPlugin_Command := LANGhuTestPlugin_Command; + LANGTestPlugin_Username := LANGhuTestPlugin_Username; + LANGTestPlugin_Password := LANGhuTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGhuTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGhuTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGhuRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGhuRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGhuRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGhuSearch_Bytes; + LANGSearch_kB := LANGhuSearch_kB; + LANGSearch_MB := LANGhuSearch_MB; + LANGSearch_days := LANGhuSearch_days; + LANGSearch_weeks := LANGhuSearch_weeks; + LANGSearch_months := LANGhuSearch_months; + LANGSearch_years := LANGhuSearch_years; + LANGSearch_Caption := LANGhuSearch_Caption; + LANGSearch_General := LANGhuSearch_General; + LANGSearch_Advanced := LANGhuSearch_Advanced; + LANGSearch_SearchResults := LANGhuSearch_SearchResults; + LANGSearch_SearchFor := LANGhuSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGhuSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGhuSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGhuSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGhuSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGhuSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGhuSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGhuSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGhuSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGhuSearch_Size; + LANGSearch_Date := LANGhuSearch_Date; + LANGSearch_BiggerThan := LANGhuSearch_BiggerThan; + LANGSearch_SmallerThan := LANGhuSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGhuSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGhuSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGhuSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGhuSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGhuSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGhuSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGhuSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGhuSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGhuSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGhuSearch_StatusSC; + LANGSearch_Ready := LANGhuSearch_Ready; + LANGSearch_PreparingToSearch := LANGhuSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGhuSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGhuSearch_UserCancelled; + LANGSearch_SearchFinished := LANGhuSearch_SearchFinished; + LANGSearch_FilesFound := LANGhuSearch_FilesFound; + LANGSearch_And := LANGhuSearch_And; + + LANGCloseOpenConnection := LANGhuCloseOpenConnection; + LANGDuplicateTabWarning := LANGhuDuplicateTabWarning; + LANGDontShowAgain := LANGhuDontShowAgain; + LANGSwitchOtherPanelWarning := LANGhuSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGhuOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGhumiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGhuDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGhuLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGhuOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGhuOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGhuShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGhuShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGhumiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGhuFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGhuCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGhumiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGhuPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGhuHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGhuHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGhuHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGhuHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGhuHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGhuFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGhuFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGhuFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGhuFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGhuFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGhuFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGhuFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGhuFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGhuFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGhuFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGhuFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGhuFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGhuFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGhuFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGhuFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('hu_HU', @SetTranslation); + AddTranslation('Hu', @SetTranslation); + AddTranslation('HU', @SetTranslation); +end. diff --git a/translations/UTranslation_IT.pas b/translations/UTranslation_IT.pas new file mode 100644 index 0000000..ad84365 --- /dev/null +++ b/translations/UTranslation_IT.pas @@ -0,0 +1,1255 @@ +(* + Tux Commander - UTranslation_IT - Italian Localization constants + Copyright (C) 2007 by Francesco Turco + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_IT; + +interface + +implementation + +uses ULocale; + +const LANGitF2Button_Caption = 'F2 - Rinomina'; + LANGitF3Button_Caption = 'F3 - Visualizza'; + LANGitF4Button_Caption = 'F4 - Modifica'; + LANGitF5Button_Caption = 'F5 - Copia'; + LANGitF6Button_Caption = 'F6 - Sposta'; + LANGitF7Button_Caption = 'F7 - CreaDir'; + LANGitF8Button_Caption = 'F8 - Elimina'; + + LANGitmnuFile_Caption = '_File'; + LANGitmnuMark_Caption = '_Marca'; + LANGitmnuCommands_Caption = '_Comandi'; + LANGitmnuHelp_Caption = '_Aiuto'; + LANGitmiExit_Caption = 'E_sci'; + LANGitmiSelectGroup_Caption = 'Seleziona _Gruppo...'; + LANGitmiUnselectGroup_Caption = '_Deseleziona Gruppo...'; + LANGitmiSelectAll_Caption = '_Seleziona Tutto'; + LANGitmiUnselectAll_Caption = 'D_eseleziona Tutto'; + LANGitmiInvertSelection_Caption = '_Inverti Selezione'; + LANGitmiRefresh_Caption = '_Aggiorna'; + LANGitmiAbout_Caption = '_Informazioni...'; + + LANGitColumn1_Caption = 'Nome'; + LANGitColumn2_Caption = 'Est'; + LANGitColumn3_Caption = 'Dim'; + LANGitColumn4_Caption = 'Data'; + LANGitColumn5_Caption = 'Attr'; + + LANGitExpandSelection = 'Espandi selezione'; + LANGitShrinkSelection = 'Shrink selection'; + LANGitNoMatchesFound = 'Nessuna occorrenza trovata'; + LANGitNoFilesSelected = 'Nessun file selezionato!'; + LANGitSelectedFilesDirectories = '%d file/directory selezionate'; + LANGitDirectoryS = 'directory %s'; + LANGitFileS = 'file %s'; + LANGitDoYouReallyWantToDeleteTheS = 'Vuoi veramente eliminare %s ?'; + LANGitDoYouReallyWantToDeleteTheSS = 'Vuoi veramente eliminare %s ?'#10'%s'; + LANGitCopyFiles = 'Copia file'; + LANGitMoveRenameFiles = 'Sposta/Rinomina file'; + LANGitCopyDFileDirectoriesTo = 'Copia %d file/directory in'; + LANGitMoveRenameDFileDirectoriesTo = 'Sposta/Rinomina %d file/directory in'; + LANGitCopySC = 'Copia:'; + LANGitMoveRenameSC = 'Sposta/Rinomina:'; + + LANGitQuickFind = ' Ricerca Veloce:'; + + LANGitAboutString = 'Tux Commander'#10'Versione %s'#10'Compilato il: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Sito WEB: http://tuxcmd.sourceforge.net/'; + LANGitAboutStringGnome = 'versione %s'#10'Compilato il: %s'#10'Sito WEB: http://tuxcmd.sourceforge.net/'; + LANGitDiskStatFmt = '%s di %s liberi'; + LANGitDiskStatVolNameFmt = '[%s] %s di %s liberi'; + LANGitStatusLineFmt = '%s di %s in %d di %d file selezionati'; + LANGitPanelStrings : array[boolean] of string = ('destra', 'sinistra'); + + LANGitDIR = ''; + LANGitErrorGettingListingForSPanel = 'Impossibile visualizzare il contenuto del pannello %s:'#10' %s'#10#10'Percorso = ''%s'''; + LANGitErrorGettingListingForSPanelNoPath = 'Impossibile visualizzare il contenuto del pannelo %s:'#10' %s'; + LANGitErrorCreatingNewDirectorySInSPanel = 'Impossibile creare la nuova directory ''%s'' nel pannello %s:'#10' %s'; + LANGitErrorCreatingNewDirectorySInSPanelNoPath = 'Impossibile creare una nuova directory nel pannello %s:'#10' %s'; + LANGitTheFileDirectory = 'Il file/directory'; + LANGitCouldNotBeDeleted = 'non può essere eliminato'; + LANGitCouldNotBeDeletedS = 'non può essere eliminato: %s'; + LANGitUserCancelled = 'Azione interrotta dall''utente!'; + LANGitTheDirectorySIsNotEmpty = 'La directory %s non è vuota!'; + LANGitCannotCopyFile = 'Impossibile copiare il file'; + LANGitCopyError = 'Errore nella copiatura'; + LANGitMoveError = 'Errore nello spostamento'; + LANGitOverwriteS = 'Sovrascrivere: %s'; + LANGitWithFileS = 'Con il file: %s'; + LANGitOvewriteSBytesS = '%s byte, %s'; + LANGitTheFile = 'Il file'; + LANGitCopy = 'Copia'; + LANGitMove = 'Sposta'; + LANGitTheDirectory = 'La directory'; + LANGitTheSymbolicLink = 'Il link simbolico'; + LANGitCannotMoveFile = 'Impossibile spostare il file'; + LANGitCouldNotBeCreated = 'non può essere creato'; + LANGitCouldNotBeCreatedS = 'non può essere creato: %s'; + LANGitFromS = 'Da: %s'; + LANGitToS = 'A: %s'; + LANGitCannotCopyFileToItself = 'Impossibile copiare un file verso se stesso'; + LANGitMemoryAllocationFailed = 'Errore nell''allocazione della memoria:'; + LANGitCannotOpenSourceFile = 'Impossibile aprire il file di partenza'; + LANGitCannotOpenDestinationFile = 'Impossibile aprire il file di destinazione'; + LANGitCannotCloseDestinationFile = 'Impossibile chiudere il file di destinazione'; + LANGitCannotCloseSourceFile = 'Impossibile chiudere il file di partenza'; + LANGitCannotReadFromSourceFile = 'Impossibile leggere dal file di partenza'; + LANGitCannotWriteToDestinationFile = 'Impossibile scrivere sul file di destinazione'; + + LANGitUnknownException = 'Eccezione sconosciuta'; + LANGitNoAccess = 'Nessun accesso'; + LANGitUnknownError = 'Errore sconosciuto'; + + LANGitCreateANewDirectory = 'Crea una nuova directory'; + LANGitEnterDirectoryName = 'Digita il nome della _directory:'; + + LANGitOverwriteQuestion = 'Conferma sovrascrittura'; + LANGitOverwriteButton_Caption = '_Sovrascrivi'; + LANGitOverwriteAllButton_Caption = 'Sovrascrivi _tutti'; + LANGitSkipButton_Caption = '_Salta'; + LANGitOverwriteAllOlderButton_Caption = 'Sovrascrivi tutti i più _vecchi'; + LANGitSkipAllButton_Caption = 'S_alta tutti'; + LANGitRenameButton_Caption = '_Rinomina'; + LANGitAppendButton_Caption = 'A_ggiungi'; + LANGitRename = 'Rinomina'; + LANGitRenameFile = 'Rinomina il file ''%s'' in'; + LANGitIgnoreButton_Caption = '_Ignora'; + + LANGitProgress = 'Progresso'; + LANGitCancel = '_Annulla'; + LANGitDelete = 'Elimina:'; + + LANGitSpecifyFileType = '_Specifica il tipo di file:'; + + LANGitRemoveDirectory = 'Rimuovi directory'; + LANGitDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Vuoi veramente eliminarla (compresi i file e le directory in essa contenuti)?'; + LANGitRetry = '_Riprova'; + LANGitDeleteButton_Caption = '_Elimina'; + LANGitAll = '_Tutti'; + + LANGitCopyFilesSC = 'Copia i file:'; + LANGitAppendQuestion = 'Vuoi veramente aggiungere il file ''%s'' a ''%s''?'; + LANGitPreparingList = 'Preparazione della lista...'; + + LANGitYouMustSelectAValidFile = 'Devi selezionare un file valido!'; + LANGitmiVerifyChecksums = '_Verifica le checksum'; + LANGitVerifyChecksumsCaption = 'Verifica le checksum'; + LANGitCheckButtonCaptionCheck = '_Controlla'; + LANGitCheckButtonCaptionStop = '_Annulla'; + LANGitFileListTooltip = '[?] - Non controllati'#10'[OK] - Checksum OK'#10'[ERR] - Checksum ERRATO'#10'[N/A] - File non disponibile'; + LANGitFilenameColumnCaption = 'Nome del file'; + LANGitTheFileSYouAreTryingToOpenIsQuiteBig = 'Il file ''%s'' che stai cercando di aprire è molto grosso (%s byte). Potrebbe non essere un file di checksum valido.'#10#10'Vuoi aprirlo comunque?'; + LANGitAnErrorOccuredWhileInitializingMemoryBlock = 'Errore nell''inizializzazione dei blocchi di memoria. Chiudi qualche programma e prova ancora.'; + LANGitAnErrorOccuredWhileOpeningFileSS = 'Errore nell''apertura del file ''%s'':'#10' %s'; + LANGitAnErrorOccuredWhileReadingFileSS = 'Errore nella lettura del file ''%s'':'#10' %s'; + LANGitChecksumNotChecked = 'Status: Non controllato'; + LANGitChecksumChecking = 'Status: Controllo in corso...'; + LANGitChecksumInterrupted = 'Status: Interrotto'; + LANGitChecksumDOK = 'Status: %d%% OK'; + + LANGitmiCreateChecksumsCaption = '_Crea checksum...'; + LANGitYouMustSelectAtLeastOneFileToCalculateChecksum = 'Devi selezionare almeno un file per poterne calcolare la checksum!'; + LANGitCreateChecksumsCaption = 'Crea checksum'; + LANGitCCHKSUMPage1Text = 'Stai per creare la checksum dei'#10'file selezionati. Se hai dimenticato di selezionare'#10'qualche file, chiudi questo wizard e'#10'riprova.'; + LANGitCCHKSUMPage4Text = 'Il wizard è pronto per calcolare la checksum dei'#10'file selezionati. Questa operazione può richiedere alcuni minuti.'#10'Premi Continua per continuare.'; + LANGitCCHKSUMPage6Text = 'Ci sono stati degli errori nel calcolare la checksum:'; + LANGitCCHKSUMPage7Text = 'La creazione della checksum è terminata e'#10'i tuoi file sono pronti.'#10#10'Clicca "Fine" per uscire.'; + LANGitCCHKSUMPage1Title = 'Prepara i file per la checksum'; + LANGitCCHKSUMPage2Title = 'Seleziona il tipo di checksum'; + LANGitCCHKSUMPage3Title = 'Scegli il nome del file'; + LANGitCCHKSUMPage4Title = 'Pronto per controllare'; + LANGitCCHKSUMPage5Title = 'Processo in corso...'; + LANGitCCHKSUMPage6Title = 'Errore!'; + LANGitCCHKSUMPage7Title = 'Finito'; + LANGitCCHKSUMSFVFile = 'File SFV'; + LANGitCCHKSUMMD5sumFile = 'File MD5'; + LANGitCCHKSUMFileName = '_Nome del file:'; + LANGitCCHKSUMCreateSeparateChecksumFiles = 'Crea file di checksum _separati'; + LANGitCCHKSUMNowProcessingFileS = 'Sto processando il file: %s'; + LANGitCCHKSUMFinishCaption = '_Fine'; + LANGitCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Sei veramente sicuro di voler interrompere il processo?'; + LANGitCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Errore nell''apertura del file ''%s'': %s'#10; + LANGitCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Errore nella lettura del file ''%s'': %s'#10; + LANGitCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Errore nella scrittura del file ''%s'': %s'#10; + + LANGitAnErrorOccuredWhileWritingFileSS = 'Errore nella scrittura del file ''%s'':'#10' %s'; + LANGitTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Il file di destinazione ''%s'' esiste già. Vuoi sovrascriverlo?'; + LANGitTheTargetFileSCannotBeRemovedS = 'Il file di destinazione ''%s'' non può essere rimosso: %s'; + LANGitMergeCaption = 'Fusione'; + LANGitPleaseInsertNextDiskOrGiveDifferentLocation = 'Inserisci il prossimo disco oppure indica una diversa posizione:'; + LANGitMergeOfSSucceeded = 'La fusione di ''%s'' ha avuto successo (checksum CRC OK).'; + LANGitWarningCreatedFileFailsCRCCheck = 'Attenzione: il file creato non ha superato il test CRC!'; + LANGitMergeOfSSucceeded_NoCRCFileAvailable = 'La fusione di ''%s'' ha avuto successo (il file CRC non è disponibile).'; + LANGitMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Fondi ''%s'' e tutti i file con nome crescente nella seguente directory:'; + LANGitMergeSC = 'Fondi:'; + LANGitmiSplitFileCaption = '_Dividi File...'; + LANGitmiMergeFilesCaption = '_Fondi File...'; + + LANGitSplitTheFileSToDirectory = '_Dividi il file ''%s'' nella directory:'; + LANGitSplitSC = 'Dividi:'; + LANGitSplitFile = 'Dividi il file'; + LANGitBytesPerFile = '_Byte per file:'; + LANGitAutomatic = 'Automatico'; + LANGitDeleteFilesOnTargetDisk = '_Elimina i file dal disco di destinazione (per supporti rimovibili)'; + LANGitSplitCaption = 'Dividi'; + LANGitCannotOpenFileS = 'Impossibile aprire il file ''%s'''; + LANGitCannotSplitTheFileToMoreThan999Parts = 'Impossibile suddividere il file in più di 999 parti!'; + LANGitThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Ci sono alcuni file nella directory di destinazione:'#10'%s'#10'Vuoi veramente eliminarli?'; + LANGitThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Ci sono %d file nella directory di destinazione. Vuoi veramente eliminarli?'; + LANGitAnErrorOccuredWhileOperationS = 'Errore durante l''operazione: %s'; + LANGitSplitOfSSucceeded = 'La suddivisione di ''%s'' ha avuto successo.'; + LANGitSplitOfSFailed = 'La suddivisione di ''%s'' è fallita!'; + + LANGitmnuShow_Caption = 'Mostra'; + LANGitmiShowDotFiles_Caption = 'Mostra i _dot files'; + LANGitTheFileYouAreTryingToOpenIsQuiteBig = 'Il file che stai per aprire è molto grande. Aprirlo in un''applicazione esterna (come gedit) può causare il rallentamento del sistema.'#10'Vuoi veramente continuare?'; + LANGitCannotExecuteSPleaseCheckTheConfiguration = 'Impossibile eseguire ''%s''. Controlla la configurazione oppure imposta correttamente l''associazione dei file.'; + LANGitEdit = 'Modifica'; + LANGitEnterFilenameToEdit = '_Digita il nome del file da modificare:'; + + LANGitmnuSettings_Caption = 'I_mpostazioni'; + LANGitmiFileTypes_Caption = '_Tipi di file...'; + LANGitThereIsNoApplicationAssociatedWithS = 'Non esiste alcuna applicazione associata a "%s".'#10#10'Puoi configurare Tux Commander in modo da associare un''applicazione ad un tipo di file. Vuoi associare un''applicazione a questo tipo di file?'; + LANGitErrorExecutingCommand = 'Errore nell''esecuzione del comando!'; + LANGitEditFileTypesCaption = 'Modifica i Tipi di File'; + LANGitTitleLabel_Caption = 'Configurazione dei Tipi di File'; + LANGitExtensionsColumn = 'Estensioni'; + LANGitDescriptionColumn = 'Descrizione'; + LANGitFileTypesList = 'Lista dei tipi di file'; + LANGitActionName = 'Nome dell''azione'; + LANGitCommand = 'Comando'; + LANGitSetDefaultActionButton_Caption = '_Imposta come predefinito'; + LANGitRunInTerminalCheckBox_Caption = 'Esegui nel _Terminale'; + LANGitAutodetectCheckBox_Caption = 'Rileva automaticamente applicazioni _grafiche'; + LANGitBrowseButton_Caption = '_Esplora...'; + LANGitCommandLabel_Caption = 'Co_mando:'; + LANGitDescriptionLabel_Caption = 'D_escrizione:'; + LANGitFNameExtLabel_Caption = 'A_ggiungi estensione:'; + LANGitNotebookPageExtensions = 'Tipo di File'; + LANGitNotebookPageActions = 'Azioni'; + LANGitDefault = ' (predefinito)'; + LANGitCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Impossibile memorizzare l''associazione al tipo di file in quanto un altro processo l''ha aggiorna nel frattempo.'; + + LANGitDefaultColor = 'Colore P_redefinito'; + LANGitIcon = '_Icona:'; + LANGitBrowseForIcon = 'Ricerca un''icona'; + LANGitSelectFileTypeColor = 'Seleziona un colore per il tipo di file'; + LANGitColor = 'Co_lore:'; + + LANGitmiChangePermissions_Caption = 'Cambia i Per_messi...'; + LANGitmiChangeOwner_Caption = 'Cambia il _Proprietario/Gruppo...'; + LANGitmiCreateSymlink_Caption = 'Crea un link Sim_bolico...'; + LANGitmiEditSymlink_Caption = '_Modifica link Simbolico...'; + LANGitChmodProgress = 'Cambia i permessi:'; + LANGitChownProgress = 'Cambia il proprietario:'; + LANGitYouMustSelectAValidSymbolicLink = 'Devi selezionare un link simbolico valido!'; + LANGitPopupRunS = 'E_segui %s'; + LANGitPopupOpenS = 'A_pri %s'; + LANGitPopupGoUp = '_Vai su'; + LANGitPopupOpenWithS = 'Apri con %s'; + LANGitPopupDefault = ' (predefinito)'; + LANGitPopupOpenWith = 'A_pri con...'; + LANGitPopupViewFile = '_Visualizza file'; + LANGitPopupEditFile = 'Modifica file'; + LANGitPopupMakeSymlink = 'Crea link _simbolico'; + LANGitPopupRename = '_Rinomina'; + LANGitPopupDelete = '_Elimina'; + LANGitDialogChangePermissions = 'Cambia i permessi'; + LANGitCouldNotBeChmoddedS = 'impossibile eseguire il comando chmod: %s'; + LANGitDialogChangeOwner = 'Cambia proprietario'; + LANGitCouldNotBeChownedS = 'impossibile eseguire il comando chown: %s'; + LANGitDialogMakeSymlink = 'Crea un link simbolico'; + LANGitDialogEditSymlink = 'Modifica il link simbolico'; + LANGitFEditSymlink_Caption = 'Modifica il link simbolico'; + LANGitFEditSymlink_SymbolicLinkFilename = 'Nome del link _Simbolico:'; + LANGitFEditSymlink_SymbolicLinkPointsTo = 'Il link simbolico punta _verso:'; + + LANGitFChmod_Caption = 'Permessi di accesso'; + LANGitFChmod_PermissionFrame = 'Permessi'; + LANGitFChmod_FileFrame = 'File'; + LANGitFChmod_ApplyRecursivelyFor = 'Applica _ricorsivamente per'; + LANGitFChmod_miAllFiles = 'Tutti i file e le directory'; + LANGitFChmod_miDirectories = 'Solo directory'; + LANGitFChmod_OctalLabel = '_Ottale:'; + LANGitFChmod_SUID = 'SUID - Imposta user ID in esecuzione'; + LANGitFChmod_SGID = 'SGID - Imposta group ID in esecuzione'; + LANGitFChmod_Sticky = 'Sticky bit'; + LANGitFChmod_RUSR = 'RUSR - Leggi dal proprietario'; + LANGitFChmod_WUSR = 'WUSR - Scrivi dal proprietario'; + LANGitFChmod_XUSR = 'XUSR - Esegui/Cerca dal proprietario'; + LANGitFChmod_RGRP = 'RGRP - Leggi dal gruppo'; + LANGitFChmod_WGRP = 'WGRP - Scrivi dal gruppo'; + LANGitFChmod_XGRP = 'XGRP - Esegui/Cerca dal gruppo'; + LANGitFChmod_ROTH = 'ROTH - Leggi da altri'; + LANGitFChmod_WOTH = 'WOTH - Scrivi da altri'; + LANGitFChmod_XOTH = 'XOTH - Esegui/Cerca da altri'; + LANGitFChmod_TextLabel = 'Testo: %s'; + LANGitFChmod_FileLabel = 'File: %s'#10'Testo: %s'#10 + + 'Ottale: %d'#10'Proprietario: %s'#10 + + 'Gruppo: %s'; + + LANGitFChown_Caption = 'Cambia proprietario/gruppo'; + LANGitFChown_OwnerFrame = 'Nome dell''utente'; + LANGitFChown_GroupFrame = 'Nome del gruppo'; + LANGitFChown_FileFrame = 'File'; + LANGitFChown_ApplyRecursively = 'Applica _ricorsivamente'; + + LANGitFSymlink_Caption = 'Crea link simbolico'; + LANGitFSymlink_ExistingFilename = 'Nome del file _esistente (il nome del file del link simbolico punterà verso):'; + LANGitFSymlink_SymlinkFilename = 'Nome del link _simbolico:'; + + LANGitmnuBookmarks_Caption = '_Segnalibri'; + LANGitmiAddBookmark_Caption = 'Aggiungi Segnalibro'; + LANGitmiEditBookmarks_Caption = 'Modifica Segnalibri'; + LANGitBookmarkPopupDelete_Caption = '_Elimina'; + LANGitmiPreferences_Caption = '_Preferenze...'; + LANGitTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'La directory corrente esiste già nella lista dei segnalibri'; + LANGitSomeOtherInstanceChanged = 'Qualche altra istanza di Tux Commander ha cambiato la configurazione. Vuoi applicare i nuovi cambiamenti?'#10#10'Attenzione: Se premi No a questo punto, la configurazione sarà sovrascritta su questa istanza'' esci!'; + + LANGitPreferences_Caption = 'Preferenze'; + LANGitPreferences_TitleLabel_Caption = 'Preferenze Applicazione'; + LANGitPreferences_GeneralPage = 'Generale'; + LANGitPreferences_FontsPage = 'Caratteri'; + LANGitPreferences_ColorsPage = 'Colori'; + LANGitPreferences_RowHeight = '_Altezza Righe:'; + LANGitPreferences_NumHistoryItems = 'Cronologia _comandi da terminale:'; + LANGitPreferences_Default = '_Predefinito'; + LANGitPreferences_ClearReadonlyAttribute = 'Pulisci attributo solo _lettura quando copia da CD-ROM'; + LANGitPreferences_DisableMouseRenaming = 'Disabilita possibilità di rinominare col _mouse'; + LANGitPreferences_ShowFiletypeIconsInList = 'Mostra icone dei tipi di _file'; + LANGitPreferences_ExternalAppsLabel = 'Programmi Esterni'; + LANGitPreferences_Viewer = '_Visualizzatore:'; + LANGitPreferences_Editor = '_Editor:'; + LANGitPreferences_Terminal = '_Terminale:'; + LANGitPreferences_ListFont = 'Lista Caratteri:'; + LANGitPreferences_Change = 'Cambia...'; + LANGitPreferences_UseDefaultFont = 'Usa font _predefinito'; + LANGitPreferences_Foreground = 'Foreground'; + LANGitPreferences_Background = 'Background'; + LANGitPreferences_NormalItem = 'Elemento Normale:'; + LANGitPreferences_SetToDefaultToUseGTKThemeColors = 'Imposta come predefinito l''uso dei colori del tema GTK'; + LANGitPreferences_Cursor = 'Cursore:'; + LANGitPreferences_InactiveItem = 'Elemento Inattivo:'; + LANGitPreferences_SelectedItem = 'Elemento Selezionato:'; + LANGitPreferences_LinkItem = 'Link simbolici:'; + LANGitPreferences_LinkItemHint = 'Imposta come predefinita la visualizzazione dei link simbolici usando i colori normali degli elementi'; + LANGitPreferences_DotFileItem = 'Dot files:'; + LANGitPreferences_DotFileItemHint = 'Imposta come predefinita la visualizzazione dei dot-files usando i colori normali degli elementi'; + LANGitPreferences_BrowseForApplication = 'Cerca un''applicazione'; + LANGitPreferences_DefaultS = 'Predefinito: %s'; + LANGitPreferences_SelectFont = 'Seleziona un carattere'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGitBookmarkButton_Tooltip = 'Mostra segnalibri'; + LANGitUpButton_Tooltip = 'Vai alla directory superiore'; + LANGitRootButton_Tooltip = 'Vai alla directory principale (/)'; + LANGitHomeButton_Tooltip = 'Vai alla directory dell''utente (/home/user)'; + LANGitLeftEqualButton_Tooltip = 'Carica nel pannello destro la stessa directory'; + LANGitRightEqualButton_Tooltip = 'Carica nel pannello sinistro la stessa directory'; + LANGitmiShowDirectorySizes_Caption = 'Mostra le dimensioni delle d_irectory'; + LANGitmiTargetSource_Caption = '_Destinazione = Sorgente'; + LANGitFileTypeDirectory = 'Directory'; + LANGitFileTypeFile = 'File'; + LANGitFileTypeMetafile = 'Questo è un meta-item comune'; + LANGitPreferencesPanelsPage = 'Pannelli'; + LANGitPreferencesApplicationsPage = 'Applicazioni'; + LANGitPreferencesExperimentalPage = 'Sperimentale'; + LANGitPreferencesSelectAllDirectoriesCheckBox_Caption = 'Seleziona _anche le directory quando selezioni tutto'; + LANGitPreferencesNewStyleAltOCheckBox_Caption = '_Nuovo stile Alt+O'; + LANGitPreferencesNewStyleAltOCheckBox_Tooltip = 'Resta nella stessa directory quando quando cambi la directory del pannello opposto premendo Ctrl/Alt+O'; + LANGitPreferencesShowFuncButtonsCheckBox_Caption = 'Mostra le funzioni dei bottoni _chiave'; + LANGitPreferencesSizeFormatLabel_Caption = 'Formato _dimensione:'; + LANGitPreferencesmiSizeFormat1 = 'Sistema'; + LANGitPreferencesmiSizeFormat6 = 'Raggruppato'; + LANGitPreferencesAutodetectXApp = 'Rileva automaticamente applicazioni X'; + LANGitPreferencesAlwaysRunInTerminal = 'Esegui sempre da terminale'; + LANGitPreferencesNeverRunInTerminal = 'Non eseguire mai da terminale'; + LANGitPreferencesCmdLineBehaviourLabel_Caption = '_Esegui da linea di comando:'; + LANGitPreferencesFeatures = 'Feature'; + LANGitPreferencesDisableMouseRename_Tooltip = 'Puoi ancora eseguire un quick-rename premendo Shift+F6'; + LANGitPreferencesDisableFileTipsCheckBox_Caption = 'Disabilita i _tooltip'; + LANGitPreferencesDisableFileTipsCheckBox_Tooltip = 'Non visualizzare i tooltip del pannello se il testo in una colonna è troncato'; + LANGitPreferencesShow = 'Mostra'; + LANGitPreferencesDirsInBoldCheckBox_Caption = 'Directory in _grassetto'; + LANGitPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Disabilita le parentesi attorno al nome delle directory'; + LANGitPreferencesOctalPermissionsCheckBox_Caption = 'Mostra i permessi in _ottale'; + LANGitPreferencesOctalPermissionsCheckBox_Tooltip = 'Mostra i permessi di file e directory come numeri anziché come testo (-rw-rw-rw-)'; + LANGitPreferencesMovement = 'Movimento'; + LANGitPreferencesLynxLikeMotionCheckBox_Caption = 'Movimento _Lynx-like'; + LANGitPreferencesInsertMovesDownCheckBox_Caption = '_Insert muove in basso'; + LANGitPreferencesSpaceMovesDownCheckBox_Caption = '_Space muove in alto'; + LANGitPreferencesViewer = 'Visualizzatore'; + LANGitPreferencesCommandSC = 'Comando:'; + LANGitPreferencesUseInternalViewer = 'Usa il visualizzatore _interno'; + LANGitPreferencesEditor = 'Editor'; + LANGitPreferencesTerminal = 'Terminale'; + LANGitPreferencesExperimentalFeatures = 'Features sperimentali'; + LANGitPreferencesExperimentalWarningLabel_Caption = 'Attenzione: Queste feature sono sperimentali e potrebbero non funzionare correttamente. Usale a tuo rischio!'; + LANGitPreferencesFocusRefreshCheckBox_Caption = 'Effettua il refresh quando una finestra viene selezionata'; + LANGitPreferencesFocusRefreshCheckBox_Tooltip = 'Al momento il refresh è molto lento'; + LANGitPreferencesWMCompatModeCheckBox_Caption = 'Modalità compatibile _WM'; + LANGitPreferencesWMCompatModeCheckBox_Tooltip = 'Usa se riscontri problemi con un window manager (ad esempio IceWM non effettua l''ingrandimento delle finestre correttamente)'; + LANGitPreferencesCompatUseLibcSystemCheckBox_Caption = 'Usa libc _system() per eseguire i programmi'; + LANGitPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Usare in caso freeze o crash nell''avvio di applicazioni esterne'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGitmiSearchCaption2 = '_Cerca...'; + LANGitmiNoMounterBarCaption = 'No_n visualizzare la barra dei dispositivi montati'; + LANGitmiShowOneMounterBarCaption = 'Visualizza _una barra dei dispositivi montati'; + LANGitmiShowTwoMounterBarCaption = 'Visualizza _due barre dei dispositivi montati'; + LANGitmnuNetworkCaption = 'R_ete'; + LANGitmiConnectionsCaption = '_Connessioni...'; + LANGitmiOpenConnectionCaption = '_Apri connessione...'; + LANGitmiQuickConnectCaption = 'Connessione _veloce...'; + LANGitmnuPluginsCaption = 'Pl_ugin'; + LANGitmiTestPluginCaption = '_Prova plugin...'; + LANGitmiMounterSettingsCaption = 'Impostazioni montaggio...'; + LANGitmiColumnsCaption = 'Colonne del pannello...'; + LANGitmiSavePositionCaption = '_Salva la posizione'; + LANGitmiMountCaption = '_Monta'; + LANGitmiUmountCaption = '_Smonta'; + LANGitmiEjectCaption = '_Espelli'; + LANGitmiDuplicateTabCaption = 'Duplica il tab corrente'; + LANGitmiCloseTabCaption = 'Chiudi il tab corrente'; + LANGitmiCloseAllTabsCaption = 'Chiudi tutti i tab'; + LANGitCannotDetermineDestinationEngine = 'Impossibile determinare la destinazione. Inserisci il percorso corretto e prova ancora.'; + LANGitCannotLoadFile = 'Impossibile caricare il file ''%s''. Controlla i permessi.'; + LANGitMountPointDevice = 'Mount Point: %s'#10'Dispositivo: %s'; + LANGitMountSC = 'Monta:'; + LANGitNoPluginsFound = 'Nessun plugin trovato'; + LANGitPluginAbout = 'Informazioni...'; + LANGitCouldntOpenURI = 'Impossibile aprire l''URI specificato. Controlla l''URI specificato e i permessi d''accesso.'; + LANGitPluginAboutInside = 'Plugin: %s'#10#10'%s'#10'%s'; + LANGitAreYouSureCloseAllTabs = 'Vuoi veramente chiudere tutti i tab inattivi?'; + LANGitCouldntOpenURIArchive = 'Impossibile aprire l''archivio. Controlla la consistenza e i permessi d''accesso.'; + LANGitThereIsNoModuleAvailable = 'Non esistono moduli VFS disponibili che possano gestire questa connessione'; + LANGitIgnoreError = 'Vuoi veramente ignorare l''errore? Il file sorgente verrà eliminato'; + LANGitErrorMount = 'Impossibile montare il dispositivo ''%s'':'#10#10; + LANGitErrorUmount = 'Impossibile smontare il dispositivo ''%s'':'#10#10; + LANGitErrorEject = 'Impossibile espellere il dispositivo ''%s'':'#10#10; + + LANGitMounterPrefs_Caption = 'Impostazioni del Mounter'; + LANGitMounterPrefs_TitleLabelCaption = 'Impostazioni del Mounter'; + LANGitMounterPrefs_ListViewFrameCaption = 'Mounter'; + LANGitMounterPrefs_MountName = 'Mount Name'; + LANGitMounterPrefs_MountPoint = 'Mount Point'; + LANGitMounterPrefs_Device = 'Dispositivo'; + LANGitMounterPrefs_MoveUpButtonTooltip = 'Sposta l''elemento su'; + LANGitMounterPrefs_MoveDownButtonTooltip = 'Sposta l''elemento giù'; + LANGitMounterPrefs_UseFSTabDefaultsCheckBox = 'Usa gli elementi predefiniti di _fstab'; + LANGitMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Selezionando questa opzione, la barra dei dispositivi montati verrà popolata dagli elementi presenti nel file /etc/fstab (system mountlist file)'; + LANGitMounterPrefs_ToggleModeCheckBox = 'I bottoni stanno _giù quando montati'; + LANGitMounterPrefs_ToggleModeCheckBoxTooltip = 'Selezionando questa opzione, i bottoni della barra dei dispositivi montati resteranno giù se il dispositivo è montato; un altro clic per smontare (espellere in questo caso)'; + LANGitMounterPrefs_PropertiesFrameCaption = 'Proprietà degli elementi del Mounter'; + LANGitMounterPrefs_DisplayTextLabelCaption = '_Testo Visualizzato:'; + LANGitMounterPrefs_MountPointLabelCaption = 'Mount _Point:'; + LANGitMounterPrefs_MountDeviceLabelCaption = '_Dispositivo:'; + LANGitMounterPrefs_DeviceTypeLabelCaption = 'T_ipo di Dispositivo:'; + LANGitMounterPrefs_miLocalDiskCaption = 'Disco locale'; + LANGitMounterPrefs_miRemovableCaption = 'Rimovibile'; + LANGitMounterPrefs_miCDCaption = 'Unità CD/DVD'; + LANGitMounterPrefs_miFloppyCaption = 'Unità Floppy'; + LANGitMounterPrefs_miNetworkCaption = 'Rete'; + LANGitMounterPrefs_MountCommandLabelCaption = 'Comando per il montaggio:'; + LANGitMounterPrefs_UmountCommandLabelCaption = 'Comando per lo smontaggio:'; + LANGitMounterPrefs_MountCommandEntryTooltip = 'Sintassi: usa %dev per sostituire il dispositivo e %dir per il mount point oppure lascia vuoto per predefinito montaggio'#10 + + 'Nota: presta attenzione ai comandi interattivi, Tux Commander può bloccarsi!'#10'Esempio: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGitMounterPrefs_UmountCommandEntryTooltip = 'Sintassi: usa %dev per sostituire il dispositivo e %dir per il mount point oppure lascia vuoto per predefinito smontaggio'#10'Esempio: smbumount $dir'; + LANGitMounterPrefs_IconLabelCaption = '_Icona:'; + + LANGitConnMgr_Caption = 'Apri Nuova Connessione'; + LANGitConnMgr_ConnectButton = 'Co_nnetti'; + LANGitConnMgr_OpenConnection = 'Apri Connessione'; + LANGitConnMgr_NameColumn = 'Nome'; + LANGitConnMgr_URIColumn = 'URI'; + LANGitConnMgr_AddConnectionButtonCaption = '_Aggiungi sito...'; + LANGitConnMgr_AddConnectionButtonTooltip = 'Aggiungi nuova connessione'; + LANGitConnMgr_EditButtonCaption = '_Modifica...'; + LANGitConnMgr_EditButtonTooltip = 'Modifica la connessione selezionata'; + LANGitConnMgr_RemoveButtonCaption = '_Rimuovi il sito'; + LANGitConnMgr_RemoveButtonTooltip = 'Rimuovi la connessione selezionata'; + LANGitConnMgr_DoYouWantDelete = 'Vuoi veramente eliminare la connessione ''%s''?'; + + LANGitConnProp_FTP = 'FTP'; + LANGitConnProp_SFTP = 'SFTP (ssh subsystem)'; + LANGitConnProp_SMB = 'Windows share (SMB)'; + LANGitConnProp_HTTP = 'WebDAV (HTTP)'; + LANGitConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGitConnProp_Other = 'Altro (specificare l''URI)'; + LANGitConnProp_Caption = 'Proprietà Connessione'; + LANGitConnProp_VFSModule = 'Modulo _VFS:'; + LANGitConnProp_URI = '_URI:'; + LANGitConnProp_URIEntryTooltip = 'Un URI corretto deve contenere un service type prefix e un indirizzo server'; + LANGitConnProp_DetailedInformations = 'Informazioni dettagliate'; + LANGitConnProp_Name = '_Nome:'; + LANGitConnProp_Server = 'Ser_ver[:porta]:'; + LANGitConnProp_Username = 'Userna_me:'; + LANGitConnProp_UserNameEntryTooltip = 'Lascia vuoto per un login anonimo'; + LANGitConnProp_Password = '_Password:'; + LANGitConnProp_TargetDirectory = '_Directory di destinazione:'; + LANGitConnProp_ServiceType = 'Tipo di _servizio:'; + LANGitConnProp_MaskPassword = '_Nascondi password'; + LANGitConnProp_MenuItemCaption = 'Predefinito (tutti i moduli adatti)'; + + LANGitConnLogin_Caption = 'Autenticazione richiesta'; + LANGitConnLogin_Login = 'Login'; + LANGitConnLogin_ExperimentalWarningLabelCaption = 'Devi effettuare il log in per accedere %s'; + LANGitConnLogin_Username = '_Username:'; + LANGitConnLogin_Password = '_Password:'; + LANGitConnLogin_AnonymousCheckButton = '_Anonimo'; + + LANGitColumns_Caption = 'Impostazioni Colonne del Pannello'; + LANGitColumns_Title = 'Impostazioni Colonne del Pannello'; + LANGitColumns_MoveUpButtonTooltip = 'Sposta l''elemento su'; + LANGitColumns_MoveDownButtonTooltip = 'Sposta l''elemento giu'; + LANGitColumns_TitlesLongName = 'Nome'; + LANGitColumns_TitlesLongNameExt = 'Nome + Estensione'; + LANGitColumns_TitlesLongExt = 'Estensione'; + LANGitColumns_TitlesLongSize = 'Dimensione'; + LANGitColumns_TitlesLongDateTime = 'Data + Orario'; + LANGitColumns_TitlesLongDate = 'Data'; + LANGitColumns_TitlesLongTime = 'Orario'; + LANGitColumns_TitlesLongUser = 'Utente'; + LANGitColumns_TitlesLongGroup = 'Gruppo'; + LANGitColumns_TitlesLongAttr = 'Attributi'; + LANGitColumns_TitlesShortName = 'Nome'; + LANGitColumns_TitlesShortNameExt = 'Nome'; + LANGitColumns_TitlesShortExt = 'Estensione'; + LANGitColumns_TitlesShortSize = 'Dimensione'; + LANGitColumns_TitlesShortDateTime = 'Data'; + LANGitColumns_TitlesShortDate = 'Data'; + LANGitColumns_TitlesShortTime = 'Orario'; + LANGitColumns_TitlesShortUser = 'Utente'; + LANGitColumns_TitlesShortGroup = 'Gruppo'; + LANGitColumns_TitlesShortAttr = 'Attributi'; + + LANGitTestPlugin_Caption = 'Test VFS Plugin'; + LANGitTestPlugin_Title = 'Test VFS Plugin'; + LANGitTestPlugin_ExperimentalWarningLabelCaption = 'Warning: Il sottosistema VFS e i suoi plugin sono sperimentali e potrebbero contenere bachi. Usa questa funzionalità a tuo rischio!'; + LANGitTestPlugin_Plugin = '_Plugin:'; + LANGitTestPlugin_Command = 'Co_mando:'; + LANGitTestPlugin_Username = '_Username:'; + LANGitTestPlugin_Password = '_Password:'; + LANGitTestPlugin_AnonymousCheckButton = 'Login _anonimo (non chiama VFSLogin)'; + LANGitTestPlugin_NoPluginsFound = 'Nessun plugins trovato'; + + LANGitRemoteWait_Caption = 'Operazione in corso'; + LANGitRemoteWait_OperationInProgress = 'Operazione in corso, sii paziente...'; + LANGitRemoteWait_ItemsFound = 'Elementi trovati: %d'; + + LANGitSearch_Bytes = 'Byte'; + LANGitSearch_kB = 'kB'; + LANGitSearch_MB = 'MB'; + LANGitSearch_days = 'giorni'; + LANGitSearch_weeks = 'settimane'; + LANGitSearch_months = 'mesi'; + LANGitSearch_years = 'anni'; + LANGitSearch_Caption = 'Trova File'; + LANGitSearch_General = 'Generale'; + LANGitSearch_Advanced = 'Avanzato'; + LANGitSearch_SearchResults = 'Trova Risultati:'; + LANGitSearch_SearchFor = 'Trova _per:'; + LANGitSearch_FileMaskEntryTooltip = 'Suggerimento: Usa dei punto e virgola (";") per specificare più file da cercare'; + LANGitSearch_SearchIn = 'Cerca _in:'; + LANGitSearch_SearchArchivesCheckButton = 'Cerca _archivi'; + LANGitSearch_FindText = 'Cerca _testo:'; + LANGitSearch_FindTextEntryTooltip = 'Lascia vuoto per escludere il text matching'#10'Nota che stiamo usando UTF-8 nella parte GUI'; + LANGitSearch_CaseSensitiveCheckButton = 'Cas_e sensitive'; + LANGitSearch_StayCurrentFSCheckButton = 'Includi altri files_ystems'; + LANGitSearch_CaseSensitiveMatchCheckButton = 'Ca_se sensitive'; + LANGitSearch_Size = 'Dimensione'; + LANGitSearch_Date = 'Data'; + LANGitSearch_BiggerThan = 'Più _grande di'; + LANGitSearch_SmallerThan = 'Più _piccolo di'; + LANGitSearch_ModifiedBetweenRadioButton = '_Modificato tra'; + LANGitSearch_NotModifiedAfterRadioButton = '_Non modificato dopo'; + LANGitSearch_ModifiedLastRadioButton = 'Mod_ificato nello scorso'; + LANGitSearch_ModifiedNotLastRadionButton = 'No_n modificato nello scorso'; + LANGitSearch_ModifiedBetweenEntry1 = '"Usa il seguente formato per la data:" c'; + LANGitSearch_ViewButtonCaption = '_Visualizza file'; + LANGitSearch_NewSearchButtonCaption = '_Nuova ricerca'; + LANGitSearch_GoToFileButtonCaption = '_Vai al file'; + LANGitSearch_FeedToListboxButtonCaption = 'Feed to _listbox'; + LANGitSearch_StatusSC = 'Status:'; + LANGitSearch_Ready = 'Pronto.'; + LANGitSearch_PreparingToSearch = 'Preparazione alla ricerca.'; + LANGitSearch_SearchInProgress = 'Ricerca in corso:'; + LANGitSearch_UserCancelled = 'Annullato dall''utente.'; + LANGitSearch_SearchFinished = 'Ricerca conclusa'; + LANGitSearch_FilesFound = '%d file trovati'; + LANGitSearch_And = 'e'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGitCloseOpenConnection = 'Stai cercando di aprire una nuova connessione al posto di un''altra attualmente attiva. Continuando, la connessione precedente verrà chiusa e sostituita dalla nuova connessione.'#10#10'Vuoi continuare?'; + LANGitDuplicateTabWarning = 'Stai cercando di aprire una nuova scheda da una directory remota. Tuttavia, la funzionalità "engine cloning" non è supportata. La directory nella nuova scheda punterà al filesystem locale.'; + LANGitDontShowAgain = '_Non mostrare più questo messaggio'; + LANGitSwitchOtherPanelWarning = 'Stai cercando di aprire una directory remota nell''altro pannello. Tuttavia, la funzionalità "engine cloning" non è supportata. La directory di destinazione non verrà modificata.'; + LANGitOpenConnectionsWarning = 'Sono state rilevate alcune connessioni ancora aperte. Chiudendo l''applicazione, queste connessioni verranno chiuse.'#10#10'Vuoi continuare?'; + LANGitmiDisconnect_Caption = '_Disconnetti'; + LANGitDisconnectButton_Tooltip = 'Disconnetti la connessione attiva'; + LANGitLeaveArchiveButton_Tooltip = 'Chiudi l''archivio corrente'; + LANGitOpenTerminalButton_Tooltip = 'Apre una nuova finestra terminale dalla directory corrente'; + LANGitOpenTerminalButton_Caption = 'Apre il te_rminale'; + LANGitShowTextUIDsCheckBox_Caption = 'Mostra _UIDs testuali'; + LANGitShowTextUIDsCheckBox_Tooltip = 'Mostra informazioni sull''Utente e sul Gruppo in forma testuale anzichè in forma numerica (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGitmiNewTab_Caption = 'Nuova _scheda'; + LANGitFilePopupMenu_Properties = '_Proprietà'; + LANGitCommandEntry_Tooltip = 'Utilizza %s come segnaposto per file/directory'; + LANGitmiFiles_Caption = 'Solo file'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGitPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGitHandleRunFromArchive_Bytes = 'bytes'; + LANGitHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGitHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGitHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGitHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGitFRunFromVFS_Caption = 'Packed file properties'; + LANGitFRunFromVFS_TitleLabel = 'File Properties'; + LANGitFRunFromVFS_FileNameLabel = 'File name:'; + LANGitFRunFromVFS_FileTypeLabel = 'File type:'; + LANGitFRunFromVFS_SizeLabel = 'Size:'; + LANGitFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGitFRunFromVFS_DateLabel = 'Modify date:'; + LANGitFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGitFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGitFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGitFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGitFSetPassword_Caption = 'Set password'; + LANGitFSetPassword_Label1_Caption = 'Password required'; + LANGitFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGitFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGitF2Button_Caption; + LANGF3Button_Caption := LANGitF3Button_Caption; + LANGF4Button_Caption := LANGitF4Button_Caption; + LANGF5Button_Caption := LANGitF5Button_Caption; + LANGF6Button_Caption := LANGitF6Button_Caption; + LANGF7Button_Caption := LANGitF7Button_Caption; + LANGF8Button_Caption := LANGitF8Button_Caption; + + LANGmnuFile_Caption := LANGitmnuFile_Caption; + LANGmnuMark_Caption := LANGitmnuMark_Caption; + LANGmnuCommands_Caption := LANGitmnuCommands_Caption; + LANGmnuHelp_Caption := LANGitmnuHelp_Caption; + LANGmiExit_Caption := LANGitmiExit_Caption; + LANGmiSelectGroup_Caption := LANGitmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGitmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGitmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGitmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGitmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGitmiRefresh_Caption; + LANGmiAbout_Caption := LANGitmiAbout_Caption; + + LANGColumn1_Caption := LANGitColumn1_Caption; + LANGColumn2_Caption := LANGitColumn2_Caption; + LANGColumn3_Caption := LANGitColumn3_Caption; + LANGColumn4_Caption := LANGitColumn4_Caption; + LANGColumn5_Caption := LANGitColumn5_Caption; + + LANGExpandSelection := LANGitExpandSelection; + LANGShrinkSelection := LANGitShrinkSelection; + LANGNoMatchesFound := LANGitNoMatchesFound; + LANGNoFilesSelected := LANGitNoFilesSelected; + LANGSelectedFilesDirectories := LANGitSelectedFilesDirectories; + LANGDirectoryS := LANGitDirectoryS; + LANGFileS := LANGitFileS; + LANGDoYouReallyWantToDeleteTheS := LANGitDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGitDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGitCopyFiles; + LANGMoveRenameFiles := LANGitMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGitCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGitMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGitCopySC; + LANGMoveRenameSC := LANGitMoveRenameSC; + + LANGQuickFind := LANGitQuickFind; + + LANGAboutString := LANGitAboutString; + LANGAboutStringGnome := LANGitAboutStringGnome; + LANGDiskStatFmt := LANGitDiskStatFmt; + LANGDiskStatVolNameFmt := LANGitDiskStatVolNameFmt; + LANGStatusLineFmt := LANGitStatusLineFmt; + LANGPanelStrings[False] := LANGitPanelStrings[False]; + LANGPanelStrings[True] := LANGitPanelStrings[True]; + LANGDIR := LANGitDIR; + LANGErrorGettingListingForSPanel := LANGitErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGitErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGitErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGitErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGitTheFileDirectory; + LANGCouldNotBeDeleted := LANGitCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGitCouldNotBeDeletedS; + LANGUserCancelled := LANGitUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGitTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGitCannotCopyFile; + LANGCopyError := LANGitCopyError; + LANGMoveError := LANGitMoveError; + LANGOverwriteS := LANGitOverwriteS; + LANGWithFileS := LANGitWithFileS; + LANGOvewriteSBytesS := LANGitOvewriteSBytesS; + LANGTheFile := LANGitTheFile; + LANGCopy := LANGitCopy; + LANGMove := LANGitMove; + LANGTheDirectory := LANGitTheDirectory; + LANGTheSymbolicLink := LANGitTheSymbolicLink; + LANGCannotMoveFile := LANGitCannotMoveFile; + LANGCouldNotBeCreated := LANGitCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGitCouldNotBeCreatedS; + LANGFromS := LANGitFromS; + LANGToS := LANGitToS; + LANGCannotCopyFileToItself := LANGitCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGitMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGitCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGitCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGitCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGitCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGitCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGitCannotWriteToDestinationFile; + + LANGUnknownException := LANGitUnknownException; + LANGNoAccess := LANGitNoAccess; + LANGUnknownError := LANGitUnknownError; + + LANGCreateANewDirectory := LANGitCreateANewDirectory; + LANGEnterDirectoryName := LANGitEnterDirectoryName; + + LANGOverwriteQuestion := LANGitOverwriteQuestion; + LANGOverwriteButton_Caption := LANGitOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGitOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGitSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGitOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGitSkipAllButton_Caption; + LANGRenameButton_Caption := LANGitRenameButton_Caption; + LANGAppendButton_Caption := LANGitAppendButton_Caption; + LANGRename := LANGitRename; + LANGRenameFile := LANGitRenameFile; + LANGIgnoreButton_Caption := LANGitIgnoreButton_Caption; + + LANGProgress := LANGitProgress; + LANGCancel := LANGitCancel; + LANGDelete := LANGitDelete; + + LANGSpecifyFileType := LANGitSpecifyFileType; + + LANGRemoveDirectory := LANGitRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGitDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGitRetry; + LANGDeleteButton_Caption := LANGitDeleteButton_Caption; + LANGAll := LANGitAll; + + LANGCopyFilesSC := LANGitCopyFilesSC; + LANGAppendQuestion := LANGitAppendQuestion; + LANGPreparingList := LANGitPreparingList; + + LANGYouMustSelectAValidFile := LANGitYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGitmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGitVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGitCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGitCheckButtonCaptionStop; + LANGFileListTooltip := LANGitFileListTooltip; + LANGFilenameColumnCaption := LANGitFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGitTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGitAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGitAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGitAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGitChecksumNotChecked; + LANGChecksumChecking := LANGitChecksumChecking; + LANGChecksumInterrupted := LANGitChecksumInterrupted; + LANGChecksumDOK := LANGitChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGitmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGitYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGitCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGitCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGitCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGitCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGitCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGitCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGitCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGitCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGitCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGitCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGitCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGitCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGitCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGitCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGitCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGitCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGitCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGitCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGitCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGitCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGitCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGitCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGitAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGitTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGitTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGitMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGitPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGitMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGitWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGitMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGitMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGitMergeSC; + LANGmiSplitFileCaption := LANGitmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGitmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGitSplitTheFileSToDirectory; + LANGSplitSC := LANGitSplitSC; + LANGSplitFile := LANGitSplitFile; + LANGBytesPerFile := LANGitBytesPerFile; + LANGAutomatic := LANGitAutomatic; + LANGDeleteFilesOnTargetDisk := LANGitDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGitSplitCaption; + LANGCannotOpenFileS := LANGitCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGitCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGitThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGitThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGitAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGitSplitOfSSucceeded; + LANGSplitOfSFailed := LANGitSplitOfSFailed; + + LANGmnuShow_Caption := LANGitmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGitmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGitTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGitCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGitEdit; + LANGEnterFilenameToEdit := LANGitEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGitmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGitmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGitThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGitErrorExecutingCommand; + LANGEditFileTypesCaption := LANGitEditFileTypesCaption; + LANGTitleLabel_Caption := LANGitTitleLabel_Caption; + LANGExtensionsColumn := LANGitExtensionsColumn; + LANGDescriptionColumn := LANGitDescriptionColumn; + LANGFileTypesList := LANGitFileTypesList; + LANGActionName := LANGitActionName; + LANGCommand := LANGitCommand; + LANGSetDefaultActionButton_Caption := LANGitSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGitRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGitAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGitBrowseButton_Caption; + LANGCommandLabel_Caption := LANGitCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGitDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGitFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGitNotebookPageExtensions; + LANGNotebookPageActions := LANGitNotebookPageActions; + LANGDefault := LANGitDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGitCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGitDefaultColor; + LANGIcon := LANGitIcon; + LANGBrowseForIcon := LANGitBrowseForIcon; + LANGSelectFileTypeColor := LANGitSelectFileTypeColor; + LANGColor := LANGitColor; + + LANGmiChangePermissions_Caption := LANGitmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGitmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGitmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGitmiEditSymlink_Caption; + LANGChmodProgress := LANGitChmodProgress; + LANGChownProgress := LANGitChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGitYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGitPopupRunS; + LANGPopupOpenS := LANGitPopupOpenS; + LANGPopupGoUp := LANGitPopupGoUp; + LANGPopupOpenWithS := LANGitPopupOpenWithS; + LANGPopupDefault := LANGitPopupDefault; + LANGPopupOpenWith := LANGitPopupOpenWith; + LANGPopupViewFile := LANGitPopupViewFile; + LANGPopupEditFile := LANGitPopupEditFile; + LANGPopupMakeSymlink := LANGitPopupMakeSymlink; + LANGPopupRename := LANGitPopupRename; + LANGPopupDelete := LANGitPopupDelete; + LANGDialogChangePermissions := LANGitDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGitCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGitDialogChangeOwner; + LANGCouldNotBeChownedS := LANGitCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGitDialogMakeSymlink; + LANGDialogEditSymlink := LANGitDialogEditSymlink; + LANGFEditSymlink_Caption := LANGitFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGitFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGitFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGitFChmod_Caption; + LANGFChmod_PermissionFrame := LANGitFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGitFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGitFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGitFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGitFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGitFChmod_OctalLabel; + LANGFChmod_SUID := LANGitFChmod_SUID; + LANGFChmod_SGID := LANGitFChmod_SGID; + LANGFChmod_Sticky := LANGitFChmod_Sticky; + LANGFChmod_RUSR := LANGitFChmod_RUSR; + LANGFChmod_WUSR := LANGitFChmod_WUSR; + LANGFChmod_XUSR := LANGitFChmod_XUSR; + LANGFChmod_RGRP := LANGitFChmod_RGRP; + LANGFChmod_WGRP := LANGitFChmod_WGRP; + LANGFChmod_XGRP := LANGitFChmod_XGRP; + LANGFChmod_ROTH := LANGitFChmod_ROTH; + LANGFChmod_WOTH := LANGitFChmod_WOTH; + LANGFChmod_XOTH := LANGitFChmod_XOTH; + LANGFChmod_TextLabel := LANGitFChmod_TextLabel; + LANGFChmod_FileLabel := LANGitFChmod_FileLabel; + LANGFChown_Caption := LANGitFChown_Caption; + LANGFChown_OwnerFrame := LANGitFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGitFChown_GroupFrame; + LANGFChown_FileFrame := LANGitFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGitFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGitFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGitFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGitFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGitmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGitmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGitmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGitBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGitmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGitTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGitSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGitPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGitPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGitPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGitPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGitPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGitPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGitPreferences_NumHistoryItems; + LANGPreferences_Default := LANGitPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGitPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGitPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGitPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGitPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGitPreferences_Viewer; + LANGPreferences_Editor := LANGitPreferences_Editor; + LANGPreferences_Terminal := LANGitPreferences_Terminal; + LANGPreferences_ListFont := LANGitPreferences_ListFont; + LANGPreferences_Change := LANGitPreferences_Change; + LANGPreferences_UseDefaultFont := LANGitPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGitPreferences_Foreground; + LANGPreferences_Background := LANGitPreferences_Background; + LANGPreferences_NormalItem := LANGitPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGitPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGitPreferences_Cursor; + LANGPreferences_InactiveItem := LANGitPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGitPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGitPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGitPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGitPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGitPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGitPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGitPreferences_DefaultS; + LANGPreferences_SelectFont := LANGitPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGitBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGitUpButton_Tooltip; + LANGRootButton_Tooltip := LANGitRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGitHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGitLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGitRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGitmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGitmiTargetSource_Caption; + LANGFileTypeDirectory := LANGitFileTypeDirectory; + LANGFileTypeFile := LANGitFileTypeFile; + LANGFileTypeMetafile := LANGitFileTypeMetafile; + LANGPreferencesPanelsPage := LANGitPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGitPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGitPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGitPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGitPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGitPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGitPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGitPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGitPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGitPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGitPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGitPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGitPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGitPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGitPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGitPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGitPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGitPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGitPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGitPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGitPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGitPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGitPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGitPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGitPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGitPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGitPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGitPreferencesViewer; + LANGPreferencesCommandSC := LANGitPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGitPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGitPreferencesEditor; + LANGPreferencesTerminal := LANGitPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGitPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGitPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGitPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGitPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGitPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGitPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGitPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGitPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGitmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGitmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGitmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGitmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGitmnuNetworkCaption; + LANGmiConnectionsCaption := LANGitmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGitmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGitmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGitmnuPluginsCaption; + LANGmiTestPluginCaption := LANGitmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGitmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGitmiColumnsCaption; + LANGmiSavePositionCaption := LANGitmiSavePositionCaption; + LANGmiMountCaption := LANGitmiMountCaption; + LANGmiUmountCaption := LANGitmiUmountCaption; + LANGmiEjectCaption := LANGitmiEjectCaption; + LANGmiDuplicateTabCaption := LANGitmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGitmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGitmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGitCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGitCannotLoadFile; + LANGMountPointDevice := LANGitMountPointDevice; + LANGMountSC := LANGitMountSC; + LANGNoPluginsFound := LANGitNoPluginsFound; + LANGPluginAbout := LANGitPluginAbout; + LANGCouldntOpenURI := LANGitCouldntOpenURI; + LANGPluginAboutInside := LANGitPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGitAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGitCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGitThereIsNoModuleAvailable; + LANGIgnoreError := LANGitIgnoreError; + LANGErrorMount := LANGitErrorMount; + LANGErrorUmount := LANGitErrorUmount; + LANGErrorEject := LANGitErrorEject; + + LANGMounterPrefs_Caption := LANGitMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGitMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGitMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGitMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGitMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGitMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGitMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGitMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGitMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGitMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGitMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGitMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGitMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGitMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGitMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGitMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGitMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGitMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGitMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGitMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGitMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGitMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGitMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGitMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGitMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGitMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGitMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGitConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGitConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGitConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGitConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGitConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGitConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGitConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGitConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGitConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGitConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGitConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGitConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGitConnProp_FTP; + LANGConnProp_SFTP := LANGitConnProp_SFTP; + LANGConnProp_SMB := LANGitConnProp_SMB; + LANGConnProp_HTTP := LANGitConnProp_HTTP; + LANGConnProp_HTTPS := LANGitConnProp_HTTPS; + LANGConnProp_Other := LANGitConnProp_Other; + LANGConnProp_Caption := LANGitConnProp_Caption; + LANGConnProp_VFSModule := LANGitConnProp_VFSModule; + LANGConnProp_URI := LANGitConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGitConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGitConnProp_DetailedInformations; + LANGConnProp_Name := LANGitConnProp_Name; + LANGConnProp_Server := LANGitConnProp_Server; + LANGConnProp_Username := LANGitConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGitConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGitConnProp_Password; + LANGConnProp_TargetDirectory := LANGitConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGitConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGitConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGitConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGitConnLogin_Caption; + LANGConnLogin_Login := LANGitConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGitConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGitConnLogin_Username; + LANGConnLogin_Password := LANGitConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGitConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGitColumns_Caption; + LANGColumns_Title := LANGitColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGitColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGitColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGitColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGitColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGitColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGitColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGitColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGitColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGitColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGitColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGitColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGitColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGitColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGitColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGitColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGitColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGitColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGitColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGitColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGitColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGitColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGitColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGitTestPlugin_Caption; + LANGTestPlugin_Title := LANGitTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGitTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGitTestPlugin_Plugin; + LANGTestPlugin_Command := LANGitTestPlugin_Command; + LANGTestPlugin_Username := LANGitTestPlugin_Username; + LANGTestPlugin_Password := LANGitTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGitTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGitTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGitRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGitRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGitRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGitSearch_Bytes; + LANGSearch_kB := LANGitSearch_kB; + LANGSearch_MB := LANGitSearch_MB; + LANGSearch_days := LANGitSearch_days; + LANGSearch_weeks := LANGitSearch_weeks; + LANGSearch_months := LANGitSearch_months; + LANGSearch_years := LANGitSearch_years; + LANGSearch_Caption := LANGitSearch_Caption; + LANGSearch_General := LANGitSearch_General; + LANGSearch_Advanced := LANGitSearch_Advanced; + LANGSearch_SearchResults := LANGitSearch_SearchResults; + LANGSearch_SearchFor := LANGitSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGitSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGitSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGitSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGitSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGitSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGitSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGitSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGitSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGitSearch_Size; + LANGSearch_Date := LANGitSearch_Date; + LANGSearch_BiggerThan := LANGitSearch_BiggerThan; + LANGSearch_SmallerThan := LANGitSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGitSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGitSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGitSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGitSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGitSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGitSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGitSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGitSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGitSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGitSearch_StatusSC; + LANGSearch_Ready := LANGitSearch_Ready; + LANGSearch_PreparingToSearch := LANGitSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGitSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGitSearch_UserCancelled; + LANGSearch_SearchFinished := LANGitSearch_SearchFinished; + LANGSearch_FilesFound := LANGitSearch_FilesFound; + LANGSearch_And := LANGitSearch_And; + + LANGCloseOpenConnection := LANGitCloseOpenConnection; + LANGDuplicateTabWarning := LANGitDuplicateTabWarning; + LANGDontShowAgain := LANGitDontShowAgain; + LANGSwitchOtherPanelWarning := LANGitSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGitOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGitmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGitDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGitLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGitOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGitOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGitShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGitShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGitmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGitFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGitCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGitmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGitPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGitHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGitHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGitHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGitHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGitHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGitFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGitFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGitFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGitFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGitFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGitFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGitFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGitFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGitFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGitFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGitFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGitFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGitFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGitFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGitFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('IT', @SetTranslation); + AddTranslation('it_IT', @SetTranslation); +end. diff --git a/translations/UTranslation_PL.pas b/translations/UTranslation_PL.pas new file mode 100644 index 0000000..df29a28 --- /dev/null +++ b/translations/UTranslation_PL.pas @@ -0,0 +1,1108 @@ +(* + Tux Commander - UTranslation_PL - Polish Localization constants + Copyright (C) 2007 by Dominik Zabłotny + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_PL; + +interface + +implementation + +uses ULocale; + +const LANGplF2Button_Caption = 'F2 - Zmień nazwę'; + LANGplF3Button_Caption = 'F3 - Podejrzyj'; + LANGplF4Button_Caption = 'F4 - Edytuj'; + LANGplF5Button_Caption = 'F5 - Kopiuj'; + LANGplF6Button_Caption = 'F6 - Przenieś'; + LANGplF7Button_Caption = 'F7 - Utw katalog'; + LANGplF8Button_Caption = 'F8 - Usuń'; + + LANGplmnuFile_Caption = '_Plik'; + LANGplmnuMark_Caption = '_Zaznaczenie'; + LANGplmnuCommands_Caption = '_Polecenia'; + LANGplmnuHelp_Caption = '_Pomoc'; + LANGplmiExit_Caption = 'W_yjście'; + LANGplmiSelectGroup_Caption = 'Zaznacz _grupę...'; + LUnselectGroup_Caption = '_Odznacz grupę...'; + LANGplmiSelectAll_Caption = '_Zaznacz wszystkie'; + LANGplmiUnselectAll_Caption = 'O_dznacz wszystkie'; + LANGplmiInvertSelection_Caption = '_Odwróć zaznaczenie'; + LANGplmiRefresh_Caption = '_Odśwież'; + LANGplmiAbout_Caption = '_Informacje o...'; + + LANGplColumn1_Caption = 'Nazwa'; + LANGplColumn2_Caption = 'Rozsz.'; + LANGplColumn3_Caption = 'Rozmiar'; + LANGplColumn4_Caption = 'Data'; + LANGplColumn5_Caption = 'Atr.'; + + LANGplExpandSelection = 'Powiększ zaznaczenie'; + LANGplShrinkSelection = 'Zmniejsz zaznaczenie'; + LANGplNoMatchesFound = 'Nie znaleziono pasujących'; + LANGplNoFilesSelected = 'Nie zaznaczono plików!'; + LANGplSelectedFilesDirectories = 'Zaznaczono %d plików/katalogów'; + LANGplDirectoryS = 'katalog %s'; + LANGplFileS = 'plik %s'; + LANGplDoYouReallyWantToDeleteTheS = 'Czy na pewno chcesz usunąć %s ?'; + LANGplDoYouReallyWantToDeleteTheSS = 'Czy na pewno chcesz usunąć %s ?'#10'%s'; + LANGplCopyFiles = 'Kopiuj pliki'; + LANGplMoveRenameFiles = 'Przenieś/Zmień nazwę'; + LANGplCopyDFileDirectoriesTo = 'Kopiuj %d plików/katalogów do'; + LANGplMoveRenameDFileDirectoriesTo = 'Przenieś/Zmień nazwę %d plików/katalogów do'; + LANGplCopySC = 'Kopiuj:'; + LANGplMoveRenameSC = 'Przenieś/Zmień nazwę:'; + + LANGplQuickFind = ' Szybkie szukanie:'; + + LANGplAboutString = 'Tux Commander'#10'Wersja %s'#10'Data kompilacji: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Strona domowa: http://tuxcmd.sourceforge.net/'; + LANGplAboutStringGnome = 'wersja %s'#10'Data kompilacji: %s'#10'Strona domowa: http://tuxcmd.sourceforge.net/'; + LANGplDiskStatFmt = 'Wolnych %s z %s'; + LANGplDiskStatVolNameFmt = '[%s] %s z %s wolnych'; + LANGplStatusLineFmt = 'Wybrano %s z %s w %d z %d plików'; + LANGplPanelStrings : array[boolean] of string = ('prawy', 'lewy'); + + LANGplErrorGettingListingForSPanel = 'Błąd przy pobieraniu listy plików (panel %s):'#10' %s'#10#10'Ścieżka = ''%s'''; + LANGplErrorGettingListingForSPanelNoPath = 'Błąd przy pobieraniu listy plików (panel %s):'#10' %s'; + LANGplErrorCreatingNewDirectorySInSPanel = 'Błąd przy tworzeniu katalogu ''%s'' (panel %s):'#10' %s'; + LANGplErrorCreatingNewDirectorySInSPanelNoPath = 'Błąd przy tworzeniu katalogu (panel %s):'#10' %s'; + LANGplTheFileDirectory = 'Plik/katalog'; + LANGplCouldNotBeDeleted = 'nie mógł zostać usunięty'; + LANGplCouldNotBeDeletedS = 'nie mógł zostać usunięty: %s'; + LANGplUserCancelled = 'Anulowane przez użytkownika!'; + LANGplTheDirectorySIsNotEmpty = 'Katalog %s nie jest pusty!'; + LANGplCannotCopyFile = 'Nie można skopiować pliku'; + LANGplCopyError = 'Błąd kopiowania'; + LANGplMoveError = 'Błąd przenoszenia'; + LANGplOverwriteS = 'Nadpisać: %s'; + LANGplWithFileS = 'plikiem: %s'; + LANGplOvewriteSBytesS = '%s bajtów, %s'; + LANGplTheFile = 'Plik'; + LANGplCopy = 'Kopiuj'; + LANGplMove = 'Przenieś'; + LANGplTheDirectory = 'Katalog'; + LANGplTheSymbolicLink = 'Dowiązanie symboliczne'; + LANGplCannotMoveFile = 'Nie można przenieść pliku'; + LANGplCouldNotBeCreated = 'nie mógł zostać utworzony'; + LANGplCouldNotBeCreatedS = 'nie mógł zostać utworzony: %s'; + LANGplFromS = 'Z: %s'; + LANGplToS = 'Do: %s'; + LANGplCannotCopyFileToItself = 'Nie można skopiować pliku na ten sam plik'; + LANGplMemoryAllocationFailed = 'Błąd alokacji pamięci:'; + LANGplCannotOpenSourceFile = 'Nie można otworzyć pliku źródłowego'; + LANGplCannotOpenDestinationFile = 'Nie można otworzyć pliku docelowego'; + LANGplCannotCloseDestinationFile = 'Nie można zamknąć pliku docelowego'; + LANGplCannotCloseSourceFile = 'Nie można zamknąć pliku źródłowego'; + LANGplCannotReadFromSourceFile = 'Nie można odczytać pliku źródłowego'';liku docelowego'; + + LANGplUnknownException = 'Nieznany wyjątek'; + LANGplNoAccess = 'Brak dostępu'; + LANGplUnknownError = 'Nieznany błąd'; + + LANGplCreateANewDirectory = 'Utwórz nowy katalog'; + LANGplEnterDirectoryName = 'Podaj nazwę _katalogu:'; + + LANGplOverwriteQuestion = 'Nadpisanie pliku'; + LANGplOverwriteButton_Caption = '_Nadpisz'; + LANGplOverwriteAllButton_Caption = 'Nadpisz _wszystkie'; + LANGplSkipButton_Caption = '_Pomiń'; + LANGplOverwriteAllOlderButton_Caption = 'Nadpisz wszystkie _starsze'; + LANGplSkipAllButton_Caption = '_Pomiń wszystkie'; + LANGplRenameButton_Caption = 'Zmień n_azwę'; + LANGplAppendButton_Caption = 'D_ołącz'; + LANGplRename = 'Zmień nazwę'; + LANGplRenameFile = 'Zmień nazwę pliku ''%s'' na'; + LANGplIgnoreButton_Caption = 'Z_ignoruj'; + + LANGplProgress = 'Postęp'; + LANGplCancel = '_Anuluj'; + LANGplDelete = 'Usuń:'; + + LANGplSpecifyFileType = '_Podaj typ pliku:'; + + LANGplRemoveDirectory = 'Usuń katalog'; + LANGplDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Czy chcesz go usunąć razem z zawartymi plikami i katalogami?'; + LANGplRetry = '_Ponów'; + LANGplDeleteButton_Caption = '_Usuń'; + LANGplAll = '_Wszystkie'; + + LANGplCopyFilesSC = 'Kopiuj pliki:'; + LANGplAppendQuestion = 'Czy jesteś pewien, że chcesz dołączyć plik ''%s'' do ''%s''?'; + LANGplPreparingList = 'Przygotowuję listę...'; + + LANGplYouMustSelectAValidFile = 'Musisz wybrać prawidłowy plik!'; + LANGplmiVerifyChecksums = '_Sprawdź sumy kontrolne'; + LANGplVerifyChecksumsCaption = 'Sprawdź sumy kontrolne'; + LANGplCheckButtonCaptionCheck = '_Sprawdź'; + LANGplCheckButtonCaptionStop = '_Zatrzymaj'; + LANGplFileListTooltip = '[?] - Nie sprawdzone'#10'[OK] - Suma prawidłowa'#10'[ERR] - Suma błędna'#10'[N/A] - Plik niedostępny'; + LANGplFilenameColumnCaption = 'Nazwa pliku'; + LANGplTheFileSYouAreTryingToOpenIsQuiteBig = 'Plik ''t dość spory (%s bajtów). Być może nie jest to prawidłowy plik z sumą kontrolną.'#10#10'Czy chcesz go pomimo tego otworzyć?'; + LANGplAnErrorOccuredWhileInitializingMemoryBlock = 'Wystąpił błąd podczas inicjalizacji bloku pamięci. Zamknij kilka innych programów i spróbuj ponownie.'; + LANGplAnErrorOccuredWhileOpeningFileSS = 'Wystąpił błąd podczas otwierania pliku ''%s'':'#10' %s'; + LANGplAnErrorOccuredWhileReadingFileSS = 'Wystąpił błąd podczas odczytu pliku ''%s'':'#10' %s'; + LANGplChecksumNotChecked = 'Stan Nie sprawdzone'; + LANGplChecksumChecking = 'Stan: Trwa sprawdzanie...'; + LANGplChecksumInterrupted = 'Stan: Przerwane'; + LANGplChecksumDOK = 'Stan: %d%% OK'; + + LANGplmiCreateChecksumsCaption = '_Utwórz sumy kontrolne...'; + LANGplYouMustSelectAtLeastOneFileToCalculateChecksum = 'Musuisz zaznaczyć przynajmniej jeden plik, aby liczyć sumy kontrolne!'; + LANGplCreateChecksumsCaption = 'Utwórz sumy kontrolne'; + LANGplCCHKSUMPage1Text = 'Zamierzasz wyznaczyć sumy kontrolne dla'#10'wybranych plików. Jeśli nie zaznaczyłeś'#10'wszystkich plików, które chciałeś, zamknij tego druida i'#10'zaznacz więcej plików.'; + LANGplCCHKSUMPage4Text = 'Druid jest gotów do wyznaczenia sum kontrolnych dla zaznaczonych plików.'#10' Ta operacja może zająć kilka minut.'#10'Naciśnij Naprzód, aby kontynuować.'; + LANGplCCHKSUMPage6Text = 'Wystąpił błąd podczas wyznaczania sum kontrolnych:'; + LANGplCCHKSUMPage7Text = 'Tworzenie sum kontrolnych zostało ukończone'#10'twoje pliki są gotowe.'#10#10'Naciśnij "Zakończ" aby zamknąć okno.'; + LANGplCCHKSUMPage1Title = 'Przygotuj pliki'; + LANGplCCHKSUMPage2Title = 'Wybierz typ sumy kontrolnej'; + LANGplCCHKSUMPage3Title = 'Gotowy do obliczenia'; + LANGplCCHKSUMPage5Title = 'Przetwarzanie...'; + LANGplCCHKSUMPage6Title = 'Błąd!'; + LANGplCCHKSUMPage7Title = 'Ukończone'; + LANGplCCHKSUMSFVFile = 'Plik SFV'; + LANGplCCHKSUMMD5sumFile = 'Plik MD5sum'; + LANGplCCHKSUMFileName = 'Nazwa _Pliku:'; + LANGplCCHKSUMCreateSeparateChecksumFiles = 'Utwórz _osobne pliki sum kontrolnych'; + LANGplCCHKSUMNowProcessingFileS = 'Trwa przetwarzanie pliku: %s'; + LANGplCCHKSUMFinishCaption = '_Zakończ'; + LANGplCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Czy jesteś pewien, że chcesz przerwać obliczenia?'; + LANGplCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Wystąpił błąd przy otwieraniu pliku ''%s'': %s'#10; + LANGplCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Wystąpił błąd przy odczycie pliku ''%s'': %s'#10; + LANGplCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Wystąpił błąd przy zapisie pliku ''%s'': %s'#10; + + LANGplAnErrorOccuredWhileWritingFileSS = 'Wystąpił błąd przy zapisie pliku ''%s'':'#10' %s'; + LANGplTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Docelowy plik ''%s'' już istnieje. Czy chcesz go nadpisać?'; + LANGplTheTargetFileSCannotBeRemovedS = 'Nie można usunąć docelowego pliku ''%s'': %s'; + LANGplMergeCaption = 'Połącz'; + LANGplPleaseInsertNextDiskOrGiveDifferentLocation = 'Włóż następny nośnik, albo podaj inną lokalizację:'; + LANGplMergeOfSSucceeded = 'Połączenie ''%s'' udane (Suma kontolna CRC OK).'; + LANGplWarningCreatedFileFailsCRCCheck = 'Ostrzeżenie: Utworzony plik nie przeszedł testu CRC!'; + LANGplMergeOfSSucceeded_NoCRCFileAvailable = 'Połączenie ''%s'' udane (brak CRC).'; + LANGplMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Połącz ''%s'' i wszystkie pliki z kolejnymi nazwami, '; + LANGplPopupDefault = ' (domyślnie)'; + LANGplPopupOpenWith = 'O_twórz z...'; + LANGplPopupViewFile = '_Podejrzyj plik'; + LANGplPopupEditFile = 'Ed_ytuj plik'; + LANGplPopupMakeSymlink = 'Utwórz dowiązanie _symboliczne'; + LANGplPopupRename = '_Zmień nazwę'; + LANGplPopupDelete = '_Usuń'; + LANGplDialogChangePermissions = 'Zmień uprawnienia'; + LANGplCouldNotBeChmoddedS = 'nie można zmienić uprawnień: %s'; + LANGplDialogChangeOwner = 'Zmień właściciela'; + LANGplCouldNotBeChownedS = 'nie można zmienić właściciela: %s'; + LANGplDialogMakeSymlink = 'Utwórz dowiązanie symboliczne'; + LANGplDialogEditSymlink = 'Edytuj dowiązanie symboliczne'; + LANGplFEditSymlink_Caption = 'Edytuj dowiązanie symboliczne'; + LANGplFEditSymlink_SymbolicLinkFilename = 'Nazwa pliku dowiązania _symboliczne:'; + LANGplFEditSymlink_SymbolicLinkPointsTo = 'Dowiązanie symboliczne wskazuje _na:'; + + LANGplFChmod_Caption = 'Uprawnienia dostępu'; + LANGplFChmod_PermissionFrame = 'Uprawnienia'; + LANGplFChmod_FileFrame = 'Plik'; + LANGplFChmod_ApplyRecursivelyFor = 'Zastosuj _rekursywnie do'; + LANGplFChmod_miAllFiles = 'Wszystkie pliki i katalogi'; + LANGplFChmod_miDirectories = 'Tylko kataloki'; + LANGplFChmod_OctalLabel = '_Ósemkowo:'; + LANGplFChmod_SUID = 'SUID - Ustaw ID użytkownika przy wykonaniu'; + LANGplFChmod_SGID = 'SGID - Ustaw ID grupy przy wykonaniu'; + LANGplFChmod_Sticky = 'Bit "sticky"'; + LANGplFChmod_RUSR = 'RUSR - Odczyt przez właściciela'; + LANGplFChmod_WUSR = 'WUSR - Zapis przez właściciela'; + LANGplFChmod_XUSR = 'XUSR - Wykonanie/Przeglądanie przez właściciela'; + LANGplFChmod_RGRP = 'RGRP - Odczyt przez grupę'; + LANGplFChmod_WGRP = 'WGRP - Zapis by grupę'; + LANGplFChmod_XGRP = 'XGRP - Wykonanie/Przeglądanie przez grupę'; + LANGplFChmod_ROTH = 'ROTH - Odczyt przez innych'; + LANGplFChmod_WOTH = 'WOTH - Zapis przez innyWykonanie/Przeglądanie przez innych'; + LANGplFChmod_TextLabel = 'Tekst: %s'; + LANGplFChmod_FileLabel = 'Plik: %s'#10'Tekst: %s'#10 + + 'Ósemkowo: %d'#10'Właściciel %s'#10 + + 'Grupa: %s'; + + LANGplFChown_Caption = 'Zmień właściciela/grupę'; + LANGplFChown_OwnerFrame = 'Nazwa właściciela'; + LANGplFChown_GroupFrame = 'Nazwa grupy'; + LANGplFChown_FileFrame = 'Plik'; + LANGplFChown_ApplyRecursively = 'Zastosuj _rekursywnie'; + + LANGplFSymlink_Caption = 'Utwórz dowiązanie symboliczne'; + LANGplFSymlink_ExistingFilename = 'Nazwa istniejącego pliku, na który będzie wskazywać dowiązanie:'; + LANGplFSymlink_SymlinkFilename = '_Nazwa dowiązania:'; + + LANGplmnuBookmarks_Caption = '_Zakładki'; + LANGplmiAddBookmark_Caption = '_Dodaj zakładkę'; + LANGplmiEditBookmarks_Caption = '_Edytuj zakładki'; + LANGplBookmarkPopupDelete_Caption = '_Usuń'; + LANGplmiPreferences_Caption = '_Preferencje...'; + LANGplTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Bieżący katalog już jest na liście zakładek'; + LANGplSomeOtherInstanceChanged = 'Inna instancja Tux Commandera zmieniła konfigurację. Czy chcesz zastosować nowe ustawienia?'#10#10'Uwaga: jeśli wciśniesz "Nie", konfiguracja będzie nadpisana przez tą instancję'' Wyjście!'; + + LANGplPreferences_Caption = 'Preferencje'; + LANGplPreferences_TitleLabel_Caption = 'Preferencje aplikacji'; + LANGplPreferences_GeneralPage = 'Ogólne'; + LANGplPreferences_FontsPage = 'Czcionki'; + LANGplPreferences_ColorsPage = 'Kolory'; + LANGplPreferences_RowHeight = 'Wysokość _wiersza:'; + LANGplPreferences_NumHistoryItems = 'Rozmiar historii wiersza _poleceń:'; + LANGplPreferences_ClearReadonlyAttribute = 'Wyczyść atrybut "tylko do _odczytu" przy kopiowaniu z CD-ROMu'; + LANGplPreferences_DisableMouseRenaming = 'Zablokuj zmianę nazwy przy pomocy _myszy'; + LANGplPreferences_ShowFiletypeIconsInList = 'Pokaż _ikony przypisane do typów pliku'; + LANGplPreferences_ExternalAppsLabel = 'Zewnętrzne programy'; + LANGplPreferences_Viewer = '_Podgląd:'; + LANGplPreferences_Editor = '_Edytor:'; + LANGplPreferences_Terminal = '_Terminal:'; + LANGplPreferences_ListFont = 'Lista czcionek:'; + LANGplPreferences_Change = 'Zmień...'; + LANGplPreferences_UseDefaultFont = 'Użyj _domyślnej czcionki'; + LANGplPreferences_Foreground = 'Tekst'; + LANGplPreferences_Background = 'Tło'; + LANGplPreferences_NormalItem = 'Normalny element:'; + LANGplPreferences_SetToDefaultToUseGTKThemeColors = 'Zmień na domyślne kolory tematu GTK'; + LANGplPreferences_Cursor = 'Kursor:'; + LANGplPreferences_InactiveItem = 'Nieaktywny element:'; + LANGplPreferences_SelectedItem = 'Wybrany element:'; + LANGplPreferences_LinkItem = 'Dowiązanie symboliczne:'; + LANGplPreferences_LinkItemHint = 'Ustaw na domyślne, aby pokazywać dowiązania w kolorze normalnych elementów'; + LANGplPreferences_DotFileItem = 'Ukryte pliki:'; + LANGplPreferences_DotFileItemHint = 'staw na domyślne, aby pokazywać pliki ukryte w kolorze normalnych elementów'; + LANGplPreferences_BrowseForApplication = 'Wybierz aplikację'; + LANGplPreferences_DefaultS = 'Domyślnie: %s'; + LANGplPreferences_SelectFont = 'Wybierz czcionkę'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGplBookmarkButton_Tooltip = 'Pokaż zakładki'; + LANGplUpButton_Tooltip = 'Przejdź do katalogu nadrzędnego'; + LANGplRootButton_Tooltip = 'Przejdź do głównego katalogu (/)'; + LANGplHomeButton_Tooltip = 'Przejdźr)'; + LANGplLeftEqualButton_Tooltip = 'Przełącz prawy panel na ten sam katalog'; + LANGplRightEqualButton_Tooltip = 'Przełącz lewy panel na ten sam katalog'; + LANGplmiShowDirectorySizes_Caption = 'Pokaż rozmiary _katalogów'; + LANGplmiTargetSource_Caption = '_Docelowy = Źródłowy'; + LANGplFileTypeDirectory = 'Katalog'; + LANGplFileTypeFile = 'Plik'; + LANGplFileTypeMetafile = 'To jest ogólny meta-element'; + LANGplPreferencesPanelsPage = 'Panele'; + LANGplPreferencesApplicationsPage = 'Aplikacje'; + LANGplPreferencesExperimentalPage = 'Eksperymentalne'; + LANGplPreferencesSelectAllDirectoriesCheckBox_Caption = 'Zaznaczaj _także katalogi przy zaznaczaniu wszystkiego'; + LANGplPreferencesNewStyleAltOCheckBox_Caption = '_Nowy styl Alt+O'; + LANGplPreferencesNewStyleAltOCheckBox_Tooltip = 'Pozostań w tym samym katalogu po zmianie katalogu w drugim panelu przez Ctrl/Alt+O'; + LANGplPreferencesShowFuncButtonsCheckBox_Caption = 'Pokazuj przyciski _klawiszy funkcyjnych'; + LANGplPreferencesSizeFormatLabel_Caption = 'Sposób wyświetlania _rozmiaru:'; + LANGplPreferencesmiSizeFormat1 = 'Systemowy'; + LANGplPreferencesmiSizeFormat6 = 'Zgroupowany'; + LANGplPreferencesAutodetectXApp = 'Automatycznie wykrywaj aplikacje X'; + LANGplPreferencesAlwaysRunInTerminal = 'Zawsze uruchamiaj w terminalu'; + LANGplPreferencesNeverRunInTerminal = 'Nigdy nie uruchamiaj w terminalu'; + LANGplPreferencesCmdLineBehaviourLabel_Caption = '_Wykonywanie z wiersza poleceń:'; + LANGplPreferencesFeatures = 'Właściwości'; + LANGplPreferencesDisableMouseRename_Tooltip = 'Możesz nadal dokonywać szybkiej zmiany nazwy wciskając Shift+F6'; + LANGplPreferencesDisableFileTipsCheckBox_Caption = 'Wyłącz _podpowiedzi dla plików'; + LANGplPreferencesDisableFileTipsCheckBox_Tooltip = 'Nie pokazuj podpowiedzi dla panelu jeśli tekst nie mieści się w kolumnie'; + LANGplPreferencesShow = 'Wyświetlanie'; + LANGplPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Wyłącz otaczanie katalogów nawiasami []'; + LANGplPreferencesOctalPermissionsCheckBox_Caption = 'Pokazuj uprawnienia ó_semkowo'; + LANGplPreferencesOctalPermissionsCheckBox_Tooltip = 'Pokzauj uprawnienia do pliku/katalogu w formie numerycnej zamiast tekstowej (-rw-rw-rw-)'; + LANGplPreferencesMovement = 'Poruszanie się'; + LANGplPreferencesLynxLikeMotionCheckBox_Caption = 'W stylu _Lynx''a'; + LANGplPreferencesInsertMovesDownCheckBox_Caption = '_Insert przechodzi w dół'; + LANGplPreferencesSpaceMovesDownCheckBox_Caption = '_Spacja przechodzi w dów'; + LANGplPreferencesViewer = 'Podgląd'; + LANGplPreferencesCommandSC = 'Polecenie:'; + LANGplPreferencesUseInternalViewer = 'Użyj _wewnętrznej przeglądarki'; + LANGplPreferencesEditor = 'Edytor'; + LANGplPreferencesTerminal = 'Terminal'; + LANGplPreferencesExperimentalFeatures = 'Opcje eksperymentalne'; + LANGplPreferencesExperimentalWarningLabel_Caption = 'Uwaga: Te opcje są dopiero rozwijanie i mogą działać nieprawidłowo. Używaj na własne ryzyko!'; + LANGplPreferencesFocusRefreshCheckBox_Caption = 'Odświeżaj, gdy okno odzyskuje skupienie'; + LANGplPreferencesFocusRefreshCheckBox_Tooltip = 'Odświeżanie panelu działa w tej chili bardzo wolno'; + LANGplPreferencesWMCompatModeCheckBox_Caption = 'Tryb kompatybilności z _WM (menadżerem okien)'; + LANGplPreferencesWMCompatModeCheckBox_Tooltip = 'Użyj, jeśli masz problemy spowodowane przez menadżera okien (np. IceWM nie maksymalizuje prawidłowo okien)'; + LANGplPreferencesCompatUseLibcSystemCheckBox_Caption = 'Użyj libc _system() do wykonywania programów'; + LANGplPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Używ w przypadku zamrażania lub zawieszania się programu przy uruchamianiu zewnętrznych aplikacji'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGplmiSearchCaption2 = '_Znajdź...'; + LANGplmiNoMounterBarCaption = '_Nie pokazuj paska montowania'; + LANGplmiShowOneMounterBarCaption = 'Pokazuj _jeden pasek montowania'; + LANGplmiShowTwoMounterBarCaption = 'Pokazuj _dwa paski montowania'; + LANGplmnuNetworkCaption = '_Sieć'; + LANGplmiConnectionsCaption = '_Połączenia...'; + LANGplmiOpenConnectionCaption = '_Połącz...'; + LANGplmiQuickConnectCaption = '_Szybkie połączenie...'; + LANGplmnuPluginsCaption = 'Wt_yczki'; + LANGplmiTestPluginCaption = '_Sprawdź wtyczkę...'; + LANGplmiMounterSettingsCaption = '_Ustawienia montowania...'; + LANGplmiColumnsCaption = 'Kolumny p_anelu...'; + LANGplmiSavePositionCaption = '_Zapisuj pozycję'; + LANGplmiMountCaption = '_Zamontuj'; + LANGplmiUmountCaption = '_Odmontuj'; + LANGplmiEjectCaption = '_Wysuń'; + LANGplmiDuplicateTabCaption = 'Podwój bieżący panel'; + LANGplmiCloseTabCaption = 'Zamknij bieżący panel'; + LANGplmiCloseAllTabsCaption = 'Zamknij wszystkie panele'; + LANGplCannotDetermineDestinationEngine = 'Nie można ustalić docelowego mechanizmu. Podaj właściwą ścieżkę i spróbuj ponownie.'; + LANGplCannotLoadFile = 'Nie można odczytać pliku ''%s''. Proszę sprawdzić uprawnienia.'; + LANGplMountPointDevice = 'Punkt montowania: %s'#10'Urządzenie: %s'; + LANGplMountSC = 'Montowanie:'; + LANGplNoPluginsFound = 'Nie znaleziono wtyczek'; + LANGplPluginAbout = 'Informacje o...'; + LANGplCouldntOpenURI = 'Nie można otworzyć podanego URI. Proszę sprawdzić stan zasobu i uprawnienia dostępu.'; + LANGplPluginAboutInside = 'Wtyczka: %s'#10#10'%s'#10'%s'; + LANGplAreYouSureCloseAllTabs = 'Czy na pewno chcesz zamknąć wszystkie nieaktywne panele?'; + LANGplCouldntOpenURIArchive = 'Nie można otworzyć archiwum. Proszę sprawdzić stan zasobu i uprawnienia dostępu.'; + LANGplThereIsNoModuleAvailable = 'Żaden z dostępnych modułów VFS nie potrafi obsłużyć tego połączenia'; + LANGplIgnoreError = 'Czy na pewno chcesz zignorować ten błąd? Plik źródłowy zostanie usunięty'; + LANGplErrorMount = 'Błąd podczas montowania urządzenia ''%s'':'#10#10; + LANGplErrorUmount = 'Błąd podczas odmontowania urządzenia ''%s'':'#10#10; + LANGplErrorEject = 'Błąd podczas wysuwania urządzenia ''%s'':'#10#10; + + LANGplMounterPrefs_Caption = 'Ustawienia montowania'; + LANGplMounterPrefs_TitleLabelCaption = 'Ustawienia montowania'; + LANGplMounterPrefs_ListViewFrameCaption = 'Montowanie'; + LANGplMounterPrefs_MountName = 'Name zasobu'; + LANGplMounterPrefs_MountPoint = 'Punkt montowania'; + LANGplMounterPrefs_Device = 'Urządzenie'; + LANGplMounterPrefs_MoveUpButtonTooltip = 'Przenieś w górę'; + LANGplMounterPrefs_MoveDownButtonTooltip = 'Przenieś w dół'; + LANGplMounterPrefs_UseFSTabDefaultsCheckBox = 'Użyj domyślnych elementów _fstab'; + LANGplMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Po zaznaczeniu, na pasek montowania znajdą się elementy z systemowej listy w /etc/fstab'; + LANGplMounterPrefs_ToggleModeCheckBox = 'Przyciski wciśnięte gdy zasób zamontowany'; + LANGplMounterPrefs_ToggleModeCheckBoxTooltip = 'Po zaznaczeniu stan "wciśnięty" przycisku będzie odzwieciedlał zamontowanie zasobu'; + LANGplMounterPrefs_PropertiesFrameCaption = 'Włąściwości zasobu'; + LANGplMounterPrefs_DisplayTextLabelCaption = 'Wyświetlany _tekst:'; + LANGplMounterPrefs_MountPointLabelCaption = '_Punkt montowania:'; + LANGplMounterPrefs_MountDeviceLabelCaption = '_Urządzenie:'; + LANGplMounterPrefs_DeviceTypeLabelCaption = 'Rodzaj urządzenia:'; + LANGplMounterPrefs_miLocalDiskCaption = 'Lokalny dysk'; + LANGplMounterPrefs_miRemovableCaption = 'Napęd przenośny'; + LANGplMounterPrefs_miCDCaption = 'Napęd CD/DVD'; + LANGplMounterPrefs_miFloppyCaption = 'Stacja dyskietek'; + LANGplMounterPrefs_miNetworkCaption = 'Udział sieciowy'; + LANGplMounterPrefs_MountCommandLabelCaption = 'Polecenie _montowania:'; + LANGplMounterPrefs_UmountCommandLabelCaption = 'Polecenie _odmontowania:'; + LANGplMounterPrefs_MountCommandEntryTooltip = 'Składnia: %dev oznacza urządzenie, %dir punkt montowania (pusty oznacza domyślny)'#10'Uważaga: przy interaktywnych komendach, tuxcmd może przestać reagować!'#10'Przykład: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGplMounterPrefs_UmountCommandEntryTooltip = 'Składnia: %dev oznacza urządzenie, %dir punkt montowania (pusty oznacza domyślny)'#10'Example: smbumount $dir'; + LANGplMounterPrefs_IconLabelCaption = '_Ikona:'; + + LANGplConnMgr_Caption = 'Otwórz nowe połączenie'; + LANGplConnMgr_ConnectButton = '_Połącz'; + LANGplConnMgr_OpenConnection = 'Open Connection'; + LANGplConnMgr_NameColumn = 'Nazwa'; + LANGplConnMgr_URIColumn = 'Adres (URI)'; + LANGplConnMgr_AddConnectionButtonCaption = '_Dodaj...'; + LANGplConnMgr_AddConnectionButtonTooltip = 'Dodaj nowe połączenie'; + LANGplConnMgr_EditButtonCaption = '_Edycja'; + LANGplConnMgr_EditButtonTooltip = 'Ustaw właściwości połączenia'; + LANGplConnMgr_RemoveButtonCaption = '_Usuń'; + LANGplConnMgr_RemoveButtonTooltip = 'Usuń zaznaczone połączenie'; + LANGplConnMgr_DoYouWantDelete = 'Czy na pewno chcesz usunąć połączenie ''%s''?'; + + LANGplConnProp_FTP = 'FTP'; + LANGplConnProp_SFTP = 'SFTP (podsystem ssh)'; + LANGplConnProp_SMB = 'Udział Windows (SMB)'; + LANGplConnProp_HTTP = 'WebDAV (HTTP)'; + LANGplConnProp_HTTPS = 'Bezpieczny WebDAV (HTTPS)'; + LANGplConnProp_Other = 'Inne (podaj URI)'; + LANGplConnProp_Caption = 'Właściwości połączenia'; + LANGplConnProp_VFSModule = 'Moduł _VFS:'; + LANGplConnProp_URI = '_URI:'; + LANGplConnProp_URIEntryTooltip = 'Prawidłowy URI powinien zawierać typ usługi (w prefiksie) oraz adres serwera'; + LANGplConnProp_DetailedInformations = 'Szczegółowe informacje'; + LANGplConnProp_Name = '_Nazwa:'; + LANGplConnProp_Server = 'Ser_wer[:port]:'; + LANGplConnProp_Username = 'Nazwa _użytkownika:'; + LANGplConnProp_UserNameEntryTooltip = 'Pozostaw puste w celu zalogowania jako anonim'; + LANGplConnProp_Password = '_Hasło:'; + LANGplConnProp_TargetDirectory = 'Katalog _docelowy:'; + LANGplConnProp_ServiceType = '_Typ usługi:'; + LANGplConnProp_MaskPassword = '_Maskuj hasło:'; + LANGplConnProp_MenuItemCaption = 'Domyślne (wszystkie pasujące moduły)'; + + LANGplConnLogin_Caption = 'Wymagana autoryzacja'; + LANGplConnLogin_Login = 'Login'; + LANGplConnLogin_ExperimentalWarningLabelCaption = 'Musisz się zalogować żeby uzyskać dostęp do %s'; + LANGplConnLogin_Username = '_Nazwa użytkownika:'; + LANGplConnLogin_Password = '_Hasło:'; + LANGplConnLogin_AnonymousCheckButton = '_Jako anonim'; + + LANGplColumns_Caption = 'Ustawienia kolumn w panelu'; + LANGplColumns_Title = 'Ustawienia kolumn w panelu'; + LANGplColumns_MoveUpButtonTooltip = 'Przesuń element w górę'; + LANGplColumns_MoveDownButtonTooltip = 'Przesuń element w dół'; + LANGplColumns_TitlesLongName = 'Nazwa'; + LANGplColumns_TitlesLongNameExt = 'Nazwa + rozszerzenie'; + LANGplColumns_TitlesLongExt = 'Rozszerzenie'; + LANGplColumns_TitlesLongSize = 'Rozmiar'; + LANGplColumns_TitlesLongDateTime = 'Data + Czas'; + LANGplColumns_TitlesLongDate = 'Data'; + LANGplColumns_TitlesLongTime = 'Czas'; + LANGplColumns_TitlesLongUser = 'Użytkownik'; + LANGplColumns_TitlesLongGroup = 'Grupa'; + LANGplColumns_TitlesLongAttr = 'Attrybuty'; + LANGplColumns_TitlesShortName = 'Nazwa'; + LANGplColumns_TitlesShortNameExt = 'Nazwa'; + LANGplColumns_TitlesShortExt = 'Roz'; + LANGplColumns_TitlesShortSize = 'Rozmiar'; + LANGplColumns_TitlesShortDateTime = 'Data'; + LANGplColumns_TitlesShortDate = 'Data'; + LANGplColumns_TitlesShortTime = 'Czas'; + LANGplColumns_TitlesShortUser = 'Użytk.'; + LANGplColumns_TitlesShortGroup = 'Grupa'; + LANGplColumns_TitlesShortAttr = 'Atr'; + + LANGplTestPlugin_Caption = 'Przetestuj wtyczkę VFS'; + LANGplTestPlugin_Title = 'Przetestuj wtyczkę VFS'; + LANGplTestPlugin_ExperimentalWarningLabelCaption = 'Uwaga: podsystem VFS i jego wtyczki są we wczesnych wersjach rozwojowych i mogą zawierać błędy. Używaj wyłacznie na własne ryzyko!'; + LANGplTestPlugin_Plugin = '_Wtyczka:'; + LANGplTestPlugin_Command = 'Po_lecenie:'; + LANGplTestPlugin_Username = '_Nazwa użytkownika:'; + LANGplTestPlugin_Password = '_Hasło:'; + LANGplTestPlugin_AnonymousCheckButton = '_Logowanie anonimowe (nie używa VFSLogin)'; + LANGplTestPlugin_NoPluginsFound = 'Nie znaleziono wtyczek'; + + LANGplRemoteWait_Caption = 'Wykonywanie operacji'; + LANGplRemoteWait_OperationInProgress = 'Wykonywanie operacji, proszę czekać...'; + LANGplRemoteWait_ItemsFound = 'dotychczas znaleziono %d elementów'; + + LANGplSearch_Bytes = 'Bajty'; + LANGplSearch_kB = 'kB'; + LANGplSearch_MB = 'MB'; + LANGplSearch_days = 'dni'; + LANGplSearch_weeks = 'tygodnie'; + LANGplSearch_months = 'miesiące'; + LANGplSearch_years = 'lata'; + LANGplSearch_Caption = 'znajdź pliki'; + LANGplSearch_General = 'Ogólne'; + LANGplSearch_Advanced = 'Zaawansowane'; + LANGplSearch_SearchResults = 'Wynik wyszukiwania:'; + LANGplSearch_SearchFor = 'Szukaj:'; + LANGplSearch_FileMaskEntryTooltip = 'Porada: Możesz wpisać kilka plików, oddzielonych średnikiem (";")'; + LANGplSearch_SearchIn = 'Znajdź _w:'; + LANGplSearch_SearchArchivesCheckButton = 'Przeszukuj _archiwa'; + LANGplSearch_FindText = 'Znajdź _tekst:'; + LANGplSearch_FindTextEntryTooltip = 'Pozostaw puste by nie szukać tekstu'#10'Uwaga: GUI używa kodowania znaków UTF-8'; + LANGplSearch_CaseSensitiveCheckButton = '_Rozróżnianie wielkości liter'; + LANGplSearch_StayCurrentFSCheckButton = 'Dołącz inne systemy plików'; + LANGplSearch_CaseSensitiveMatchCheckButton = '_Rozróżnianie wielkości liter'; + LANGplSearch_Size = 'Rozmiar'; + LANGplSearch_Date = 'Data'; + LANGplSearch_BiggerThan = '_większe niż'; + LANGplSearch_SmallerThan = '_Mniejsze niż'; + LANGplSearch_ModifiedBetweenRadioButton = '_Zmienione pomiędzy'; + LANGplSearch_NotModifiedAfterRadioButton = '_Nie zmienione po'; + LANGplSearch_ModifiedLastRadioButton = 'Zmien_ione w ciągu ostatniech'; + LANGplSearch_ModifiedNotLastRadionButton = 'Nie zmienione w ciągu osta_tnich'; + LANGplSearch_ModifiedBetweenEntry1 = '"Użyć daty w formacie:" c'; + LANGplSearch_ViewButtonCaption = '_Podgląd pliku'; + LANGplSearch_NewSearchButtonCaption = '_Nowe wyszukiwanie'; + LANGplSearch_GoToFileButtonCaption = '_Idź do pliku'; + LANGplSearch_FeedToListboxButtonCaption = 'Wyślij do _listy'; + LANGplSearch_StatusSC = 'Status:'; + LANGplSearch_Ready = 'Gotowe.'; + LANGplSearch_PreparingToSearch = 'Przygotowanie do wyszukiwania.'; + LANGplSearch_SearchInProgress = 'Trwa szukanie:'; + LANGplSearch_UserCancelled = 'Anulowane przez użytkownika.'; + LANGplSearch_SearchFinished = 'Szukanie zakończone'; + LANGplSearch_FilesFound = 'znaleziono %d plików'; + LANGplSearch_And = 'i'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGplCloseOpenConnection = 'Próbujesz otworzyć nowe połączenie. Kontynuacja spowoduje zamknięcie poprzedniego i zastąpienie go nowym.'#10#10'Czy kontynuować?'; + LANGplDuplicateTabWarning = 'Próbujesz otworzyć nową kartę zdalnego katalogu. Nie jest to możliwe, w nowej karcie otworzy się w zamian lokalny katalog. '; + LANGplDontShowAgain = '_Don''t show this message again'; + LANGplSwitchOtherPanelWarning = 'Próbujesz otworzyć zdalny katalog w przeciwległym panelu. Nie jest to możliwe, docelowy katalog nie będzie zmieniony.'; + LANGplOpenConnectionsWarning = 'W panelu otwarte jest połączenie sieciowe. Przy zamknięciu aplikacji zostaną one rozłączone.'#10#10'Czy na pewno zamknąć?'; + LANGplmiDisconnect_Caption = '_Rozłącz'; + LANGplDisconnectButton_Tooltip = 'Rozłącza aktywne połączanie'; + LANGplLeaveArchiveButton_Tooltip = 'Zamykabieżące archiwum'; + LANGplOpenTerminalButton_Tooltip = 'Otwiera nowe okna terminala w bieżącym katalogu'; + LANGplOpenTerminalButton_Caption = 'Otwórz Te_rminal'; + LANGplShowTextUIDsCheckBox_Caption = 'Wyświetlaj tekstowe _UID'; + LANGplShowTextUIDsCheckBox_Tooltip = 'Wyświetla tekstowe informacje o użytkowniku i grupie zamiast oznaczeń cyfrowych (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGplmiNewTab_Caption = 'Nowa karta _folderu'; + LANGplFilePopupMenu_Properties = '_Właściwości'; + LANGplCommandEntry_Tooltip = 'Używa %s jako pliku/katalogu'; + LANGplmiFiles_Caption = 'Tylko pliki'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGplPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGplHandleRunFromArchive_Bytes = 'bytes'; + LANGplHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGplHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGplHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGplHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGplFRunFromVFS_Caption = 'Packed file properties'; + LANGplFRunFromVFS_TitleLabel = 'File Properties'; + LANGplFRunFromVFS_FileNameLabel = 'File name:'; + LANGplFRunFromVFS_FileTypeLabel = 'File type:'; + LANGplFRunFromVFS_SizeLabel = 'Size:'; + LANGplFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGplFRunFromVFS_DateLabel = 'Modify date:'; + LANGplFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGplFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGplFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGplFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGplFSetPassword_Caption = 'Set password'; + LANGplFSetPassword_Label1_Caption = 'Password required'; + LANGplFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGplFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + +(********************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGplF2Button_Caption; + LANGF3Button_Caption := LANGplF3Button_Caption; + LANGF4Button_Caption := LANGplF4Button_Caption; + LANGF5Button_Caption := LANGplF5Button_Caption; + LANGF6Button_Caption := LANGplF6Button_Caption; + LANGF7Button_Caption := LANGplF7Button_Caption; + LANGF8Button_Caption := LANGplF8Button_Caption; + + LANGmnuFile_Caption := LANGplmnuFile_Caption; + LANGmnuMark_Caption := LANGplmnuMark_Caption; + LANGmnuCommands_Caption := LANGplmnuCommands_Caption; + LANGmnuHelp_Caption := LANGplmnuHelp_Caption; + LANGmiExit_Caption := LANGplmiExit_Caption; + LANGmiSelectGroup_Caption := LANGplmiSelectGroup_Caption; + LANGmiSelectAll_Caption := LANGplmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGplmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGplmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGplmiRefresh_Caption; + LANGmiAbout_Caption := LANGplmiAbout_Caption; + + LANGColumn1_Caption := LANGplColumn1_Caption; + LANGColumn2_Caption := LANGplColumn2_Caption; + LANGColumn3_Caption := LANGplColumn3_Caption; + LANGColumn4_Caption := LANGplColumn4_Caption; + LANGColumn5_Caption := LANGplColumn5_Caption; + + LANGExpandSelection := LANGplExpandSelection; + LANGShrinkSelection := LANGplShrinkSelection; + LANGNoMatchesFound := LANGplNoMatchesFound; + LANGNoFilesSelected := LANGplNoFilesSelected; + LANGSelectedFilesDirectories := LANGplSelectedFilesDirectories; + LANGDirectoryS := LANGplDirectoryS; + LANGFileS := LANGplFileS; + LANGDoYouReallyWantToDeleteTheS := LANGplDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGplDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGplCopyFiles; + LANGMoveRenameFiles := LANGplMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGplCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGplMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGplCopySC; + LANGMoveRenameSC := LANGplMoveRenameSC; + + LANGQuickFind := LANGplQuickFind; + + LANGAboutString := LANGplAboutString; + LANGAboutStringGnome := LANGplAboutStringGnome; + LANGDiskStatFmt := LANGplDiskStatFmt; + LANGDiskStatVolNameFmt := LANGplDiskStatVolNameFmt; + LANGStatusLineFmt := LANGplStatusLineFmt; + LANGPanelStrings[False] := LANGplPanelStrings[False]; + LANGPanelStrings[True] := LANGplPanelStrings[True]; + LANGErrorGettingListingForSPanel := LANGplErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGplErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGplErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGplErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGplTheFileDirectory; + LANGCouldNotBeDeleted := LANGplCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGplCouldNotBeDeletedS; + LANGUserCancelled := LANGplUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGplTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGplCannotCopyFile; + LANGCopyError := LANGplCopyError; + LANGMoveError := LANGplMoveError; + LANGOverwriteS := LANGplOverwriteS; + LANGWithFileS := LANGplWithFileS; + LANGOvewriteSBytesS := LANGplOvewriteSBytesS; + LANGTheFile := LANGplTheFile; + LANGCopy := LANGplCopy; + LANGMove := LANGplMove; + LANGTheDirectory := LANGplTheDirectory; + LANGTheSymbolicLink := LANGplTheSymbolicLink; + LANGCannotMoveFile := LANGplCannotMoveFile; + LANGCouldNotBeCreated := LANGplCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGplCouldNotBeCreatedS; + LANGFromS := LANGplFromS; + LANGToS := LANGplToS; + LANGCannotCopyFileToItself := LANGplCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGplMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGplCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGplCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGplCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGplCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGplCannotReadFromSourceFile; + + LANGUnknownException := LANGplUnknownException; + LANGNoAccess := LANGplNoAccess; + LANGUnknownError := LANGplUnknownError; + + LANGCreateANewDirectory := LANGplCreateANewDirectory; + LANGEnterDirectoryName := LANGplEnterDirectoryName; + + LANGOverwriteQuestion := LANGplOverwriteQuestion; + LANGOverwriteButton_Caption := LANGplOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGplOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGplSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGplOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGplSkipAllButton_Caption; + LANGRenameButton_Caption := LANGplRenameButton_Caption; + LANGAppendButton_Caption := LANGplAppendButton_Caption; + LANGRename := LANGplRename; + LANGRenameFile := LANGplRenameFile; + LANGIgnoreButton_Caption := LANGplIgnoreButton_Caption; + + LANGProgress := LANGplProgress; + LANGCancel := LANGplCancel; + LANGDelete := LANGplDelete; + + LANGSpecifyFileType := LANGplSpecifyFileType; + + LANGRemoveDirectory := LANGplRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGplDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGplRetry; + LANGDeleteButton_Caption := LANGplDeleteButton_Caption; + LANGAll := LANGplAll; + + LANGCopyFilesSC := LANGplCopyFilesSC; + LANGAppendQuestion := LANGplAppendQuestion; + LANGPreparingList := LANGplPreparingList; + + LANGYouMustSelectAValidFile := LANGplYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGplmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGplVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGplCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGplCheckButtonCaptionStop; + LANGFileListTooltip := LANGplFileListTooltip; + LANGFilenameColumnCaption := LANGplFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGplTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGplAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGplAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGplAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGplChecksumNotChecked; + LANGChecksumChecking := LANGplChecksumChecking; + LANGChecksumInterrupted := LANGplChecksumInterrupted; + LANGChecksumDOK := LANGplChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGplmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGplYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGplCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGplCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGplCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGplCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGplCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGplCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGplCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGplCCHKSUMPage3Title; + LANGCCHKSUMPage5Title := LANGplCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGplCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGplCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGplCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGplCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGplCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGplCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGplCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGplCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGplCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGplCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGplCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGplCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGplAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGplTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGplTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGplMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGplPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGplMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGplWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGplMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGplMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + + LANGPopupDefault := LANGplPopupDefault; + LANGPopupOpenWith := LANGplPopupOpenWith; + LANGPopupViewFile := LANGplPopupViewFile; + LANGPopupEditFile := LANGplPopupEditFile; + LANGPopupMakeSymlink := LANGplPopupMakeSymlink; + LANGPopupRename := LANGplPopupRename; + LANGPopupDelete := LANGplPopupDelete; + LANGDialogChangePermissions := LANGplDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGplCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGplDialogChangeOwner; + LANGCouldNotBeChownedS := LANGplCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGplDialogMakeSymlink; + LANGDialogEditSymlink := LANGplDialogEditSymlink; + LANGFEditSymlink_Caption := LANGplFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGplFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGplFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGplFChmod_Caption; + LANGFChmod_PermissionFrame := LANGplFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGplFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGplFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGplFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGplFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGplFChmod_OctalLabel; + LANGFChmod_SUID := LANGplFChmod_SUID; + LANGFChmod_SGID := LANGplFChmod_SGID; + LANGFChmod_Sticky := LANGplFChmod_Sticky; + LANGFChmod_RUSR := LANGplFChmod_RUSR; + LANGFChmod_WUSR := LANGplFChmod_WUSR; + LANGFChmod_XUSR := LANGplFChmod_XUSR; + LANGFChmod_RGRP := LANGplFChmod_RGRP; + LANGFChmod_WGRP := LANGplFChmod_WGRP; + LANGFChmod_XGRP := LANGplFChmod_XGRP; + LANGFChmod_ROTH := LANGplFChmod_ROTH; + LANGFChmod_WOTH := LANGplFChmod_WOTH; + LANGFChmod_TextLabel := LANGplFChmod_TextLabel; + LANGFChmod_FileLabel := LANGplFChmod_FileLabel; + LANGFChown_Caption := LANGplFChown_Caption; + LANGFChown_OwnerFrame := LANGplFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGplFChown_GroupFrame; + LANGFChown_FileFrame := LANGplFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGplFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGplFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGplFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGplFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGplmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGplmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGplmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGplBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGplmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGplTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGplSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGplPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGplPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGplPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGplPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGplPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGplPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGplPreferences_NumHistoryItems; + LANGPreferences_ClearReadonlyAttribute := LANGplPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGplPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGplPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGplPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGplPreferences_Viewer; + LANGPreferences_Editor := LANGplPreferences_Editor; + LANGPreferences_Terminal := LANGplPreferences_Terminal; + LANGPreferences_ListFont := LANGplPreferences_ListFont; + LANGPreferences_Change := LANGplPreferences_Change; + LANGPreferences_UseDefaultFont := LANGplPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGplPreferences_Foreground; + LANGPreferences_Background := LANGplPreferences_Background; + LANGPreferences_NormalItem := LANGplPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGplPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGplPreferences_Cursor; + LANGPreferences_InactiveItem := LANGplPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGplPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGplPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGplPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGplPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGplPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGplPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGplPreferences_DefaultS; + LANGPreferences_SelectFont := LANGplPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGplBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGplUpButton_Tooltip; + LANGRootButton_Tooltip := LANGplRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGplHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGplLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGplRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGplmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGplmiTargetSource_Caption; + LANGFileTypeDirectory := LANGplFileTypeDirectory; + LANGFileTypeFile := LANGplFileTypeFile; + LANGFileTypeMetafile := LANGplFileTypeMetafile; + LANGPreferencesPanelsPage := LANGplPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGplPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGplPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGplPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGplPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGplPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGplPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGplPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGplPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGplPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGplPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGplPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGplPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGplPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGplPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGplPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGplPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGplPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGplPreferencesShow; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGplPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGplPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGplPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGplPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGplPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGplPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGplPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGplPreferencesViewer; + LANGPreferencesCommandSC := LANGplPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGplPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGplPreferencesEditor; + LANGPreferencesTerminal := LANGplPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGplPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGplPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGplPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGplPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGplPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGplPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGplPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGplPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGplmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGplmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGplmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGplmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGplmnuNetworkCaption; + LANGmiConnectionsCaption := LANGplmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGplmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGplmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGplmnuPluginsCaption; + LANGmiTestPluginCaption := LANGplmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGplmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGplmiColumnsCaption; + LANGmiSavePositionCaption := LANGplmiSavePositionCaption; + LANGmiMountCaption := LANGplmiMountCaption; + LANGmiUmountCaption := LANGplmiUmountCaption; + LANGmiEjectCaption := LANGplmiEjectCaption; + LANGmiDuplicateTabCaption := LANGplmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGplmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGplmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGplCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGplCannotLoadFile; + LANGMountPointDevice := LANGplMountPointDevice; + LANGMountSC := LANGplMountSC; + LANGNoPluginsFound := LANGplNoPluginsFound; + LANGPluginAbout := LANGplPluginAbout; + LANGCouldntOpenURI := LANGplCouldntOpenURI; + LANGPluginAboutInside := LANGplPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGplAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGplCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGplThereIsNoModuleAvailable; + LANGIgnoreError := LANGplIgnoreError; + LANGErrorMount := LANGplErrorMount; + LANGErrorUmount := LANGplErrorUmount; + LANGErrorEject := LANGplErrorEject; + + LANGMounterPrefs_Caption := LANGplMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGplMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGplMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGplMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGplMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGplMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGplMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGplMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGplMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGplMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGplMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGplMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGplMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGplMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGplMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGplMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGplMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGplMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGplMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGplMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGplMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGplMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGplMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGplMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGplMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGplMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGplMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGplConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGplConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGplConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGplConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGplConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGplConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGplConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGplConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGplConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGplConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGplConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGplConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGplConnProp_FTP; + LANGConnProp_SFTP := LANGplConnProp_SFTP; + LANGConnProp_SMB := LANGplConnProp_SMB; + LANGConnProp_HTTP := LANGplConnProp_HTTP; + LANGConnProp_HTTPS := LANGplConnProp_HTTPS; + LANGConnProp_Other := LANGplConnProp_Other; + LANGConnProp_Caption := LANGplConnProp_Caption; + LANGConnProp_VFSModule := LANGplConnProp_VFSModule; + LANGConnProp_URI := LANGplConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGplConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGplConnProp_DetailedInformations; + LANGConnProp_Name := LANGplConnProp_Name; + LANGConnProp_Server := LANGplConnProp_Server; + LANGConnProp_Username := LANGplConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGplConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGplConnProp_Password; + LANGConnProp_TargetDirectory := LANGplConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGplConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGplConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGplConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGplConnLogin_Caption; + LANGConnLogin_Login := LANGplConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGplConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGplConnLogin_Username; + LANGConnLogin_Password := LANGplConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGplConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGplColumns_Caption; + LANGColumns_Title := LANGplColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGplColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGplColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGplColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGplColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGplColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGplColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGplColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGplColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGplColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGplColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGplColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGplColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGplColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGplColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGplColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGplColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGplColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGplColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGplColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGplColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGplColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGplColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGplTestPlugin_Caption; + LANGTestPlugin_Title := LANGplTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGplTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGplTestPlugin_Plugin; + LANGTestPlugin_Command := LANGplTestPlugin_Command; + LANGTestPlugin_Username := LANGplTestPlugin_Username; + LANGTestPlugin_Password := LANGplTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGplTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGplTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGplRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGplRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGplRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGplSearch_Bytes; + LANGSearch_kB := LANGplSearch_kB; + LANGSearch_MB := LANGplSearch_MB; + LANGSearch_days := LANGplSearch_days; + LANGSearch_weeks := LANGplSearch_weeks; + LANGSearch_months := LANGplSearch_months; + LANGSearch_years := LANGplSearch_years; + LANGSearch_Caption := LANGplSearch_Caption; + LANGSearch_General := LANGplSearch_General; + LANGSearch_Advanced := LANGplSearch_Advanced; + LANGSearch_SearchResults := LANGplSearch_SearchResults; + LANGSearch_SearchFor := LANGplSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGplSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGplSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGplSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGplSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGplSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGplSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGplSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGplSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGplSearch_Size; + LANGSearch_Date := LANGplSearch_Date; + LANGSearch_BiggerThan := LANGplSearch_BiggerThan; + LANGSearch_SmallerThan := LANGplSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGplSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGplSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGplSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGplSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGplSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGplSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGplSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGplSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGplSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGplSearch_StatusSC; + LANGSearch_Ready := LANGplSearch_Ready; + LANGSearch_PreparingToSearch := LANGplSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGplSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGplSearch_UserCancelled; + LANGSearch_SearchFinished := LANGplSearch_SearchFinished; + LANGSearch_FilesFound := LANGplSearch_FilesFound; + LANGSearch_And := LANGplSearch_And; + + LANGCloseOpenConnection := LANGplCloseOpenConnection; + LANGDuplicateTabWarning := LANGplDuplicateTabWarning; + LANGDontShowAgain := LANGplDontShowAgain; + LANGSwitchOtherPanelWarning := LANGplSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGplOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGplmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGplDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGplLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGplOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGplOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGplShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGplShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGplmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGplFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGplCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGplmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGplPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGplHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGplHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGplHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGplHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGplHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGplFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGplFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGplFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGplFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGplFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGplFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGplFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGplFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGplFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGplFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGplFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGplFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGplFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGplFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGplFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('PL', @SetTranslation); + AddTranslation('pl_PL', @SetTranslation); +end. diff --git a/translations/UTranslation_RU.pas b/translations/UTranslation_RU.pas new file mode 100644 index 0000000..0455466 --- /dev/null +++ b/translations/UTranslation_RU.pas @@ -0,0 +1,1254 @@ +(* + Tux Commander - UTranslation_RU - Russian Localization constants + Copyright (C) 2004 Maxim Baranov + !! Currently unmaintained, new translator needed !! + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_RU; + +interface + +implementation + +uses ULocale; + +const LANGruF2Button_Caption = 'F2 - Переименов'; + LANGruF3Button_Caption = 'F3 - Просмотр'; + LANGruF4Button_Caption = 'F4 - Правка'; + LANGruF5Button_Caption = 'F5 - Копия'; + LANGruF6Button_Caption = 'F6 - Перемещ'; + LANGruF7Button_Caption = 'F7 - Каталог'; + LANGruF8Button_Caption = 'F8 - Удалить'; + + LANGrumnuFile_Caption = '_Файл'; + LANGrumnuMark_Caption = '_Выделение'; + LANGrumnuCommands_Caption = 'Коман_ды'; + LANGrumnuHelp_Caption = '_Справка'; + LANGrumiExit_Caption = 'В_ыход'; + LANGrumiSelectGroup_Caption = 'Выделить _группу...'; + LANGrumiUnselectGroup_Caption = '_Снять Выделение...'; + LANGrumiSelectAll_Caption = 'Вы_делить Все'; + LANGrumiUnselectAll_Caption = 'Сн_ять все выделение'; + LANGrumiInvertSelection_Caption = '_Инвертировать выделение'; + LANGrumiRefresh_Caption = 'О_бновить окно'; + LANGrumiAbout_Caption = '_О Программе...'; + + LANGruColumn1_Caption = 'Имя'; + LANGruColumn2_Caption = 'Тип'; + LANGruColumn3_Caption = 'Размер'; + LANGruColumn4_Caption = 'Дата'; + LANGruColumn5_Caption = 'Атрибуты'; + + LANGruExpandSelection = 'Расширить выделение'; + LANGruShrinkSelection = 'Уменьшить выделение'; + LANGruNoMatchesFound = 'Такие файлы не найдены.'; + LANGruNoFilesSelected = 'Нет выбранных файлов.'; + LANGruSelectedFilesDirectories = '%d файла(ов)/каталога(ов)'; + LANGruDirectoryS = 'каталог %s'; + LANGruFileS = 'файл %s'; + LANGruDoYouReallyWantToDeleteTheS = 'Действительно удалить %s ?'; + LANGruDoYouReallyWantToDeleteTheSS = 'Действительно удалить %s ?'#10'%s'; + LANGruCopyFiles = 'Копировать файлы'; + LANGruMoveRenameFiles = 'Переименовать/Переместить файлы'; + LANGruCopyDFileDirectoriesTo = 'Копировать %d файла(ов)/каталога(ов) в'; + LANGruMoveRenameDFileDirectoriesTo = 'Переименовать/Переместить %d файла(ов)/каталога(ов) в'; + LANGruCopySC = 'Копировать:'; + LANGruMoveRenameSC = 'Переименовать/Переместить:'; + + LANGruQuickFind = ' Поиск:'; + + LANGruAboutString = 'Tux Commander'#10'Version %s'#10'Build date: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGruAboutStringGnome = 'version %s'#10'Build date: %s'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGruDiskStatFmt = '%s из %s свободно'; + LANGruDiskStatVolNameFmt = '[%s] %s из %s кБ свободно'; + LANGruStatusLineFmt = 'выбрано: %s из %s , файлов: %d из %d'; + LANGruPanelStrings : array[boolean] of string = ('правой', 'левой'); + + LANGruDIR = ''; + LANGruErrorGettingListingForSPanel = 'Невозможно получить список для %s панели:'#10' %s'#10#10'Путь = ''%s'''; + LANGruErrorGettingListingForSPanelNoPath = 'Невозможно получить список для %s панели:'#10' %s'; + LANGruErrorCreatingNewDirectorySInSPanel = 'Ошибка создания нового каталога ''%s'' в %s панели:'#10' %s'; + LANGruErrorCreatingNewDirectorySInSPanelNoPath = 'Ошибка создания нового каталога в %s панели:'#10' %s'; + LANGruTheFileDirectory = 'Файл/Каталог'; + LANGruCouldNotBeDeleted = 'не может быть удален'; + LANGruCouldNotBeDeletedS = 'не может быть удален: %s'; + LANGruUserCancelled = 'Прервано пользователем'; + LANGruTheDirectorySIsNotEmpty = 'Каталог %s содержит файлы и/или подкаталоги.'; + LANGruCannotCopyFile = 'Не могу скопировать файл'; + LANGruCopyError = 'Ошибка копирования файлов'; + LANGruMoveError = 'Ошибка перемещения файлов'; + LANGruOverwriteS = 'Заменить: %s'; + LANGruWithFileS = 'Файлом: %s'; + LANGruOvewriteSBytesS = '%s байт, %s'; + LANGruTheFile = 'Файл'; + LANGruCopy = 'Копировать'; + LANGruMove = 'Переместить'; + LANGruTheDirectory = 'Каталог'; + LANGruTheSymbolicLink = 'Символьная ссылка'; + LANGruCannotMoveFile = 'Не могу пререместить файл'; + LANGruCouldNotBeCreated = 'не может быть создан'; + LANGruCouldNotBeCreatedS = 'не может быть создан: %s'; + LANGruFromS = 'Из: %s'; + LANGruToS = 'В: %s'; + LANGruCannotCopyFileToItself = 'Нельзя скопировать файл сам в себя'; + LANGruMemoryAllocationFailed = 'Не хватает памяти:'; + LANGruCannotOpenSourceFile = 'Не могу открыть исходный файл'; + LANGruCannotOpenDestinationFile = 'Не могу создать выходной файл'; + LANGruCannotCloseDestinationFile = 'Не могу закрыть выходной файл'; + LANGruCannotCloseSourceFile = 'Не могу закрыть исходный файл'; + LANGruCannotReadFromSourceFile = 'Ошибка чтения исходного файла'; + LANGruCannotWriteToDestinationFile = 'Ошибка записи в выходной файл'; + + LANGruUnknownException = 'Неизвестное исключение'; + LANGruNoAccess = 'Нет доступа'; + LANGruUnknownError = 'Неизвестная ошибка'; + + LANGruCreateANewDirectory = 'Создать новый каталог'; + LANGruEnterDirectoryName = 'Укажите имя _каталога:'; + + LANGruOverwriteQuestion = 'Подтверждение замены'; + LANGruOverwriteButton_Caption = '_Заменить'; + LANGruOverwriteAllButton_Caption = 'Заменить _все'; + LANGruSkipButton_Caption = '_Пропустить'; + LANGruOverwriteAllOlderButton_Caption = 'Заменить более _старые'; + LANGruSkipAllButton_Caption = 'Пропустить вс_е'; + LANGruRenameButton_Caption = 'Пере_именовать'; + LANGruAppendButton_Caption = '_Дописать'; + LANGruRename = 'Переименовать'; + LANGruRenameFile = 'Переименовать файл ''%s'' в'; + LANGruIgnoreButton_Caption = '_Игнорировать'; + + LANGruProgress = 'Прогресс'; + LANGruCancel = '_Отмена'; + LANGruDelete = 'Удалить:'; + + LANGruSpecifyFileType = '_Тип файла:'; + + LANGruRemoveDirectory = 'Удалить каталог'; + LANGruDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Вы действительно хотите удалить его целиком, со всеми файлами и подкаталогами?'; + LANGruRetry = '_Повторить'; + LANGruDeleteButton_Caption = '_Удалить'; + LANGruAll = '_Все'; + + LANGruCopyFilesSC = 'Копировать файлы:'; + LANGruAppendQuestion = 'Вы действительно хотите добавить файл ''%s'' в ''%s''?'; + LANGruPreparingList = 'Подготовка списка...'; + + LANGruYouMustSelectAValidFile = 'выбран неверный файл!'; + LANGrumiVerifyChecksums = 'Пров_ерить контрольную сумму'; + LANGruVerifyChecksumsCaption = 'Проверка контрольной суммы'; + LANGruCheckButtonCaptionCheck = '_Проверка'; + LANGruCheckButtonCaptionStop = '_Остановить'; + LANGruFileListTooltip = '[?] - Не Проверен'#10'[OK] - Контрольная сумма ОК'#10'[BAD] - Плохая контрольная сумма'#10'[N/A] - Файл не доступен'; + LANGruFilenameColumnCaption = 'Имя файла'; + LANGruTheFileSYouAreTryingToOpenIsQuiteBig = 'Файл ''%s'' слишком большой. Вероятно, он не содержит контрольной суммы.'#10#10'Все равно продолжить?'; + LANGruAnErrorOccuredWhileInitializingMemoryBlock = 'Ошибка инициализации блока памяти. Закройте несколько программ и попробуйте еще раз.'; + LANGruAnErrorOccuredWhileOpeningFileSS = 'Ошибка открытия файла ''%s'':'#10' %s'; + LANGruAnErrorOccuredWhileReadingFileSS = 'Ошибка чтения файла ''%s'':'#10' %s'; + LANGruChecksumNotChecked = 'Статус: Не Проверен'; + LANGruChecksumChecking = 'Статус: Проверяю...'; + LANGruChecksumInterrupted = 'Статус: Проверка прервана'; + LANGruChecksumDOK = 'Статус: %d%% ОК'; + + LANGrumiCreateChecksumsCaption = '_Создать контрольные суммы...'; + LANGruYouMustSelectAtLeastOneFileToCalculateChecksum = 'Нужно выбрать по крайней мере один файл для создания контрольной суммы!'; + LANGruCreateChecksumsCaption = 'Создание контрольных сумм'; + LANGruCCHKSUMPage1Text = 'Если Вы не выбрали'#10'все нужные Вам файлы, закройте это окно и'#10'выберите остальные файлы.'; + LANGruCCHKSUMPage4Text = 'Друид готов к созданию контрольных сумм'#10'для выбраных файлов. Это может занять несколько минут.'#10'Нажмите "Вперед" для продолжения.'; + LANGruCCHKSUMPage6Text = 'Ошибка создания контрольной суммы:'; + LANGruCCHKSUMPage7Text = 'Создание контрольных сумм завершено.'#10#10'Нажмите "Завершить" для выхода.'; + LANGruCCHKSUMPage1Title = 'Подготовка к созданию контрольной суммы'; + LANGruCCHKSUMPage2Title = 'Выберите тип контрольной суммы'; + LANGruCCHKSUMPage3Title = 'Выберите имя файла'; + LANGruCCHKSUMPage4Title = 'Готов к созданию контрольных сумм'; + LANGruCCHKSUMPage5Title = 'В процессе...'; + LANGruCCHKSUMPage6Title = 'Ошибка!'; + LANGruCCHKSUMPage7Title = 'Готово'; + LANGruCCHKSUMSFVFile = 'Файл SFV'; + LANGruCCHKSUMMD5sumFile = 'Файл MD5'; + LANGruCCHKSUMFileName = '_Имя файла:'; + LANGruCCHKSUMCreateSeparateChecksumFiles = 'Создать _отделные файлы контрольнух сумм'; + LANGruCCHKSUMNowProcessingFileS = 'В прецессе создания файла: %s'; + LANGruCCHKSUMFinishCaption = '_Завершить'; + LANGruCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Хотите прервать текущий процесс?'; + LANGruCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Ошибка открытия файла ''%s'': %s'#10; + LANGruCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Ошибка чтения файла ''%s'': %s'#10; + LANGruCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Ошибка записи в файл ''%s'': %s'#10; + + LANGruAnErrorOccuredWhileWritingFileSS = 'Ошибка записи в файл ''%s'':'#10' %s'; + LANGruTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Файл ''%s'' уже существует. Хотите его заменить?'; + LANGruTheTargetFileSCannotBeRemovedS = 'Невозможно удалить файл ''%s'' : %s'; + LANGruMergeCaption = 'Объединить'; + LANGruPleaseInsertNextDiskOrGiveDifferentLocation = 'Пожалуьста, вставте следующий диск, или укажите другой каталог: '; + LANGruMergeOfSSucceeded = 'Объединение файла ''%s'' произошло успешно (CRC checksum OK).'; + LANGruWarningCreatedFileFailsCRCCheck = 'Внимание: Созданный файл имеет неверную контрольную сумму!'; + LANGruMergeOfSSucceeded_NoCRCFileAvailable = 'Объединение ''%s'' произошло успешно (без проверки контрольной суммы).'; + LANGruMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Объединить все файлы начинающиеся с ''%s'' в каталог:'; + LANGruMergeSC = 'Объединение:'; + LANGrumiSplitFileCaption = '_Разделить файл...'; + LANGrumiMergeFilesCaption = '_Объедить файлы...'; + + LANGruSplitTheFileSToDirectory = '_Разбить файл ''%s'' в каталог:'; + LANGruSplitSC = 'Разбить:'; + LANGruSplitFile = 'Разбить файл'; + LANGruBytesPerFile = 'Разбить _на части размером:'; + LANGruAutomatic = 'Автоматически'; + LANGruDeleteFilesOnTargetDisk = '_Удалить все файлы на получателе (только для сменных дисков)'; + LANGruSplitCaption = 'Разбить'; + LANGruCannotOpenFileS = 'Невозможно открыть файл ''%s'''; + LANGruCannotSplitTheFileToMoreThan999Parts = 'Невозможно разбить файл на более чем 999 частей!'; + LANGruThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Каталог получатель %s содержит файлы '#10' Вы действительно хотите удалить его содержимое?'; + LANGruThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Каталог получатель содержит %d файлов. Вы действительно хотите удалить его содержимое?'; + LANGruAnErrorOccuredWhileOperationS = 'Ошибка во время выполнения: %s'; + LANGruSplitOfSSucceeded = 'Разделение файла ''%s'' произошло успешно.'; + LANGruSplitOfSFailed = 'Невосможно разделить файл: %s'; + + LANGrumnuShow_Caption = 'В_ид'; + LANGrumiShowDotFiles_Caption = 'Показать _Спрятаные файлы'; + LANGruTheFileYouAreTryingToOpenIsQuiteBig = 'Открываемый файл слишком большой. Программа загружающая этот файл может вызвать замедление системы.'#10'Вы действительно хотите продолжить'; + LANGruCannotExecuteSPleaseCheckTheConfiguration = 'Невозможно выполнить ''%s''. Проверьте конфигурацию или произведите ассоциацию типов файлов сначала.'; + LANGruEdit = 'Правка'; + LANGruEnterFilenameToEdit = '_Введите имя файла для правки:'; + + LANGrumnuSettings_Caption = '_Настройки'; + LANGrumiFileTypes_Caption = '_Типы файлов...'; + LANGruThereIsNoApplicationAssociatedWithS = 'Нет приложений, ассоциированных с файлом "%s".'#10#10'Вы хотите произвести ассоциацию сейчас?'; + LANGruErrorExecutingCommand = 'Ошибка выполнения команды!'; + LANGruEditFileTypesCaption = 'Типы файлов'; + LANGruTitleLabel_Caption = 'Конфигурация типов файлов'; + LANGruExtensionsColumn = 'Типы'; + LANGruDescriptionColumn = 'Описание'; + LANGruFileTypesList = 'Список типов файлов'; + LANGruActionName = 'Имя действия'; + LANGruCommand = 'Команда'; + LANGruSetDefaultActionButton_Caption = '_Использовать по умолчанию'; + LANGruRunInTerminalCheckBox_Caption = 'Запустить в _теминале'; + LANGruAutodetectCheckBox_Caption = 'Авто-определение _графических программ'; + LANGruBrowseButton_Caption = '_Поиск...'; + LANGruCommandLabel_Caption = 'Ко_манда:'; + LANGruDescriptionLabel_Caption = '_Описание:'; + LANGruFNameExtLabel_Caption = '_Добавить тип:'; + LANGruNotebookPageExtensions = 'Тип файла'; + LANGruNotebookPageActions = 'Действия'; + LANGruDefault = ' (по умолчанию)'; + LANGruCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Невозможно сохранить цонфигурацию типов файлов: другой процесс обновил ее на диске.'; + + LANGruDefaultColor = 'Цвет по _умолчанию'; + LANGruIcon = '_Значок:'; + LANGruBrowseForIcon = 'Выбрерите значок'; + LANGruSelectFileTypeColor = 'Выберите Цвет'; + LANGruColor = '_Цвет:'; + + LANGrumiChangePermissions_Caption = 'Изменить _Права...'; + LANGrumiChangeOwner_Caption = 'Изменить _Владельца/Группу...'; + LANGrumiCreateSymlink_Caption = 'Со_здать Ссылку...'; + LANGrumiEditSymlink_Caption = 'Пр_авить Ссылку'; + LANGruChmodProgress = 'Изменить права:'; + LANGruChownProgress = 'Изменить владельца:'; + LANGruYouMustSelectAValidSymbolicLink = 'Необходимо выбрать символьную ссылку!'; + LANGruPopupRunS = '_Выполнить %s'; + LANGruPopupOpenS = '_Открыть %s'; + LANGruPopupGoUp = 'Прейти на уровень в_ыше'; + LANGruPopupOpenWithS = 'Открыть с помощью %s'; + LANGruPopupDefault = ' (по умолчанию)'; + LANGruPopupOpenWith = 'Открыть с помо_щью...'; + LANGruPopupViewFile = '_Просмотр файла'; + LANGruPopupEditFile = 'Пр_авить файл'; + LANGruPopupMakeSymlink = 'создать _ссылку'; + LANGruPopupRename = 'Переи_меновать'; + LANGruPopupDelete = 'У_далить'; + LANGruDialogChangePermissions = 'Изменить права'; + LANGruCouldNotBeChmoddedS = 'Невозможно изменить права доступа: %s'; + LANGruDialogChangeOwner = 'Изменить владельца'; + LANGruCouldNotBeChownedS = 'Невозможно изменить владельца: %s'; + LANGruDialogMakeSymlink = 'Создать ссылку'; + LANGruDialogEditSymlink = 'Править ссылку'; + LANGruFEditSymlink_Caption = 'Править символьную ссылку'; + LANGruFEditSymlink_SymbolicLinkFilename = '_Имя символьной ссылки:'; + LANGruFEditSymlink_SymbolicLinkPointsTo = 'Ссылка указывает _на:'; + + LANGruFChmod_Caption = 'Права доступа'; + LANGruFChmod_PermissionFrame = 'Права'; + LANGruFChmod_FileFrame = 'Файл'; + LANGruFChmod_ApplyRecursivelyFor = 'Применить _Рекурсивно'; + LANGruFChmod_miAllFiles = 'Для всех файлов и каталогов'; + LANGruFChmod_miDirectories = 'Только для каталогов'; + LANGruFChmod_OctalLabel = '_Восьмеричный:'; + LANGruFChmod_SUID = 'SUID - Установить идентификатор пользователя'; + LANGruFChmod_SGID = 'SGID - Установить идентификатор группы'; + LANGruFChmod_Sticky = 'Приклееный'; + LANGruFChmod_RUSR = 'RUSR - Чтение для владельца'; + LANGruFChmod_WUSR = 'WUSR - Запись для владельца'; + LANGruFChmod_XUSR = 'XUSR - Выполнение/Поиск для владельца'; + LANGruFChmod_RGRP = 'RGRP - Чтение для группы'; + LANGruFChmod_WGRP = 'WGRP - Запись для группы'; + LANGruFChmod_XGRP = 'XGRP - Выполнение/Поиск для группы'; + LANGruFChmod_ROTH = 'ROTH - Чтение для остальных'; + LANGruFChmod_WOTH = 'WOTH - Запись для остальных'; + LANGruFChmod_XOTH = 'XOTH - Выполнение/Поиск для остальных'; + LANGruFChmod_TextLabel = 'Текст: %s'; + LANGruFChmod_FileLabel = 'Файл: %s'#10'Текст: %s'#10 + + 'Восьмеричный: %d'#10'Владелец: %s'#10 + + 'Группа: %s'; + + LANGruFChown_Caption = 'Изменить владельца/группу'; + LANGruFChown_OwnerFrame = 'Имя владельца'; + LANGruFChown_GroupFrame = 'Имя группы'; + LANGruFChown_FileFrame = 'Файл'; + LANGruFChown_ApplyRecursively = 'Применить _Рекусивно'; + + LANGruFSymlink_Caption = 'Создать символьную ссылку'; + LANGruFSymlink_ExistingFilename = 'Существующий _файл:'; + LANGruFSymlink_SymlinkFilename = 'Имя символьной _ссылки:'; + + LANGrumnuBookmarks_Caption = '_Закладки'; + LANGrumiAddBookmark_Caption = 'Добавить закладку'; + LANGrumiEditBookmarks_Caption = 'Изменить закладку'; + LANGruBookmarkPopupDelete_Caption = 'У_далить'; + LANGrumiPreferences_Caption = 'Изменить _настройки...'; + LANGruTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Текущий каталог уже добавлен к закладкам'; + LANGruSomeOtherInstanceChanged1 = 'Другая программа изменила файл конфигурации на диске. Вы хотите применить нове установки?'#10#10'Внимание: Если Вы сейчас нажмете '; + LANGruSomeOtherInstanceChanged2 = '"Нет", конфигурация будет перезаписана во время завершения программы!'; + + LANGruPreferences_Caption = 'Настройки'; + LANGruPreferences_TitleLabel_Caption = 'Настройки программы'; + LANGruPreferences_GeneralPage = 'Общие'; + LANGruPreferences_FontsPage = 'Шрифты'; + LANGruPreferences_ColorsPage = 'Цвета'; + LANGruPreferences_RowHeight = ' _Высота строк:'; + LANGruPreferences_NumHistoryItems = '_Элементы командной строки:'; + LANGruPreferences_Default = 'По умолчанию'; + LANGruPreferences_ClearReadonlyAttribute = 'Во время копирования с CD-ROM сбрасывать _атрибут "только для чтения"'; + LANGruPreferences_DisableMouseRenaming = 'Запретить переименование _мышью'; + LANGruPreferences_ShowFiletypeIconsInList = 'Показывать _значки'; + LANGruPreferences_ExternalAppsLabel = 'Внешние программы'; + LANGruPreferences_Viewer = '_Просмотр:'; + LANGruPreferences_Editor = '_Редактор:'; + LANGruPreferences_Terminal = '_Терминал:'; + LANGruPreferences_ListFont = 'Шрифт списков:'; + LANGruPreferences_Change = 'Изменить...'; + LANGruPreferences_UseDefaultFont = 'Использовать шрифт по _умолчанию'; + LANGruPreferences_Foreground = 'Передний план'; + LANGruPreferences_Background = 'Фон'; + LANGruPreferences_NormalItem = 'Обычный элемент:'; + LANGruPreferences_SetToDefaultToUseGTKThemeColors = 'Использовать цвета темы GTK'; + LANGruPreferences_Cursor = 'Курсор:'; + LANGruPreferences_InactiveItem = 'Неактивный элемент:'; + LANGruPreferences_SelectedItem = 'Выбранный элемент:'; + LANGruPreferences_LinkItem = 'Сымвольные ссылки:'; + LANGruPreferences_LinkItemHint = 'Использовать цвета нормальных элементов для ссылок'; + LANGruPreferences_DotFileItem = 'Спрятанные файлы:'; + LANGruPreferences_DotFileItemHint = 'Использовать цвета нормальных элементов для спрятанных файлов'; + LANGruPreferences_BrowseForApplication = 'Поиск программы'; + LANGruPreferences_DefaultS = 'По умолчанию: %s'; + LANGruPreferences_SelectFont = 'Выберите шрифт'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGruBookmarkButton_Tooltip = 'Show bookmarks'; + LANGruUpButton_Tooltip = 'Go to the upper directory'; + LANGruRootButton_Tooltip = 'Go to the root directory (/)'; + LANGruHomeButton_Tooltip = 'Go to the home directory (/home/user)'; + LANGruLeftEqualButton_Tooltip = 'Switch the right panel to the same directory'; + LANGruRightEqualButton_Tooltip = 'Switch the left panel to the same directory'; + LANGrumiShowDirectorySizes_Caption = 'Show d_irectory sizes'; + LANGrumiTargetSource_Caption = 'Target = Source'; + LANGruFileTypeDirectory = 'Directory'; + LANGruFileTypeFile = 'File'; + LANGruFileTypeMetafile = 'This is a common meta-item'; + LANGruPreferencesPanelsPage = 'Panels'; + LANGruPreferencesApplicationsPage = 'Applications'; + LANGruPreferencesExperimentalPage = 'Experimental'; + LANGruPreferencesSelectAllDirectoriesCheckBox_Caption = 'Select _also directories when selecting all'; + LANGruPreferencesNewStyleAltOCheckBox_Caption = '_New style Alt+O'; + LANGruPreferencesNewStyleAltOCheckBox_Tooltip = 'Stay in the same directory when switching directory opposite panel by pressing Ctrl/Alt+O'; + LANGruPreferencesShowFuncButtonsCheckBox_Caption = 'Show function _key buttons'; + LANGruPreferencesSizeFormatLabel_Caption = '_Size format:'; + LANGruPreferencesmiSizeFormat1 = 'System'; + LANGruPreferencesmiSizeFormat6 = 'Grouped'; + LANGruPreferencesAutodetectXApp = 'Autodetect X app'; + LANGruPreferencesAlwaysRunInTerminal = 'Always run in terminal'; + LANGruPreferencesNeverRunInTerminal = 'Never run in terminal'; + LANGruPreferencesCmdLineBehaviourLabel_Caption = '_Executing from commandline:'; + LANGruPreferencesFeatures = 'Features'; + LANGruPreferencesDisableMouseRename_Tooltip = 'You can still perform quick-rename by pressing Shift+F6'; + LANGruPreferencesDisableFileTipsCheckBox_Caption = 'Disable file _tooltips'; + LANGruPreferencesDisableFileTipsCheckBox_Tooltip = 'Don''t show panel tooltips if the text in a comlumn is truncated'; + LANGruPreferencesShow = 'Show'; + LANGruPreferencesDirsInBoldCheckBox_Caption = 'Directories in _bold'; + LANGruPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Disable directory b_rackets'; + LANGruPreferencesOctalPermissionsCheckBox_Caption = 'Show _octal permissions'; + LANGruPreferencesOctalPermissionsCheckBox_Tooltip = 'Show file/directory permissions as a number instead of text form (-rw-rw-rw-)'; + LANGruPreferencesMovement = 'Movement'; + LANGruPreferencesLynxLikeMotionCheckBox_Caption = '_Lynx-like motion'; + LANGruPreferencesInsertMovesDownCheckBox_Caption = '_Insert moves down'; + LANGruPreferencesSpaceMovesDownCheckBox_Caption = '_Space moves down'; + LANGruPreferencesViewer = 'Viewer'; + LANGruPreferencesCommandSC = 'Command:'; + LANGruPreferencesUseInternalViewer = 'Use _internal viewer'; + LANGruPreferencesEditor = 'Editor'; + LANGruPreferencesTerminal = 'Terminal'; + LANGruPreferencesExperimentalFeatures = 'Experimental features'; + LANGruPreferencesExperimentalWarningLabel_Caption = 'Warning: These features are currently under development and may not work properly. Use them at your own risk!'; + LANGruPreferencesFocusRefreshCheckBox_Caption = 'Perform _refresh on window focus'; + LANGruPreferencesFocusRefreshCheckBox_Tooltip = 'Very slow panel refreshing at this moment'; + LANGruPreferencesWMCompatModeCheckBox_Caption = '_WM Compatibility mode'; + LANGruPreferencesWMCompatModeCheckBox_Tooltip = 'Use if you have some window manager issues (for example IceWM doesn''t perform window maximize correctly)'; + LANGruPreferencesCompatUseLibcSystemCheckBox_Caption = 'Use libc _system() for executing programs'; + LANGruPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Use in case of freeze or crash problems when launching external applications'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGrumiSearchCaption2 = '_Search...'; + LANGrumiNoMounterBarCaption = 'Do_n''t show mounter bar'; + LANGrumiShowOneMounterBarCaption = 'Show _one mounter bar'; + LANGrumiShowTwoMounterBarCaption = 'Show _two mounter bars'; + LANGrumnuNetworkCaption = 'N_etwork'; + LANGrumiConnectionsCaption = '_Connections...'; + LANGrumiOpenConnectionCaption = '_Open connection...'; + LANGrumiQuickConnectCaption = '_Quick connect...'; + LANGrumnuPluginsCaption = 'Pl_ugins'; + LANGrumiTestPluginCaption = '_Test plugin...'; + LANGrumiMounterSettingsCaption = '_Mounter Settings...'; + LANGrumiColumnsCaption = 'P_anel Columns...'; + LANGrumiSavePositionCaption = '_Save position'; + LANGrumiMountCaption = '_Mount'; + LANGrumiUmountCaption = '_Umount'; + LANGrumiEjectCaption = '_Eject'; + LANGrumiDuplicateTabCaption = 'Duplicate current tab'; + LANGrumiCloseTabCaption = 'Close current tab'; + LANGrumiCloseAllTabsCaption = 'Close all tabs'; + LANGruCannotDetermineDestinationEngine = 'Cannot determine destination engine. Please enter correct path and try it again.'; + LANGruCannotLoadFile = 'Cannot load file ''%s''. Please check the permissions.'; + LANGruMountPointDevice = 'Mount Point: %s'#10'Device: %s'; + LANGruMountSC = 'Mount:'; + LANGruNoPluginsFound = 'No plugins found'; + LANGruPluginAbout = 'About...'; + LANGruCouldntOpenURI = 'Couldn''t open the URI specified. Please check the consistency of the resource identifier and the access permission.'; + LANGruPluginAboutInside = 'Plugin: %s'#10#10'%s'#10'%s'; + LANGruAreYouSureCloseAllTabs = 'Are you sure you want to close all inactive tabs?'; + LANGruCouldntOpenURIArchive = 'Couldn''t open the archive. Please check consistency and access permissions.'; + LANGruThereIsNoModuleAvailable = 'There are no VFS modules available that can handle this connection'; + LANGruIgnoreError = 'Do you really want to ignore the error? The source file will be then deleted'; + LANGruErrorMount = 'There was an error while mounting the device ''%s'':'#10#10; + LANGruErrorUmount = 'There was an error while umounting the device ''%s'':'#10#10; + LANGruErrorEject = 'There was an error while ejecting the device ''%s'':'#10#10; + + LANGruMounterPrefs_Caption = 'Mounter Settings'; + LANGruMounterPrefs_TitleLabelCaption = 'Mounter Settings'; + LANGruMounterPrefs_ListViewFrameCaption = 'Mounter'; + LANGruMounterPrefs_MountName = 'Mount Name'; + LANGruMounterPrefs_MountPoint = 'Mount Point'; + LANGruMounterPrefs_Device = 'Device'; + LANGruMounterPrefs_MoveUpButtonTooltip = 'Move item up'; + LANGruMounterPrefs_MoveDownButtonTooltip = 'Move item down'; + LANGruMounterPrefs_UseFSTabDefaultsCheckBox = 'Use _fstab default items'; + LANGruMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'By checking this, the mounter bar will be filled by default items found in the /etc/fstab (system mountlist file)'; + LANGruMounterPrefs_ToggleModeCheckBox = 'Buttons stay _down when mounted'; + LANGruMounterPrefs_ToggleModeCheckBoxTooltip = 'When checked, the mounter buttons will stay down if the device is mounted; another click will cause umounting them (eject in this case)'; + LANGruMounterPrefs_PropertiesFrameCaption = 'Mounter item properties'; + LANGruMounterPrefs_DisplayTextLabelCaption = 'Displayed _Text:'; + LANGruMounterPrefs_MountPointLabelCaption = 'Mount _Point:'; + LANGruMounterPrefs_MountDeviceLabelCaption = '_Device:'; + LANGruMounterPrefs_DeviceTypeLabelCaption = 'Device T_ype:'; + LANGruMounterPrefs_miLocalDiskCaption = 'Local disk'; + LANGruMounterPrefs_miRemovableCaption = 'Removable'; + LANGruMounterPrefs_miCDCaption = 'CD/DVD drive'; + LANGruMounterPrefs_miFloppyCaption = 'Floppy drive'; + LANGruMounterPrefs_miNetworkCaption = 'Network'; + LANGruMounterPrefs_MountCommandLabelCaption = 'Mount _Command:'; + LANGruMounterPrefs_UmountCommandLabelCaption = 'Umount C_ommand:'; + LANGruMounterPrefs_MountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default mount'#10'Note: beware of interactive commands, tuxcmd could freeze!'#10'Example: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGruMounterPrefs_UmountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default umount'#10'Example: smbumount $dir'; + LANGruMounterPrefs_IconLabelCaption = '_Icon:'; + + LANGruConnMgr_Caption = 'Open New Connection'; + LANGruConnMgr_ConnectButton = 'Co_nnect'; + LANGruConnMgr_OpenConnection = 'Open Connection'; + LANGruConnMgr_NameColumn = 'Name'; + LANGruConnMgr_URIColumn = 'URI'; + LANGruConnMgr_AddConnectionButtonCaption = '_Add site...'; + LANGruConnMgr_AddConnectionButtonTooltip = 'Add new connection'; + LANGruConnMgr_EditButtonCaption = '_Edit...'; + LANGruConnMgr_EditButtonTooltip = 'Edit selected connection'; + LANGruConnMgr_RemoveButtonCaption = '_Remove site'; + LANGruConnMgr_RemoveButtonTooltip = 'Delete selected connection'; + LANGruConnMgr_DoYouWantDelete = 'Do you really want to delete the connection ''%s''?'; + + LANGruConnProp_FTP = 'FTP'; + LANGruConnProp_SFTP = 'SFTP (ssh subsystem)'; + LANGruConnProp_SMB = 'Windows share (SMB)'; + LANGruConnProp_HTTP = 'WebDAV (HTTP)'; + LANGruConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGruConnProp_Other = 'Other (please specify in URI)'; + LANGruConnProp_Caption = 'Connection properties'; + LANGruConnProp_VFSModule = '_VFS module:'; + LANGruConnProp_URI = '_URI:'; + LANGruConnProp_URIEntryTooltip = 'Correct URI should contain service type prefix and server address'; + LANGruConnProp_DetailedInformations = 'Detailed informations'; + LANGruConnProp_Name = '_Name:'; + LANGruConnProp_Server = 'Ser_ver[:port]:'; + LANGruConnProp_Username = 'Userna_me:'; + LANGruConnProp_UserNameEntryTooltip = 'Leave blank for anonymous login'; + LANGruConnProp_Password = '_Password:'; + LANGruConnProp_TargetDirectory = 'Target _directory:'; + LANGruConnProp_ServiceType = '_Service type:'; + LANGruConnProp_MaskPassword = '_Mask password'; + LANGruConnProp_MenuItemCaption = 'Default (all suitable modules)'; + + LANGruConnLogin_Caption = 'Authentication required'; + LANGruConnLogin_Login = 'Login'; + LANGruConnLogin_ExperimentalWarningLabelCaption = 'You must log in to access %s'; + LANGruConnLogin_Username = '_Username:'; + LANGruConnLogin_Password = '_Password:'; + LANGruConnLogin_AnonymousCheckButton = '_Anonymous'; + + LANGruColumns_Caption = 'Panel Columns Settings'; + LANGruColumns_Title = 'Panel Columns Settings'; + LANGruColumns_MoveUpButtonTooltip = 'Move item up'; + LANGruColumns_MoveDownButtonTooltip = 'Move item down'; + LANGruColumns_TitlesLongName = 'Name'; + LANGruColumns_TitlesLongNameExt = 'Name + Extension'; + LANGruColumns_TitlesLongExt = 'Extension'; + LANGruColumns_TitlesLongSize = 'Size'; + LANGruColumns_TitlesLongDateTime = 'Date + Time'; + LANGruColumns_TitlesLongDate = 'Date'; + LANGruColumns_TitlesLongTime = 'Time'; + LANGruColumns_TitlesLongUser = 'User'; + LANGruColumns_TitlesLongGroup = 'Group'; + LANGruColumns_TitlesLongAttr = 'Attributes'; + LANGruColumns_TitlesShortName = 'Name'; + LANGruColumns_TitlesShortNameExt = 'Name'; + LANGruColumns_TitlesShortExt = 'Ext'; + LANGruColumns_TitlesShortSize = 'Size'; + LANGruColumns_TitlesShortDateTime = 'Date'; + LANGruColumns_TitlesShortDate = 'Date'; + LANGruColumns_TitlesShortTime = 'Time'; + LANGruColumns_TitlesShortUser = 'User'; + LANGruColumns_TitlesShortGroup = 'Group'; + LANGruColumns_TitlesShortAttr = 'Attr'; + + LANGruTestPlugin_Caption = 'Test VFS Plugin'; + LANGruTestPlugin_Title = 'Test VFS Plugin'; + LANGruTestPlugin_ExperimentalWarningLabelCaption = 'Warning: The VFS subsystem and its plugins are under heavy development and may contain bugs. Use this function under your own risk!'; + LANGruTestPlugin_Plugin = '_Plugin:'; + LANGruTestPlugin_Command = 'Co_mmand:'; + LANGruTestPlugin_Username = '_Username:'; + LANGruTestPlugin_Password = '_Password:'; + LANGruTestPlugin_AnonymousCheckButton = '_Anonymous login (doesn''t call VFSLogin)'; + LANGruTestPlugin_NoPluginsFound = 'No plugins found'; + + LANGruRemoteWait_Caption = 'Operation in progress'; + LANGruRemoteWait_OperationInProgress = 'Operation in progress, please be patient...'; + LANGruRemoteWait_ItemsFound = 'Items found so far: %d'; + + LANGruSearch_Bytes = 'Bytes'; + LANGruSearch_kB = 'kB'; + LANGruSearch_MB = 'MB'; + LANGruSearch_days = 'days'; + LANGruSearch_weeks = 'weeks'; + LANGruSearch_months = 'months'; + LANGruSearch_years = 'years'; + LANGruSearch_Caption = 'Find Files'; + LANGruSearch_General = 'General'; + LANGruSearch_Advanced = 'Advanced'; + LANGruSearch_SearchResults = 'Search _Results:'; + LANGruSearch_SearchFor = 'Search _for:'; + LANGruSearch_FileMaskEntryTooltip = 'Tip: Use colons (";") to specify multiple files to find'; + LANGruSearch_SearchIn = 'Search _in:'; + LANGruSearch_SearchArchivesCheckButton = 'Search _archives'; + LANGruSearch_FindText = 'Find _text:'; + LANGruSearch_FindTextEntryTooltip = 'Leave blank for no text matching'#10'Please note that we are using UTF-8 in GUI part'; + LANGruSearch_CaseSensitiveCheckButton = 'Cas_e sensitive'; + LANGruSearch_StayCurrentFSCheckButton = 'Include other files_ystems'; + LANGruSearch_CaseSensitiveMatchCheckButton = 'Ca_se sensitive'; + LANGruSearch_Size = 'Size'; + LANGruSearch_Date = 'Date'; + LANGruSearch_BiggerThan = '_Bigger than'; + LANGruSearch_SmallerThan = '_Smaller than'; + LANGruSearch_ModifiedBetweenRadioButton = '_Modified between'; + LANGruSearch_NotModifiedAfterRadioButton = '_Not modified after'; + LANGruSearch_ModifiedLastRadioButton = 'Mod_ified in the last'; + LANGruSearch_ModifiedNotLastRadionButton = 'No_t modified in the last'; + LANGruSearch_ModifiedBetweenEntry1 = '"Please use this date format:" c'; + LANGruSearch_ViewButtonCaption = '_View file'; + LANGruSearch_NewSearchButtonCaption = '_New search'; + LANGruSearch_GoToFileButtonCaption = '_Go to file'; + LANGruSearch_FeedToListboxButtonCaption = 'Feed to _listbox'; + LANGruSearch_StatusSC = 'Status:'; + LANGruSearch_Ready = 'Ready.'; + LANGruSearch_PreparingToSearch = 'Preparing to search.'; + LANGruSearch_SearchInProgress = 'Search in progress:'; + LANGruSearch_UserCancelled = 'User cancelled.'; + LANGruSearch_SearchFinished = 'Search finished'; + LANGruSearch_FilesFound = '%d files found'; + LANGruSearch_And = 'and'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGruCloseOpenConnection = 'You''re trying to open new connection over the another active connection. By continuing, the previous connection will be closed and replaced by the new requested one.'#10#10'Do you want to continue?'; + LANGruDuplicateTabWarning = 'You are trying to open a new tab from a remote directory. However, engine cloning is not supported. The directory in the new tab will point to a local filesystem.'; + LANGruDontShowAgain = '_Don''t show this message again'; + LANGruSwitchOtherPanelWarning = 'You are trying to open the remote directory in the opposite panel. However, engine cloning is not supported. The target directory will not be switched.'; + LANGruOpenConnectionsWarning = 'There are some active connections opened in the panel. By closing the application, these connections will be disconnected.'#10#10'Do you want to continue quit?'; + LANGrumiDisconnect_Caption = '_Disconnect'; + LANGruDisconnectButton_Tooltip = 'Disconnect active connection'; + LANGruLeaveArchiveButton_Tooltip = 'Close current archive'; + LANGruOpenTerminalButton_Tooltip = 'Opens a new terminal windows from the current directory'; + LANGruOpenTerminalButton_Caption = 'Open Te_rminal'; + LANGruShowTextUIDsCheckBox_Caption = 'Show text _UIDs'; + LANGruShowTextUIDsCheckBox_Tooltip = 'Show textual User and Group informations instead of numbers (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGrumiNewTab_Caption = 'New folder _tab'; + LANGruFilePopupMenu_Properties = '_Properties'; + LANGruCommandEntry_Tooltip = 'Use %s as file/directory placeholder'; + LANGrumiFiles_Caption = 'Files only'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGruPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGruHandleRunFromArchive_Bytes = 'bytes'; + LANGruHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGruHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGruHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGruHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGruFRunFromVFS_Caption = 'Packed file properties'; + LANGruFRunFromVFS_TitleLabel = 'File Properties'; + LANGruFRunFromVFS_FileNameLabel = 'File name:'; + LANGruFRunFromVFS_FileTypeLabel = 'File type:'; + LANGruFRunFromVFS_SizeLabel = 'Size:'; + LANGruFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGruFRunFromVFS_DateLabel = 'Modify date:'; + LANGruFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGruFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGruFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGruFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGruFSetPassword_Caption = 'Set password'; + LANGruFSetPassword_Label1_Caption = 'Password required'; + LANGruFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGruFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGruF2Button_Caption; + LANGF3Button_Caption := LANGruF3Button_Caption; + LANGF4Button_Caption := LANGruF4Button_Caption; + LANGF5Button_Caption := LANGruF5Button_Caption; + LANGF6Button_Caption := LANGruF6Button_Caption; + LANGF7Button_Caption := LANGruF7Button_Caption; + LANGF8Button_Caption := LANGruF8Button_Caption; + + LANGmnuFile_Caption := LANGrumnuFile_Caption; + LANGmnuMark_Caption := LANGrumnuMark_Caption; + LANGmnuCommands_Caption := LANGrumnuCommands_Caption; + LANGmnuHelp_Caption := LANGrumnuHelp_Caption; + LANGmiExit_Caption := LANGrumiExit_Caption; + LANGmiSelectGroup_Caption := LANGrumiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGrumiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGrumiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGrumiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGrumiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGrumiRefresh_Caption; + LANGmiAbout_Caption := LANGrumiAbout_Caption; + + LANGColumn1_Caption := LANGruColumn1_Caption; + LANGColumn2_Caption := LANGruColumn2_Caption; + LANGColumn3_Caption := LANGruColumn3_Caption; + LANGColumn4_Caption := LANGruColumn4_Caption; + LANGColumn5_Caption := LANGruColumn5_Caption; + + LANGExpandSelection := LANGruExpandSelection; + LANGShrinkSelection := LANGruShrinkSelection; + LANGNoMatchesFound := LANGruNoMatchesFound; + LANGNoFilesSelected := LANGruNoFilesSelected; + LANGSelectedFilesDirectories := LANGruSelectedFilesDirectories; + LANGDirectoryS := LANGruDirectoryS; + LANGFileS := LANGruFileS; + LANGDoYouReallyWantToDeleteTheS := LANGruDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGruDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGruCopyFiles; + LANGMoveRenameFiles := LANGruMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGruCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGruMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGruCopySC; + LANGMoveRenameSC := LANGruMoveRenameSC; + + LANGQuickFind := LANGruQuickFind; + + LANGAboutString := LANGruAboutString; + LANGAboutStringGnome := LANGruAboutStringGnome; + LANGDiskStatFmt := LANGruDiskStatFmt; + LANGDiskStatVolNameFmt := LANGruDiskStatVolNameFmt; + LANGStatusLineFmt := LANGruStatusLineFmt; + LANGPanelStrings[False] := LANGruPanelStrings[False]; + LANGPanelStrings[True] := LANGruPanelStrings[True]; + LANGDIR := LANGruDIR; + LANGErrorGettingListingForSPanel := LANGruErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGruErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGruErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGruErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGruTheFileDirectory; + LANGCouldNotBeDeleted := LANGruCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGruCouldNotBeDeletedS; + LANGUserCancelled := LANGruUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGruTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGruCannotCopyFile; + LANGCopyError := LANGruCopyError; + LANGMoveError := LANGruMoveError; + LANGOverwriteS := LANGruOverwriteS; + LANGWithFileS := LANGruWithFileS; + LANGOvewriteSBytesS := LANGruOvewriteSBytesS; + LANGTheFile := LANGruTheFile; + LANGCopy := LANGruCopy; + LANGMove := LANGruMove; + LANGTheDirectory := LANGruTheDirectory; + LANGTheSymbolicLink := LANGruTheSymbolicLink; + LANGCannotMoveFile := LANGruCannotMoveFile; + LANGCouldNotBeCreated := LANGruCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGruCouldNotBeCreatedS; + LANGFromS := LANGruFromS; + LANGToS := LANGruToS; + LANGCannotCopyFileToItself := LANGruCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGruMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGruCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGruCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGruCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGruCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGruCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGruCannotWriteToDestinationFile; + + LANGUnknownException := LANGruUnknownException; + LANGNoAccess := LANGruNoAccess; + LANGUnknownError := LANGruUnknownError; + + LANGCreateANewDirectory := LANGruCreateANewDirectory; + LANGEnterDirectoryName := LANGruEnterDirectoryName; + + LANGOverwriteQuestion := LANGruOverwriteQuestion; + LANGOverwriteButton_Caption := LANGruOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGruOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGruSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGruOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGruSkipAllButton_Caption; + LANGRenameButton_Caption := LANGruRenameButton_Caption; + LANGAppendButton_Caption := LANGruAppendButton_Caption; + LANGRename := LANGruRename; + LANGRenameFile := LANGruRenameFile; + LANGIgnoreButton_Caption := LANGruIgnoreButton_Caption; + + LANGProgress := LANGruProgress; + LANGCancel := LANGruCancel; + LANGDelete := LANGruDelete; + + LANGSpecifyFileType := LANGruSpecifyFileType; + + LANGRemoveDirectory := LANGruRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGruDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGruRetry; + LANGDeleteButton_Caption := LANGruDeleteButton_Caption; + LANGAll := LANGruAll; + + LANGCopyFilesSC := LANGruCopyFilesSC; + LANGAppendQuestion := LANGruAppendQuestion; + LANGPreparingList := LANGruPreparingList; + + LANGYouMustSelectAValidFile := LANGruYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGrumiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGruVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGruCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGruCheckButtonCaptionStop; + LANGFileListTooltip := LANGruFileListTooltip; + LANGFilenameColumnCaption := LANGruFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGruTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGruAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGruAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGruAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGruChecksumNotChecked; + LANGChecksumChecking := LANGruChecksumChecking; + LANGChecksumInterrupted := LANGruChecksumInterrupted; + LANGChecksumDOK := LANGruChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGrumiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGruYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGruCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGruCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGruCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGruCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGruCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGruCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGruCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGruCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGruCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGruCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGruCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGruCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGruCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGruCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGruCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGruCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGruCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGruCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGruCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGruCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGruCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGruCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGruAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGruTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGruTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGruMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGruPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGruMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGruWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGruMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGruMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGruMergeSC; + LANGmiSplitFileCaption := LANGrumiSplitFileCaption; + LANGmiMergeFilesCaption := LANGrumiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGruSplitTheFileSToDirectory; + LANGSplitSC := LANGruSplitSC; + LANGSplitFile := LANGruSplitFile; + LANGBytesPerFile := LANGruBytesPerFile; + LANGAutomatic := LANGruAutomatic; + LANGDeleteFilesOnTargetDisk := LANGruDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGruSplitCaption; + LANGCannotOpenFileS := LANGruCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGruCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGruThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGruThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGruAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGruSplitOfSSucceeded; + LANGSplitOfSFailed := LANGruSplitOfSFailed; + + LANGmnuShow_Caption := LANGrumnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGrumiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGruTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGruCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGruEdit; + LANGEnterFilenameToEdit := LANGruEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGrumnuSettings_Caption; + LANGmiFileTypes_Caption := LANGrumiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGruThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGruErrorExecutingCommand; + LANGEditFileTypesCaption := LANGruEditFileTypesCaption; + LANGTitleLabel_Caption := LANGruTitleLabel_Caption; + LANGExtensionsColumn := LANGruExtensionsColumn; + LANGDescriptionColumn := LANGruDescriptionColumn; + LANGFileTypesList := LANGruFileTypesList; + LANGActionName := LANGruActionName; + LANGCommand := LANGruCommand; + LANGSetDefaultActionButton_Caption := LANGruSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGruRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGruAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGruBrowseButton_Caption; + LANGCommandLabel_Caption := LANGruCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGruDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGruFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGruNotebookPageExtensions; + LANGNotebookPageActions := LANGruNotebookPageActions; + LANGDefault := LANGruDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGruCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGruDefaultColor; + LANGIcon := LANGruIcon; + LANGBrowseForIcon := LANGruBrowseForIcon; + LANGSelectFileTypeColor := LANGruSelectFileTypeColor; + LANGColor := LANGruColor; + + LANGmiChangePermissions_Caption := LANGrumiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGrumiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGrumiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGrumiEditSymlink_Caption; + LANGChmodProgress := LANGruChmodProgress; + LANGChownProgress := LANGruChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGruYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGruPopupRunS; + LANGPopupOpenS := LANGruPopupOpenS; + LANGPopupGoUp := LANGruPopupGoUp; + LANGPopupOpenWithS := LANGruPopupOpenWithS; + LANGPopupDefault := LANGruPopupDefault; + LANGPopupOpenWith := LANGruPopupOpenWith; + LANGPopupViewFile := LANGruPopupViewFile; + LANGPopupEditFile := LANGruPopupEditFile; + LANGPopupMakeSymlink := LANGruPopupMakeSymlink; + LANGPopupRename := LANGruPopupRename; + LANGPopupDelete := LANGruPopupDelete; + LANGDialogChangePermissions := LANGruDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGruCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGruDialogChangeOwner; + LANGCouldNotBeChownedS := LANGruCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGruDialogMakeSymlink; + LANGDialogEditSymlink := LANGruDialogEditSymlink; + LANGFEditSymlink_Caption := LANGruFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGruFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGruFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGruFChmod_Caption; + LANGFChmod_PermissionFrame := LANGruFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGruFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGruFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGruFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGruFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGruFChmod_OctalLabel; + LANGFChmod_SUID := LANGruFChmod_SUID; + LANGFChmod_SGID := LANGruFChmod_SGID; + LANGFChmod_Sticky := LANGruFChmod_Sticky; + LANGFChmod_RUSR := LANGruFChmod_RUSR; + LANGFChmod_WUSR := LANGruFChmod_WUSR; + LANGFChmod_XUSR := LANGruFChmod_XUSR; + LANGFChmod_RGRP := LANGruFChmod_RGRP; + LANGFChmod_WGRP := LANGruFChmod_WGRP; + LANGFChmod_XGRP := LANGruFChmod_XGRP; + LANGFChmod_ROTH := LANGruFChmod_ROTH; + LANGFChmod_WOTH := LANGruFChmod_WOTH; + LANGFChmod_XOTH := LANGruFChmod_XOTH; + LANGFChmod_TextLabel := LANGruFChmod_TextLabel; + LANGFChmod_FileLabel := LANGruFChmod_FileLabel; + LANGFChown_Caption := LANGruFChown_Caption; + LANGFChown_OwnerFrame := LANGruFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGruFChown_GroupFrame; + LANGFChown_FileFrame := LANGruFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGruFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGruFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGruFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGruFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGrumnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGrumiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGrumiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGruBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGrumiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGruTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGruSomeOtherInstanceChanged1 + LANGruSomeOtherInstanceChanged2; + + LANGPreferences_Caption := LANGruPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGruPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGruPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGruPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGruPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGruPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGruPreferences_NumHistoryItems; + LANGPreferences_Default := LANGruPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGruPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGruPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGruPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGruPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGruPreferences_Viewer; + LANGPreferences_Editor := LANGruPreferences_Editor; + LANGPreferences_Terminal := LANGruPreferences_Terminal; + LANGPreferences_ListFont := LANGruPreferences_ListFont; + LANGPreferences_Change := LANGruPreferences_Change; + LANGPreferences_UseDefaultFont := LANGruPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGruPreferences_Foreground; + LANGPreferences_Background := LANGruPreferences_Background; + LANGPreferences_NormalItem := LANGruPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGruPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGruPreferences_Cursor; + LANGPreferences_InactiveItem := LANGruPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGruPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGruPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGruPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGruPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGruPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGruPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGruPreferences_DefaultS; + LANGPreferences_SelectFont := LANGruPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGruBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGruUpButton_Tooltip; + LANGRootButton_Tooltip := LANGruRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGruHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGruLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGruRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGrumiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGrumiTargetSource_Caption; + LANGFileTypeDirectory := LANGruFileTypeDirectory; + LANGFileTypeFile := LANGruFileTypeFile; + LANGFileTypeMetafile := LANGruFileTypeMetafile; + LANGPreferencesPanelsPage := LANGruPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGruPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGruPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGruPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGruPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGruPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGruPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGruPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGruPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGruPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGruPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGruPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGruPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGruPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGruPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGruPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGruPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGruPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGruPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGruPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGruPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGruPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGruPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGruPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGruPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGruPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGruPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGruPreferencesViewer; + LANGPreferencesCommandSC := LANGruPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGruPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGruPreferencesEditor; + LANGPreferencesTerminal := LANGruPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGruPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGruPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGruPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGruPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGruPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGruPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGruPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGruPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGrumiSearchCaption2; + LANGmiNoMounterBarCaption := LANGrumiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGrumiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGrumiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGrumnuNetworkCaption; + LANGmiConnectionsCaption := LANGrumiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGrumiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGrumiQuickConnectCaption; + LANGmnuPluginsCaption := LANGrumnuPluginsCaption; + LANGmiTestPluginCaption := LANGrumiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGrumiMounterSettingsCaption; + LANGmiColumnsCaption := LANGrumiColumnsCaption; + LANGmiSavePositionCaption := LANGrumiSavePositionCaption; + LANGmiMountCaption := LANGrumiMountCaption; + LANGmiUmountCaption := LANGrumiUmountCaption; + LANGmiEjectCaption := LANGrumiEjectCaption; + LANGmiDuplicateTabCaption := LANGrumiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGrumiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGrumiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGruCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGruCannotLoadFile; + LANGMountPointDevice := LANGruMountPointDevice; + LANGMountSC := LANGruMountSC; + LANGNoPluginsFound := LANGruNoPluginsFound; + LANGPluginAbout := LANGruPluginAbout; + LANGCouldntOpenURI := LANGruCouldntOpenURI; + LANGPluginAboutInside := LANGruPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGruAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGruCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGruThereIsNoModuleAvailable; + LANGIgnoreError := LANGruIgnoreError; + LANGErrorMount := LANGruErrorMount; + LANGErrorUmount := LANGruErrorUmount; + LANGErrorEject := LANGruErrorEject; + + LANGMounterPrefs_Caption := LANGruMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGruMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGruMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGruMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGruMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGruMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGruMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGruMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGruMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGruMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGruMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGruMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGruMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGruMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGruMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGruMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGruMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGruMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGruMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGruMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGruMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGruMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGruMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGruMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGruMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGruMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGruMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGruConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGruConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGruConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGruConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGruConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGruConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGruConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGruConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGruConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGruConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGruConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGruConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGruConnProp_FTP; + LANGConnProp_SFTP := LANGruConnProp_SFTP; + LANGConnProp_SMB := LANGruConnProp_SMB; + LANGConnProp_HTTP := LANGruConnProp_HTTP; + LANGConnProp_HTTPS := LANGruConnProp_HTTPS; + LANGConnProp_Other := LANGruConnProp_Other; + LANGConnProp_Caption := LANGruConnProp_Caption; + LANGConnProp_VFSModule := LANGruConnProp_VFSModule; + LANGConnProp_URI := LANGruConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGruConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGruConnProp_DetailedInformations; + LANGConnProp_Name := LANGruConnProp_Name; + LANGConnProp_Server := LANGruConnProp_Server; + LANGConnProp_Username := LANGruConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGruConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGruConnProp_Password; + LANGConnProp_TargetDirectory := LANGruConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGruConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGruConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGruConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGruConnLogin_Caption; + LANGConnLogin_Login := LANGruConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGruConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGruConnLogin_Username; + LANGConnLogin_Password := LANGruConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGruConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGruColumns_Caption; + LANGColumns_Title := LANGruColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGruColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGruColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGruColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGruColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGruColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGruColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGruColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGruColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGruColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGruColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGruColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGruColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGruColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGruColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGruColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGruColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGruColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGruColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGruColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGruColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGruColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGruColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGruTestPlugin_Caption; + LANGTestPlugin_Title := LANGruTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGruTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGruTestPlugin_Plugin; + LANGTestPlugin_Command := LANGruTestPlugin_Command; + LANGTestPlugin_Username := LANGruTestPlugin_Username; + LANGTestPlugin_Password := LANGruTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGruTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGruTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGruRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGruRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGruRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGruSearch_Bytes; + LANGSearch_kB := LANGruSearch_kB; + LANGSearch_MB := LANGruSearch_MB; + LANGSearch_days := LANGruSearch_days; + LANGSearch_weeks := LANGruSearch_weeks; + LANGSearch_months := LANGruSearch_months; + LANGSearch_years := LANGruSearch_years; + LANGSearch_Caption := LANGruSearch_Caption; + LANGSearch_General := LANGruSearch_General; + LANGSearch_Advanced := LANGruSearch_Advanced; + LANGSearch_SearchResults := LANGruSearch_SearchResults; + LANGSearch_SearchFor := LANGruSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGruSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGruSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGruSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGruSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGruSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGruSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGruSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGruSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGruSearch_Size; + LANGSearch_Date := LANGruSearch_Date; + LANGSearch_BiggerThan := LANGruSearch_BiggerThan; + LANGSearch_SmallerThan := LANGruSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGruSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGruSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGruSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGruSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGruSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGruSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGruSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGruSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGruSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGruSearch_StatusSC; + LANGSearch_Ready := LANGruSearch_Ready; + LANGSearch_PreparingToSearch := LANGruSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGruSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGruSearch_UserCancelled; + LANGSearch_SearchFinished := LANGruSearch_SearchFinished; + LANGSearch_FilesFound := LANGruSearch_FilesFound; + LANGSearch_And := LANGruSearch_And; + + LANGCloseOpenConnection := LANGruCloseOpenConnection; + LANGDuplicateTabWarning := LANGruDuplicateTabWarning; + LANGDontShowAgain := LANGruDontShowAgain; + LANGSwitchOtherPanelWarning := LANGruSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGruOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGrumiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGruDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGruLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGruOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGruOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGruShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGruShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGrumiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGruFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGruCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGrumiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGruPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGruHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGruHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGruHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGruHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGruHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGruFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGruFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGruFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGruFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGruFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGruFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGruFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGruFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGruFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGruFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGruFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGruFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGruFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGruFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGruFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('ru_RU', @SetTranslation); + AddTranslation('ru_RU.utf8', @SetTranslation); + AddTranslation('RU', @SetTranslation); +end. diff --git a/translations/UTranslation_SR.pas b/translations/UTranslation_SR.pas new file mode 100644 index 0000000..b6c9328 --- /dev/null +++ b/translations/UTranslation_SR.pas @@ -0,0 +1,1261 @@ +(* + Tux Commander - UTranslation_SR - Serbian Localization constants + Copyright (C) 2005 Bojan Bozovic + !! Currently unmaintained, new translator needed !! + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_SR; + +interface + +implementation + +uses ULocale; + +const LANGsrF2Button_Caption = 'F2 - Преименуј'; + LANGsrF3Button_Caption = 'F3 - Преглед'; + LANGsrF4Button_Caption = 'F4 - Измена'; + LANGsrF5Button_Caption = 'F5 - Копирај'; + LANGsrF6Button_Caption = 'F6 - Премести'; + LANGsrF7Button_Caption = 'F7 - НовиДир'; + LANGsrF8Button_Caption = 'F8 - Обриши'; + + LANGsrmnuFile_Caption = '_Фајл'; + LANGsrmnuMark_Caption = '_Обележи'; + LANGsrmnuCommands_Caption = '_Команде'; + LANGsrmnuHelp_Caption = '_Помоћ'; + LANGsrmiExit_Caption = 'И_злаз'; + LANGsrmiSelectGroup_Caption = 'Изабери _Групу...'; + LANGsrmiUnselectGroup_Caption = '_Поништи Избор...'; + LANGsrmiSelectAll_Caption = '_Обележи Све'; + LANGsrmiUnselectAll_Caption = 'П_оништи Избор'; + LANGsrmiInvertSelection_Caption = '_Окрени Избор'; + LANGsrmiRefresh_Caption = '_Освежи'; + LANGsrmiAbout_Caption = '_О програму...'; + + LANGsrColumn1_Caption = 'Име'; + LANGsrColumn2_Caption = 'Екст'; + LANGsrColumn3_Caption = 'Величина'; + LANGsrColumn4_Caption = 'Датум'; + LANGsrColumn5_Caption = 'Атр'; + + LANGsrExpandSelection = 'Прошири избор'; + LANGsrShrinkSelection = 'Смањи избор'; + LANGsrNoMatchesFound = 'Нисам пронашао поклапања'; + LANGsrNoFilesSelected = 'Нема изабраних фајлова!'; + LANGsrSelectedFilesDirectories = '%d изабрани фајлови/директоријуми'; + LANGsrDirectoryS = 'директоријум %s'; + LANGsrFileS = 'фајл %s'; + LANGsrDoYouReallyWantToDeleteTheS = 'Да ли стварно желите да обришете %s ?'; + LANGsrDoYouReallyWantToDeleteTheSS = 'Да ли стварно желите да обришете %s ?'#10'%s'; + LANGsrCopyFiles = 'Копирај фајлове'; + LANGsrMoveRenameFiles = 'Премести/Преименуј фајлове'; + LANGsrCopyDFileDirectoriesTo = 'Копирај %d фајл/директоријуме у'; + LANGsrMoveRenameDFileDirectoriesTo = 'Премести/Преименуј %d фајл/директоријуме у'; + LANGsrCopySC = 'Копирај:'; + LANGsrMoveRenameSC = 'Премести/Преименуј:'; + + LANGsrQuickFind = ' Брза Претрага:'; + + LANGsrAboutString = 'Tux Commander'#10'Верзија %s'#10'Датум градње: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'Е-пошта: tbzatek@users.sourceforge.net'#10'Сајт: http://tuxcmd.sourceforge.net/'; + LANGsrAboutStringGnome = 'верзија %s'#10'Датум градње: %s'#10'Сајт: http://tuxcmd.sourceforge.net/'; + LANGsrDiskStatFmt = '%s од %s слободно'; + LANGsrDiskStatVolNameFmt = '[%s] %s од %s слободно'; + LANGsrStatusLineFmt = '%s од %s у %d од %d изабраних фајлова'; + LANGsrPanelStrings : array[boolean] of string = ('десно', 'лево'); + + LANGsrDIR = '<ДИР>'; + LANGsrErrorGettingListingForSPanel = 'Грешка при добављању листинга за %s панел:'#10' %s'#10#10'Путања = ''%s'''; + LANGsrErrorGettingListingForSPanelNoPath = 'Грешка при добављању листинга за %s панел:'#10' %s'; + LANGsrErrorCreatingNewDirectorySInSPanel = 'Грешка при прављењу новог директоријума ''%s'' у %s панелу:'#10' %s'; + LANGsrErrorCreatingNewDirectorySInSPanelNoPath = 'Грешка при прављењу новог директоријума у %s панелу:'#10' %s'; + LANGsrTheFileDirectory = 'Фајл/директоријум'; + LANGsrCouldNotBeDeleted = 'није могуће обрисати'; + LANGsrCouldNotBeDeletedS = 'није могуће обрисати: %s'; + LANGsrUserCancelled = 'Корисник поништио!'; + LANGsrTheDirectorySIsNotEmpty = 'Директоријум %s није празан!'; + LANGsrCannotCopyFile = 'Не могу да копирам фајл'; + LANGsrCopyError = 'Грешка при копирању'; + LANGsrMoveError = 'Грешка при премештању'; + LANGsrOverwriteS = 'Препиши: %s'; + LANGsrWithFileS = 'Фајлом: %s'; + LANGsrOvewriteSBytesS = '%s бајта, %s'; + LANGsrTheFile = 'Фајл'; + LANGsrCopy = 'Копирај'; + LANGsrMove = 'Премести'; + LANGsrTheDirectory = 'Директоријум'; + LANGsrTheSymbolicLink = 'Симболичка веза'; + LANGsrCannotMoveFile = 'Не могу да преместим фајл'; + LANGsrCouldNotBeCreated = 'није могуће направити'; + LANGsrCouldNotBeCreatedS = 'није могуће направити: %s'; + LANGsrFromS = 'Од: %s'; + LANGsrToS = 'За: %s'; + LANGsrCannotCopyFileToItself = 'Не могу да копирам фајл у њега самог'; + LANGsrMemoryAllocationFailed = 'Премештање меморије није успело:'; + LANGsrCannotOpenSourceFile = 'Не могу да отворим изворни фајл'; + LANGsrCannotOpenDestinationFile = 'Не могу да отворим одредишни фајл'; + LANGsrCannotCloseDestinationFile = 'Не могу да затворим одредишни фајл'; + LANGsrCannotCloseSourceFile = 'Не могу да затворим изворни фајл'; + LANGsrCannotReadFromSourceFile = 'Не могу да читам из изворног фајла'; + LANGsrCannotWriteToDestinationFile = 'Не могу да уписујем у одредишни фајл'; + + LANGsrUnknownException = 'Непознат Изузетак'; + LANGsrNoAccess = 'Нема Приступа'; + LANGsrUnknownError = 'Непозната Грешка'; + + LANGsrCreateANewDirectory = 'Направи нови директоријум'; + LANGsrEnterDirectoryName = 'Унесите _име директоријума:'; + + LANGsrOverwriteQuestion = 'Препиши питање'; + LANGsrOverwriteButton_Caption = '_Препиши'; + LANGsrOverwriteAllButton_Caption = 'Препиши _све'; + LANGsrSkipButton_Caption = '_Прескочи'; + LANGsrOverwriteAllOlderButton_Caption = 'Препиши све ст_арије'; + LANGsrSkipAllButton_Caption = 'П_рескочи све'; + LANGsrRenameButton_Caption = '_Преименуј'; + LANGsrAppendButton_Caption = 'П_римени'; + LANGsrRename = 'Преименуј'; + LANGsrRenameFile = 'Преименуј фајл ''%s'' у'; + LANGsrIgnoreButton_Caption = '_Игнориши'; + + LANGsrProgress = 'Напредак'; + LANGsrCancel = '_Поништи'; + LANGsrDelete = 'Обриши:'; + + LANGsrSpecifyFileType = '_Прецизирајте врсте фајлова:'; + + LANGsrRemoveDirectory = 'Уклони директоријум'; + LANGsrDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Да ли желите да га обришете са свим фајловима и поддиректоријумима?'; + LANGsrRetry = '_Покушај поново'; + LANGsrDeleteButton_Caption = '_Обриши'; + LANGsrAll = '_Све'; + + LANGsrCopyFilesSC = 'Копирај фајлове:'; + LANGsrAppendQuestion = 'Да ли сте сигурни да желите да примените фајл ''%s'' на ''%s''?'; + LANGsrPreparingList = 'Припремам листу...'; + + LANGsrYouMustSelectAValidFile = 'Морате изабрати исправан фајл!'; + LANGsrmiVerifyChecksums = '_Потврди чексуме'; + LANGsrVerifyChecksumsCaption = 'Потврди чексуме'; + LANGsrCheckButtonCaptionCheck = '_Провери'; + LANGsrCheckButtonCaptionStop = '_Заустави'; + LANGsrFileListTooltip = '[?] - Није проверено'#10'[У реду] - Чексума у реду'#10'[ЛОШЕ] - Лоша чексума'#10'[Н/Д] - Фајл није доступан'; + LANGsrFilenameColumnCaption = 'Име фајла'; + LANGsrTheFileSYouAreTryingToOpenIsQuiteBig = 'Фајл ''%s'' који покушавате да отворите је прилично велики (%s бајта). Можда то није исправан фајл чексуме.'#10#10'Да ли свакако желите да га учитате?'; + LANGsrAnErrorOccuredWhileInitializingMemoryBlock = 'Дошло је до грешке приликом покретања меморијског блока. Затворите неке програме и покушајте поново.'; + LANGsrAnErrorOccuredWhileOpeningFileSS = 'Дошло је до грешке приликом отварања фајла ''%s'':'#10' %s'; + LANGsrAnErrorOccuredWhileReadingFileSS = 'Дошло је до грешке приликом читања фајла ''%s'':'#10' %s'; + LANGsrChecksumNotChecked = 'Статус: Није проверено'; + LANGsrChecksumChecking = 'Статус: Проверавам...'; + LANGsrChecksumInterrupted = 'Статус: Прекинуто'; + LANGsrChecksumDOK = 'Статус: %d%% У реду'; + + LANGsrmiCreateChecksumsCaption = '_Направи чексуму...'; + LANGsrYouMustSelectAtLeastOneFileToCalculateChecksum = 'Морате изабрати бар један фајл како би чексума била израчуната!'; + LANGsrCreateChecksumsCaption = 'Направи чексуме'; + LANGsrCCHKSUMPage1Text = 'Направићете чексуме за'#10'изабраних фајлова. Ако нисте изабрали'#10'све фајлове које желите, затворите овај друид и'#10'изаберите још фајлова.'; + LANGsrCCHKSUMPage4Text = 'Друид је спреман да направи чексуме за '#10' фајлова које сте изабрали. ' + + 'Ово може да потраје неколико минута.'#10'Притисните Напред да бисте наставили.'; + LANGsrCCHKSUMPage6Text = 'Дошло је до грешака при прављењу чексума:'; + LANGsrCCHKSUMPage7Text = 'Прављење чексума је завршено и'#10'Ваших фајлова је спремно.'#10#10'Кликните "Заврши" да бисте изашли.'; + LANGsrCCHKSUMPage1Title = 'Припремите фајлове за чексуме'; + LANGsrCCHKSUMPage2Title = 'Изаберите врсту фајлова за чексуме'; + LANGsrCCHKSUMPage3Title = 'Изаберите имена фајлова'; + LANGsrCCHKSUMPage4Title = 'Спреман за проверу'; + LANGsrCCHKSUMPage5Title = 'Обрађујем...'; + LANGsrCCHKSUMPage6Title = 'Грешка!'; + LANGsrCCHKSUMPage7Title = 'Готово'; + LANGsrCCHKSUMSFVFile = 'SFV Фајл'; + LANGsrCCHKSUMMD5sumFile = 'MD5sum Фајл'; + LANGsrCCHKSUMFileName = 'Име _Фајла:'; + LANGsrCCHKSUMCreateSeparateChecksumFiles = 'Направи _одвојене фајлове чексума'; + LANGsrCCHKSUMNowProcessingFileS = 'Тренутно обрађујем фајл: %s'; + LANGsrCCHKSUMFinishCaption = '_Заврши'; + LANGsrCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Да ли сте сигурни да желите да прекинете обраду?'; + LANGsrCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Дошло је до грешке при отварању фајла ''%s'': %s'#10; + LANGsrCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Дошло је до грешке при читању фајла ''%s'': %s'#10; + LANGsrCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Дошло је до грешке при уписивању фајла ''%s'': %s'#10; + + LANGsrAnErrorOccuredWhileWritingFileSS = 'Дошло је до грешке при уписивању фајла ''%s'':'#10' %s'; + LANGsrTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Одредишни фајл ''%s'' већ постоји. Да ли желите да га препишете?'; + LANGsrTheTargetFileSCannotBeRemovedS = 'Одредишни фајл ''%s'' не може бити уклоњен: %s'; + LANGsrMergeCaption = 'Споји'; + LANGsrPleaseInsertNextDiskOrGiveDifferentLocation = 'Молим Вас убаците следећи диск, или унесите другачију локацију:'; + LANGsrMergeOfSSucceeded = 'Спајање ''%s'' успело (CRC чексума у реду).'; + LANGsrWarningCreatedFileFailsCRCCheck = 'Упозорење: Направљени фајл не пролази CRC проверу!'; + LANGsrMergeOfSSucceeded_NoCRCFileAvailable = 'Спајање ''%s'' успело (није доступан CRC фајл).'; + LANGsrMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Спајање ''%s'' и свих фајлова са опадајућим именима у следећи директоријум:'; + LANGsrMergeSC = 'Споји:'; + LANGsrmiSplitFileCaption = '_Подели фајл...'; + LANGsrmiMergeFilesCaption = '_Споји фајлове...'; + + LANGsrSplitTheFileSToDirectory = '_Подели фајл ''%s'' у директоријум:'; + LANGsrSplitSC = 'Подели:'; + LANGsrSplitFile = 'Подели Фајл'; + LANGsrBytesPerFile = '_Бајта по фајлу:'; + LANGsrAutomatic = 'Аутоматски'; + LANGsrDeleteFilesOnTargetDisk = '_Обриши фајлове на одредишном диску (usable for removable media)'; + LANGsrSplitCaption = 'Подели'; + LANGsrCannotOpenFileS = 'Не могу да отворим фајл ''%s'''; + LANGsrCannotSplitTheFileToMoreThan999Parts = 'Не могу да поделим фајл на више од 999 делова!'; + LANGsrThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'У одредишном директоријуму има фајлова:'#10'%s'#10'Да ли желите да их обришете?'; + LANGsrThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Има %d фајлова у одредишном директоријуму. Да ли желите да их обришете?'; + LANGsrAnErrorOccuredWhileOperationS = 'Дошло је до грешке током операције: %s'; + LANGsrSplitOfSSucceeded = 'Дељење ''%s'' успело.'; + LANGsrSplitOfSFailed = 'Дељење ''%s'' није успело!'; + + LANGsrmnuShow_Caption = 'Прикаж_и'; + LANGsrmiShowDotFiles_Caption = 'Прикажи фајлове са _тачком '; + LANGsrTheFileYouAreTryingToOpenIsQuiteBig = 'Фајл који покушавате да отворите је прилично велики. Његово учитавање у спољном програму ' + + '(као што је gedit) може изазвати успорење система.'#10'Да ли желите да наставите?'; + LANGsrCannotExecuteSPleaseCheckTheConfiguration = 'Не могу да извршим ''%s''. Молим Вас проверите подешавања или исправно поставите везе са врстама фајлова.'; + LANGsrEdit = 'Измени'; + LANGsrEnterFilenameToEdit = '_Унесите име фајла за измену:'; + + LANGsrmnuSettings_Caption = 'По_дешавања'; + LANGsrmiFileTypes_Caption = '_Врсте фајлова...'; + LANGsrThereIsNoApplicationAssociatedWithS = 'Ниједан програм није повезан са "%s".'#10#10'Можете подесити Tux Commander да повезује програме са ' + + 'врстама фајлова. Да ли сада желите да повежете програм са овом врстом фајла?'; + LANGsrErrorExecutingCommand = 'Грешка при извршавању наредбе!'; + LANGsrEditFileTypesCaption = 'Измени врсте фајлова'; + LANGsrTitleLabel_Caption = 'Подешавање врста фајлова'; + LANGsrExtensionsColumn = 'Екстензије'; + LANGsrDescriptionColumn = 'Опис'; + LANGsrFileTypesList = 'Листа врста фајлова'; + LANGsrActionName = 'Име акције'; + LANGsrCommand = 'Наредба'; + LANGsrSetDefaultActionButton_Caption = '_Постави као подразумевано'; + LANGsrRunInTerminalCheckBox_Caption = 'Покрени _Терминалу'; + LANGsrAutodetectCheckBox_Caption = 'Аутоматско препознавање _GUI програма'; + LANGsrBrowseButton_Caption = '_Прегледај...'; + LANGsrCommandLabel_Caption = 'На_редба:'; + LANGsrDescriptionLabel_Caption = 'О_пис:'; + LANGsrFNameExtLabel_Caption = 'Д_одај екстензију:'; + LANGsrNotebookPageExtensions = 'Врста фајла'; + LANGsrNotebookPageActions = 'Акције'; + LANGsrDefault = ' (подразумевано)'; + LANGsrCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Не могу да снимим везу са врстом фајла зато што је други процес обновио док је био покренут овај део програма.'; + + LANGsrDefaultColor = 'По_дразумевана боја'; + LANGsrIcon = '_Икона:'; + LANGsrBrowseForIcon = 'Прегледај за икону'; + LANGsrSelectFileTypeColor = 'Изаберите боју за врсту фајла'; + LANGsrColor = 'Бо_ја:'; + + LANGsrmiChangePermissions_Caption = 'Промени Доз_воле...'; + LANGsrmiChangeOwner_Caption = 'Промени _Власника/Групу...'; + LANGsrmiCreateSymlink_Caption = 'Направи Симболичку_везу...'; + LANGsrmiEditSymlink_Caption = '_Измени симболичку везу...'; + LANGsrChmodProgress = 'Промени дозволе:'; + LANGsrChownProgress = 'Промени власника:'; + LANGsrYouMustSelectAValidSymbolicLink = 'Морате изабрати исправну симболичку везу!'; + LANGsrPopupRunS = 'И_зврши %s'; + LANGsrPopupOpenS = 'О_твори %s'; + LANGsrPopupGoUp = '_Иди горе'; + LANGsrPopupOpenWithS = 'Отвори помоћу %s'; + LANGsrPopupDefault = ' (подразумевано)'; + LANGsrPopupOpenWith = 'О_твори помоћу...'; + LANGsrPopupViewFile = '_Прегледај фајл'; + LANGsrPopupEditFile = 'Из_мени фајл'; + LANGsrPopupMakeSymlink = 'Направи _симболичку везу'; + LANGsrPopupRename = '_Преименуј'; + LANGsrPopupDelete = '_Обриши'; + LANGsrDialogChangePermissions = 'Промени дозволе'; + LANGsrCouldNotBeChmoddedS = 'није могуће извршити chmod: %s'; + LANGsrDialogChangeOwner = 'Промени власника'; + LANGsrCouldNotBeChownedS = 'није могуће извршити chown: %s'; + LANGsrDialogMakeSymlink = 'Направи симболичку везу'; + LANGsrDialogEditSymlink = 'Измени симболичку везу'; + LANGsrFEditSymlink_Caption = 'Измени симболичку везу'; + LANGsrFEditSymlink_SymbolicLinkFilename = 'Име фајла _симболичке везе:'; + LANGsrFEditSymlink_SymbolicLinkPointsTo = 'Симболичка веза показује _на:'; + + LANGsrFChmod_Caption = 'Дозволе Приступа'; + LANGsrFChmod_PermissionFrame = 'Дозволе'; + LANGsrFChmod_FileFrame = 'Фајл'; + LANGsrFChmod_ApplyRecursivelyFor = 'Примени _рекурзивно за'; + LANGsrFChmod_miAllFiles = 'Сви фајлови и директоријуми'; + LANGsrFChmod_miDirectories = 'Само директоријуми'; + LANGsrFChmod_OctalLabel = '_Octal:'; + LANGsrFChmod_SUID = 'SUID - Постави ИД корисника по извршавању'; + LANGsrFChmod_SGID = 'SGID - Постави ИД групе по извршавању'; + LANGsrFChmod_Sticky = 'Лепљиви део'; + LANGsrFChmod_RUSR = 'RUSR - Читање од стране власника'; + LANGsrFChmod_WUSR = 'WUSR - Уписивање од стране власника'; + LANGsrFChmod_XUSR = 'XUSR - Извршавање/Претрага од стране власника'; + LANGsrFChmod_RGRP = 'RGRP - Читање од стране групе'; + LANGsrFChmod_WGRP = 'WGRP - Уписивање од стране групе'; + LANGsrFChmod_XGRP = 'XGRP - Извршавање/Претрага од стране групе'; + LANGsrFChmod_ROTH = 'ROTH - Читање од стране осталих'; + LANGsrFChmod_WOTH = 'WOTH - Уписивање од стране осталих'; + LANGsrFChmod_XOTH = 'XOTH - Извршавање/Претрага од стране осталих'; + LANGsrFChmod_TextLabel = 'Текст: %s'; + LANGsrFChmod_FileLabel = 'Фајл: %s'#10'Текст: %s'#10 + + 'Octal: %d'#10'Власник: %s'#10 + + 'Група: %s'; + + LANGsrFChown_Caption = 'Промени власника/групу'; + LANGsrFChown_OwnerFrame = 'Корисничко име'; + LANGsrFChown_GroupFrame = 'Име групе'; + LANGsrFChown_FileFrame = 'Фајл'; + LANGsrFChown_ApplyRecursively = 'Примени _рекурзивно'; + + LANGsrFSymlink_Caption = 'Направи симболичку везу'; + LANGsrFSymlink_ExistingFilename = '_Постојеће име фајла (име фајла на које ће указивати симболичка веза):'; + LANGsrFSymlink_SymlinkFilename = '_Име фајла симболичке везе:'; + + LANGsrmnuBookmarks_Caption = '_Маркер'; + LANGsrmiAddBookmark_Caption = 'Додај Маркер'; + LANGsrmiEditBookmarks_Caption = 'Измени Маркере'; + LANGsrBookmarkPopupDelete_Caption = '_Обриши'; + LANGsrmiPreferences_Caption = '_Поставке...'; + LANGsrTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Текући директоријум већ постоји у листи маркера'; + LANGsrSomeOtherInstanceChanged = 'Неки други Tux Commander је променио подешавања. Да ли желите да примените нова подешавања?'#10#10'Упозорење: Ако притиснете Не у овом ' + + 'тренутку, подешавања ће бити преписана у овом прозору'' изађи!'; + + LANGsrPreferences_Caption = 'Поставке'; + LANGsrPreferences_TitleLabel_Caption = 'Поставке програма'; + LANGsrPreferences_GeneralPage = 'Опште'; + LANGsrPreferences_FontsPage = 'Фонтови'; + LANGsrPreferences_ColorsPage = 'Боје'; + LANGsrPreferences_RowHeight = '_Висина реда:'; + LANGsrPreferences_NumHistoryItems = 'Историја Ко_мандне линије:'; + LANGsrPreferences_Default = '_Подразумевано'; + LANGsrPreferences_ClearReadonlyAttribute = 'Уклони _readonly атрибуте при копирању са CD-ROM-а'; + LANGsrPreferences_DisableMouseRenaming = 'Онемогући преименовање помоћу _миша '; + LANGsrPreferences_ShowFiletypeIconsInList = 'Прикажи иконе за _врсте фајлова'; + LANGsrPreferences_ExternalAppsLabel = 'Спољни програми'; + LANGsrPreferences_Viewer = '_Прегледач:'; + LANGsrPreferences_Editor = '_Измењивач:'; + LANGsrPreferences_Terminal = '_Терминал:'; + LANGsrPreferences_ListFont = 'Фонт листе:'; + LANGsrPreferences_Change = 'Промени...'; + LANGsrPreferences_UseDefaultFont = 'Користи _подразумевани фонт'; + LANGsrPreferences_Foreground = 'Спреда'; + LANGsrPreferences_Background = 'Позадина'; + LANGsrPreferences_NormalItem = 'Нормална Ставка:'; + LANGsrPreferences_SetToDefaultToUseGTKThemeColors = 'Постави коришћење GTK тема за боје као подразумевано'; + LANGsrPreferences_Cursor = 'Курсор:'; + LANGsrPreferences_InactiveItem = 'Неактивна ставка:'; + LANGsrPreferences_SelectedItem = 'Изабрана ставка:'; + LANGsrPreferences_LinkItem = 'Симболичке везе:'; + LANGsrPreferences_LinkItemHint = 'Постави као подразумевано да се симболичке везе приказују коришћењем подразумеваних нормалних боја за ставке'; + LANGsrPreferences_DotFileItem = 'Фајлови са тачком:'; + LANGsrPreferences_DotFileItemHint = 'Постави као подразумевано да се фајлови са тачком приказују коришћењем подразумеваних нормалних боја за ставке'; + LANGsrPreferences_BrowseForApplication = 'Прегледај за програм'; + LANGsrPreferences_DefaultS = 'Подразумевано: %s'; + LANGsrPreferences_SelectFont = 'Изаберите фонт'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGsrBookmarkButton_Tooltip = 'Прикажи маркере'; + LANGsrUpButton_Tooltip = 'Иди у претходни директоријум'; + LANGsrRootButton_Tooltip = 'Иди у корени директоријум (/)'; + LANGsrHomeButton_Tooltip = 'Иди у матични директоријум (/home/user)'; + LANGsrLeftEqualButton_Tooltip = 'Пребаци десну таблу на исти директоријум'; + LANGsrRightEqualButton_Tooltip = 'Пребаци леву таблу на исти директоријум'; + LANGsrmiShowDirectorySizes_Caption = 'Прикажи величине д_иректоријума'; + LANGsrmiTargetSource_Caption = '_Одредиште = Извор'; + LANGsrFileTypeDirectory = 'Директоријум'; + LANGsrFileTypeFile = 'Фајл'; + LANGsrFileTypeMetafile = 'Ово је уобичајена мета-ставка'; + LANGsrPreferencesPanelsPage = 'Табла'; + LANGsrPreferencesApplicationsPage = 'Програми'; + LANGsrPreferencesExperimentalPage = 'Експериментално'; + LANGsrPreferencesSelectAllDirectoriesCheckBox_Caption = 'Обележи _и директоријуме када се обележава све'; + LANGsrPreferencesNewStyleAltOCheckBox_Caption = '_Нови стил Alt+O'; + LANGsrPreferencesNewStyleAltOCheckBox_Tooltip = 'Остани у истом директоријуму при промени директоријума на супротној табли притискањем Ctrl/Alt+O'; + LANGsrPreferencesShowFuncButtonsCheckBox_Caption = 'Прикажи дугмад функцијских _тастера'; + LANGsrPreferencesSizeFormatLabel_Caption = '_Формат величине:'; + LANGsrPreferencesmiSizeFormat1 = 'Систем'; + LANGsrPreferencesmiSizeFormat6 = 'Груписано'; + LANGsrPreferencesAutodetectXApp = 'Аутоматски препознај X програм'; + LANGsrPreferencesAlwaysRunInTerminal = 'Увек покрени у терминалу'; + LANGsrPreferencesNeverRunInTerminal = 'Никада немој да покренеш у терминалу'; + LANGsrPreferencesCmdLineBehaviourLabel_Caption = '_Извршавање из командне линије:'; + LANGsrPreferencesFeatures = 'Могућности'; + LANGsrPreferencesDisableMouseRename_Tooltip = 'Још увек можете извршити брзо преименовање притискањем Shift+F6'; + LANGsrPreferencesDisableFileTipsCheckBox_Caption = 'Онемогући _облачиће за фајлове'; + LANGsrPreferencesDisableFileTipsCheckBox_Tooltip = 'Немој да приказујеш облачиће на табли ако је текст у колони скраћен'; + LANGsrPreferencesShow = 'Прикажи'; + LANGsrPreferencesDirsInBoldCheckBox_Caption = 'Директоријуми _подебљани'; + LANGsrPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Онемогући з_аграде за директоријуме'; + LANGsrPreferencesOctalPermissionsCheckBox_Caption = 'Прикажи _octal дозволе'; + LANGsrPreferencesOctalPermissionsCheckBox_Tooltip = 'Прикажи дозволе за фајлове/директоријуме као број уместо у текстуалном облику (-rw-rw-rw-)'; + LANGsrPreferencesMovement = 'Кретање'; + LANGsrPreferencesLynxLikeMotionCheckBox_Caption = 'Кретање попут _Lynx-а'; + LANGsrPreferencesInsertMovesDownCheckBox_Caption = '_Insert помера на доле'; + LANGsrPreferencesSpaceMovesDownCheckBox_Caption = '_Space помера на доле'; + LANGsrPreferencesViewer = 'Прегледач'; + LANGsrPreferencesCommandSC = 'Наредба:'; + LANGsrPreferencesUseInternalViewer = 'Користи _унутрашњи прегледач'; + LANGsrPreferencesEditor = 'Измењивач'; + LANGsrPreferencesTerminal = 'Терминал'; + LANGsrPreferencesExperimentalFeatures = 'Експерименталне могућности'; + LANGsrPreferencesExperimentalWarningLabel_Caption = 'Упозорење: Ове могућности су тренутно у развоју и можда не раде како треба. Користите их на сопствени ризик!'; + LANGsrPreferencesFocusRefreshCheckBox_Caption = 'Обави _освежење при фокусирању прозора'; + LANGsrPreferencesFocusRefreshCheckBox_Tooltip = 'Веома споро освежавање табле у овом тренутку'; + LANGsrPreferencesWMCompatModeCheckBox_Caption = '_WM режим компатибилности'; + LANGsrPreferencesWMCompatModeCheckBox_Tooltip = 'Користите ако имате неких проблема са управљачем прозорима (на пример IceWM не обавља увеличавање прозора исправно)'; + LANGsrPreferencesCompatUseLibcSystemCheckBox_Caption = 'Користи libc _систем() за извршавање програма'; + LANGsrPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Користите у случају проблема са замрзавањем и падањем при покретању спољних програма'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGsrmiSearchCaption2 = '_Претрага...'; + LANGsrmiNoMounterBarCaption = '_Не приказуј линију за монтирање'; + LANGsrmiShowOneMounterBarCaption = 'Прикажи _једну линију за монтирање'; + LANGsrmiShowTwoMounterBarCaption = 'Прикажи _две линије за монтирање'; + LANGsrmnuNetworkCaption = 'М_режа'; + LANGsrmiConnectionsCaption = '_Везе...'; + LANGsrmiOpenConnectionCaption = '_Отвори везу...'; + LANGsrmiQuickConnectCaption = '_Брзо повезивање...'; + LANGsrmnuPluginsCaption = 'Пр_икључци'; + LANGsrmiTestPluginCaption = '_Тестирај прикључак...'; + LANGsrmiMounterSettingsCaption = 'Подешавања за _монтирање...'; + LANGsrmiColumnsCaption = 'Колоне т_абле...'; + LANGsrmiSavePositionCaption = '_Сними позицију'; + LANGsrmiMountCaption = '_Mount'; + LANGsrmiUmountCaption = '_Umount'; + LANGsrmiEjectCaption = '_Отвори'; + LANGsrmiDuplicateTabCaption = 'Дуплирај текући језичак'; + LANGsrmiCloseTabCaption = 'Затвори текући језичак'; + LANGsrmiCloseAllTabsCaption = 'Затвори све језичке'; + LANGsrCannotDetermineDestinationEngine = 'Не могу да утврдим одредишни мотор. Молим Вас унесите исправну путању и покушајте поново.'; + LANGsrCannotLoadFile = 'Не могу да учитам фајл ''%s''. Молим Вас проверите дозволе.'; + LANGsrMountPointDevice = 'Тачка Монтирања: %s'#10'Уређај: %s'; + LANGsrMountSC = 'Монтирај:'; + LANGsrNoPluginsFound = 'Нису пронађени прикључци'; + LANGsrPluginAbout = 'О програму...'; + LANGsrCouldntOpenURI = 'Нисам могао да отворим наведени URI. Молим Вас проверите постојаност идентификатора извора и дозволе приступа.'; + LANGsrPluginAboutInside = 'Прикључак: %s'#10#10'%s'#10'%s'; + LANGsrAreYouSureCloseAllTabs = 'Да ли сте сигурни да желите да затворите све активне језичке?'; + LANGsrCouldntOpenURIArchive = 'Нисам могао да отворим архиву. Молим Вас проверите постојаност и дозволе приступа.'; + LANGsrThereIsNoModuleAvailable = 'Нема доступних VFS модула који могу да раде са овом везом'; + LANGsrIgnoreError = 'Да ли стварно желите да игноришете грешку? Изворни фајл ће бити обрисан'; + LANGsrErrorMount = 'Дошло је до грешке при монтирању уређаја ''%s'':'#10#10; + LANGsrErrorUmount = 'Дошло је до грешке при одмонтиравању уређаја ''%s'':'#10#10; + LANGsrErrorEject = 'Дошло је до грешке при отварању уређаја ''%s'':'#10#10; + + LANGsrMounterPrefs_Caption = 'Подешавања Монтера'; + LANGsrMounterPrefs_TitleLabelCaption = 'Подешавања Монтера'; + LANGsrMounterPrefs_ListViewFrameCaption = 'Монтер'; + LANGsrMounterPrefs_MountName = 'Име за монтирање'; + LANGsrMounterPrefs_MountPoint = 'Тачка монтирања'; + LANGsrMounterPrefs_Device = 'Уређај'; + LANGsrMounterPrefs_MoveUpButtonTooltip = 'Помери ставку на горе'; + LANGsrMounterPrefs_MoveDownButtonTooltip = 'Помери ставку на доле'; + LANGsrMounterPrefs_UseFSTabDefaultsCheckBox = 'Користи _fstab подразумеване ставке'; + LANGsrMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Штиклирањем овога, линија монтера ће бити попуњена подразумеваним ставкама које се ' + + 'могу пронаћи у /etc/fstab (системски фајл са листом монтирања)'; + LANGsrMounterPrefs_ToggleModeCheckBox = 'Дугмад остају _притиснута када је уређај монтиран'; + LANGsrMounterPrefs_ToggleModeCheckBoxTooltip = 'Када је штиклирано, дугмад монтера ће остати притиснута ако је уређај монтиран; још један клик ће ' + + 'резултовати одмонтиравањем (отварањем у овом случају)'; + LANGsrMounterPrefs_PropertiesFrameCaption = 'Поставке ставки монтера'; + LANGsrMounterPrefs_DisplayTextLabelCaption = 'Приказани _Текст:'; + LANGsrMounterPrefs_MountPointLabelCaption = 'Тачка _Монтирања:'; + LANGsrMounterPrefs_MountDeviceLabelCaption = '_Уређај:'; + LANGsrMounterPrefs_DeviceTypeLabelCaption = '_Врста Уређаја:'; + LANGsrMounterPrefs_miLocalDiskCaption = 'Локални диск'; + LANGsrMounterPrefs_miRemovableCaption = 'Измењиви'; + LANGsrMounterPrefs_miCDCaption = 'CD/DVD уређај'; + LANGsrMounterPrefs_miFloppyCaption = 'Флопи драјв'; + LANGsrMounterPrefs_miNetworkCaption = 'Мрежа'; + LANGsrMounterPrefs_MountCommandLabelCaption = '_Команда Монтирања:'; + LANGsrMounterPrefs_UmountCommandLabelCaption = 'К_оманда Одмонтиравања:'; + LANGsrMounterPrefs_MountCommandEntryTooltip = 'Синтакса: користите %dev уместо уређаја и %dir уместо тачке монтирања или оставите празно за подразумевано монтирање'#10'Обратите пажњу: ' + + 'чувајте се интерактивних команди, tuxcmd би могао да се укочи!'#10'Пример: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGsrMounterPrefs_UmountCommandEntryTooltip = 'Синтакса: користите %dev уместо уређаја и %dir уместо тачке монтирања или оставите празно за подразумевано монтирање'#10'Пример: smbumount $dir'; + LANGsrMounterPrefs_IconLabelCaption = '_Икона:'; + + LANGsrConnMgr_Caption = 'Отвори Нову Везу'; + LANGsrConnMgr_ConnectButton = 'По_вежи се'; + LANGsrConnMgr_OpenConnection = 'Отвори Везу'; + LANGsrConnMgr_NameColumn = 'Име'; + LANGsrConnMgr_URIColumn = 'URI'; + LANGsrConnMgr_AddConnectionButtonCaption = '_Додај сајт...'; + LANGsrConnMgr_AddConnectionButtonTooltip = 'Додај нову везу'; + LANGsrConnMgr_EditButtonCaption = '_Измени...'; + LANGsrConnMgr_EditButtonTooltip = 'Измени изабрану везу'; + LANGsrConnMgr_RemoveButtonCaption = '_Уклони сајт'; + LANGsrConnMgr_RemoveButtonTooltip = 'Обриши изабрану везу'; + LANGsrConnMgr_DoYouWantDelete = 'Да ли стварно желите да обришете везу ''%s''?'; + + LANGsrConnProp_FTP = 'FTP'; + LANGsrConnProp_SFTP = 'SFTP (ssh подсистем)'; + LANGsrConnProp_SMB = 'Windows share (SMB)'; + LANGsrConnProp_HTTP = 'WebDAV (HTTP)'; + LANGsrConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGsrConnProp_Other = 'Друго (молим Вас наведите у URI)'; + LANGsrConnProp_Caption = 'Поставке везе'; + LANGsrConnProp_VFSModule = '_VFS модул:'; + LANGsrConnProp_URI = '_URI:'; + LANGsrConnProp_URIEntryTooltip = 'Исправан URI би требало да садржи префикс врсте услуге и адресу сервера'; + LANGsrConnProp_DetailedInformations = 'Детаљне Информације'; + LANGsrConnProp_Name = '_Име:'; + LANGsrConnProp_Server = 'Сер_вер[:порт]:'; + LANGsrConnProp_Username = 'Корисничко_ко име:'; + LANGsrConnProp_UserNameEntryTooltip = 'Оставите празно за анониман приступ'; + LANGsrConnProp_Password = '_Лозинка:'; + LANGsrConnProp_TargetDirectory = 'Одредишни _директоријум:'; + LANGsrConnProp_ServiceType = 'Врста _услуге:'; + LANGsrConnProp_MaskPassword = 'Сакриј _шифру'; + LANGsrConnProp_MenuItemCaption = 'Подразумевано (сви погодни модули)'; + + LANGsrConnLogin_Caption = 'Захтевана ауторизација'; + LANGsrConnLogin_Login = 'Пријава'; + LANGsrConnLogin_ExperimentalWarningLabelCaption = 'Морате се пријавити ради приступа %s'; + LANGsrConnLogin_Username = '_Корисничко име:'; + LANGsrConnLogin_Password = '_Лозинка:'; + LANGsrConnLogin_AnonymousCheckButton = '_Анонимно'; + + LANGsrColumns_Caption = 'Подешавања Колона Табле'; + LANGsrColumns_Title = 'Подешавања Колона Табле'; + LANGsrColumns_MoveUpButtonTooltip = 'Помери ставку на горе'; + LANGsrColumns_MoveDownButtonTooltip = 'Помери ставку на доле'; + LANGsrColumns_TitlesLongName = 'Име'; + LANGsrColumns_TitlesLongNameExt = 'Име + Екстензија'; + LANGsrColumns_TitlesLongExt = 'Екстензија'; + LANGsrColumns_TitlesLongSize = 'Величина'; + LANGsrColumns_TitlesLongDateTime = 'Датум + Време'; + LANGsrColumns_TitlesLongDate = 'Датум'; + LANGsrColumns_TitlesLongTime = 'Време'; + LANGsrColumns_TitlesLongUser = 'Корисник'; + LANGsrColumns_TitlesLongGroup = 'Група'; + LANGsrColumns_TitlesLongAttr = 'Атрибути'; + LANGsrColumns_TitlesShortName = 'Име'; + LANGsrColumns_TitlesShortNameExt = 'Име'; + LANGsrColumns_TitlesShortExt = 'Екст'; + LANGsrColumns_TitlesShortSize = 'Величина'; + LANGsrColumns_TitlesShortDateTime = 'Датум'; + LANGsrColumns_TitlesShortDate = 'Датум'; + LANGsrColumns_TitlesShortTime = 'Време'; + LANGsrColumns_TitlesShortUser = 'Корисник'; + LANGsrColumns_TitlesShortGroup = 'Група'; + LANGsrColumns_TitlesShortAttr = 'Атр'; + + LANGsrTestPlugin_Caption = 'Тестирај VFS Прикључак'; + LANGsrTestPlugin_Title = 'Тестирај VFS Прикључак'; + LANGsrTestPlugin_ExperimentalWarningLabelCaption = 'Упозорење: VFS подсистем и његови прикључци су у раној фази развоја и могу садржати ' + + 'грешке. Користите ову функцију на сопствени ризик!'; + LANGsrTestPlugin_Plugin = '_Прикључак:'; + LANGsrTestPlugin_Command = 'На_редба:'; + LANGsrTestPlugin_Username = '_Корисничко име:'; + LANGsrTestPlugin_Password = '_Лозинка:'; + LANGsrTestPlugin_AnonymousCheckButton = '_Анонимна пријава (не позива VFSLogin)'; + LANGsrTestPlugin_NoPluginsFound = 'Нису пронађени прикључци'; + + LANGsrRemoteWait_Caption = 'Операција у току'; + LANGsrRemoteWait_OperationInProgress = 'Операција у току, молим Вас будите стрпљиви...'; + LANGsrRemoteWait_ItemsFound = 'Ставке пронађене до сада: %d'; + + LANGsrSearch_Bytes = 'Бајта'; + LANGsrSearch_kB = 'kB'; + LANGsrSearch_MB = 'MB'; + LANGsrSearch_days = 'дана'; + LANGsrSearch_weeks = 'недеља'; + LANGsrSearch_months = 'месеци'; + LANGsrSearch_years = 'година'; + LANGsrSearch_Caption = 'Пронађи фајлове'; + LANGsrSearch_General = 'Опште'; + LANGsrSearch_Advanced = 'Напредно'; + LANGsrSearch_SearchResults = '_Резултати претраге:'; + LANGsrSearch_SearchFor = '_Тражи:'; + LANGsrSearch_FileMaskEntryTooltip = 'Савет: Користите тачку-зарез (";") како бисте навели више фајлова које тражите'; + LANGsrSearch_SearchIn = 'Тражи _у:'; + LANGsrSearch_SearchArchivesCheckButton = 'Тражи у _архивама'; + LANGsrSearch_FindText = 'Нађи _текст:'; + LANGsrSearch_FindTextEntryTooltip = 'Оставите празно ако не желите поклапање текста'#10'Обратите пажњу да користимо UTF-8 у GUI делу'; + LANGsrSearch_CaseSensitiveCheckButton = 'Осетљиво на м_ала и велика слова'; + LANGsrSearch_StayCurrentFSCheckButton = 'Укључи и друге фајл _системе'; + LANGsrSearch_CaseSensitiveMatchCheckButton = 'Осетљиво на м_ала и велика слова'; + LANGsrSearch_Size = 'Величина'; + LANGsrSearch_Date = 'Датум'; + LANGsrSearch_BiggerThan = '_Веће од'; + LANGsrSearch_SmallerThan = '_Мање од'; + LANGsrSearch_ModifiedBetweenRadioButton = '_Мењано између'; + LANGsrSearch_NotModifiedAfterRadioButton = '_Није мењано након'; + LANGsrSearch_ModifiedLastRadioButton = 'Мењ_ано у последњих'; + LANGsrSearch_ModifiedNotLastRadionButton = 'Ниј_е мењано у последњих'; + LANGsrSearch_ModifiedBetweenEntry1 = '"Молим Вас користите овај облик датума:" c'; + LANGsrSearch_ViewButtonCaption = '_Прегледај фајл'; + LANGsrSearch_NewSearchButtonCaption = '_Нова претрага'; + LANGsrSearch_GoToFileButtonCaption = '_Иди на фајл'; + LANGsrSearch_FeedToListboxButtonCaption = 'Похрани у _прозор листе'; + LANGsrSearch_StatusSC = 'Статус:'; + LANGsrSearch_Ready = 'Спреман.'; + LANGsrSearch_PreparingToSearch = 'Припрема за претрагу.'; + LANGsrSearch_SearchInProgress = 'Претрага у току:'; + LANGsrSearch_UserCancelled = 'Поништено од стране корисника.'; + LANGsrSearch_SearchFinished = 'Претрага завршена'; + LANGsrSearch_FilesFound = '%d фајлова пронађено'; + LANGsrSearch_And = 'и'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGsrCloseOpenConnection = 'You''re trying to open new connection over the another active connection. By continuing, the previous connection will be closed and replaced by the new requested one.'#10#10'Do you want to continue?'; + LANGsrDuplicateTabWarning = 'You are trying to open a new tab from a remote directory. However, engine cloning is not supported. The directory in the new tab will point to a local filesystem.'; + LANGsrDontShowAgain = '_Don''t show this message again'; + LANGsrSwitchOtherPanelWarning = 'You are trying to open the remote directory in the opposite panel. However, engine cloning is not supported. The target directory will not be switched.'; + LANGsrOpenConnectionsWarning = 'There are some active connections opened in the panel. By closing the application, these connections will be disconnected.'#10#10'Do you want to continue quit?'; + LANGsrmiDisconnect_Caption = '_Disconnect'; + LANGsrDisconnectButton_Tooltip = 'Disconnect active connection'; + LANGsrLeaveArchiveButton_Tooltip = 'Close current archive'; + LANGsrOpenTerminalButton_Tooltip = 'Opens a new terminal windows from the current directory'; + LANGsrOpenTerminalButton_Caption = 'Open Te_rminal'; + LANGsrShowTextUIDsCheckBox_Caption = 'Show text _UIDs'; + LANGsrShowTextUIDsCheckBox_Tooltip = 'Show textual User and Group informations instead of numbers (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGsrmiNewTab_Caption = 'New folder _tab'; + LANGsrFilePopupMenu_Properties = '_Properties'; + LANGsrCommandEntry_Tooltip = 'Use %s as file/directory placeholder'; + LANGsrmiFiles_Caption = 'Files only'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGsrPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGsrHandleRunFromArchive_Bytes = 'bytes'; + LANGsrHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGsrHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGsrHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGsrHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGsrFRunFromVFS_Caption = 'Packed file properties'; + LANGsrFRunFromVFS_TitleLabel = 'File Properties'; + LANGsrFRunFromVFS_FileNameLabel = 'File name:'; + LANGsrFRunFromVFS_FileTypeLabel = 'File type:'; + LANGsrFRunFromVFS_SizeLabel = 'Size:'; + LANGsrFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGsrFRunFromVFS_DateLabel = 'Modify date:'; + LANGsrFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGsrFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGsrFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGsrFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGsrFSetPassword_Caption = 'Set password'; + LANGsrFSetPassword_Label1_Caption = 'Password required'; + LANGsrFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGsrFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGsrF2Button_Caption; + LANGF3Button_Caption := LANGsrF3Button_Caption; + LANGF4Button_Caption := LANGsrF4Button_Caption; + LANGF5Button_Caption := LANGsrF5Button_Caption; + LANGF6Button_Caption := LANGsrF6Button_Caption; + LANGF7Button_Caption := LANGsrF7Button_Caption; + LANGF8Button_Caption := LANGsrF8Button_Caption; + + LANGmnuFile_Caption := LANGsrmnuFile_Caption; + LANGmnuMark_Caption := LANGsrmnuMark_Caption; + LANGmnuCommands_Caption := LANGsrmnuCommands_Caption; + LANGmnuHelp_Caption := LANGsrmnuHelp_Caption; + LANGmiExit_Caption := LANGsrmiExit_Caption; + LANGmiSelectGroup_Caption := LANGsrmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGsrmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGsrmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGsrmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGsrmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGsrmiRefresh_Caption; + LANGmiAbout_Caption := LANGsrmiAbout_Caption; + + LANGColumn1_Caption := LANGsrColumn1_Caption; + LANGColumn2_Caption := LANGsrColumn2_Caption; + LANGColumn3_Caption := LANGsrColumn3_Caption; + LANGColumn4_Caption := LANGsrColumn4_Caption; + LANGColumn5_Caption := LANGsrColumn5_Caption; + + LANGExpandSelection := LANGsrExpandSelection; + LANGShrinkSelection := LANGsrShrinkSelection; + LANGNoMatchesFound := LANGsrNoMatchesFound; + LANGNoFilesSelected := LANGsrNoFilesSelected; + LANGSelectedFilesDirectories := LANGsrSelectedFilesDirectories; + LANGDirectoryS := LANGsrDirectoryS; + LANGFileS := LANGsrFileS; + LANGDoYouReallyWantToDeleteTheS := LANGsrDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGsrDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGsrCopyFiles; + LANGMoveRenameFiles := LANGsrMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGsrCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGsrMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGsrCopySC; + LANGMoveRenameSC := LANGsrMoveRenameSC; + + LANGQuickFind := LANGsrQuickFind; + + LANGAboutString := LANGsrAboutString; + LANGAboutStringGnome := LANGsrAboutStringGnome; + LANGDiskStatFmt := LANGsrDiskStatFmt; + LANGDiskStatVolNameFmt := LANGsrDiskStatVolNameFmt; + LANGStatusLineFmt := LANGsrStatusLineFmt; + LANGPanelStrings[False] := LANGsrPanelStrings[False]; + LANGPanelStrings[True] := LANGsrPanelStrings[True]; + LANGDIR := LANGsrDIR; + LANGErrorGettingListingForSPanel := LANGsrErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGsrErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGsrErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGsrErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGsrTheFileDirectory; + LANGCouldNotBeDeleted := LANGsrCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGsrCouldNotBeDeletedS; + LANGUserCancelled := LANGsrUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGsrTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGsrCannotCopyFile; + LANGCopyError := LANGsrCopyError; + LANGMoveError := LANGsrMoveError; + LANGOverwriteS := LANGsrOverwriteS; + LANGWithFileS := LANGsrWithFileS; + LANGOvewriteSBytesS := LANGsrOvewriteSBytesS; + LANGTheFile := LANGsrTheFile; + LANGCopy := LANGsrCopy; + LANGMove := LANGsrMove; + LANGTheDirectory := LANGsrTheDirectory; + LANGTheSymbolicLink := LANGsrTheSymbolicLink; + LANGCannotMoveFile := LANGsrCannotMoveFile; + LANGCouldNotBeCreated := LANGsrCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGsrCouldNotBeCreatedS; + LANGFromS := LANGsrFromS; + LANGToS := LANGsrToS; + LANGCannotCopyFileToItself := LANGsrCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGsrMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGsrCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGsrCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGsrCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGsrCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGsrCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGsrCannotWriteToDestinationFile; + + LANGUnknownException := LANGsrUnknownException; + LANGNoAccess := LANGsrNoAccess; + LANGUnknownError := LANGsrUnknownError; + + LANGCreateANewDirectory := LANGsrCreateANewDirectory; + LANGEnterDirectoryName := LANGsrEnterDirectoryName; + + LANGOverwriteQuestion := LANGsrOverwriteQuestion; + LANGOverwriteButton_Caption := LANGsrOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGsrOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGsrSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGsrOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGsrSkipAllButton_Caption; + LANGRenameButton_Caption := LANGsrRenameButton_Caption; + LANGAppendButton_Caption := LANGsrAppendButton_Caption; + LANGRename := LANGsrRename; + LANGRenameFile := LANGsrRenameFile; + LANGIgnoreButton_Caption := LANGsrIgnoreButton_Caption; + + LANGProgress := LANGsrProgress; + LANGCancel := LANGsrCancel; + LANGDelete := LANGsrDelete; + + LANGSpecifyFileType := LANGsrSpecifyFileType; + + LANGRemoveDirectory := LANGsrRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGsrDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGsrRetry; + LANGDeleteButton_Caption := LANGsrDeleteButton_Caption; + LANGAll := LANGsrAll; + + LANGCopyFilesSC := LANGsrCopyFilesSC; + LANGAppendQuestion := LANGsrAppendQuestion; + LANGPreparingList := LANGsrPreparingList; + + LANGYouMustSelectAValidFile := LANGsrYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGsrmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGsrVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGsrCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGsrCheckButtonCaptionStop; + LANGFileListTooltip := LANGsrFileListTooltip; + LANGFilenameColumnCaption := LANGsrFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGsrTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGsrAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGsrAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGsrAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGsrChecksumNotChecked; + LANGChecksumChecking := LANGsrChecksumChecking; + LANGChecksumInterrupted := LANGsrChecksumInterrupted; + LANGChecksumDOK := LANGsrChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGsrmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGsrYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGsrCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGsrCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGsrCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGsrCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGsrCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGsrCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGsrCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGsrCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGsrCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGsrCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGsrCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGsrCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGsrCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGsrCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGsrCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGsrCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGsrCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGsrCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGsrCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGsrCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGsrCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGsrCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGsrAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGsrTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGsrTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGsrMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGsrPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGsrMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGsrWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGsrMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGsrMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGsrMergeSC; + LANGmiSplitFileCaption := LANGsrmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGsrmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGsrSplitTheFileSToDirectory; + LANGSplitSC := LANGsrSplitSC; + LANGSplitFile := LANGsrSplitFile; + LANGBytesPerFile := LANGsrBytesPerFile; + LANGAutomatic := LANGsrAutomatic; + LANGDeleteFilesOnTargetDisk := LANGsrDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGsrSplitCaption; + LANGCannotOpenFileS := LANGsrCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGsrCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGsrThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGsrThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGsrAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGsrSplitOfSSucceeded; + LANGSplitOfSFailed := LANGsrSplitOfSFailed; + + LANGmnuShow_Caption := LANGsrmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGsrmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGsrTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGsrCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGsrEdit; + LANGEnterFilenameToEdit := LANGsrEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGsrmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGsrmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGsrThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGsrErrorExecutingCommand; + LANGEditFileTypesCaption := LANGsrEditFileTypesCaption; + LANGTitleLabel_Caption := LANGsrTitleLabel_Caption; + LANGExtensionsColumn := LANGsrExtensionsColumn; + LANGDescriptionColumn := LANGsrDescriptionColumn; + LANGFileTypesList := LANGsrFileTypesList; + LANGActionName := LANGsrActionName; + LANGCommand := LANGsrCommand; + LANGSetDefaultActionButton_Caption := LANGsrSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGsrRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGsrAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGsrBrowseButton_Caption; + LANGCommandLabel_Caption := LANGsrCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGsrDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGsrFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGsrNotebookPageExtensions; + LANGNotebookPageActions := LANGsrNotebookPageActions; + LANGDefault := LANGsrDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGsrCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGsrDefaultColor; + LANGIcon := LANGsrIcon; + LANGBrowseForIcon := LANGsrBrowseForIcon; + LANGSelectFileTypeColor := LANGsrSelectFileTypeColor; + LANGColor := LANGsrColor; + + LANGmiChangePermissions_Caption := LANGsrmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGsrmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGsrmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGsrmiEditSymlink_Caption; + LANGChmodProgress := LANGsrChmodProgress; + LANGChownProgress := LANGsrChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGsrYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGsrPopupRunS; + LANGPopupOpenS := LANGsrPopupOpenS; + LANGPopupGoUp := LANGsrPopupGoUp; + LANGPopupOpenWithS := LANGsrPopupOpenWithS; + LANGPopupDefault := LANGsrPopupDefault; + LANGPopupOpenWith := LANGsrPopupOpenWith; + LANGPopupViewFile := LANGsrPopupViewFile; + LANGPopupEditFile := LANGsrPopupEditFile; + LANGPopupMakeSymlink := LANGsrPopupMakeSymlink; + LANGPopupRename := LANGsrPopupRename; + LANGPopupDelete := LANGsrPopupDelete; + LANGDialogChangePermissions := LANGsrDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGsrCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGsrDialogChangeOwner; + LANGCouldNotBeChownedS := LANGsrCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGsrDialogMakeSymlink; + LANGDialogEditSymlink := LANGsrDialogEditSymlink; + LANGFEditSymlink_Caption := LANGsrFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGsrFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGsrFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGsrFChmod_Caption; + LANGFChmod_PermissionFrame := LANGsrFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGsrFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGsrFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGsrFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGsrFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGsrFChmod_OctalLabel; + LANGFChmod_SUID := LANGsrFChmod_SUID; + LANGFChmod_SGID := LANGsrFChmod_SGID; + LANGFChmod_Sticky := LANGsrFChmod_Sticky; + LANGFChmod_RUSR := LANGsrFChmod_RUSR; + LANGFChmod_WUSR := LANGsrFChmod_WUSR; + LANGFChmod_XUSR := LANGsrFChmod_XUSR; + LANGFChmod_RGRP := LANGsrFChmod_RGRP; + LANGFChmod_WGRP := LANGsrFChmod_WGRP; + LANGFChmod_XGRP := LANGsrFChmod_XGRP; + LANGFChmod_ROTH := LANGsrFChmod_ROTH; + LANGFChmod_WOTH := LANGsrFChmod_WOTH; + LANGFChmod_XOTH := LANGsrFChmod_XOTH; + LANGFChmod_TextLabel := LANGsrFChmod_TextLabel; + LANGFChmod_FileLabel := LANGsrFChmod_FileLabel; + LANGFChown_Caption := LANGsrFChown_Caption; + LANGFChown_OwnerFrame := LANGsrFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGsrFChown_GroupFrame; + LANGFChown_FileFrame := LANGsrFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGsrFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGsrFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGsrFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGsrFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGsrmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGsrmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGsrmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGsrBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGsrmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGsrTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGsrSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGsrPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGsrPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGsrPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGsrPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGsrPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGsrPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGsrPreferences_NumHistoryItems; + LANGPreferences_Default := LANGsrPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGsrPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGsrPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGsrPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGsrPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGsrPreferences_Viewer; + LANGPreferences_Editor := LANGsrPreferences_Editor; + LANGPreferences_Terminal := LANGsrPreferences_Terminal; + LANGPreferences_ListFont := LANGsrPreferences_ListFont; + LANGPreferences_Change := LANGsrPreferences_Change; + LANGPreferences_UseDefaultFont := LANGsrPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGsrPreferences_Foreground; + LANGPreferences_Background := LANGsrPreferences_Background; + LANGPreferences_NormalItem := LANGsrPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGsrPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGsrPreferences_Cursor; + LANGPreferences_InactiveItem := LANGsrPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGsrPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGsrPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGsrPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGsrPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGsrPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGsrPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGsrPreferences_DefaultS; + LANGPreferences_SelectFont := LANGsrPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGsrBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGsrUpButton_Tooltip; + LANGRootButton_Tooltip := LANGsrRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGsrHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGsrLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGsrRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGsrmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGsrmiTargetSource_Caption; + LANGFileTypeDirectory := LANGsrFileTypeDirectory; + LANGFileTypeFile := LANGsrFileTypeFile; + LANGFileTypeMetafile := LANGsrFileTypeMetafile; + LANGPreferencesPanelsPage := LANGsrPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGsrPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGsrPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGsrPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGsrPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGsrPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGsrPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGsrPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGsrPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGsrPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGsrPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGsrPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGsrPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGsrPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGsrPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGsrPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGsrPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGsrPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGsrPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGsrPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGsrPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGsrPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGsrPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGsrPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGsrPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGsrPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGsrPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGsrPreferencesViewer; + LANGPreferencesCommandSC := LANGsrPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGsrPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGsrPreferencesEditor; + LANGPreferencesTerminal := LANGsrPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGsrPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGsrPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGsrPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGsrPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGsrPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGsrPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGsrPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGsrPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGsrmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGsrmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGsrmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGsrmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGsrmnuNetworkCaption; + LANGmiConnectionsCaption := LANGsrmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGsrmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGsrmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGsrmnuPluginsCaption; + LANGmiTestPluginCaption := LANGsrmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGsrmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGsrmiColumnsCaption; + LANGmiSavePositionCaption := LANGsrmiSavePositionCaption; + LANGmiMountCaption := LANGsrmiMountCaption; + LANGmiUmountCaption := LANGsrmiUmountCaption; + LANGmiEjectCaption := LANGsrmiEjectCaption; + LANGmiDuplicateTabCaption := LANGsrmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGsrmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGsrmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGsrCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGsrCannotLoadFile; + LANGMountPointDevice := LANGsrMountPointDevice; + LANGMountSC := LANGsrMountSC; + LANGNoPluginsFound := LANGsrNoPluginsFound; + LANGPluginAbout := LANGsrPluginAbout; + LANGCouldntOpenURI := LANGsrCouldntOpenURI; + LANGPluginAboutInside := LANGsrPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGsrAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGsrCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGsrThereIsNoModuleAvailable; + LANGIgnoreError := LANGsrIgnoreError; + LANGErrorMount := LANGsrErrorMount; + LANGErrorUmount := LANGsrErrorUmount; + LANGErrorEject := LANGsrErrorEject; + + LANGMounterPrefs_Caption := LANGsrMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGsrMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGsrMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGsrMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGsrMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGsrMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGsrMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGsrMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGsrMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGsrMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGsrMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGsrMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGsrMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGsrMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGsrMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGsrMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGsrMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGsrMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGsrMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGsrMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGsrMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGsrMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGsrMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGsrMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGsrMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGsrMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGsrMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGsrConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGsrConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGsrConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGsrConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGsrConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGsrConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGsrConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGsrConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGsrConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGsrConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGsrConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGsrConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGsrConnProp_FTP; + LANGConnProp_SFTP := LANGsrConnProp_SFTP; + LANGConnProp_SMB := LANGsrConnProp_SMB; + LANGConnProp_HTTP := LANGsrConnProp_HTTP; + LANGConnProp_HTTPS := LANGsrConnProp_HTTPS; + LANGConnProp_Other := LANGsrConnProp_Other; + LANGConnProp_Caption := LANGsrConnProp_Caption; + LANGConnProp_VFSModule := LANGsrConnProp_VFSModule; + LANGConnProp_URI := LANGsrConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGsrConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGsrConnProp_DetailedInformations; + LANGConnProp_Name := LANGsrConnProp_Name; + LANGConnProp_Server := LANGsrConnProp_Server; + LANGConnProp_Username := LANGsrConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGsrConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGsrConnProp_Password; + LANGConnProp_TargetDirectory := LANGsrConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGsrConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGsrConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGsrConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGsrConnLogin_Caption; + LANGConnLogin_Login := LANGsrConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGsrConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGsrConnLogin_Username; + LANGConnLogin_Password := LANGsrConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGsrConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGsrColumns_Caption; + LANGColumns_Title := LANGsrColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGsrColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGsrColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGsrColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGsrColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGsrColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGsrColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGsrColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGsrColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGsrColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGsrColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGsrColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGsrColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGsrColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGsrColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGsrColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGsrColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGsrColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGsrColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGsrColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGsrColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGsrColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGsrColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGsrTestPlugin_Caption; + LANGTestPlugin_Title := LANGsrTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGsrTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGsrTestPlugin_Plugin; + LANGTestPlugin_Command := LANGsrTestPlugin_Command; + LANGTestPlugin_Username := LANGsrTestPlugin_Username; + LANGTestPlugin_Password := LANGsrTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGsrTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGsrTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGsrRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGsrRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGsrRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGsrSearch_Bytes; + LANGSearch_kB := LANGsrSearch_kB; + LANGSearch_MB := LANGsrSearch_MB; + LANGSearch_days := LANGsrSearch_days; + LANGSearch_weeks := LANGsrSearch_weeks; + LANGSearch_months := LANGsrSearch_months; + LANGSearch_years := LANGsrSearch_years; + LANGSearch_Caption := LANGsrSearch_Caption; + LANGSearch_General := LANGsrSearch_General; + LANGSearch_Advanced := LANGsrSearch_Advanced; + LANGSearch_SearchResults := LANGsrSearch_SearchResults; + LANGSearch_SearchFor := LANGsrSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGsrSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGsrSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGsrSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGsrSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGsrSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGsrSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGsrSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGsrSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGsrSearch_Size; + LANGSearch_Date := LANGsrSearch_Date; + LANGSearch_BiggerThan := LANGsrSearch_BiggerThan; + LANGSearch_SmallerThan := LANGsrSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGsrSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGsrSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGsrSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGsrSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGsrSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGsrSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGsrSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGsrSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGsrSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGsrSearch_StatusSC; + LANGSearch_Ready := LANGsrSearch_Ready; + LANGSearch_PreparingToSearch := LANGsrSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGsrSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGsrSearch_UserCancelled; + LANGSearch_SearchFinished := LANGsrSearch_SearchFinished; + LANGSearch_FilesFound := LANGsrSearch_FilesFound; + LANGSearch_And := LANGsrSearch_And; + + LANGCloseOpenConnection := LANGsrCloseOpenConnection; + LANGDuplicateTabWarning := LANGsrDuplicateTabWarning; + LANGDontShowAgain := LANGsrDontShowAgain; + LANGSwitchOtherPanelWarning := LANGsrSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGsrOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGsrmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGsrDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGsrLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGsrOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGsrOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGsrShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGsrShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGsrmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGsrFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGsrCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGsrmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGsrPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGsrHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGsrHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGsrHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGsrHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGsrHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGsrFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGsrFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGsrFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGsrFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGsrFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGsrFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGsrFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGsrFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGsrFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGsrFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGsrFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGsrFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGsrFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGsrFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGsrFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('SR', @SetTranslation); + AddTranslation('sr_YU', @SetTranslation); + AddTranslation('sr_YU.ISO_8859_2', @SetTranslation); +end. diff --git a/translations/UTranslation_SV.pas b/translations/UTranslation_SV.pas new file mode 100644 index 0000000..d11ebcf --- /dev/null +++ b/translations/UTranslation_SV.pas @@ -0,0 +1,1252 @@ +(* + Tux Commander - UTranslation_SV - Swedish Localization constants + Copyright (C) 2004 Johan kesson + !! Currently unmaintained, new translator needed !! + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_SV; + +interface + +implementation + +uses ULocale; + +const LANGsvF2Button_Caption = 'F2 - Byt namn'; + LANGsvF3Button_Caption = 'F3 - Läs'; + LANGsvF4Button_Caption = 'F4 - Editera'; + LANGsvF5Button_Caption = 'F5 - Kopiera'; + LANGsvF6Button_Caption = 'F6 - Flytta'; + LANGsvF7Button_Caption = 'F7 - MkDir'; + LANGsvF8Button_Caption = 'F8 - Ta bort'; + + LANGsvmnuFile_Caption = '_Arkiv'; + LANGsvmnuMark_Caption = '_Markera'; + LANGsvmnuCommands_Caption = '_Kommandon'; + LANGsvmnuHelp_Caption = '_Hjälp'; + LANGsvmiExit_Caption = 'E_xit'; + LANGsvmiSelectGroup_Caption = 'Välj _Grupp...'; + LANGsvmiUnselectGroup_Caption = '_Avmarkera Grupp...'; + LANGsvmiSelectAll_Caption = '_Välj Alla'; + LANGsvmiUnselectAll_Caption = 'A_vmarkera Allt'; + LANGsvmiInvertSelection_Caption = '_Omvänt Val'; + LANGsvmiRefresh_Caption = '_Uppdatera'; + LANGsvmiAbout_Caption = '_Om...'; + + LANGsvColumn1_Caption = 'Namn'; + LANGsvColumn2_Caption = 'Ext'; + LANGsvColumn3_Caption = 'Strl'; + LANGsvColumn4_Caption = 'Datum'; + LANGsvColumn5_Caption = 'Attr'; + + LANGsvExpandSelection = 'Expandera val'; + LANGsvShrinkSelection = 'Minimera val'; + LANGsvNoMatchesFound = 'Inga träffar funna'; + LANGsvNoFilesSelected = 'Inga filer valda!'; + LANGsvSelectedFilesDirectories = '%d valda filer/kataloger'; + LANGsvDirectoryS = 'katalog %s'; + LANGsvFileS = 'fil %s'; + LANGsvDoYouReallyWantToDeleteTheS = 'Vill du verkligen radera %s ?'; + LANGsvDoYouReallyWantToDeleteTheSS = 'Vill du verkligen radera %s ?'#10'%s'; + LANGsvCopyFiles = 'Kopiera filer'; + LANGsvMoveRenameFiles = 'Flytta/Döp om files'; + LANGsvCopyDFileDirectoriesTo = 'Kopiera %d fil/kataloger till'; + LANGsvMoveRenameDFileDirectoriesTo = 'Flytta/Döp om %d fil/kataloger till'; + LANGsvCopySC = 'Kopiera:'; + LANGsvMoveRenameSC = 'Flytta/Döp om:'; + + LANGsvQuickFind = ' Snabbsök:'; + + LANGsvAboutString = 'Tux Commander'#10'Version %s'#10'Build date: %s'#10#10'Copyright (c) 2008 Tomas Bzatek'#10'E-mail: tbzatek@users.sourceforge.net'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGsvAboutStringGnome = 'version %s'#10'Build date: %s'#10'Website: http://tuxcmd.sourceforge.net/'; + LANGsvDiskStatFmt = '%s of %s kB ledigt'; + LANGsvDiskStatVolNameFmt = '[%s] %s av %s kB ledigt'; + LANGsvStatusLineFmt = '%s of %s kB i %d av %d filer valda'; + LANGsvPanelStrings : array[boolean] of string = ('höger', 'vänster'); + + LANGsvDIR = ''; + LANGsvErrorGettingListingForSPanel = 'Fel vid hämtning av listning for %s panel:'#10' %s'#10#10'Sökväg = ''%s'''; + LANGsvErrorGettingListingForSPanelNoPath = 'Fel vid hämtning av listning för %s panel:'#10' %s'; + LANGsvErrorCreatingNewDirectorySInSPanel = 'Fel vid skapande av ny katalog ''%s'' i %s panel:'#10' %s'; + LANGsvErrorCreatingNewDirectorySInSPanelNoPath = 'Fel vid skapande av ny katalog i %s panel:'#10' %s'; + LANGsvTheFileDirectory = 'Filen/katalogen'; + LANGsvCouldNotBeDeleted = 'kunde inte raderas'; + LANGsvCouldNotBeDeletedS = 'kunde inte raderas: %s'; + LANGsvUserCancelled = 'Användaren avbröt!'; + LANGsvTheDirectorySIsNotEmpty = 'Katalogen %s är inte tom!'; + LANGsvCannotCopyFile = 'Kan inte kopiera fil'; + LANGsvCopyError = 'Kopieringsfel'; + LANGsvMoveError = 'Flyttningsfel'; + LANGsvOverwriteS = 'Skriv över: %s'; + LANGsvWithFileS = 'Med fil: %s'; + LANGsvOvewriteSBytesS = '%s bytes, %s'; + LANGsvTheFile = 'Filen'; + LANGsvCopy = 'Kopiera'; + LANGsvMove = 'Flytta'; + LANGsvTheDirectory = 'Katalogen'; + LANGsvTheSymbolicLink = 'Den symboliska länken'; + LANGsvCannotMoveFile = 'Kan inte flytta fil'; + LANGsvCouldNotBeCreated = 'kunde inte skapas'; + LANGsvCouldNotBeCreatedS = 'kunde inte skapas: %s'; + LANGsvFromS = 'Från: %s'; + LANGsvToS = 'Till: %s'; + LANGsvCannotCopyFileToItself = 'Kan inte kopiera fil till sig själv'; + LANGsvMemoryAllocationFailed = 'Minnesallokation misslyckades:'; + LANGsvCannotOpenSourceFile = 'Kan inte öppna källfil'; + LANGsvCannotOpenDestinationFile = 'Kan inte öppna målfil'; + LANGsvCannotCloseDestinationFile = 'Kan inte stänga målfil'; + LANGsvCannotCloseSourceFile = 'Kan inte stänga källfil'; + LANGsvCannotReadFromSourceFile = 'Kan inte läsa från källfil'; + LANGsvCannotWriteToDestinationFile = 'Kan inte skriva till målfil'; + + LANGsvUnknownException = 'Okänd Avvikelse'; + LANGsvNoAccess = 'Ingen Behörighet'; + LANGsvUnknownError = 'Okänt Fel'; + + LANGsvCreateANewDirectory = 'Skapa en ny katalog'; + LANGsvEnterDirectoryName = 'Fyll i _katalognamn:'; + + LANGsvOverwriteQuestion = 'Skriv över fråga'; + LANGsvOverwriteButton_Caption = '_Skriv över'; + LANGsvOverwriteAllButton_Caption = 'Skriv över _allt'; + LANGsvSkipButton_Caption = '_Skippa'; + LANGsvOverwriteAllOlderButton_Caption = 'Skriv över alla äldre'; + LANGsvSkipAllButton_Caption = 'S_kippa alla'; + LANGsvRenameButton_Caption = '_Byt namn'; + LANGsvAppendButton_Caption = 'L_ägg till'; + LANGsvRename = 'Byt namn'; + LANGsvRenameFile = 'Byt namn på ''%s'' till'; + LANGsvIgnoreButton_Caption = '_Ignorera'; + + LANGsvProgress = 'Framsteg'; + LANGsvCancel = '_Avbryt'; + LANGsvDelete = 'Radera:'; + + LANGsvSpecifyFileType = '_Specifiera filtyp:'; + + LANGsvRemoveDirectory = 'Radera katalog'; + LANGsvDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Vill du radera den med alla dess filer och underkataloger?'; + LANGsvRetry = '_Försök igen'; + LANGsvDeleteButton_Caption = '_Radera'; + LANGsvAll = '_Allt'; + + LANGsvCopyFilesSC = 'Kopiera filer:'; + LANGsvAppendQuestion = 'Är du säker på att du vill lägga till fil ''%s'' till ''%s''?'; + LANGsvPreparingList = 'Förbereder lista...'; + + LANGsvYouMustSelectAValidFile = 'Du måste välja en giltig fil!'; + LANGsvmiVerifyChecksums = '_Verifierar checksums'; + LANGsvVerifyChecksumsCaption = 'Verifiera checksums'; + LANGsvCheckButtonCaptionCheck = '_Kontrollera'; + LANGsvCheckButtonCaptionStop = '_Stopp'; + LANGsvFileListTooltip = '[?] - Inte kontrollerad'#10'[OK] - Checksum OK'#10'[BAD] - Checksum BAD'#10'[N/A] - Filen inte tillgänglig'; + LANGsvFilenameColumnCaption = 'Filnamn'; + LANGsvTheFileSYouAreTryingToOpenIsQuiteBig = 'Filen ''%s'' som du försöker öppna är relativt stor (%s bytes). Det kanske inte är en giltig checksum-fil.'#10#10'Vill du ladda den ändå?'; + LANGsvAnErrorOccuredWhileInitializingMemoryBlock = 'Ett fel uppstod medan minnesblocket initierades. Stäng alla program och försök igen.'; + LANGsvAnErrorOccuredWhileOpeningFileSS = 'Ett fel uppstod vid öppnandet av ''%s'':'#10' %s'; + LANGsvAnErrorOccuredWhileReadingFileSS = 'Ett fel uppstod vid läsning av ''%s'':'#10' %s'; + LANGsvChecksumNotChecked = 'Status: Inte kontrollerad'; + LANGsvChecksumChecking = 'Status: Kontrollerar...'; + LANGsvChecksumInterrupted = 'Status: Avbruten'; + LANGsvChecksumDOK = 'Status: %d%% OK'; + + LANGsvmiCreateChecksumsCaption = '_Skapa checksums...'; + LANGsvYouMustSelectAtLeastOneFileToCalculateChecksum = 'Du måste välja åtminstone en fil för att räkna ut checksums!'; + LANGsvCreateChecksumsCaption = 'Skapa checksums'; + LANGsvCCHKSUMPage1Text = 'Du kommer att skapa checksums för'#10'de valda filerna. Om du inte valde'#10'alla filer du vill användat, stäng den här druiden och'#10'välj fler filer.'; + LANGsvCCHKSUMPage4Text = 'Druiden är redo att skapa checksums för dina'#10'valda filer. Den här processen kan ta ett par minuter.'#10'Tryck Framåt för att fortsätta.'; + LANGsvCCHKSUMPage6Text = 'Det uppstod fel vid skapandet av checksums:'; + LANGsvCCHKSUMPage7Text = 'Skapandet av checksums är färdigt och'#10'dina filer är färdiga.'#10#10'Klicka "Avsluta" för att avsluta.'; + LANGsvCCHKSUMPage1Title = 'Förbered filer för checksum'; + LANGsvCCHKSUMPage2Title = 'Välj checksums-filtyper'; + LANGsvCCHKSUMPage3Title = 'Välj filnamn'; + LANGsvCCHKSUMPage4Title = 'Redo att kontrollera'; + LANGsvCCHKSUMPage5Title = 'Kontrollerar...'; + LANGsvCCHKSUMPage6Title = 'Fel!'; + LANGsvCCHKSUMPage7Title = 'Färdig'; + LANGsvCCHKSUMSFVFile = 'SFV-fil'; + LANGsvCCHKSUMMD5sumFile = 'MD5sum-fil'; + LANGsvCCHKSUMFileName = 'Fil _namn:'; + LANGsvCCHKSUMCreateSeparateChecksumFiles = 'Skapa _separata checksum-filer'; + LANGsvCCHKSUMNowProcessingFileS = 'Kontrollerar nu fil: %s'; + LANGsvCCHKSUMFinishCaption = '_Avsluta'; + LANGsvCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Är du säker på att du vill avbryta?'; + LANGsvCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Ett fel uppstod vid öppnandet av ''%s'': %s'#10; + LANGsvCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Ett fel uppstod vid läsandet av ''%s'': %s'#10; + LANGsvCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Ett fel uppstod vid skrivandet till ''%s'': %s'#10; + + LANGsvAnErrorOccuredWhileWritingFileSS = 'Ett fel uppstod vid skrivandet till ''%s'':'#10' %s'; + LANGsvTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Målfilen ''%s'' existerar redan. Vill du skriva över den?'; + LANGsvTheTargetFileSCannotBeRemovedS = 'Målfilen ''%s'' kan inte raderas: %s'; + LANGsvMergeCaption = 'Förena'; + LANGsvPleaseInsertNextDiskOrGiveDifferentLocation = 'Var god sätt i nästa disk eller ange annan plats:'; + LANGsvMergeOfSSucceeded = 'Förening av ''%s'' lyckades (CRC checksum OK).'; + LANGsvWarningCreatedFileFailsCRCCheck = 'Varning: Skapad fil passerar inte CRC-kontrollen!'; + LANGsvMergeOfSSucceeded_NoCRCFileAvailable = 'Förening av ''%s'' lyckades (ingen CRC-fil tillgänglig).'; + LANGsvMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Förena ''%s'' och alla filer med stigande namn till följande katalog:'; + LANGsvMergeSC = 'Förena:'; + LANGsvmiSplitFileCaption = '_Dela Fil...'; + LANGsvmiMergeFilesCaption = '_Förena Filer...'; + + LANGsvSplitTheFileSToDirectory = '_Dela filen ''%s'' till katalog:'; + LANGsvSplitSC = 'Dela:'; + LANGsvSplitFile = 'Dela Fil'; + LANGsvBytesPerFile = '_Bytes per fil:'; + LANGsvAutomatic = 'Automatisk'; + LANGsvDeleteFilesOnTargetDisk = '_Radera filer på måldisk (användbart på flyttbara enheter)'; + LANGsvSplitCaption = 'Dela'; + LANGsvCannotOpenFileS = 'Kan inte öppna fil ''%s'''; + LANGsvCannotSplitTheFileToMoreThan999Parts = 'Kan inte dela filen i mer än 999 delar!'; + LANGsvThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Det existerar några filer i målkatalogen:'#10'%s'#10'Vill du radera dem?'; + LANGsvThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Det finns %d filer i målkatalogen. Vill du radera dem?'; + LANGsvAnErrorOccuredWhileOperationS = 'Ett fel uppstod vid: %s'; + LANGsvSplitOfSSucceeded = 'Delning av ''%s'' lyckades.'; + LANGsvSplitOfSFailed = 'Delning av ''%s'' misslyckades!'; + + LANGsvmnuShow_Caption = 'Vis_a'; + LANGsvmiShowDotFiles_Caption = 'Visa _punktfiler'; + LANGsvTheFileYouAreTryingToOpenIsQuiteBig = 'Filen du försöker öppna är relativt stor. Genom att ladda den i ett externt program (som gedit) kan systemet bli långsamt.'#10'Vill du fortsätta?'; + LANGsvCannotExecuteSPleaseCheckTheConfiguration = 'Kan inte exekvera ''%s''. Var god kontrollera konfigurationen eller ställ in filtyps-associationen korrekt.'; + LANGsvEdit = 'Editera'; + LANGsvEnterFilenameToEdit = '_Fyll i filnamn att editera:'; + + LANGsvmnuSettings_Caption = 'In_ställningar'; + LANGsvmiFileTypes_Caption = 'Fil_typer...'; + LANGsvThereIsNoApplicationAssociatedWithS = 'Det finns inget program associerat med "%s".'#10#10'Du kan konfigurera Tux Commander att associera program med filtyper. Vill du associera ett program med den här filen?'; + LANGsvErrorExecutingCommand = 'Kommandot misslyckades!'; + LANGsvEditFileTypesCaption = 'Editera filtyper'; + LANGsvTitleLabel_Caption = 'Filtypskonfiguration'; + LANGsvExtensionsColumn = 'Extensions'; + LANGsvDescriptionColumn = 'Beskrivning'; + LANGsvFileTypesList = 'Filtypslista'; + LANGsvActionName = 'Händelsenamn'; + LANGsvCommand = 'Kommando'; + LANGsvSetDefaultActionButton_Caption = '_Sätt som standard'; + LANGsvRunInTerminalCheckBox_Caption = 'Kör i _Terminal'; + LANGsvAutodetectCheckBox_Caption = 'Autoupptäck _GUI-program'; + LANGsvBrowseButton_Caption = '_Bläddra...'; + LANGsvCommandLabel_Caption = 'Ko_mmando:'; + LANGsvDescriptionLabel_Caption = 'B_eskrivning:'; + LANGsvFNameExtLabel_Caption = 'L_ägg till extension:'; + LANGsvNotebookPageExtensions = 'Filtyp'; + LANGsvNotebookPageActions = 'Händelser'; + LANGsvDefault = ' (standard)'; + LANGsvCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Kan inte spara filtypsassociation därför att en annan process har uppdaterat den under tiden som det här programmet körts.'; + + LANGsvDefaultColor = 'St_andardfärg'; + LANGsvIcon = '_Ikon:'; + LANGsvBrowseForIcon = 'Bläddra efter ikon'; + LANGsvSelectFileTypeColor = 'Välj filtypsfärg'; + LANGsvColor = 'Fä_rg:'; + + LANGsvmiChangePermissions_Caption = 'Ändra Rät_ttigheter...'; + LANGsvmiChangeOwner_Caption = 'Ändra _Ägare/Grupp...'; + LANGsvmiCreateSymlink_Caption = 'Skapa Sym_länk...'; + LANGsvmiEditSymlink_Caption = '_Editera Symlänk...'; + LANGsvChmodProgress = 'Ändra rättigheter:'; + LANGsvChownProgress = 'Ändra ägare:'; + LANGsvYouMustSelectAValidSymbolicLink = 'Du måste välja en giltig symbolisk länk!'; + LANGsvPopupRunS = 'E_xekvera %s'; + LANGsvPopupOpenS = 'Ö_ppna %s'; + LANGsvPopupGoUp = '_Gå upp'; + LANGsvPopupOpenWithS = 'Öppna med %s'; + LANGsvPopupDefault = ' (standard)'; + LANGsvPopupOpenWith = 'Ö_ppna med...'; + LANGsvPopupViewFile = '_Läs fil'; + LANGsvPopupEditFile = 'Ed_itera fil'; + LANGsvPopupMakeSymlink = 'Skapa _symlänk'; + LANGsvPopupRename = '_Döp om'; + LANGsvPopupDelete = '_Radera'; + LANGsvDialogChangePermissions = 'Ändra rättigheter'; + LANGsvCouldNotBeChmoddedS = 'kunde inte chmoddas: %s'; + LANGsvDialogChangeOwner = 'Ändra ägare'; + LANGsvCouldNotBeChownedS = 'kunde inte chownas: %s'; + LANGsvDialogMakeSymlink = 'Skapa symlänk'; + LANGsvDialogEditSymlink = 'Editera symlänk'; + LANGsvFEditSymlink_Caption = 'Editera symbolisk länk'; + LANGsvFEditSymlink_SymbolicLinkFilename = '_Symbolisk länk filnamn:'; + LANGsvFEditSymlink_SymbolicLinkPointsTo = 'Symbolisk länk pekar _på:'; + + LANGsvFChmod_Caption = 'Tillgå Rättigheter'; + LANGsvFChmod_PermissionFrame = 'Rättigheter'; + LANGsvFChmod_FileFrame = 'Fil'; + LANGsvFChmod_ApplyRecursivelyFor = 'Applicera _rekursivt för'; + LANGsvFChmod_miAllFiles = 'Alla filer och kataloger'; + LANGsvFChmod_miDirectories = 'Endast kataloger'; + LANGsvFChmod_OctalLabel = '_Oktal:'; + LANGsvFChmod_SUID = 'SUID - Sätt användar ID vid exekvering'; + LANGsvFChmod_SGID = 'SGID - Sätt användar group ID vid exekvering'; + LANGsvFChmod_Sticky = 'Sticky bit'; + LANGsvFChmod_RUSR = 'RUSR - Läs av ägare'; + LANGsvFChmod_WUSR = 'WUSR - Skriv av ägare'; + LANGsvFChmod_XUSR = 'XUSR - Exekvera/Sök av ägare'; + LANGsvFChmod_RGRP = 'RGRP - Läs av grupp'; + LANGsvFChmod_WGRP = 'WGRP - Skriv av grupp'; + LANGsvFChmod_XGRP = 'XGRP - Exekvera/Sök av grupp'; + LANGsvFChmod_ROTH = 'ROTH - Läs av andra'; + LANGsvFChmod_WOTH = 'WOTH - Skriv av andra'; + LANGsvFChmod_XOTH = 'XOTH - Exekvera/Sök av andra'; + LANGsvFChmod_TextLabel = 'Text: %s'; + LANGsvFChmod_FileLabel = 'Fil: %s'#10'Text: %s'#10 + + 'Oktal: %d'#10'Ägare: %s'#10 + + 'Grupp: %s'; + + LANGsvFChown_Caption = 'Ändra ägare/grupp'; + LANGsvFChown_OwnerFrame = 'Användarnamn'; + LANGsvFChown_GroupFrame = 'Gruppname'; + LANGsvFChown_FileFrame = 'Fil'; + LANGsvFChown_ApplyRecursively = 'Applicera _rekursivt'; + + LANGsvFSymlink_Caption = 'Skapa symbolisk länk'; + LANGsvFSymlink_ExistingFilename = '_Befintligt filnamn (filnamnets symlänk kommer peka på):'; + LANGsvFSymlink_SymlinkFilename = '_Symbolisk länks filnamn:'; + + LANGsvmnuBookmarks_Caption = '_Bokmärken'; + LANGsvmiAddBookmark_Caption = 'Lägg till Bokmärke'; + LANGsvmiEditBookmarks_Caption = 'Editera Bokmärken'; + LANGsvBookmarkPopupDelete_Caption = '_Radera'; + LANGsvmiPreferences_Caption = '_Inställningar...'; + LANGsvTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Nuvarande katalog finns redan i bokmärkelistan'; + LANGsvSomeOtherInstanceChanged = 'En annan instans av Tux Commander ändrade konfigurationen. Vill du applicera de nya inställningarna?'#10#10'Varning: Om du trycker Nej nu kommer konfigurationen skrivas över från den här instansen'' exit!'; + + LANGsvPreferences_Caption = 'Inställningar'; + LANGsvPreferences_TitleLabel_Caption = 'Applikationsinställningar'; + LANGsvPreferences_GeneralPage = 'Allmänt'; + LANGsvPreferences_FontsPage = 'Teckensnitt'; + LANGsvPreferences_ColorsPage = 'Färger'; + LANGsvPreferences_RowHeight = 'Rad _höjd:'; + LANGsvPreferences_NumHistoryItems = '_Kommandoradens gamla poster:'; + LANGsvPreferences_Default = 'Standard'; + LANGsvPreferences_ClearReadonlyAttribute = 'Ta bort _skrivskydd-sattribut vid kopiering från CD-ROM'; + LANGsvPreferences_DisableMouseRenaming = 'Inaktivera namnbyte via _mus'; + LANGsvPreferences_ShowFiletypeIconsInList = 'Visa _filtypsikoner'; + LANGsvPreferences_ExternalAppsLabel = 'Externa program'; + LANGsvPreferences_Viewer = '_Visningsprogram:'; + LANGsvPreferences_Editor = '_Editerare:'; + LANGsvPreferences_Terminal = '_Terminal:'; + LANGsvPreferences_ListFont = 'List-teckensnitt:'; + LANGsvPreferences_Change = 'Ändra...'; + LANGsvPreferences_UseDefaultFont = 'Använd _standardteckensnitt'; + LANGsvPreferences_Foreground = 'Förgrund'; + LANGsvPreferences_Background = 'Bakgrund'; + LANGsvPreferences_NormalItem = 'Normalt:'; + LANGsvPreferences_SetToDefaultToUseGTKThemeColors = 'Sätt som standard att använda GTK-temafärger'; + LANGsvPreferences_Cursor = 'Muspekare:'; + LANGsvPreferences_InactiveItem = 'Inaktiva:'; + LANGsvPreferences_SelectedItem = 'Valda:'; + LANGsvPreferences_LinkItem = 'Symboliska länkar:'; + LANGsvPreferences_LinkItemHint = 'Sätt som standard att visa symlänkar med normala färger'; + LANGsvPreferences_DotFileItem = 'Punktfiler:'; + LANGsvPreferences_DotFileItemHint = 'Sätt som standard att visa punktfiler med normala färger'; + LANGsvPreferences_BrowseForApplication = 'Bläddra efter applikation'; + LANGsvPreferences_DefaultS = 'Standard: %s'; + LANGsvPreferences_SelectFont = 'Välj teckensnitt'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGsvBookmarkButton_Tooltip = 'Visa bokmärken'; + LANGsvUpButton_Tooltip = 'Gå till övre katalog'; + LANGsvRootButton_Tooltip = 'Gå till rotkatalog (/)'; + LANGsvHomeButton_Tooltip = 'Gå till hemkatalog (/home/user)'; + LANGsvLeftEqualButton_Tooltip = 'Byt högerpanalen till samma katalog'; + LANGsvRightEqualButton_Tooltip = 'Byt högerpanalen till samma katalog'; + LANGsvmiShowDirectorySizes_Caption = 'Visa k_atalogstorlek'; + LANGsvmiTargetSource_Caption = 'Mål = Källa'; + LANGsvFileTypeDirectory = 'Katalog'; + LANGsvFileTypeFile = 'Fil'; + LANGsvFileTypeMetafile = 'Detta är en vanlig meta'; + LANGsvPreferencesPanelsPage = 'Paneler'; + LANGsvPreferencesApplicationsPage = 'Applikationer'; + LANGsvPreferencesExperimentalPage = 'Experimentiell'; + LANGsvPreferencesSelectAllDirectoriesCheckBox_Caption = 'Välj _även kataloger när allt markeras'; + LANGsvPreferencesNewStyleAltOCheckBox_Caption = '_Ny stil Alt+O'; + LANGsvPreferencesNewStyleAltOCheckBox_Tooltip = 'Stanna i samma katalog vid byte av katalog mittemot panel genom att trycka Ctrl/Alt+O'; + LANGsvPreferencesShowFuncButtonsCheckBox_Caption = 'Visa funktion_knappar'; + LANGsvPreferencesSizeFormatLabel_Caption = '_Storleksformat:'; + LANGsvPreferencesmiSizeFormat1 = 'System'; + LANGsvPreferencesmiSizeFormat6 = 'Grupperad'; + LANGsvPreferencesAutodetectXApp = 'Autodetecta X app'; + LANGsvPreferencesAlwaysRunInTerminal = 'Kör alltid i terminal'; + LANGsvPreferencesNeverRunInTerminal = 'Kör aldrig i terminal'; + LANGsvPreferencesCmdLineBehaviourLabel_Caption = '_Exekverar från kommandoraden:'; + LANGsvPreferencesFeatures = 'Finesser'; + LANGsvPreferencesDisableMouseRename_Tooltip = 'Du kan fortfarande göra snabb omdöpning av filer genom att trycka Shift+F6'; + LANGsvPreferencesDisableFileTipsCheckBox_Caption = 'Avaktivera fil _tips'; + LANGsvPreferencesDisableFileTipsCheckBox_Tooltip = 'Visa inte tips om texten i en kolumn är avskuren'; + LANGsvPreferencesShow = 'Visa'; + LANGsvPreferencesDirsInBoldCheckBox_Caption = 'Kataloger i _fetstil'; + LANGsvPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Avaktivera katalog p_aranteser'; + LANGsvPreferencesOctalPermissionsCheckBox_Caption = 'Visa _oktala rättigheter'; + LANGsvPreferencesOctalPermissionsCheckBox_Tooltip = 'Visa fil/katalog-rättigheter som nummer istället för i textform (-rw-rw-rw-)'; + LANGsvPreferencesMovement = 'Rörelse'; + LANGsvPreferencesLynxLikeMotionCheckBox_Caption = '_Lynx-liknande rörelse'; + LANGsvPreferencesInsertMovesDownCheckBox_Caption = '_Insert scrollar uppåt'; + LANGsvPreferencesSpaceMovesDownCheckBox_Caption = '_Space scrollar neråt'; + LANGsvPreferencesViewer = 'Läsare'; + LANGsvPreferencesCommandSC = 'Kommando:'; + LANGsvPreferencesUseInternalViewer = 'Använd _intern läsare'; + LANGsvPreferencesEditor = 'Redigerare'; + LANGsvPreferencesTerminal = 'Terminal'; + LANGsvPreferencesExperimentalFeatures = 'Experimentiella finesser'; + LANGsvPreferencesExperimentalWarningLabel_Caption = 'Warning: Dessa funktioner är under utveckling och kanske inte fungerar som väntat. Använd dem på egen risk!'; + LANGsvPreferencesFocusRefreshCheckBox_Caption = '_Uppdatera vid fönsterfokusering'; + LANGsvPreferencesFocusRefreshCheckBox_Tooltip = 'Väldigt långsam panel-uppdatering just nu'; + LANGsvPreferencesWMCompatModeCheckBox_Caption = '_WM Kompatibilitetsläge'; + LANGsvPreferencesWMCompatModeCheckBox_Tooltip = 'Använd om du har problem med din window manager (IceWM kan inte maximera fönster riktigt tex.)'; + LANGsvPreferencesCompatUseLibcSystemCheckBox_Caption = 'Använd libc _system() för att köra program'; + LANGsvPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Använd mot frysning eller krasch vid start av externa applikationer'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGsvmiSearchCaption2 = '_Search...'; + LANGsvmiNoMounterBarCaption = 'Do_n''t show mounter bar'; + LANGsvmiShowOneMounterBarCaption = 'Show _one mounter bar'; + LANGsvmiShowTwoMounterBarCaption = 'Show _two mounter bars'; + LANGsvmnuNetworkCaption = 'N_etwork'; + LANGsvmiConnectionsCaption = '_Connections...'; + LANGsvmiOpenConnectionCaption = '_Open connection...'; + LANGsvmiQuickConnectCaption = '_Quick connect...'; + LANGsvmnuPluginsCaption = 'Pl_ugins'; + LANGsvmiTestPluginCaption = '_Test plugin...'; + LANGsvmiMounterSettingsCaption = '_Mounter Settings...'; + LANGsvmiColumnsCaption = 'P_anel Columns...'; + LANGsvmiSavePositionCaption = '_Save position'; + LANGsvmiMountCaption = '_Mount'; + LANGsvmiUmountCaption = '_Umount'; + LANGsvmiEjectCaption = '_Eject'; + LANGsvmiDuplicateTabCaption = 'Duplicate current tab'; + LANGsvmiCloseTabCaption = 'Close current tab'; + LANGsvmiCloseAllTabsCaption = 'Close all tabs'; + LANGsvCannotDetermineDestinationEngine = 'Cannot determine destination engine. Please enter correct path and try it again.'; + LANGsvCannotLoadFile = 'Cannot load file ''%s''. Please check the permissions.'; + LANGsvMountPointDevice = 'Mount Point: %s'#10'Device: %s'; + LANGsvMountSC = 'Mount:'; + LANGsvNoPluginsFound = 'No plugins found'; + LANGsvPluginAbout = 'About...'; + LANGsvCouldntOpenURI = 'Couldn''t open the URI specified. Please check the consistency of the resource identifier and the access permission.'; + LANGsvPluginAboutInside = 'Plugin: %s'#10#10'%s'#10'%s'; + LANGsvAreYouSureCloseAllTabs = 'Are you sure you want to close all inactive tabs?'; + LANGsvCouldntOpenURIArchive = 'Couldn''t open the archive. Please check consistency and access permissions.'; + LANGsvThereIsNoModuleAvailable = 'There are no VFS modules available that can handle this connection'; + LANGsvIgnoreError = 'Do you really want to ignore the error? The source file will be then deleted'; + LANGsvErrorMount = 'There was an error while mounting the device ''%s'':'#10#10; + LANGsvErrorUmount = 'There was an error while umounting the device ''%s'':'#10#10; + LANGsvErrorEject = 'There was an error while ejecting the device ''%s'':'#10#10; + + LANGsvMounterPrefs_Caption = 'Mounter Settings'; + LANGsvMounterPrefs_TitleLabelCaption = 'Mounter Settings'; + LANGsvMounterPrefs_ListViewFrameCaption = 'Mounter'; + LANGsvMounterPrefs_MountName = 'Mount Name'; + LANGsvMounterPrefs_MountPoint = 'Mount Point'; + LANGsvMounterPrefs_Device = 'Device'; + LANGsvMounterPrefs_MoveUpButtonTooltip = 'Move item up'; + LANGsvMounterPrefs_MoveDownButtonTooltip = 'Move item down'; + LANGsvMounterPrefs_UseFSTabDefaultsCheckBox = 'Use _fstab default items'; + LANGsvMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'By checking this, the mounter bar will be filled by default items found in the /etc/fstab (system mountlist file)'; + LANGsvMounterPrefs_ToggleModeCheckBox = 'Buttons stay _down when mounted'; + LANGsvMounterPrefs_ToggleModeCheckBoxTooltip = 'When checked, the mounter buttons will stay down if the device is mounted; another click will cause umounting them (eject in this case)'; + LANGsvMounterPrefs_PropertiesFrameCaption = 'Mounter item properties'; + LANGsvMounterPrefs_DisplayTextLabelCaption = 'Displayed _Text:'; + LANGsvMounterPrefs_MountPointLabelCaption = 'Mount _Point:'; + LANGsvMounterPrefs_MountDeviceLabelCaption = '_Device:'; + LANGsvMounterPrefs_DeviceTypeLabelCaption = 'Device T_ype:'; + LANGsvMounterPrefs_miLocalDiskCaption = 'Local disk'; + LANGsvMounterPrefs_miRemovableCaption = 'Removable'; + LANGsvMounterPrefs_miCDCaption = 'CD/DVD drive'; + LANGsvMounterPrefs_miFloppyCaption = 'Floppy drive'; + LANGsvMounterPrefs_miNetworkCaption = 'Network'; + LANGsvMounterPrefs_MountCommandLabelCaption = 'Mount _Command:'; + LANGsvMounterPrefs_UmountCommandLabelCaption = 'Umount C_ommand:'; + LANGsvMounterPrefs_MountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default mount'#10'Note: beware of interactive commands, tuxcmd could freeze!'#10'Example: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGsvMounterPrefs_UmountCommandEntryTooltip = 'Syntax: use %dev for substitution of the device and %dir for the mount point or leave blank for default umount'#10'Example: smbumount $dir'; + LANGsvMounterPrefs_IconLabelCaption = '_Icon:'; + + LANGsvConnMgr_Caption = 'Open New Connection'; + LANGsvConnMgr_ConnectButton = 'Co_nnect'; + LANGsvConnMgr_OpenConnection = 'Open Connection'; + LANGsvConnMgr_NameColumn = 'Name'; + LANGsvConnMgr_URIColumn = 'URI'; + LANGsvConnMgr_AddConnectionButtonCaption = '_Add site...'; + LANGsvConnMgr_AddConnectionButtonTooltip = 'Add new connection'; + LANGsvConnMgr_EditButtonCaption = '_Edit...'; + LANGsvConnMgr_EditButtonTooltip = 'Edit selected connection'; + LANGsvConnMgr_RemoveButtonCaption = '_Remove site'; + LANGsvConnMgr_RemoveButtonTooltip = 'Delete selected connection'; + LANGsvConnMgr_DoYouWantDelete = 'Do you really want to delete the connection ''%s''?'; + + LANGsvConnProp_FTP = 'FTP'; + LANGsvConnProp_SFTP = 'SFTP (ssh subsystem)'; + LANGsvConnProp_SMB = 'Windows share (SMB)'; + LANGsvConnProp_HTTP = 'WebDAV (HTTP)'; + LANGsvConnProp_HTTPS = 'Secure WebDAV (HTTPS)'; + LANGsvConnProp_Other = 'Other (please specify in URI)'; + LANGsvConnProp_Caption = 'Connection properties'; + LANGsvConnProp_VFSModule = '_VFS module:'; + LANGsvConnProp_URI = '_URI:'; + LANGsvConnProp_URIEntryTooltip = 'Correct URI should contain service type prefix and server address'; + LANGsvConnProp_DetailedInformations = 'Detailed informations'; + LANGsvConnProp_Name = '_Name:'; + LANGsvConnProp_Server = 'Ser_ver[:port]:'; + LANGsvConnProp_Username = 'Userna_me:'; + LANGsvConnProp_UserNameEntryTooltip = 'Leave blank for anonymous login'; + LANGsvConnProp_Password = '_Password:'; + LANGsvConnProp_TargetDirectory = 'Target _directory:'; + LANGsvConnProp_ServiceType = '_Service type:'; + LANGsvConnProp_MaskPassword = '_Mask password'; + LANGsvConnProp_MenuItemCaption = 'Default (all suitable modules)'; + + LANGsvConnLogin_Caption = 'Authentication required'; + LANGsvConnLogin_Login = 'Login'; + LANGsvConnLogin_ExperimentalWarningLabelCaption = 'You must log in to access %s'; + LANGsvConnLogin_Username = '_Username:'; + LANGsvConnLogin_Password = '_Password:'; + LANGsvConnLogin_AnonymousCheckButton = '_Anonymous'; + + LANGsvColumns_Caption = 'Panel Columns Settings'; + LANGsvColumns_Title = 'Panel Columns Settings'; + LANGsvColumns_MoveUpButtonTooltip = 'Move item up'; + LANGsvColumns_MoveDownButtonTooltip = 'Move item down'; + LANGsvColumns_TitlesLongName = 'Name'; + LANGsvColumns_TitlesLongNameExt = 'Name + Extension'; + LANGsvColumns_TitlesLongExt = 'Extension'; + LANGsvColumns_TitlesLongSize = 'Size'; + LANGsvColumns_TitlesLongDateTime = 'Date + Time'; + LANGsvColumns_TitlesLongDate = 'Date'; + LANGsvColumns_TitlesLongTime = 'Time'; + LANGsvColumns_TitlesLongUser = 'User'; + LANGsvColumns_TitlesLongGroup = 'Group'; + LANGsvColumns_TitlesLongAttr = 'Attributes'; + LANGsvColumns_TitlesShortName = 'Name'; + LANGsvColumns_TitlesShortNameExt = 'Name'; + LANGsvColumns_TitlesShortExt = 'Ext'; + LANGsvColumns_TitlesShortSize = 'Size'; + LANGsvColumns_TitlesShortDateTime = 'Date'; + LANGsvColumns_TitlesShortDate = 'Date'; + LANGsvColumns_TitlesShortTime = 'Time'; + LANGsvColumns_TitlesShortUser = 'User'; + LANGsvColumns_TitlesShortGroup = 'Group'; + LANGsvColumns_TitlesShortAttr = 'Attr'; + + LANGsvTestPlugin_Caption = 'Test VFS Plugin'; + LANGsvTestPlugin_Title = 'Test VFS Plugin'; + LANGsvTestPlugin_ExperimentalWarningLabelCaption = 'Warning: The VFS subsystem and its plugins are under heavy development and may contain bugs. Use this function under your own risk!'; + LANGsvTestPlugin_Plugin = '_Plugin:'; + LANGsvTestPlugin_Command = 'Co_mmand:'; + LANGsvTestPlugin_Username = '_Username:'; + LANGsvTestPlugin_Password = '_Password:'; + LANGsvTestPlugin_AnonymousCheckButton = '_Anonymous login (doesn''t call VFSLogin)'; + LANGsvTestPlugin_NoPluginsFound = 'No plugins found'; + + LANGsvRemoteWait_Caption = 'Operation in progress'; + LANGsvRemoteWait_OperationInProgress = 'Operation in progress, please be patient...'; + LANGsvRemoteWait_ItemsFound = 'Items found so far: %d'; + + LANGsvSearch_Bytes = 'Bytes'; + LANGsvSearch_kB = 'kB'; + LANGsvSearch_MB = 'MB'; + LANGsvSearch_days = 'days'; + LANGsvSearch_weeks = 'weeks'; + LANGsvSearch_months = 'months'; + LANGsvSearch_years = 'years'; + LANGsvSearch_Caption = 'Find Files'; + LANGsvSearch_General = 'General'; + LANGsvSearch_Advanced = 'Advanced'; + LANGsvSearch_SearchResults = 'Search _Results:'; + LANGsvSearch_SearchFor = 'Search _for:'; + LANGsvSearch_FileMaskEntryTooltip = 'Tip: Use colons (";") to specify multiple files to find'; + LANGsvSearch_SearchIn = 'Search _in:'; + LANGsvSearch_SearchArchivesCheckButton = 'Search _archives'; + LANGsvSearch_FindText = 'Find _text:'; + LANGsvSearch_FindTextEntryTooltip = 'Leave blank for no text matching'#10'Please note that we are using UTF-8 in GUI part'; + LANGsvSearch_CaseSensitiveCheckButton = 'Cas_e sensitive'; + LANGsvSearch_StayCurrentFSCheckButton = 'Include other files_ystems'; + LANGsvSearch_CaseSensitiveMatchCheckButton = 'Ca_se sensitive'; + LANGsvSearch_Size = 'Size'; + LANGsvSearch_Date = 'Date'; + LANGsvSearch_BiggerThan = '_Bigger than'; + LANGsvSearch_SmallerThan = '_Smaller than'; + LANGsvSearch_ModifiedBetweenRadioButton = '_Modified between'; + LANGsvSearch_NotModifiedAfterRadioButton = '_Not modified after'; + LANGsvSearch_ModifiedLastRadioButton = 'Mod_ified in the last'; + LANGsvSearch_ModifiedNotLastRadionButton = 'No_t modified in the last'; + LANGsvSearch_ModifiedBetweenEntry1 = '"Please use this date format:" c'; + LANGsvSearch_ViewButtonCaption = '_View file'; + LANGsvSearch_NewSearchButtonCaption = '_New search'; + LANGsvSearch_GoToFileButtonCaption = '_Go to file'; + LANGsvSearch_FeedToListboxButtonCaption = 'Feed to _listbox'; + LANGsvSearch_StatusSC = 'Status:'; + LANGsvSearch_Ready = 'Ready.'; + LANGsvSearch_PreparingToSearch = 'Preparing to search.'; + LANGsvSearch_SearchInProgress = 'Search in progress:'; + LANGsvSearch_UserCancelled = 'User cancelled.'; + LANGsvSearch_SearchFinished = 'Search finished'; + LANGsvSearch_FilesFound = '%d files found'; + LANGsvSearch_And = 'and'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGsvCloseOpenConnection = 'You''re trying to open new connection over the another active connection. By continuing, the previous connection will be closed and replaced by the new requested one.'#10#10'Do you want to continue?'; + LANGsvDuplicateTabWarning = 'You are trying to open a new tab from a remote directory. However, engine cloning is not supported. The directory in the new tab will point to a local filesystem.'; + LANGsvDontShowAgain = '_Don''t show this message again'; + LANGsvSwitchOtherPanelWarning = 'You are trying to open the remote directory in the opposite panel. However, engine cloning is not supported. The target directory will not be switched.'; + LANGsvOpenConnectionsWarning = 'There are some active connections opened in the panel. By closing the application, these connections will be disconnected.'#10#10'Do you want to continue quit?'; + LANGsvmiDisconnect_Caption = '_Disconnect'; + LANGsvDisconnectButton_Tooltip = 'Disconnect active connection'; + LANGsvLeaveArchiveButton_Tooltip = 'Close current archive'; + LANGsvOpenTerminalButton_Tooltip = 'Opens a new terminal windows from the current directory'; + LANGsvOpenTerminalButton_Caption = 'Open Te_rminal'; + LANGsvShowTextUIDsCheckBox_Caption = 'Show text _UIDs'; + LANGsvShowTextUIDsCheckBox_Tooltip = 'Show textual User and Group informations instead of numbers (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGsvmiNewTab_Caption = 'New folder _tab'; + LANGsvFilePopupMenu_Properties = '_Properties'; + LANGsvCommandEntry_Tooltip = 'Use %s as file/directory placeholder'; + LANGsvmiFiles_Caption = 'Files only'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGsvPasswordButton_Tooltip = 'Archive requires password.'#10'Click to set'; + LANGsvHandleRunFromArchive_Bytes = 'bytes'; + LANGsvHandleRunFromArchive_FileTypeDesc_Unknown = '(unknown)'; + LANGsvHandleRunFromArchive_NotAssociated = '(not associated)'; + LANGsvHandleRunFromArchive_SelfExecutable = '(self-executable)'; + LANGsvHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Couldn''t create temporary directory "%s": %s.'#10#10'Please check the temporary directory settings and try it again.'; + LANGsvFRunFromVFS_Caption = 'Packed file properties'; + LANGsvFRunFromVFS_TitleLabel = 'File Properties'; + LANGsvFRunFromVFS_FileNameLabel = 'File name:'; + LANGsvFRunFromVFS_FileTypeLabel = 'File type:'; + LANGsvFRunFromVFS_SizeLabel = 'Size:'; + LANGsvFRunFromVFS_PackedSizeLabel = 'Compressed size:'; + LANGsvFRunFromVFS_DateLabel = 'Modify date:'; + LANGsvFRunFromVFS_InfoLabel = 'Opening files directly from archives is not supported. By clicking the buttons below the file (all files respectively) will be extracted to a temporary location. Temporary files will be deleted when you close Tux Commander.'; + LANGsvFRunFromVFS_OpensWithLabel = 'Open with:'; + LANGsvFRunFromVFS_ExecuteButton = 'E_xtract and open'; + LANGsvFRunFromVFS_ExecuteAllButton = 'Extract _all and open'; + LANGsvFSetPassword_Caption = 'Set password'; + LANGsvFSetPassword_Label1_Caption = 'Password required'; + LANGsvFSetPassword_Label2_Caption = 'The archive is encrypted and requires password in order to extract the data'; + LANGsvFSetPassword_ShowPasswordCheckButton = 'Un_mask password'; + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGsvF2Button_Caption; + LANGF3Button_Caption := LANGsvF3Button_Caption; + LANGF4Button_Caption := LANGsvF4Button_Caption; + LANGF5Button_Caption := LANGsvF5Button_Caption; + LANGF6Button_Caption := LANGsvF6Button_Caption; + LANGF7Button_Caption := LANGsvF7Button_Caption; + LANGF8Button_Caption := LANGsvF8Button_Caption; + + LANGmnuFile_Caption := LANGsvmnuFile_Caption; + LANGmnuMark_Caption := LANGsvmnuMark_Caption; + LANGmnuCommands_Caption := LANGsvmnuCommands_Caption; + LANGmnuHelp_Caption := LANGsvmnuHelp_Caption; + LANGmiExit_Caption := LANGsvmiExit_Caption; + LANGmiSelectGroup_Caption := LANGsvmiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGsvmiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGsvmiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGsvmiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGsvmiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGsvmiRefresh_Caption; + LANGmiAbout_Caption := LANGsvmiAbout_Caption; + + LANGColumn1_Caption := LANGsvColumn1_Caption; + LANGColumn2_Caption := LANGsvColumn2_Caption; + LANGColumn3_Caption := LANGsvColumn3_Caption; + LANGColumn4_Caption := LANGsvColumn4_Caption; + LANGColumn5_Caption := LANGsvColumn5_Caption; + + LANGExpandSelection := LANGsvExpandSelection; + LANGShrinkSelection := LANGsvShrinkSelection; + LANGNoMatchesFound := LANGsvNoMatchesFound; + LANGNoFilesSelected := LANGsvNoFilesSelected; + LANGSelectedFilesDirectories := LANGsvSelectedFilesDirectories; + LANGDirectoryS := LANGsvDirectoryS; + LANGFileS := LANGsvFileS; + LANGDoYouReallyWantToDeleteTheS := LANGsvDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGsvDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGsvCopyFiles; + LANGMoveRenameFiles := LANGsvMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGsvCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGsvMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGsvCopySC; + LANGMoveRenameSC := LANGsvMoveRenameSC; + + LANGQuickFind := LANGsvQuickFind; + + LANGAboutString := LANGsvAboutString; + LANGAboutStringGnome := LANGsvAboutStringGnome; + LANGDiskStatFmt := LANGsvDiskStatFmt; + LANGDiskStatVolNameFmt := LANGsvDiskStatVolNameFmt; + LANGStatusLineFmt := LANGsvStatusLineFmt; + LANGPanelStrings[False] := LANGsvPanelStrings[False]; + LANGPanelStrings[True] := LANGsvPanelStrings[True]; + LANGDIR := LANGsvDIR; + LANGErrorGettingListingForSPanel := LANGsvErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGsvErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGsvErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGsvErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGsvTheFileDirectory; + LANGCouldNotBeDeleted := LANGsvCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGsvCouldNotBeDeletedS; + LANGUserCancelled := LANGsvUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGsvTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGsvCannotCopyFile; + LANGCopyError := LANGsvCopyError; + LANGMoveError := LANGsvMoveError; + LANGOverwriteS := LANGsvOverwriteS; + LANGWithFileS := LANGsvWithFileS; + LANGOvewriteSBytesS := LANGsvOvewriteSBytesS; + LANGTheFile := LANGsvTheFile; + LANGCopy := LANGsvCopy; + LANGMove := LANGsvMove; + LANGTheDirectory := LANGsvTheDirectory; + LANGTheSymbolicLink := LANGsvTheSymbolicLink; + LANGCannotMoveFile := LANGsvCannotMoveFile; + LANGCouldNotBeCreated := LANGsvCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGsvCouldNotBeCreatedS; + LANGFromS := LANGsvFromS; + LANGToS := LANGsvToS; + LANGCannotCopyFileToItself := LANGsvCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGsvMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGsvCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGsvCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGsvCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGsvCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGsvCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGsvCannotWriteToDestinationFile; + + LANGUnknownException := LANGsvUnknownException; + LANGNoAccess := LANGsvNoAccess; + LANGUnknownError := LANGsvUnknownError; + + LANGCreateANewDirectory := LANGsvCreateANewDirectory; + LANGEnterDirectoryName := LANGsvEnterDirectoryName; + + LANGOverwriteQuestion := LANGsvOverwriteQuestion; + LANGOverwriteButton_Caption := LANGsvOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGsvOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGsvSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGsvOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGsvSkipAllButton_Caption; + LANGRenameButton_Caption := LANGsvRenameButton_Caption; + LANGAppendButton_Caption := LANGsvAppendButton_Caption; + LANGRename := LANGsvRename; + LANGRenameFile := LANGsvRenameFile; + LANGIgnoreButton_Caption := LANGsvIgnoreButton_Caption; + + LANGProgress := LANGsvProgress; + LANGCancel := LANGsvCancel; + LANGDelete := LANGsvDelete; + + LANGSpecifyFileType := LANGsvSpecifyFileType; + + LANGRemoveDirectory := LANGsvRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGsvDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGsvRetry; + LANGDeleteButton_Caption := LANGsvDeleteButton_Caption; + LANGAll := LANGsvAll; + + LANGCopyFilesSC := LANGsvCopyFilesSC; + LANGAppendQuestion := LANGsvAppendQuestion; + LANGPreparingList := LANGsvPreparingList; + + LANGYouMustSelectAValidFile := LANGsvYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGsvmiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGsvVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGsvCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGsvCheckButtonCaptionStop; + LANGFileListTooltip := LANGsvFileListTooltip; + LANGFilenameColumnCaption := LANGsvFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGsvTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGsvAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGsvAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGsvAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGsvChecksumNotChecked; + LANGChecksumChecking := LANGsvChecksumChecking; + LANGChecksumInterrupted := LANGsvChecksumInterrupted; + LANGChecksumDOK := LANGsvChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGsvmiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGsvYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGsvCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGsvCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGsvCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGsvCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGsvCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGsvCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGsvCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGsvCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGsvCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGsvCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGsvCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGsvCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGsvCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGsvCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGsvCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGsvCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGsvCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGsvCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGsvCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGsvCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGsvCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGsvCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGsvAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGsvTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGsvTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGsvMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGsvPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGsvMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGsvWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGsvMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGsvMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGsvMergeSC; + LANGmiSplitFileCaption := LANGsvmiSplitFileCaption; + LANGmiMergeFilesCaption := LANGsvmiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGsvSplitTheFileSToDirectory; + LANGSplitSC := LANGsvSplitSC; + LANGSplitFile := LANGsvSplitFile; + LANGBytesPerFile := LANGsvBytesPerFile; + LANGAutomatic := LANGsvAutomatic; + LANGDeleteFilesOnTargetDisk := LANGsvDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGsvSplitCaption; + LANGCannotOpenFileS := LANGsvCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGsvCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGsvThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGsvThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGsvAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGsvSplitOfSSucceeded; + LANGSplitOfSFailed := LANGsvSplitOfSFailed; + + LANGmnuShow_Caption := LANGsvmnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGsvmiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGsvTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGsvCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGsvEdit; + LANGEnterFilenameToEdit := LANGsvEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGsvmnuSettings_Caption; + LANGmiFileTypes_Caption := LANGsvmiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGsvThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGsvErrorExecutingCommand; + LANGEditFileTypesCaption := LANGsvEditFileTypesCaption; + LANGTitleLabel_Caption := LANGsvTitleLabel_Caption; + LANGExtensionsColumn := LANGsvExtensionsColumn; + LANGDescriptionColumn := LANGsvDescriptionColumn; + LANGFileTypesList := LANGsvFileTypesList; + LANGActionName := LANGsvActionName; + LANGCommand := LANGsvCommand; + LANGSetDefaultActionButton_Caption := LANGsvSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGsvRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGsvAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGsvBrowseButton_Caption; + LANGCommandLabel_Caption := LANGsvCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGsvDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGsvFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGsvNotebookPageExtensions; + LANGNotebookPageActions := LANGsvNotebookPageActions; + LANGDefault := LANGsvDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGsvCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGsvDefaultColor; + LANGIcon := LANGsvIcon; + LANGBrowseForIcon := LANGsvBrowseForIcon; + LANGSelectFileTypeColor := LANGsvSelectFileTypeColor; + LANGColor := LANGsvColor; + + LANGmiChangePermissions_Caption := LANGsvmiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGsvmiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGsvmiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGsvmiEditSymlink_Caption; + LANGChmodProgress := LANGsvChmodProgress; + LANGChownProgress := LANGsvChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGsvYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGsvPopupRunS; + LANGPopupOpenS := LANGsvPopupOpenS; + LANGPopupGoUp := LANGsvPopupGoUp; + LANGPopupOpenWithS := LANGsvPopupOpenWithS; + LANGPopupDefault := LANGsvPopupDefault; + LANGPopupOpenWith := LANGsvPopupOpenWith; + LANGPopupViewFile := LANGsvPopupViewFile; + LANGPopupEditFile := LANGsvPopupEditFile; + LANGPopupMakeSymlink := LANGsvPopupMakeSymlink; + LANGPopupRename := LANGsvPopupRename; + LANGPopupDelete := LANGsvPopupDelete; + LANGDialogChangePermissions := LANGsvDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGsvCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGsvDialogChangeOwner; + LANGCouldNotBeChownedS := LANGsvCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGsvDialogMakeSymlink; + LANGDialogEditSymlink := LANGsvDialogEditSymlink; + LANGFEditSymlink_Caption := LANGsvFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGsvFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGsvFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGsvFChmod_Caption; + LANGFChmod_PermissionFrame := LANGsvFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGsvFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGsvFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGsvFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGsvFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGsvFChmod_OctalLabel; + LANGFChmod_SUID := LANGsvFChmod_SUID; + LANGFChmod_SGID := LANGsvFChmod_SGID; + LANGFChmod_Sticky := LANGsvFChmod_Sticky; + LANGFChmod_RUSR := LANGsvFChmod_RUSR; + LANGFChmod_WUSR := LANGsvFChmod_WUSR; + LANGFChmod_XUSR := LANGsvFChmod_XUSR; + LANGFChmod_RGRP := LANGsvFChmod_RGRP; + LANGFChmod_WGRP := LANGsvFChmod_WGRP; + LANGFChmod_XGRP := LANGsvFChmod_XGRP; + LANGFChmod_ROTH := LANGsvFChmod_ROTH; + LANGFChmod_WOTH := LANGsvFChmod_WOTH; + LANGFChmod_XOTH := LANGsvFChmod_XOTH; + LANGFChmod_TextLabel := LANGsvFChmod_TextLabel; + LANGFChmod_FileLabel := LANGsvFChmod_FileLabel; + LANGFChown_Caption := LANGsvFChown_Caption; + LANGFChown_OwnerFrame := LANGsvFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGsvFChown_GroupFrame; + LANGFChown_FileFrame := LANGsvFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGsvFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGsvFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGsvFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGsvFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGsvmnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGsvmiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGsvmiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGsvBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGsvmiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGsvTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGsvSomeOtherInstanceChanged; + + LANGPreferences_Caption := LANGsvPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGsvPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGsvPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGsvPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGsvPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGsvPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGsvPreferences_NumHistoryItems; + LANGPreferences_Default := LANGsvPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGsvPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGsvPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGsvPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGsvPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGsvPreferences_Viewer; + LANGPreferences_Editor := LANGsvPreferences_Editor; + LANGPreferences_Terminal := LANGsvPreferences_Terminal; + LANGPreferences_ListFont := LANGsvPreferences_ListFont; + LANGPreferences_Change := LANGsvPreferences_Change; + LANGPreferences_UseDefaultFont := LANGsvPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGsvPreferences_Foreground; + LANGPreferences_Background := LANGsvPreferences_Background; + LANGPreferences_NormalItem := LANGsvPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGsvPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGsvPreferences_Cursor; + LANGPreferences_InactiveItem := LANGsvPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGsvPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGsvPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGsvPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGsvPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGsvPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGsvPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGsvPreferences_DefaultS; + LANGPreferences_SelectFont := LANGsvPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGsvBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGsvUpButton_Tooltip; + LANGRootButton_Tooltip := LANGsvRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGsvHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGsvLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGsvRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGsvmiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGsvmiTargetSource_Caption; + LANGFileTypeDirectory := LANGsvFileTypeDirectory; + LANGFileTypeFile := LANGsvFileTypeFile; + LANGFileTypeMetafile := LANGsvFileTypeMetafile; + LANGPreferencesPanelsPage := LANGsvPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGsvPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGsvPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGsvPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGsvPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGsvPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGsvPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGsvPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGsvPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGsvPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGsvPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGsvPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGsvPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGsvPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGsvPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGsvPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGsvPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGsvPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGsvPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGsvPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGsvPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGsvPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGsvPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGsvPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGsvPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGsvPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGsvPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGsvPreferencesViewer; + LANGPreferencesCommandSC := LANGsvPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGsvPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGsvPreferencesEditor; + LANGPreferencesTerminal := LANGsvPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGsvPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGsvPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGsvPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGsvPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGsvPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGsvPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGsvPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGsvPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGsvmiSearchCaption2; + LANGmiNoMounterBarCaption := LANGsvmiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGsvmiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGsvmiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGsvmnuNetworkCaption; + LANGmiConnectionsCaption := LANGsvmiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGsvmiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGsvmiQuickConnectCaption; + LANGmnuPluginsCaption := LANGsvmnuPluginsCaption; + LANGmiTestPluginCaption := LANGsvmiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGsvmiMounterSettingsCaption; + LANGmiColumnsCaption := LANGsvmiColumnsCaption; + LANGmiSavePositionCaption := LANGsvmiSavePositionCaption; + LANGmiMountCaption := LANGsvmiMountCaption; + LANGmiUmountCaption := LANGsvmiUmountCaption; + LANGmiEjectCaption := LANGsvmiEjectCaption; + LANGmiDuplicateTabCaption := LANGsvmiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGsvmiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGsvmiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGsvCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGsvCannotLoadFile; + LANGMountPointDevice := LANGsvMountPointDevice; + LANGMountSC := LANGsvMountSC; + LANGNoPluginsFound := LANGsvNoPluginsFound; + LANGPluginAbout := LANGsvPluginAbout; + LANGCouldntOpenURI := LANGsvCouldntOpenURI; + LANGPluginAboutInside := LANGsvPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGsvAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGsvCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGsvThereIsNoModuleAvailable; + LANGIgnoreError := LANGsvIgnoreError; + LANGErrorMount := LANGsvErrorMount; + LANGErrorUmount := LANGsvErrorUmount; + LANGErrorEject := LANGsvErrorEject; + + LANGMounterPrefs_Caption := LANGsvMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGsvMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGsvMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGsvMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGsvMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGsvMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGsvMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGsvMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGsvMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGsvMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGsvMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGsvMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGsvMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGsvMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGsvMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGsvMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGsvMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGsvMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGsvMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGsvMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGsvMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGsvMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGsvMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGsvMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGsvMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGsvMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGsvMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGsvConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGsvConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGsvConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGsvConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGsvConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGsvConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGsvConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGsvConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGsvConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGsvConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGsvConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGsvConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGsvConnProp_FTP; + LANGConnProp_SFTP := LANGsvConnProp_SFTP; + LANGConnProp_SMB := LANGsvConnProp_SMB; + LANGConnProp_HTTP := LANGsvConnProp_HTTP; + LANGConnProp_HTTPS := LANGsvConnProp_HTTPS; + LANGConnProp_Other := LANGsvConnProp_Other; + LANGConnProp_Caption := LANGsvConnProp_Caption; + LANGConnProp_VFSModule := LANGsvConnProp_VFSModule; + LANGConnProp_URI := LANGsvConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGsvConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGsvConnProp_DetailedInformations; + LANGConnProp_Name := LANGsvConnProp_Name; + LANGConnProp_Server := LANGsvConnProp_Server; + LANGConnProp_Username := LANGsvConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGsvConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGsvConnProp_Password; + LANGConnProp_TargetDirectory := LANGsvConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGsvConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGsvConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGsvConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGsvConnLogin_Caption; + LANGConnLogin_Login := LANGsvConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGsvConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGsvConnLogin_Username; + LANGConnLogin_Password := LANGsvConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGsvConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGsvColumns_Caption; + LANGColumns_Title := LANGsvColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGsvColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGsvColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGsvColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGsvColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGsvColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGsvColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGsvColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGsvColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGsvColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGsvColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGsvColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGsvColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGsvColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGsvColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGsvColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGsvColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGsvColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGsvColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGsvColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGsvColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGsvColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGsvColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGsvTestPlugin_Caption; + LANGTestPlugin_Title := LANGsvTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGsvTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGsvTestPlugin_Plugin; + LANGTestPlugin_Command := LANGsvTestPlugin_Command; + LANGTestPlugin_Username := LANGsvTestPlugin_Username; + LANGTestPlugin_Password := LANGsvTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGsvTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGsvTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGsvRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGsvRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGsvRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGsvSearch_Bytes; + LANGSearch_kB := LANGsvSearch_kB; + LANGSearch_MB := LANGsvSearch_MB; + LANGSearch_days := LANGsvSearch_days; + LANGSearch_weeks := LANGsvSearch_weeks; + LANGSearch_months := LANGsvSearch_months; + LANGSearch_years := LANGsvSearch_years; + LANGSearch_Caption := LANGsvSearch_Caption; + LANGSearch_General := LANGsvSearch_General; + LANGSearch_Advanced := LANGsvSearch_Advanced; + LANGSearch_SearchResults := LANGsvSearch_SearchResults; + LANGSearch_SearchFor := LANGsvSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGsvSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGsvSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGsvSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGsvSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGsvSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGsvSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGsvSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGsvSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGsvSearch_Size; + LANGSearch_Date := LANGsvSearch_Date; + LANGSearch_BiggerThan := LANGsvSearch_BiggerThan; + LANGSearch_SmallerThan := LANGsvSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGsvSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGsvSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGsvSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGsvSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGsvSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGsvSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGsvSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGsvSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGsvSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGsvSearch_StatusSC; + LANGSearch_Ready := LANGsvSearch_Ready; + LANGSearch_PreparingToSearch := LANGsvSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGsvSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGsvSearch_UserCancelled; + LANGSearch_SearchFinished := LANGsvSearch_SearchFinished; + LANGSearch_FilesFound := LANGsvSearch_FilesFound; + LANGSearch_And := LANGsvSearch_And; + + LANGCloseOpenConnection := LANGsvCloseOpenConnection; + LANGDuplicateTabWarning := LANGsvDuplicateTabWarning; + LANGDontShowAgain := LANGsvDontShowAgain; + LANGSwitchOtherPanelWarning := LANGsvSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGsvOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGsvmiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGsvDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGsvLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGsvOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGsvOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGsvShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGsvShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGsvmiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGsvFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGsvCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGsvmiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGsvPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGsvHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGsvHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGsvHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGsvHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGsvHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGsvFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGsvFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGsvFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGsvFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGsvFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGsvFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGsvFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGsvFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGsvFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGsvFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGsvFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGsvFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGsvFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGsvFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGsvFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('sv_SE', @SetTranslation); + AddTranslation('SV', @SetTranslation); +end. diff --git a/translations/UTranslation_UA.pas b/translations/UTranslation_UA.pas new file mode 100644 index 0000000..bbd2ad7 --- /dev/null +++ b/translations/UTranslation_UA.pas @@ -0,0 +1,1265 @@ +(* + Tux Commander - UTranslation_UA - Ukrainian Localization constants + Copyright (C) 2007 Serhij Dubyk + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UTranslation_UA; + +interface + +implementation + +uses ULocale; + +const LANGuaF2Button_Caption = 'F2 - Перейменувати'; + LANGuaF3Button_Caption = 'F3 - Перегляд'; + LANGuaF4Button_Caption = 'F4 - Редагувати'; + LANGuaF5Button_Caption = 'F5 - Копіювати'; + LANGuaF6Button_Caption = 'F6 - Перемістити'; + LANGuaF7Button_Caption = 'F7 - Тека'; + LANGuaF8Button_Caption = 'F8 - Вилучити'; + + LANGuamnuFile_Caption = '_Файл'; + LANGuamnuMark_Caption = '_Виділення'; + LANGuamnuCommands_Caption = 'Коман_ди'; + LANGuamnuHelp_Caption = '_Допомога'; + LANGuamiExit_Caption = 'В_ихід'; + LANGuamiSelectGroup_Caption = 'Виділити _групу...'; + LANGuamiUnselectGroup_Caption = '_Зняти виділення...'; + LANGuamiSelectAll_Caption = 'Ви_ділити усе'; + LANGuamiUnselectAll_Caption = 'Зн_яти усе виділення'; + LANGuamiInvertSelection_Caption = '_Інвертувати виділення'; + LANGuamiRefresh_Caption = 'О_новити вікно'; + LANGuamiAbout_Caption = '_Про програму...'; + + LANGuaColumn1_Caption = 'І''мя'; + LANGuaColumn2_Caption = 'Тип'; + LANGuaColumn3_Caption = 'Розмір'; + LANGuaColumn4_Caption = 'Дата'; + LANGuaColumn5_Caption = 'Атрибути'; + + LANGuaExpandSelection = 'Розширити виділення'; + LANGuaShrinkSelection = 'Зменшити виділення'; + LANGuaNoMatchesFound = 'Такі файли не знайдені.'; + LANGuaNoFilesSelected = 'Немає вибраних файлів.'; + LANGuaSelectedFilesDirectories = '%d файли(ів)/тек(и)'; + LANGuaDirectoryS = 'тека %s'; + LANGuaFileS = 'файл %s'; + LANGuaDoYouReallyWantToDeleteTheS = 'Дійсно видалити %s ?'; + LANGuaDoYouReallyWantToDeleteTheSS = 'Дійсно видалити %s ?'#10'%s'; + LANGuaCopyFiles = 'Копіювати файли'; + LANGuaMoveRenameFiles = 'Перейменувати/Перемістити файли'; + LANGuaCopyDFileDirectoriesTo = 'Копіювати %d файли(ів)/тек(и) в'; + LANGuaMoveRenameDFileDirectoriesTo = 'Перейменувати/Перемістити %d файли(ів)/тек(и) у'; + LANGuaCopySC = 'Копіювати:'; + LANGuaMoveRenameSC = 'Перейменувати/Перемістити:'; + + LANGuaQuickFind = ' Пошук:'; + + LANGuaAboutString = 'Tux Commander'#10'Версія %s'#10'Дата збірки: %s'#10#10'Авторське право (c) 2008 Tomáš Bžatek'#10'електронна пошта: tbzatek@users.sourceforge.net'#10'Сайт: http://tuxcmd.sourceforge.net/'; + LANGuaAboutStringGnome = 'версія %s'#10'Дата збірки: %s'#10'Сайт: http://tuxcmd.sourceforge.net/'; + LANGuaDiskStatFmt = '%s зі %s вільно'; + LANGuaDiskStatVolNameFmt = '[%s] %s зі %s кБ вільно'; + LANGuaStatusLineFmt = 'вибрано: %s зі %s , файлів: %d зі %d'; + LANGuaPanelStrings : array[boolean] of string = ('правої', 'лівої'); + + LANGuaDIR = ''; + LANGuaErrorGettingListingForSPanel = 'Неможливо отримати список для %s панелі:'#10' %s'#10#10'Шлях = ''%s'''; + LANGuaErrorGettingListingForSPanelNoPath = 'Неможливо отримати список для %s панелі:'#10' %s'; + LANGuaErrorCreatingNewDirectorySInSPanel = 'Помилка створення нової теки ''%s'' у %s панелі:'#10' %s'; + LANGuaErrorCreatingNewDirectorySInSPanelNoPath = 'Помилка створення нової теки у %s панелі:'#10' %s'; + LANGuaTheFileDirectory = 'Файл/Тека'; + LANGuaCouldNotBeDeleted = 'не може бути вилучено'; + LANGuaCouldNotBeDeletedS = 'не може бути вилучено: %s'; + LANGuaUserCancelled = 'Перервано користувачем'; + LANGuaTheDirectorySIsNotEmpty = 'Тека %s містить файли і/чи підтеки.'; + LANGuaCannotCopyFile = 'Не можу скопіювати файл'; + LANGuaCopyError = 'Помилка копіювання файлів'; + LANGuaMoveError = 'Помилка переміщення файлів'; + LANGuaOverwriteS = 'Замінити: %s'; + LANGuaWithFileS = 'Файлом: %s'; + LANGuaOvewriteSBytesS = '%s байт, %s'; + LANGuaTheFile = 'Файл'; + LANGuaCopy = 'Копіювати'; + LANGuaMove = 'Перемістити'; + LANGuaTheDirectory = 'Тека'; + LANGuaTheSymbolicLink = 'Символьне посилання'; + LANGuaCannotMoveFile = 'Не можу перемістити файл'; + LANGuaCouldNotBeCreated = 'не може бути створений'; + LANGuaCouldNotBeCreatedS = 'не може бути створений: %s'; + LANGuaFromS = 'Зі: %s'; + LANGuaToS = 'У: %s'; + LANGuaCannotCopyFileToItself = 'Не можна скопіювати файл сам в себе'; + LANGuaMemoryAllocationFailed = 'Не вистачає пам''яті:'; + LANGuaCannotOpenSourceFile = 'Неможливо відкрити джерельний файл'; + LANGuaCannotOpenDestinationFile = 'Неможливо створити файл-призначення'; + LANGuaCannotCloseDestinationFile = 'Неможливо закрити файл-призначення'; + LANGuaCannotCloseSourceFile = 'Неможливо закрити джерельний файл'; + LANGuaCannotReadFromSourceFile = 'Помилка читання джерельного файла'; + LANGuaCannotWriteToDestinationFile = 'Помилка запису до файлу-призначення'; + + LANGuaUnknownException = 'Невідомий збій'; + LANGuaNoAccess = 'Немає доступу'; + LANGuaUnknownError = 'Невідома помилка'; + + LANGuaCreateANewDirectory = 'Створити нову теку'; + LANGuaEnterDirectoryName = 'Вкажіть ім''я _теки:'; + + LANGuaOverwriteQuestion = 'Підтвердження заміни'; + LANGuaOverwriteButton_Caption = '_Замінити'; + LANGuaOverwriteAllButton_Caption = 'Замінити _усе'; + LANGuaSkipButton_Caption = '_Пропустити'; + LANGuaOverwriteAllOlderButton_Caption = 'Замінити більш _старі'; + LANGuaSkipAllButton_Caption = 'Пропустити ус_е'; + LANGuaRenameButton_Caption = 'Пере_йменувати'; + LANGuaAppendButton_Caption = '_Дописати'; + LANGuaRename = 'Перейменувати'; + LANGuaRenameFile = 'Перейменувати файл ''%s'' в'; + LANGuaIgnoreButton_Caption = '_Ігнорувати'; + + LANGuaProgress = 'Прогрес'; + LANGuaCancel = '_Відміна'; + LANGuaDelete = 'Вилучити:'; + + LANGuaSpecifyFileType = '_Тип файлу:'; + + LANGuaRemoveDirectory = 'Вилучити теку'; + LANGuaDoYouWantToDeleteItWithAllItsFilesAndSubdirectories = 'Чи дійсно хочете вилучити його повністю, зі всіма файлами та підтеками?'; + LANGuaRetry = '_Повторити'; + LANGuaDeleteButton_Caption = '_Вилучити'; + LANGuaAll = '_Усе'; + + LANGuaCopyFilesSC = 'Копіювати файли:'; + LANGuaAppendQuestion = 'Чи дійсно хочете додати файл ''%s'' до ''%s''?'; + LANGuaPreparingList = 'Підготовка списку...'; + + LANGuaYouMustSelectAValidFile = 'вибраний невірний файл!'; + LANGuamiVerifyChecksums = 'Перев_ірити контрольну суму'; + LANGuaVerifyChecksumsCaption = 'Перевірка контрольної суми'; + LANGuaCheckButtonCaptionCheck = '_Перевірка'; + LANGuaCheckButtonCaptionStop = '_Зупинити'; + LANGuaFileListTooltip = '[?] - Не перевірено'#10'[OK] - Контрольну суму перевірено'#10'[BAD] - Погана контрольна сума'#10'[N/A] - Файл не доступний'; + LANGuaFilenameColumnCaption = 'Ім''я файла'; + LANGuaTheFileSYouAreTryingToOpenIsQuiteBig = 'Файл ''%s'' занадто великий. Ймовірно, він не містить контрольної суми.'#10#10'Тим не менше продовжити?'; + LANGuaAnErrorOccuredWhileInitializingMemoryBlock = 'Помилка ініціалізації блоку пам''яті. Закрийте декілька програм та спробуйте ще раз.'; + LANGuaAnErrorOccuredWhileOpeningFileSS = 'Помилка відкриття файла ''%s'':'#10' %s'; + LANGuaAnErrorOccuredWhileReadingFileSS = 'Помилка читання файла ''%s'':'#10' %s'; + LANGuaChecksumNotChecked = 'Статус: не перевірено'; + LANGuaChecksumChecking = 'Статус: перевіряю...'; + LANGuaChecksumInterrupted = 'Статус: перевірку перервано'; + LANGuaChecksumDOK = 'Статус: %d%% гаразд'; + + LANGuamiCreateChecksumsCaption = '_Створити контрольні суми...'; + LANGuaYouMustSelectAtLeastOneFileToCalculateChecksum = 'Потрібно вибрати хоча б один файл для створення контрольної суми!'; + LANGuaCreateChecksumsCaption = 'Створення контрольних сум'; + LANGuaCCHKSUMPage1Text = 'Якщо Ви не вибрали'#10'усі необхідні Вам файли, закрийте це вікно та'#10'виберіть решту файлів.'; + LANGuaCCHKSUMPage4Text = 'Друїд готовий до створення контрольних сум'#10'для вибраних файлів. Це може зайняти декілька хвилин.'#10'Натисніть "Вперед" для продовження.'; + LANGuaCCHKSUMPage6Text = 'Помилка створення контрольної суми:'; + LANGuaCCHKSUMPage7Text = 'Створення контрольних сум завершено.'#10#10'Натисніть "Завершити" для виходу.'; + LANGuaCCHKSUMPage1Title = 'Підготовка до створення контрольної суми'; + LANGuaCCHKSUMPage2Title = 'Виберіть тип контрольної суми'; + LANGuaCCHKSUMPage3Title = 'Виберіть ім''я файлу'; + LANGuaCCHKSUMPage4Title = 'Готовий до створення контрольних сум'; + LANGuaCCHKSUMPage5Title = 'В процесі...'; + LANGuaCCHKSUMPage6Title = 'Помилка!'; + LANGuaCCHKSUMPage7Title = 'Готово'; + LANGuaCCHKSUMSFVFile = 'Файл SFV'; + LANGuaCCHKSUMMD5sumFile = 'Файл MD5'; + LANGuaCCHKSUMFileName = '_Ім''я файлу:'; + LANGuaCCHKSUMCreateSeparateChecksumFiles = 'Створити _окремі файли контрольних сум'; + LANGuaCCHKSUMNowProcessingFileS = 'У процесі створення файлу: %s'; + LANGuaCCHKSUMFinishCaption = '_Завершити'; + LANGuaCCHKSUMAreYouSureYouWantToAbortTheProcessing = 'Хочете перервати поточний процес?'; + LANGuaCCHKSUMAnErrorOccuredWhileOpeningFileSS = 'Помилка відкриття файлу ''%s'': %s'#10; + LANGuaCCHKSUMAnErrorOccuredWhileReadingFileSS = 'Помилка читання файлу ''%s'': %s'#10; + LANGuaCCHKSUMAnErrorOccuredWhileWritingFileSS = 'Помилка запису в файл ''%s'': %s'#10; + + LANGuaAnErrorOccuredWhileWritingFileSS = 'Помилка запису в файл ''%s'':'#10' %s'; + LANGuaTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt = 'Файл ''%s'' вже існує. Чи хочете його замінити?'; + LANGuaTheTargetFileSCannotBeRemovedS = 'Неможливо вилучити файл ''%s'' : %s'; + LANGuaMergeCaption = 'Об''єднати'; + LANGuaPleaseInsertNextDiskOrGiveDifferentLocation = 'Будь-ласка, вставте наступний диск, чи вкажіть іншу теку: '; + LANGuaMergeOfSSucceeded = 'Об''єднання файла ''%s'' відбулося вдало (контрольну суму(CRC) перевірено).'; + LANGuaWarningCreatedFileFailsCRCCheck = 'Увага: створений файл має невірну контрольну суму!'; + LANGuaMergeOfSSucceeded_NoCRCFileAvailable = 'Об''єднання ''%s'' відбулося вдало (без перевірки контрольної суми).'; + LANGuaMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory = 'Об''єднати усі файли, що починаються з ''%s'' до теки:'; + LANGuaMergeSC = 'Об''єднання:'; + LANGuamiSplitFileCaption = '_Розділити файл...'; + LANGuamiMergeFilesCaption = '_Об''єднати файли...'; + + LANGuaSplitTheFileSToDirectory = '_Розбити файл ''%s'' до теки:'; + LANGuaSplitSC = 'Розбити:'; + LANGuaSplitFile = 'Розбити файл'; + LANGuaBytesPerFile = 'Розбити _на частини розміром:'; + LANGuaAutomatic = 'Автоматично'; + LANGuaDeleteFilesOnTargetDisk = '_Вилучіть усі файли на приймальнику (лише для змінних дисків)'; + LANGuaSplitCaption = 'Розбити'; + LANGuaCannotOpenFileS = 'Неможливо відкрити файл ''%s'''; + LANGuaCannotSplitTheFileToMoreThan999Parts = 'Неможливо розбити файл на більш ніж 999 частин!'; + LANGuaThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem = 'Тека-приймальник %s містить файли '#10' Чи дійсно хочете вилучити його вміст?'; + LANGuaThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem = 'Тека-приймальник містить %d файлів. Чи дійсно хочете вилучити його вміст?'; + LANGuaAnErrorOccuredWhileOperationS = 'Помилка під час виконання: %s'; + LANGuaSplitOfSSucceeded = 'Розбиття файла ''%s'' відбулося вдало.'; + LANGuaSplitOfSFailed = 'Неможливо розбити файл: %s'; + + LANGuamnuShow_Caption = 'В_игляд'; + LANGuamiShowDotFiles_Caption = 'Показати _приховані файли'; + LANGuaTheFileYouAreTryingToOpenIsQuiteBig = 'Файл, що відкриваєте, занадто великий. Програма, що завантажує цей файл, може викликати сповільнення системи.'#10'Чи дійсно хочете продовжувати'; + LANGuaCannotExecuteSPleaseCheckTheConfiguration = 'Неможливо виконати ''%s''. Перевірте конфігурацію чи зробіть асоціацію типів файлів спочатку.'; + LANGuaEdit = 'Правка'; + LANGuaEnterFilenameToEdit = '_Введіть ім''я файла для редагування:'; + + LANGuamnuSettings_Caption = '_Налаштування'; + LANGuamiFileTypes_Caption = '_Типи файлів...'; + LANGuaThereIsNoApplicationAssociatedWithS = 'Немає програм, асоційованих з файлом "%s".'#10#10'Чи хочете зробити асоціацію зараз?'; + LANGuaErrorExecutingCommand = 'Помилка виконання команди!'; + LANGuaEditFileTypesCaption = 'Типи файлів'; + LANGuaTitleLabel_Caption = 'Конфігурація типів файлів'; + LANGuaExtensionsColumn = 'Типи'; + LANGuaDescriptionColumn = 'Опис'; + LANGuaFileTypesList = 'Список типів файлів'; + LANGuaActionName = 'Ім''я дії'; + LANGuaCommand = 'Команда'; + LANGuaSetDefaultActionButton_Caption = '_Використовувати за умовчанням'; + LANGuaRunInTerminalCheckBox_Caption = 'Запустити у _терміналі'; + LANGuaAutodetectCheckBox_Caption = 'Авто-визначення _графічних програм'; + LANGuaBrowseButton_Caption = '_Пошук...'; + LANGuaCommandLabel_Caption = 'Ко_манда:'; + LANGuaDescriptionLabel_Caption = '_Опис:'; + LANGuaFNameExtLabel_Caption = '_Додати тип:'; + LANGuaNotebookPageExtensions = 'Тип файлу'; + LANGuaNotebookPageActions = 'Дії'; + LANGuaDefault = ' (за умовчанням)'; + LANGuaCannotSaveFileTypeAssociationsBecauseOtherProcess = 'Неможливо зберегти конфігурацію типів файлів: інший процес оновив її на диску.'; + + LANGuaDefaultColor = 'Колір по _умовчанню'; + LANGuaIcon = '_Іконка:'; + LANGuaBrowseForIcon = 'Виберіть іконку'; + LANGuaSelectFileTypeColor = 'Виберіть колір'; + LANGuaColor = '_Колір:'; + + LANGuamiChangePermissions_Caption = 'Змінити _права...'; + LANGuamiChangeOwner_Caption = 'Змінити _власника/групу...'; + LANGuamiCreateSymlink_Caption = 'С_творити посилання...'; + LANGuamiEditSymlink_Caption = 'Ре_дагувати посилання'; + LANGuaChmodProgress = 'Змінити права:'; + LANGuaChownProgress = 'Змінити власника:'; + LANGuaYouMustSelectAValidSymbolicLink = 'Необхідно вибрати символьне посилання!'; + LANGuaPopupRunS = '_Виконати %s'; + LANGuaPopupOpenS = '_Відкрити %s'; + LANGuaPopupGoUp = 'Перейти на рівень в_ище'; + LANGuaPopupOpenWithS = 'Відкрити з допомогою %s'; + LANGuaPopupDefault = ' (за умовчанням)'; + LANGuaPopupOpenWith = 'Відкрити з допо_могою...'; + LANGuaPopupViewFile = '_Перегляд файла'; + LANGuaPopupEditFile = 'Ре_дагувати файл'; + LANGuaPopupMakeSymlink = 'створити _посилання'; + LANGuaPopupRename = 'Перей_менувати'; + LANGuaPopupDelete = 'Ви_лучити'; + LANGuaDialogChangePermissions = 'Змінити права'; + LANGuaCouldNotBeChmoddedS = 'Неможливо змінити права доступу: %s'; + LANGuaDialogChangeOwner = 'Змінити власника'; + LANGuaCouldNotBeChownedS = 'Неможливо змінити власника: %s'; + LANGuaDialogMakeSymlink = 'Створити посилання'; + LANGuaDialogEditSymlink = 'Редагувати посилання'; + LANGuaFEditSymlink_Caption = 'Редагувати символьне посилання'; + LANGuaFEditSymlink_SymbolicLinkFilename = '_Ім''я символьного посилання:'; + LANGuaFEditSymlink_SymbolicLinkPointsTo = 'Посилання вказує _на:'; + + LANGuaFChmod_Caption = 'Права доступу'; + LANGuaFChmod_PermissionFrame = 'Права'; + LANGuaFChmod_FileFrame = 'Файл'; + LANGuaFChmod_ApplyRecursivelyFor = 'Застосувати _рекурсивно'; + LANGuaFChmod_miAllFiles = 'Для усіх файлів та тек'; + LANGuaFChmod_miDirectories = 'Лише для тек'; + LANGuaFChmod_OctalLabel = '_Вісімковий:'; + LANGuaFChmod_SUID = 'SUID - Встановити ідентифікатор користувача'; + LANGuaFChmod_SGID = 'SGID - Встановити ідентифікатор групи'; + LANGuaFChmod_Sticky = 'Приклеєний'; + LANGuaFChmod_RUSR = 'RUSR - Читання для власника'; + LANGuaFChmod_WUSR = 'WUSR - Запис для власника'; + LANGuaFChmod_XUSR = 'XUSR - Виконання/Пошук для власника'; + LANGuaFChmod_RGRP = 'RGRP - Читання для групи'; + LANGuaFChmod_WGRP = 'WGRP - Запис для групи'; + LANGuaFChmod_XGRP = 'XGRP - Виконання/Пошук для групи'; + LANGuaFChmod_ROTH = 'ROTH - Читання для решту'; + LANGuaFChmod_WOTH = 'WOTH - Запис для решту'; + LANGuaFChmod_XOTH = 'XOTH - Виконання/Пошук для решту'; + LANGuaFChmod_TextLabel = 'Текст: %s'; + LANGuaFChmod_FileLabel = 'Файл: %s'#10'Текст: %s'#10 + + 'Вісімковий: %d'#10'Власник: %s'#10 + + 'Група: %s'; + + LANGuaFChown_Caption = 'Змінити власника/групу'; + LANGuaFChown_OwnerFrame = 'Ім''я власника'; + LANGuaFChown_GroupFrame = 'Ім''я групи'; + LANGuaFChown_FileFrame = 'Файл'; + LANGuaFChown_ApplyRecursively = 'Застосувати _рекурсивно'; + + LANGuaFSymlink_Caption = 'Створити символьне посилання'; + LANGuaFSymlink_ExistingFilename = 'Існуючий _файл:'; + LANGuaFSymlink_SymlinkFilename = 'Ім''я символьного _посилання:'; + + LANGuamnuBookmarks_Caption = '_Закладки'; + LANGuamiAddBookmark_Caption = 'Додати закладку'; + LANGuamiEditBookmarks_Caption = 'Змінити закладку'; + LANGuaBookmarkPopupDelete_Caption = 'Ви_лучити'; + LANGuamiPreferences_Caption = 'Змінити _налаштування...'; + LANGuaTheCurrentDirectoryAlreadyExistsInTheBookmarksList = 'Поточна тека вже додана до закладок'; + LANGuaSomeOtherInstanceChanged1 = 'Інша програма змінила файл конфігурації на диску. Чи хочете застосувати нові налаштування?'#10#10'Увага: якщо Ви зараз натиснете '; + LANGuaSomeOtherInstanceChanged2 = '"Ні", конфігурація буде перезаписана під час завершення програми!'; + + LANGuaPreferences_Caption = 'Налаштування'; + LANGuaPreferences_TitleLabel_Caption = 'Налаштування програми'; + LANGuaPreferences_GeneralPage = 'Загальні'; + LANGuaPreferences_FontsPage = 'Шрифти'; + LANGuaPreferences_ColorsPage = 'Кольори'; + LANGuaPreferences_RowHeight = ' _Висота рядків:'; + LANGuaPreferences_NumHistoryItems = '_Елементи командного рядка:'; + LANGuaPreferences_Default = 'За умовчанням'; + LANGuaPreferences_ClearReadonlyAttribute = 'Під час копіювання зі CD-ROM знімати _атрибут "лише для читання"'; + LANGuaPreferences_DisableMouseRenaming = 'Заборонити перейменування _мишкою'; + LANGuaPreferences_ShowFiletypeIconsInList = 'Показувати _іконки'; + LANGuaPreferences_ExternalAppsLabel = 'Зовнішні програми'; + LANGuaPreferences_Viewer = '_Перегляд:'; + LANGuaPreferences_Editor = '_Редактор:'; + LANGuaPreferences_Terminal = '_Термінал:'; + LANGuaPreferences_ListFont = 'Шрифт списків:'; + LANGuaPreferences_Change = 'Змінити...'; + LANGuaPreferences_UseDefaultFont = 'Використовувати шрифт по _умовчанню'; + LANGuaPreferences_Foreground = 'Передній план'; + LANGuaPreferences_Background = 'Фон'; + LANGuaPreferences_NormalItem = 'Звичайний елемент:'; + LANGuaPreferences_SetToDefaultToUseGTKThemeColors = 'Використовувати кольори теми GTK'; + LANGuaPreferences_Cursor = 'Курсор:'; + LANGuaPreferences_InactiveItem = 'Неактивний елемент:'; + LANGuaPreferences_SelectedItem = 'Вибраний елемент:'; + LANGuaPreferences_LinkItem = 'Символьні посилання:'; + LANGuaPreferences_LinkItemHint = 'Використовувати кольори нормальних елементів для посилань'; + LANGuaPreferences_DotFileItem = 'Приховані файли:'; + LANGuaPreferences_DotFileItemHint = 'Використовувати кольори нормальних елементів для прихованих файлів'; + LANGuaPreferences_BrowseForApplication = 'Пошук програми'; + LANGuaPreferences_DefaultS = 'За умовчанням: %s'; + LANGuaPreferences_SelectFont = 'Виберіть шрифт'; + + (*************** STRINGS ADDED TO v0.4.101 **********************************************************************************) + LANGuaBookmarkButton_Tooltip = 'Показати закладки'; + LANGuaUpButton_Tooltip = 'Перейти до верхньої теки'; + LANGuaRootButton_Tooltip = 'Перейти до кореневої теки (/)'; + LANGuaHomeButton_Tooltip = 'Перейти до домашньої теки (/home/user)'; + LANGuaLeftEqualButton_Tooltip = 'Перейти у правій панелі у ту саму теку що і у лівій'; + LANGuaRightEqualButton_Tooltip = 'Перейти у лівій панелі у ту саму теку що і у правій'; + LANGuamiShowDirectorySizes_Caption = 'Показати _розміри тек'; + LANGuamiTargetSource_Caption = 'Приймальник = Джерело'; + LANGuaFileTypeDirectory = 'Тека'; + LANGuaFileTypeFile = 'Файл'; + LANGuaFileTypeMetafile = 'Це загальний мета-елемент'; + LANGuaPreferencesPanelsPage = 'Панелі'; + LANGuaPreferencesApplicationsPage = 'Програми'; + LANGuaPreferencesExperimentalPage = 'Експериментальний'; + LANGuaPreferencesSelectAllDirectoriesCheckBox_Caption = 'Вибирати _також теки, вибираючи усе'; + LANGuaPreferencesNewStyleAltOCheckBox_Caption = '_Новий стиль Alt+O'; + LANGuaPreferencesNewStyleAltOCheckBox_Tooltip = 'Залишатися у тій же теці при перемиканні теки протилежної панелі натискаючи Ctrl/Alt+O'; + LANGuaPreferencesShowFuncButtonsCheckBox_Caption = 'Показувати кнопки _функціональних клавіш'; + LANGuaPreferencesSizeFormatLabel_Caption = '_Формат розміру:'; + LANGuaPreferencesmiSizeFormat1 = 'Система'; + LANGuaPreferencesmiSizeFormat6 = 'Згруповано'; + LANGuaPreferencesAutodetectXApp = 'Автоматичне виявлення програм у X-ах'; + LANGuaPreferencesAlwaysRunInTerminal = 'Завжди виконувати у терміналі'; + LANGuaPreferencesNeverRunInTerminal = 'Ніколи не виконувати у терміналі'; + LANGuaPreferencesCmdLineBehaviourLabel_Caption = '_Виконувати з командного рядка:'; + LANGuaPreferencesFeatures = 'Властивості'; + LANGuaPreferencesDisableMouseRename_Tooltip = 'Ви можете все ще використовувати швидке перейменування натискаючи Shift+F6'; + LANGuaPreferencesDisableFileTipsCheckBox_Caption = 'Заблокувати спливаючі _нотатки до файлів'; + LANGuaPreferencesDisableFileTipsCheckBox_Tooltip = 'Не показувати спливаючі нотатки у панелях якщо текст у колонках обрізається'; + LANGuaPreferencesShow = 'Показати'; + LANGuaPreferencesDirsInBoldCheckBox_Caption = 'Теки _жирним'; + LANGuaPreferencesDisableDirectoryBracketsCheckBox_Caption = 'Відмінити квадратні _дужки тек'; + LANGuaPreferencesOctalPermissionsCheckBox_Caption = 'Показувати _вісімкові дозволи'; + LANGuaPreferencesOctalPermissionsCheckBox_Tooltip = 'Показувати дозволи файлів/тек як номери замість текстової форми (-rw-rw-rw-)'; + LANGuaPreferencesMovement = 'Рух'; + LANGuaPreferencesLynxLikeMotionCheckBox_Caption = 'Рухи як у браузера _Lynx'; + LANGuaPreferencesInsertMovesDownCheckBox_Caption = 'Після натискання _Insert рухатися нижче'; + LANGuaPreferencesSpaceMovesDownCheckBox_Caption = 'Після натискання _пробілу рухатися нижче'; + LANGuaPreferencesViewer = 'Переглядач'; + LANGuaPreferencesCommandSC = 'Команда:'; + LANGuaPreferencesUseInternalViewer = 'Використовувати _внутрішній переглядач'; + LANGuaPreferencesEditor = 'Редактор'; + LANGuaPreferencesTerminal = 'Термінал'; + LANGuaPreferencesExperimentalFeatures = 'Експериментальні можливості'; + LANGuaPreferencesExperimentalWarningLabel_Caption = 'Попередження: Робота над цими можливостями ще не завершена наразі, отож, вони ' + + 'можуть не працювати належним чином. Використовуйте їх на Ваш власний ризик!'; + LANGuaPreferencesFocusRefreshCheckBox_Caption = 'Виконувати _оновлення при отриманні вікном фокусу'; + LANGuaPreferencesFocusRefreshCheckBox_Tooltip = 'Дуже повільне оновлення панелей, на даний час'; + LANGuaPreferencesWMCompatModeCheckBox_Caption = 'Режим сумісності зі _WM'; + LANGuaPreferencesWMCompatModeCheckBox_Tooltip = 'Використовуйте, якщо Ви маєте певні проблеми з менеджером вікон (наприклад ICEWM не правильно максимізує вікно)'; + LANGuaPreferencesCompatUseLibcSystemCheckBox_Caption = 'Використовувати libc _system() для виконання програм'; + LANGuaPreferencesCompatUseLibcSystemCheckBox_Tooltip = 'Використовуйте у разі заморожування або збійних проблем при запуску зовнішніх програм'; + + (*************** STRINGS ADDED TO v0.5.70 **********************************************************************************) + LANGuamiSearchCaption2 = '_Пошук...'; + LANGuamiNoMounterBarCaption = '_Не показувати монтувальну панель'; + LANGuamiShowOneMounterBarCaption = 'Показувати _одну монтувальну панель'; + LANGuamiShowTwoMounterBarCaption = 'Показувати _дві монтувальні панелі'; + LANGuamnuNetworkCaption = '_Мережа'; + LANGuamiConnectionsCaption = '_З''єднання...'; + LANGuamiOpenConnectionCaption = '_Відкриті з''єднання...'; + LANGuamiQuickConnectCaption = '_Швидке з''єднання...'; + LANGuamnuPluginsCaption = '_Плаґіни'; + LANGuamiTestPluginCaption = '_Тест плаґіна...'; + LANGuamiMounterSettingsCaption = 'Налаштування _монтувальника...'; + LANGuamiColumnsCaption = 'Панельні _колонки...'; + LANGuamiSavePositionCaption = '_Запам''ятати позицію'; + LANGuamiMountCaption = '_Змонтувати'; + LANGuamiUmountCaption = '_Розмонтувати'; + LANGuamiEjectCaption = '_Витягнути'; + LANGuamiDuplicateTabCaption = 'Здублювати поточну закладку'; + LANGuamiCloseTabCaption = 'Закрити поточну закладку'; + LANGuamiCloseAllTabsCaption = 'Закрити усі закладки'; + LANGuaCannotDetermineDestinationEngine = 'Неможливо визначити пристрій призначення. Введіть, будь-ласка, вірний шлях та спробуйте знову.'; + LANGuaCannotLoadFile = 'Неможливо завантажити файл ''%s''. Перевірте наявні дозволи.'; + LANGuaMountPointDevice = 'Точка монтування: %s'#10'Пристрій: %s'; + LANGuaMountSC = 'Mount:'; + LANGuaNoPluginsFound = 'Не знайдено жодних плаґінів'; + LANGuaPluginAbout = 'Про програму...'; + LANGuaCouldntOpenURI = 'Неможливо відкрити зазначений Універсальний Ідентифікатор Користувача (URI). ' + + 'Перевірте, будь-ласка, логічність ідентифікатора та дозволи на доступ.'; + LANGuaPluginAboutInside = 'Плаґін: %s'#10#10'%s'#10'%s'; + LANGuaAreYouSureCloseAllTabs = 'Чи Ви справді хочете позакривати усі неактивні закладки?'; + LANGuaCouldntOpenURIArchive = 'Неможливо відкрити архів. Перевірте, будь-ласка, логічність та дозволи на доступ.'; + LANGuaThereIsNoModuleAvailable = 'Немає жодного доступного модуля віртуальної файлової системи (VFS), котрий міг би здійснити це з''єднання'; + LANGuaIgnoreError = 'Чи Ви справді хочете ігнорувати цю помилку? Джерельний файл буде знищено'; + LANGuaErrorMount = 'Трапилася помилка при монтуванні пристрою ''%s'':'#10#10; + LANGuaErrorUmount = 'Трапилася помилка при розмонтуванні пристрою ''%s'':'#10#10; + LANGuaErrorEject = 'Трапилася помилка при витягненні пристрою ''%s'':'#10#10; + + LANGuaMounterPrefs_Caption = 'Налаштування монтувальника'; + LANGuaMounterPrefs_TitleLabelCaption = 'Налаштування монтувальника'; + LANGuaMounterPrefs_ListViewFrameCaption = 'Монтувальник'; + LANGuaMounterPrefs_MountName = 'Ім''я монтування'; + LANGuaMounterPrefs_MountPoint = 'Точка монтування'; + LANGuaMounterPrefs_Device = 'Пристрій'; + LANGuaMounterPrefs_MoveUpButtonTooltip = 'Перемістити елемент догори'; + LANGuaMounterPrefs_MoveDownButtonTooltip = 'Перемістити елемент донизу'; + LANGuaMounterPrefs_UseFSTabDefaultsCheckBox = 'Використовувати за умовчанням значення зі _fstab'; + LANGuaMounterPrefs_UseFSTabDefaultsCheckBoxTooltip = 'Якщо вибрано, то монтувальна панель буде за умовчанням заповнена елементами, знайденими у /etc/fstab (системний файл зі списком монтування)'; + LANGuaMounterPrefs_ToggleModeCheckBox = 'Кнопки залишати _натиснутими коли змонтовано'; + LANGuaMounterPrefs_ToggleModeCheckBoxTooltip = 'Якщо вибрано, то кнопки монтування залишати натиснутими якщо пристрій змонтовано; ' + + 'а ще одне клацання призводитиме до розмонтування (чи й витягнення у даному випадку)'; + LANGuaMounterPrefs_PropertiesFrameCaption = 'Властивості монтувального елемента'; + LANGuaMounterPrefs_DisplayTextLabelCaption = '_Текст для відображення:'; + LANGuaMounterPrefs_MountPointLabelCaption = '_Точка монтування:'; + LANGuaMounterPrefs_MountDeviceLabelCaption = '_Пристрій:'; + LANGuaMounterPrefs_DeviceTypeLabelCaption = '_Тип пристрою:'; + LANGuaMounterPrefs_miLocalDiskCaption = 'Локальний диск'; + LANGuaMounterPrefs_miRemovableCaption = 'Витягувальний'; + LANGuaMounterPrefs_miCDCaption = 'Привід CD/DVD'; + LANGuaMounterPrefs_miFloppyCaption = 'Пристрій гнучких дисків'; + LANGuaMounterPrefs_miNetworkCaption = 'Мережа'; + LANGuaMounterPrefs_MountCommandLabelCaption = 'Команда _монтування:'; + LANGuaMounterPrefs_UmountCommandLabelCaption = 'Команда _розмонтування:'; + LANGuaMounterPrefs_MountCommandEntryTooltip = 'Синтаксис: використовуйте %dev для підстановки пристрою та %dir для точки монтування чи лишіть пустим для монтування за ' + + 'умовчанням'#10'Зауваження: стережіться інтерактивних команд, tuxcmd може зависнути!'#10'Приклад: smbmount %dev %dir -o username=netuser,password=somepass'; + LANGuaMounterPrefs_UmountCommandEntryTooltip = 'Синтаксис: використовуйте %dev для підстановки пристрою та %dir для точки ' + + 'монтування чи лишіть пустим для розмонтування за умовчанням'#10'Приклад: smbumount %dir'; + LANGuaMounterPrefs_IconLabelCaption = '_Іконка:'; + + LANGuaConnMgr_Caption = 'Відкрити нове з''єднання'; + LANGuaConnMgr_ConnectButton = '_З''єднання'; + LANGuaConnMgr_OpenConnection = 'Відкрити з''єднання'; + LANGuaConnMgr_NameColumn = 'Ім''я'; + LANGuaConnMgr_URIColumn = 'Універсальний Ідентифікатор Ресурсів (URI)'; + LANGuaConnMgr_AddConnectionButtonCaption = '_Додати сайт...'; + LANGuaConnMgr_AddConnectionButtonTooltip = 'Додати нове з''єднання'; + LANGuaConnMgr_EditButtonCaption = '_Редагувати...'; + LANGuaConnMgr_EditButtonTooltip = 'Редагувати вибране з''єднання'; + LANGuaConnMgr_RemoveButtonCaption = '_Вилучити сайт'; + LANGuaConnMgr_RemoveButtonTooltip = 'Вилучити вибране з''єднання'; + LANGuaConnMgr_DoYouWantDelete = 'Чи Ви справді хочете вилучити з''єднання ''%s''?'; + + LANGuaConnProp_FTP = 'FTP'; + LANGuaConnProp_SFTP = 'SFTP (ssh-підсистема)'; + LANGuaConnProp_SMB = 'Спільний доступ Windows (SMB)'; + LANGuaConnProp_HTTP = 'WebDAV (HTTP)'; + LANGuaConnProp_HTTPS = 'Безпечний WebDAV (HTTPS)'; + LANGuaConnProp_Other = 'Інше (будь-ласка, вкажіть в Універсальному Ідентифікаторі Ресурсів (URI))'; + LANGuaConnProp_Caption = 'Властивості з''єднання'; + LANGuaConnProp_VFSModule = 'Модуль _VFS:'; + LANGuaConnProp_URI = 'Універсальний Ідентифікатор Ресурсів (_URI):'; + LANGuaConnProp_URIEntryTooltip = 'Правильний Універсальний Ідентифікатор Ресурсів (_URI) повинен містити префікс типу сервісу та адрес сервера'; + LANGuaConnProp_DetailedInformations = 'Детальна інформація'; + LANGuaConnProp_Name = '_Ім''я:'; + LANGuaConnProp_Server = '_Сервер[:порт]:'; + LANGuaConnProp_Username = 'Ім''я _користувача_:'; + LANGuaConnProp_UserNameEntryTooltip = 'Залишити пустим для анонімного входу'; + LANGuaConnProp_Password = '_Пароль:'; + LANGuaConnProp_TargetDirectory = '_Тека призначення:'; + LANGuaConnProp_ServiceType = 'Тип _сервісу:'; + LANGuaConnProp_MaskPassword = '_Замаскувати пароль'; + LANGuaConnProp_MenuItemCaption = 'За умовчанням (усі підходящі модулі)'; + + LANGuaConnLogin_Caption = 'Потрібна ідентифікація'; + LANGuaConnLogin_Login = 'Ім''я для входу'; + LANGuaConnLogin_ExperimentalWarningLabelCaption = 'Ви повинні увійти щоб мати доступ до %s'; + LANGuaConnLogin_Username = '_Ім''я користувача:'; + LANGuaConnLogin_Password = '_Пароль:'; + LANGuaConnLogin_AnonymousCheckButton = '_Анонімно'; + + LANGuaColumns_Caption = 'Налаштування колонок панелі'; + LANGuaColumns_Title = 'Налаштування колонок панелі'; + LANGuaColumns_MoveUpButtonTooltip = 'Перемістити елемент догори'; + LANGuaColumns_MoveDownButtonTooltip = 'Перемістити елемент донизу'; + LANGuaColumns_TitlesLongName = 'Ім''я'; + LANGuaColumns_TitlesLongNameExt = 'Ім''я + розширення'; + LANGuaColumns_TitlesLongExt = 'Розширення'; + LANGuaColumns_TitlesLongSize = 'Розмір'; + LANGuaColumns_TitlesLongDateTime = 'Дата + Час'; + LANGuaColumns_TitlesLongDate = 'Дата'; + LANGuaColumns_TitlesLongTime = 'Час'; + LANGuaColumns_TitlesLongUser = 'Користувач'; + LANGuaColumns_TitlesLongGroup = 'Група'; + LANGuaColumns_TitlesLongAttr = 'Атрибути'; + LANGuaColumns_TitlesShortName = 'Ім''я'; + LANGuaColumns_TitlesShortNameExt = 'Ім''я'; + LANGuaColumns_TitlesShortExt = 'Розш.'; + LANGuaColumns_TitlesShortSize = 'Розмір'; + LANGuaColumns_TitlesShortDateTime = 'Дата'; + LANGuaColumns_TitlesShortDate = 'Дата'; + LANGuaColumns_TitlesShortTime = 'Час'; + LANGuaColumns_TitlesShortUser = 'Корист.'; + LANGuaColumns_TitlesShortGroup = 'Група'; + LANGuaColumns_TitlesShortAttr = 'Атриб.'; + + LANGuaTestPlugin_Caption = 'Тестувати плаґін Віртуальної Файлової Системи (VFS)'; + LANGuaTestPlugin_Title = 'Тестувати плаґін Віртуальної Файлової Системи (VFS)'; + LANGuaTestPlugin_ExperimentalWarningLabelCaption = 'Застереження: Підсистема Віртуальної Файлової Системи (VFS) та відповідний ' + + 'плаґін ще активно розробляються та можуть містити помилки. Користуйтеся цією функцією на власний ризик!'; + LANGuaTestPlugin_Plugin = '_Плаґін:'; + LANGuaTestPlugin_Command = '_Команда:'; + LANGuaTestPlugin_Username = '_Ім''я користувача:'; + LANGuaTestPlugin_Password = '_Пароль:'; + LANGuaTestPlugin_AnonymousCheckButton = '_Анонімний вхід (не викликати VFSLogin)'; + LANGuaTestPlugin_NoPluginsFound = 'Не знайдено жодного плаґіна'; + + LANGuaRemoteWait_Caption = 'Дія триває'; + LANGuaRemoteWait_OperationInProgress = 'Дія триває, майте терпіння...'; + LANGuaRemoteWait_ItemsFound = 'Елемент шукається до сих пір: %d'; + + LANGuaSearch_Bytes = 'байт'; + LANGuaSearch_kB = 'кБ'; + LANGuaSearch_MB = 'МБ'; + LANGuaSearch_days = 'днів'; + LANGuaSearch_weeks = 'тижнів'; + LANGuaSearch_months = 'місяців'; + LANGuaSearch_years = 'років'; + LANGuaSearch_Caption = 'Знайти файл'; + LANGuaSearch_General = 'Загальне'; + LANGuaSearch_Advanced = 'Додатково'; + LANGuaSearch_SearchResults = '_Результати пошуку:'; + LANGuaSearch_SearchFor = 'Шукати _за:'; + LANGuaSearch_FileMaskEntryTooltip = 'Порада: Використовуйте двокрапку (";") щоб вказати декілька файлів для пошуку'; + LANGuaSearch_SearchIn = 'Шукати _у:'; + LANGuaSearch_SearchArchivesCheckButton = 'Шукати і у _архівах'; + LANGuaSearch_FindText = 'Знайти _текст:'; + LANGuaSearch_FindTextEntryTooltip = 'Залишайте пустим, якщо не треба шукати текст'#10'Зауважте, що в графічному інтерфейсі (GUI) використовується кодування UTF-8'; + LANGuaSearch_CaseSensitiveCheckButton = 'Чутливо до _реґістру'; + LANGuaSearch_StayCurrentFSCheckButton = 'Включати інші _файлові системи'; + LANGuaSearch_CaseSensitiveMatchCheckButton = '_Чутливо до _реґістру'; + LANGuaSearch_Size = 'Розмір'; + LANGuaSearch_Date = 'Дата'; + LANGuaSearch_BiggerThan = '_Більше ніж'; + LANGuaSearch_SmallerThan = '_Менше аніж'; + LANGuaSearch_ModifiedBetweenRadioButton = '_Змінено між'; + LANGuaSearch_NotModifiedAfterRadioButton = '_Не змінено після'; + LANGuaSearch_ModifiedLastRadioButton = 'Змінено у _кінці'; + LANGuaSearch_ModifiedNotLastRadionButton = '_Не змінено у кінці'; + LANGuaSearch_ModifiedBetweenEntry1 = '"Будь ласка, використовуйте цей формат дати:" c'; + LANGuaSearch_ViewButtonCaption = '_Переглянути файл'; + LANGuaSearch_NewSearchButtonCaption = '_Новий пошук'; + LANGuaSearch_GoToFileButtonCaption = '_Перейти до файлу'; + LANGuaSearch_FeedToListboxButtonCaption = 'Заповнити у _списковому елементі'; + LANGuaSearch_StatusSC = 'Статус:'; + LANGuaSearch_Ready = 'Готово.'; + LANGuaSearch_PreparingToSearch = 'Підготовка для пошуку.'; + LANGuaSearch_SearchInProgress = 'Пошук продовжується:'; + LANGuaSearch_UserCancelled = 'Користувач скасував дію.'; + LANGuaSearch_SearchFinished = 'Пошук завершено'; + LANGuaSearch_FilesFound = '%d файлів знайдено'; + LANGuaSearch_And = 'та'; + + (*************** STRINGS ADDED TO v0.5.82 **********************************************************************************) + LANGuaCloseOpenConnection = 'Ви намагаєтеся відкрити нове з''єднання поверха іншого активного з''єднання. Якщо продовжувати, попереднє з''єднання '+'буде закрите та замінено цим новим.'#10#10'Чи бажаєте продовжувати?'; + LANGuaDuplicateTabWarning = 'Ви намагаєтеся відкрити нову вкладку для віддаленої теки. Однак, машинне клонування не підтримується. Тека у новій вкладці'+' повинна адресуватися у локальну файлову систему.'; + LANGuaDontShowAgain = '_Не показувати це повідомлення знову'; + LANGuaSwitchOtherPanelWarning = 'Ви намагаєтеся відкрити віддалену теку на протилежній панелі. Однак, машинне клонування не підтримується. '+ + 'Цільова тека не може бути перемкнена.'; + LANGuaOpenConnectionsWarning = 'Є активні з''єднання, відкриті на панелі. При закритті програми, ці з''єдання будуть розірвані.'#10#10'Продовжувати виходити?'; + LANGuamiDisconnect_Caption = '_Роз''єднання'; + LANGuaDisconnectButton_Tooltip = 'Розірвати поточне з''єднання'; + LANGuaLeaveArchiveButton_Tooltip = 'Зачинити поточний архів'; + LANGuaOpenTerminalButton_Tooltip = 'Відкриває нові термінальні вікна для поточної теки'; + LANGuaOpenTerminalButton_Caption = 'Відкрити те_рмінал'; + LANGuaShowTextUIDsCheckBox_Caption = 'Показувати тексти _UID'; + LANGuaShowTextUIDsCheckBox_Tooltip = 'Показувати текстову інформацію про користувача та групу взамін показу чисел (UID/GID)'; + + (*************** STRINGS ADDED TO v0.5.100 **********************************************************************************) + LANGuamiNewTab_Caption = 'Нова _закладка для теки'; + LANGuaFilePopupMenu_Properties = '_Властивості'; + LANGuaCommandEntry_Tooltip = 'Використовувати %s як замінник файлу/теки'; + LANGuamiFiles_Caption = 'Лише файли'; + + (*************** STRINGS ADDED TO v0.6.31 **********************************************************************************) + LANGuaPasswordButton_Tooltip = 'Архів потребує пароль.'#10'Клацніть щоб встановити'; + LANGuaHandleRunFromArchive_Bytes = 'байти'; + LANGuaHandleRunFromArchive_FileTypeDesc_Unknown = '(невідомо)'; + LANGuaHandleRunFromArchive_NotAssociated = '(не прив''язано)'; + LANGuaHandleRunFromArchive_SelfExecutable = '(виконавчий)'; + LANGuaHandleRunFromArchive_CouldntCreateTemporaryDirectory = 'Не вдається створити тимчасову теку "%s": %s.'#10#10'Будь ласка, перевірте налаштування тимчасової теки і спробуйте знову.'; + LANGuaFRunFromVFS_Caption = 'Властивості запакованого файлу'; + LANGuaFRunFromVFS_TitleLabel = 'Властивості файлу'; + LANGuaFRunFromVFS_FileNameLabel = 'Назва файлу:'; + LANGuaFRunFromVFS_FileTypeLabel = 'Тип файлу:'; + LANGuaFRunFromVFS_SizeLabel = 'Розмір:'; + LANGuaFRunFromVFS_PackedSizeLabel = 'Стиснутий розмір:'; + LANGuaFRunFromVFS_DateLabel = 'Дата модифікації:'; + LANGuaFRunFromVFS_InfoLabel = 'Відкриття файлів напряму з архівів не підтримується. ' + + 'Клацнувши на кнопки нижче файлу (усі файли відповідно) він буде розпакований до тимчасового розташування. ' + + 'Тимчасові файли будуть вилучені тоді, коли Ви закриваєте Tux Commander.'; + LANGuaFRunFromVFS_OpensWithLabel = 'Відкрити з допомогою:'; + LANGuaFRunFromVFS_ExecuteButton = '_Розпакувати та відкрити'; + LANGuaFRunFromVFS_ExecuteAllButton = 'Розпакувати _усе та відкрити'; + LANGuaFSetPassword_Caption = 'Встановити пароль'; + LANGuaFSetPassword_Label1_Caption = 'Пароль необхідний'; + LANGuaFSetPassword_Label2_Caption = 'Архів зашифровано і необхідний пароль для того щоб розпакувати дані'; + LANGuaFSetPassword_ShowPasswordCheckButton = '_Зняти маскування пароля'; + + + +(********************************************************************************************************************************) +procedure SetTranslation; +begin + LANGF2Button_Caption := LANGuaF2Button_Caption; + LANGF3Button_Caption := LANGuaF3Button_Caption; + LANGF4Button_Caption := LANGuaF4Button_Caption; + LANGF5Button_Caption := LANGuaF5Button_Caption; + LANGF6Button_Caption := LANGuaF6Button_Caption; + LANGF7Button_Caption := LANGuaF7Button_Caption; + LANGF8Button_Caption := LANGuaF8Button_Caption; + + LANGmnuFile_Caption := LANGuamnuFile_Caption; + LANGmnuMark_Caption := LANGuamnuMark_Caption; + LANGmnuCommands_Caption := LANGuamnuCommands_Caption; + LANGmnuHelp_Caption := LANGuamnuHelp_Caption; + LANGmiExit_Caption := LANGuamiExit_Caption; + LANGmiSelectGroup_Caption := LANGuamiSelectGroup_Caption; + LANGmiUnselectGroup_Caption := LANGuamiUnselectGroup_Caption; + LANGmiSelectAll_Caption := LANGuamiSelectAll_Caption; + LANGmiUnselectAll_Caption := LANGuamiUnselectAll_Caption; + LANGmiInvertSelection_Caption := LANGuamiInvertSelection_Caption; + LANGmiRefresh_Caption := LANGuamiRefresh_Caption; + LANGmiAbout_Caption := LANGuamiAbout_Caption; + + LANGColumn1_Caption := LANGuaColumn1_Caption; + LANGColumn2_Caption := LANGuaColumn2_Caption; + LANGColumn3_Caption := LANGuaColumn3_Caption; + LANGColumn4_Caption := LANGuaColumn4_Caption; + LANGColumn5_Caption := LANGuaColumn5_Caption; + + LANGExpandSelection := LANGuaExpandSelection; + LANGShrinkSelection := LANGuaShrinkSelection; + LANGNoMatchesFound := LANGuaNoMatchesFound; + LANGNoFilesSelected := LANGuaNoFilesSelected; + LANGSelectedFilesDirectories := LANGuaSelectedFilesDirectories; + LANGDirectoryS := LANGuaDirectoryS; + LANGFileS := LANGuaFileS; + LANGDoYouReallyWantToDeleteTheS := LANGuaDoYouReallyWantToDeleteTheS; + LANGDoYouReallyWantToDeleteTheSS := LANGuaDoYouReallyWantToDeleteTheSS; + LANGCopyFiles := LANGuaCopyFiles; + LANGMoveRenameFiles := LANGuaMoveRenameFiles; + LANGCopyDFileDirectoriesTo := LANGuaCopyDFileDirectoriesTo; + LANGMoveRenameDFileDirectoriesTo := LANGuaMoveRenameDFileDirectoriesTo; + LANGCopySC := LANGuaCopySC; + LANGMoveRenameSC := LANGuaMoveRenameSC; + + LANGQuickFind := LANGuaQuickFind; + + LANGAboutString := LANGuaAboutString; + LANGAboutStringGnome := LANGuaAboutStringGnome; + LANGDiskStatFmt := LANGuaDiskStatFmt; + LANGDiskStatVolNameFmt := LANGuaDiskStatVolNameFmt; + LANGStatusLineFmt := LANGuaStatusLineFmt; + LANGPanelStrings[False] := LANGuaPanelStrings[False]; + LANGPanelStrings[True] := LANGuaPanelStrings[True]; + LANGDIR := LANGuaDIR; + LANGErrorGettingListingForSPanel := LANGuaErrorGettingListingForSPanel; + LANGErrorGettingListingForSPanelNoPath := LANGuaErrorGettingListingForSPanelNoPath; + LANGErrorCreatingNewDirectorySInSPanel := LANGuaErrorCreatingNewDirectorySInSPanel; + LANGErrorCreatingNewDirectorySInSPanelNoPath := LANGuaErrorCreatingNewDirectorySInSPanelNoPath; + LANGTheFileDirectory := LANGuaTheFileDirectory; + LANGCouldNotBeDeleted := LANGuaCouldNotBeDeleted; + LANGCouldNotBeDeletedS := LANGuaCouldNotBeDeletedS; + LANGUserCancelled := LANGuaUserCancelled; + LANGTheDirectorySIsNotEmpty := LANGuaTheDirectorySIsNotEmpty; + LANGCannotCopyFile := LANGuaCannotCopyFile; + LANGCopyError := LANGuaCopyError; + LANGMoveError := LANGuaMoveError; + LANGOverwriteS := LANGuaOverwriteS; + LANGWithFileS := LANGuaWithFileS; + LANGOvewriteSBytesS := LANGuaOvewriteSBytesS; + LANGTheFile := LANGuaTheFile; + LANGCopy := LANGuaCopy; + LANGMove := LANGuaMove; + LANGTheDirectory := LANGuaTheDirectory; + LANGTheSymbolicLink := LANGuaTheSymbolicLink; + LANGCannotMoveFile := LANGuaCannotMoveFile; + LANGCouldNotBeCreated := LANGuaCouldNotBeCreated; + LANGCouldNotBeCreatedS := LANGuaCouldNotBeCreatedS; + LANGFromS := LANGuaFromS; + LANGToS := LANGuaToS; + LANGCannotCopyFileToItself := LANGuaCannotCopyFileToItself; + LANGMemoryAllocationFailed := LANGuaMemoryAllocationFailed; + LANGCannotOpenSourceFile := LANGuaCannotOpenSourceFile; + LANGCannotOpenDestinationFile := LANGuaCannotOpenDestinationFile; + LANGCannotCloseDestinationFile := LANGuaCannotCloseDestinationFile; + LANGCannotCloseSourceFile := LANGuaCannotCloseSourceFile; + LANGCannotReadFromSourceFile := LANGuaCannotReadFromSourceFile; + LANGCannotWriteToDestinationFile := LANGuaCannotWriteToDestinationFile; + + LANGUnknownException := LANGuaUnknownException; + LANGNoAccess := LANGuaNoAccess; + LANGUnknownError := LANGuaUnknownError; + + LANGCreateANewDirectory := LANGuaCreateANewDirectory; + LANGEnterDirectoryName := LANGuaEnterDirectoryName; + + LANGOverwriteQuestion := LANGuaOverwriteQuestion; + LANGOverwriteButton_Caption := LANGuaOverwriteButton_Caption; + LANGOverwriteAllButton_Caption := LANGuaOverwriteAllButton_Caption; + LANGSkipButton_Caption := LANGuaSkipButton_Caption; + LANGOverwriteAllOlderButton_Caption := LANGuaOverwriteAllOlderButton_Caption; + LANGSkipAllButton_Caption := LANGuaSkipAllButton_Caption; + LANGRenameButton_Caption := LANGuaRenameButton_Caption; + LANGAppendButton_Caption := LANGuaAppendButton_Caption; + LANGRename := LANGuaRename; + LANGRenameFile := LANGuaRenameFile; + LANGIgnoreButton_Caption := LANGuaIgnoreButton_Caption; + + LANGProgress := LANGuaProgress; + LANGCancel := LANGuaCancel; + LANGDelete := LANGuaDelete; + + LANGSpecifyFileType := LANGuaSpecifyFileType; + + LANGRemoveDirectory := LANGuaRemoveDirectory; + LANGDoYouWantToDeleteItWithAllItsFilesAndSubdirectories := LANGuaDoYouWantToDeleteItWithAllItsFilesAndSubdirectories; + LANGRetry := LANGuaRetry; + LANGDeleteButton_Caption := LANGuaDeleteButton_Caption; + LANGAll := LANGuaAll; + + LANGCopyFilesSC := LANGuaCopyFilesSC; + LANGAppendQuestion := LANGuaAppendQuestion; + LANGPreparingList := LANGuaPreparingList; + + LANGYouMustSelectAValidFile := LANGuaYouMustSelectAValidFile; + LANGmiVerifyChecksums := LANGuamiVerifyChecksums; + LANGVerifyChecksumsCaption := LANGuaVerifyChecksumsCaption; + LANGCheckButtonCaptionCheck := LANGuaCheckButtonCaptionCheck; + LANGCheckButtonCaptionStop := LANGuaCheckButtonCaptionStop; + LANGFileListTooltip := LANGuaFileListTooltip; + LANGFilenameColumnCaption := LANGuaFilenameColumnCaption; + LANGTheFileSYouAreTryingToOpenIsQuiteBig := LANGuaTheFileSYouAreTryingToOpenIsQuiteBig; + LANGAnErrorOccuredWhileInitializingMemoryBlock := LANGuaAnErrorOccuredWhileInitializingMemoryBlock; + LANGAnErrorOccuredWhileOpeningFileSS := LANGuaAnErrorOccuredWhileOpeningFileSS; + LANGAnErrorOccuredWhileReadingFileSS := LANGuaAnErrorOccuredWhileReadingFileSS; + LANGChecksumNotChecked := LANGuaChecksumNotChecked; + LANGChecksumChecking := LANGuaChecksumChecking; + LANGChecksumInterrupted := LANGuaChecksumInterrupted; + LANGChecksumDOK := LANGuaChecksumDOK; + + LANGmiCreateChecksumsCaption := LANGuamiCreateChecksumsCaption; + LANGYouMustSelectAtLeastOneFileToCalculateChecksum := LANGuaYouMustSelectAtLeastOneFileToCalculateChecksum; + LANGCreateChecksumsCaption := LANGuaCreateChecksumsCaption; + LANGCCHKSUMPage1Text := LANGuaCCHKSUMPage1Text; + LANGCCHKSUMPage4Text := LANGuaCCHKSUMPage4Text; + LANGCCHKSUMPage6Text := LANGuaCCHKSUMPage6Text; + LANGCCHKSUMPage7Text := LANGuaCCHKSUMPage7Text; + LANGCCHKSUMPage1Title := LANGuaCCHKSUMPage1Title; + LANGCCHKSUMPage2Title := LANGuaCCHKSUMPage2Title; + LANGCCHKSUMPage3Title := LANGuaCCHKSUMPage3Title; + LANGCCHKSUMPage4Title := LANGuaCCHKSUMPage4Title; + LANGCCHKSUMPage5Title := LANGuaCCHKSUMPage5Title; + LANGCCHKSUMPage6Title := LANGuaCCHKSUMPage6Title; + LANGCCHKSUMPage7Title := LANGuaCCHKSUMPage7Title; + LANGCCHKSUMSFVFile := LANGuaCCHKSUMSFVFile; + LANGCCHKSUMMD5sumFile := LANGuaCCHKSUMMD5sumFile; + LANGCCHKSUMFileName := LANGuaCCHKSUMFileName; + LANGCCHKSUMCreateSeparateChecksumFiles := LANGuaCCHKSUMCreateSeparateChecksumFiles; + LANGCCHKSUMNowProcessingFileS := LANGuaCCHKSUMNowProcessingFileS; + LANGCCHKSUMFinishCaption := LANGuaCCHKSUMFinishCaption; + LANGCCHKSUMAreYouSureYouWantToAbortTheProcessing := LANGuaCCHKSUMAreYouSureYouWantToAbortTheProcessing; + LANGCCHKSUMAnErrorOccuredWhileOpeningFileSS := LANGuaCCHKSUMAnErrorOccuredWhileOpeningFileSS; + LANGCCHKSUMAnErrorOccuredWhileReadingFileSS := LANGuaCCHKSUMAnErrorOccuredWhileReadingFileSS; + LANGCCHKSUMAnErrorOccuredWhileWritingFileSS := LANGuaCCHKSUMAnErrorOccuredWhileWritingFileSS; + + LANGAnErrorOccuredWhileWritingFileSS := LANGuaAnErrorOccuredWhileWritingFileSS; + LANGTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt := LANGuaTheTargetFileSAlreadyExistsDoYouWantToOverwriteIt; + LANGTheTargetFileSCannotBeRemovedS := LANGuaTheTargetFileSCannotBeRemovedS; + LANGMergeCaption := LANGuaMergeCaption; + LANGPleaseInsertNextDiskOrGiveDifferentLocation := LANGuaPleaseInsertNextDiskOrGiveDifferentLocation; + LANGMergeOfSSucceeded := LANGuaMergeOfSSucceeded; + LANGWarningCreatedFileFailsCRCCheck := LANGuaWarningCreatedFileFailsCRCCheck; + LANGMergeOfSSucceeded_NoCRCFileAvailable := LANGuaMergeOfSSucceeded_NoCRCFileAvailable; + LANGMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory := LANGuaMergeSAndAllFilesWithAscendingNamesToTheFollowingDirectory; + LANGMergeSC := LANGuaMergeSC; + LANGmiSplitFileCaption := LANGuamiSplitFileCaption; + LANGmiMergeFilesCaption := LANGuamiMergeFilesCaption; + + LANGSplitTheFileSToDirectory := LANGuaSplitTheFileSToDirectory; + LANGSplitSC := LANGuaSplitSC; + LANGSplitFile := LANGuaSplitFile; + LANGBytesPerFile := LANGuaBytesPerFile; + LANGAutomatic := LANGuaAutomatic; + LANGDeleteFilesOnTargetDisk := LANGuaDeleteFilesOnTargetDisk; + LANGSplitCaption := LANGuaSplitCaption; + LANGCannotOpenFileS := LANGuaCannotOpenFileS; + LANGCannotSplitTheFileToMoreThan999Parts := LANGuaCannotSplitTheFileToMoreThan999Parts; + LANGThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem := LANGuaThereAreSomeFilesInTheTargetDirectorySDoYouWantToDeleteThem; + LANGThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem := LANGuaThereAreDFilesInTheTargetDirectoryDoYouWantToDeleteThem; + LANGAnErrorOccuredWhileOperationS := LANGuaAnErrorOccuredWhileOperationS; + LANGSplitOfSSucceeded := LANGuaSplitOfSSucceeded; + LANGSplitOfSFailed := LANGuaSplitOfSFailed; + + LANGmnuShow_Caption := LANGuamnuShow_Caption; + LANGmiShowDotFiles_Caption := LANGuamiShowDotFiles_Caption; + LANGTheFileYouAreTryingToOpenIsQuiteBig := LANGuaTheFileYouAreTryingToOpenIsQuiteBig; + LANGCannotExecuteSPleaseCheckTheConfiguration := LANGuaCannotExecuteSPleaseCheckTheConfiguration; + LANGEdit := LANGuaEdit; + LANGEnterFilenameToEdit := LANGuaEnterFilenameToEdit; + + LANGmnuSettings_Caption := LANGuamnuSettings_Caption; + LANGmiFileTypes_Caption := LANGuamiFileTypes_Caption; + LANGThereIsNoApplicationAssociatedWithS := LANGuaThereIsNoApplicationAssociatedWithS; + LANGErrorExecutingCommand := LANGuaErrorExecutingCommand; + LANGEditFileTypesCaption := LANGuaEditFileTypesCaption; + LANGTitleLabel_Caption := LANGuaTitleLabel_Caption; + LANGExtensionsColumn := LANGuaExtensionsColumn; + LANGDescriptionColumn := LANGuaDescriptionColumn; + LANGFileTypesList := LANGuaFileTypesList; + LANGActionName := LANGuaActionName; + LANGCommand := LANGuaCommand; + LANGSetDefaultActionButton_Caption := LANGuaSetDefaultActionButton_Caption; + LANGRunInTerminalCheckBox_Caption := LANGuaRunInTerminalCheckBox_Caption; + LANGAutodetectCheckBox_Caption := LANGuaAutodetectCheckBox_Caption; + LANGBrowseButton_Caption := LANGuaBrowseButton_Caption; + LANGCommandLabel_Caption := LANGuaCommandLabel_Caption; + LANGDescriptionLabel_Caption := LANGuaDescriptionLabel_Caption; + LANGFNameExtLabel_Caption := LANGuaFNameExtLabel_Caption; + LANGNotebookPageExtensions := LANGuaNotebookPageExtensions; + LANGNotebookPageActions := LANGuaNotebookPageActions; + LANGDefault := LANGuaDefault; + LANGCannotSaveFileTypeAssociationsBecauseOtherProcess := LANGuaCannotSaveFileTypeAssociationsBecauseOtherProcess; + + LANGDefaultColor := LANGuaDefaultColor; + LANGIcon := LANGuaIcon; + LANGBrowseForIcon := LANGuaBrowseForIcon; + LANGSelectFileTypeColor := LANGuaSelectFileTypeColor; + LANGColor := LANGuaColor; + + LANGmiChangePermissions_Caption := LANGuamiChangePermissions_Caption; + LANGmiChangeOwner_Caption := LANGuamiChangeOwner_Caption; + LANGmiCreateSymlink_Caption := LANGuamiCreateSymlink_Caption; + LANGmiEditSymlink_Caption := LANGuamiEditSymlink_Caption; + LANGChmodProgress := LANGuaChmodProgress; + LANGChownProgress := LANGuaChownProgress; + LANGYouMustSelectAValidSymbolicLink := LANGuaYouMustSelectAValidSymbolicLink; + LANGPopupRunS := LANGuaPopupRunS; + LANGPopupOpenS := LANGuaPopupOpenS; + LANGPopupGoUp := LANGuaPopupGoUp; + LANGPopupOpenWithS := LANGuaPopupOpenWithS; + LANGPopupDefault := LANGuaPopupDefault; + LANGPopupOpenWith := LANGuaPopupOpenWith; + LANGPopupViewFile := LANGuaPopupViewFile; + LANGPopupEditFile := LANGuaPopupEditFile; + LANGPopupMakeSymlink := LANGuaPopupMakeSymlink; + LANGPopupRename := LANGuaPopupRename; + LANGPopupDelete := LANGuaPopupDelete; + LANGDialogChangePermissions := LANGuaDialogChangePermissions; + LANGCouldNotBeChmoddedS := LANGuaCouldNotBeChmoddedS; + LANGDialogChangeOwner := LANGuaDialogChangeOwner; + LANGCouldNotBeChownedS := LANGuaCouldNotBeChownedS; + LANGDialogMakeSymlink := LANGuaDialogMakeSymlink; + LANGDialogEditSymlink := LANGuaDialogEditSymlink; + LANGFEditSymlink_Caption := LANGuaFEditSymlink_Caption; + LANGFEditSymlink_SymbolicLinkFilename := LANGuaFEditSymlink_SymbolicLinkFilename; + LANGFEditSymlink_SymbolicLinkPointsTo := LANGuaFEditSymlink_SymbolicLinkPointsTo; + + LANGFChmod_Caption := LANGuaFChmod_Caption; + LANGFChmod_PermissionFrame := LANGuaFChmod_PermissionFrame; + LANGFChmod_FileFrame := LANGuaFChmod_FileFrame; + LANGFChmod_ApplyRecursivelyFor := LANGuaFChmod_ApplyRecursivelyFor; + LANGFChmod_miAllFiles := LANGuaFChmod_miAllFiles; + LANGFChmod_miDirectories := LANGuaFChmod_miDirectories; + LANGFChmod_OctalLabel := LANGuaFChmod_OctalLabel; + LANGFChmod_SUID := LANGuaFChmod_SUID; + LANGFChmod_SGID := LANGuaFChmod_SGID; + LANGFChmod_Sticky := LANGuaFChmod_Sticky; + LANGFChmod_RUSR := LANGuaFChmod_RUSR; + LANGFChmod_WUSR := LANGuaFChmod_WUSR; + LANGFChmod_XUSR := LANGuaFChmod_XUSR; + LANGFChmod_RGRP := LANGuaFChmod_RGRP; + LANGFChmod_WGRP := LANGuaFChmod_WGRP; + LANGFChmod_XGRP := LANGuaFChmod_XGRP; + LANGFChmod_ROTH := LANGuaFChmod_ROTH; + LANGFChmod_WOTH := LANGuaFChmod_WOTH; + LANGFChmod_XOTH := LANGuaFChmod_XOTH; + LANGFChmod_TextLabel := LANGuaFChmod_TextLabel; + LANGFChmod_FileLabel := LANGuaFChmod_FileLabel; + LANGFChown_Caption := LANGuaFChown_Caption; + LANGFChown_OwnerFrame := LANGuaFChown_OwnerFrame; + LANGFChown_GroupFrame := LANGuaFChown_GroupFrame; + LANGFChown_FileFrame := LANGuaFChown_FileFrame; + LANGFChown_ApplyRecursively := LANGuaFChown_ApplyRecursively; + + LANGFSymlink_Caption := LANGuaFSymlink_Caption; + LANGFSymlink_ExistingFilename := LANGuaFSymlink_ExistingFilename; + LANGFSymlink_SymlinkFilename := LANGuaFSymlink_SymlinkFilename; + + LANGmnuBookmarks_Caption := LANGuamnuBookmarks_Caption; + LANGmiAddBookmark_Caption := LANGuamiAddBookmark_Caption; + LANGmiEditBookmarks_Caption := LANGuamiEditBookmarks_Caption; + LANGBookmarkPopupDelete_Caption := LANGuaBookmarkPopupDelete_Caption; + LANGmiPreferences_Caption := LANGuamiPreferences_Caption; + LANGTheCurrentDirectoryAlreadyExistsInTheBookmarksList := LANGuaTheCurrentDirectoryAlreadyExistsInTheBookmarksList; + LANGSomeOtherInstanceChanged := LANGuaSomeOtherInstanceChanged1 + LANGuaSomeOtherInstanceChanged2; + + LANGPreferences_Caption := LANGuaPreferences_Caption; + LANGPreferences_TitleLabel_Caption := LANGuaPreferences_TitleLabel_Caption; + LANGPreferences_GeneralPage := LANGuaPreferences_GeneralPage; + LANGPreferences_FontsPage := LANGuaPreferences_FontsPage; + LANGPreferences_ColorsPage := LANGuaPreferences_ColorsPage; + LANGPreferences_RowHeight := LANGuaPreferences_RowHeight; + LANGPreferences_NumHistoryItems := LANGuaPreferences_NumHistoryItems; + LANGPreferences_Default := LANGuaPreferences_Default; + LANGPreferences_ClearReadonlyAttribute := LANGuaPreferences_ClearReadonlyAttribute; + LANGPreferences_DisableMouseRenaming := LANGuaPreferences_DisableMouseRenaming; + LANGPreferences_ShowFiletypeIconsInList := LANGuaPreferences_ShowFiletypeIconsInList; + LANGPreferences_ExternalAppsLabel := LANGuaPreferences_ExternalAppsLabel; + LANGPreferences_Viewer := LANGuaPreferences_Viewer; + LANGPreferences_Editor := LANGuaPreferences_Editor; + LANGPreferences_Terminal := LANGuaPreferences_Terminal; + LANGPreferences_ListFont := LANGuaPreferences_ListFont; + LANGPreferences_Change := LANGuaPreferences_Change; + LANGPreferences_UseDefaultFont := LANGuaPreferences_UseDefaultFont; + LANGPreferences_Foreground := LANGuaPreferences_Foreground; + LANGPreferences_Background := LANGuaPreferences_Background; + LANGPreferences_NormalItem := LANGuaPreferences_NormalItem; + LANGPreferences_SetToDefaultToUseGTKThemeColors := LANGuaPreferences_SetToDefaultToUseGTKThemeColors; + LANGPreferences_Cursor := LANGuaPreferences_Cursor; + LANGPreferences_InactiveItem := LANGuaPreferences_InactiveItem; + LANGPreferences_SelectedItem := LANGuaPreferences_SelectedItem; + LANGPreferences_LinkItem := LANGuaPreferences_LinkItem; + LANGPreferences_LinkItemHint := LANGuaPreferences_LinkItemHint; + LANGPreferences_DotFileItem := LANGuaPreferences_DotFileItem; + LANGPreferences_DotFileItemHint := LANGuaPreferences_DotFileItemHint; + LANGPreferences_BrowseForApplication := LANGuaPreferences_BrowseForApplication; + LANGPreferences_DefaultS := LANGuaPreferences_DefaultS; + LANGPreferences_SelectFont := LANGuaPreferences_SelectFont; + + LANGBookmarkButton_Tooltip := LANGuaBookmarkButton_Tooltip; + LANGUpButton_Tooltip := LANGuaUpButton_Tooltip; + LANGRootButton_Tooltip := LANGuaRootButton_Tooltip; + LANGHomeButton_Tooltip := LANGuaHomeButton_Tooltip; + LANGLeftEqualButton_Tooltip := LANGuaLeftEqualButton_Tooltip; + LANGRightEqualButton_Tooltip := LANGuaRightEqualButton_Tooltip; + LANGmiShowDirectorySizes_Caption := LANGuamiShowDirectorySizes_Caption; + LANGmiTargetSource_Caption := LANGuamiTargetSource_Caption; + LANGFileTypeDirectory := LANGuaFileTypeDirectory; + LANGFileTypeFile := LANGuaFileTypeFile; + LANGFileTypeMetafile := LANGuaFileTypeMetafile; + LANGPreferencesPanelsPage := LANGuaPreferencesPanelsPage; + LANGPreferencesApplicationsPage := LANGuaPreferencesApplicationsPage; + LANGPreferencesExperimentalPage := LANGuaPreferencesExperimentalPage; + LANGPreferencesSelectAllDirectoriesCheckBox_Caption := LANGuaPreferencesSelectAllDirectoriesCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Caption := LANGuaPreferencesNewStyleAltOCheckBox_Caption; + LANGPreferencesNewStyleAltOCheckBox_Tooltip := LANGuaPreferencesNewStyleAltOCheckBox_Tooltip; + LANGPreferencesShowFuncButtonsCheckBox_Caption := LANGuaPreferencesShowFuncButtonsCheckBox_Caption; + LANGPreferencesSizeFormatLabel_Caption := LANGuaPreferencesSizeFormatLabel_Caption; + LANGPreferencesmiSizeFormat1 := LANGuaPreferencesmiSizeFormat1; + LANGPreferencesmiSizeFormat6 := LANGuaPreferencesmiSizeFormat6; + LANGPreferencesAutodetectXApp := LANGuaPreferencesAutodetectXApp; + LANGPreferencesAlwaysRunInTerminal := LANGuaPreferencesAlwaysRunInTerminal; + LANGPreferencesNeverRunInTerminal := LANGuaPreferencesNeverRunInTerminal; + LANGPreferencesCmdLineBehaviourLabel_Caption := LANGuaPreferencesCmdLineBehaviourLabel_Caption; + LANGPreferencesFeatures := LANGuaPreferencesFeatures; + LANGPreferencesDisableMouseRename_Tooltip := LANGuaPreferencesDisableMouseRename_Tooltip; + LANGPreferencesDisableFileTipsCheckBox_Caption := LANGuaPreferencesDisableFileTipsCheckBox_Caption; + LANGPreferencesDisableFileTipsCheckBox_Tooltip := LANGuaPreferencesDisableFileTipsCheckBox_Tooltip; + LANGPreferencesShow := LANGuaPreferencesShow; + LANGPreferencesDirsInBoldCheckBox_Caption := LANGuaPreferencesDirsInBoldCheckBox_Caption; + LANGPreferencesDisableDirectoryBracketsCheckBox_Caption := LANGuaPreferencesDisableDirectoryBracketsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Caption := LANGuaPreferencesOctalPermissionsCheckBox_Caption; + LANGPreferencesOctalPermissionsCheckBox_Tooltip := LANGuaPreferencesOctalPermissionsCheckBox_Tooltip; + LANGPreferencesMovement := LANGuaPreferencesMovement; + LANGPreferencesLynxLikeMotionCheckBox_Caption := LANGuaPreferencesLynxLikeMotionCheckBox_Caption; + LANGPreferencesInsertMovesDownCheckBox_Caption := LANGuaPreferencesInsertMovesDownCheckBox_Caption; + LANGPreferencesSpaceMovesDownCheckBox_Caption := LANGuaPreferencesSpaceMovesDownCheckBox_Caption; + LANGPreferencesViewer := LANGuaPreferencesViewer; + LANGPreferencesCommandSC := LANGuaPreferencesCommandSC; + LANGPreferencesUseInternalViewer := LANGuaPreferencesUseInternalViewer; + LANGPreferencesEditor := LANGuaPreferencesEditor; + LANGPreferencesTerminal := LANGuaPreferencesTerminal; + LANGPreferencesExperimentalFeatures := LANGuaPreferencesExperimentalFeatures; + LANGPreferencesExperimentalWarningLabel_Caption := LANGuaPreferencesExperimentalWarningLabel_Caption; + LANGPreferencesFocusRefreshCheckBox_Caption := LANGuaPreferencesFocusRefreshCheckBox_Caption; + LANGPreferencesFocusRefreshCheckBox_Tooltip := LANGuaPreferencesFocusRefreshCheckBox_Tooltip; + LANGPreferencesWMCompatModeCheckBox_Caption := LANGuaPreferencesWMCompatModeCheckBox_Caption; + LANGPreferencesWMCompatModeCheckBox_Tooltip := LANGuaPreferencesWMCompatModeCheckBox_Tooltip; + LANGPreferencesCompatUseLibcSystemCheckBox_Caption := LANGuaPreferencesCompatUseLibcSystemCheckBox_Caption; + LANGPreferencesCompatUseLibcSystemCheckBox_Tooltip := LANGuaPreferencesCompatUseLibcSystemCheckBox_Tooltip; + + LANGmiSearchCaption2 := LANGuamiSearchCaption2; + LANGmiNoMounterBarCaption := LANGuamiNoMounterBarCaption; + LANGmiShowOneMounterBarCaption := LANGuamiShowOneMounterBarCaption; + LANGmiShowTwoMounterBarCaption := LANGuamiShowTwoMounterBarCaption; + LANGmnuNetworkCaption := LANGuamnuNetworkCaption; + LANGmiConnectionsCaption := LANGuamiConnectionsCaption; + LANGmiOpenConnectionCaption := LANGuamiOpenConnectionCaption; + LANGmiQuickConnectCaption := LANGuamiQuickConnectCaption; + LANGmnuPluginsCaption := LANGuamnuPluginsCaption; + LANGmiTestPluginCaption := LANGuamiTestPluginCaption; + LANGmiMounterSettingsCaption := LANGuamiMounterSettingsCaption; + LANGmiColumnsCaption := LANGuamiColumnsCaption; + LANGmiSavePositionCaption := LANGuamiSavePositionCaption; + LANGmiMountCaption := LANGuamiMountCaption; + LANGmiUmountCaption := LANGuamiUmountCaption; + LANGmiEjectCaption := LANGuamiEjectCaption; + LANGmiDuplicateTabCaption := LANGuamiDuplicateTabCaption; + LANGmiCloseTabCaption := LANGuamiCloseTabCaption; + LANGmiCloseAllTabsCaption := LANGuamiCloseAllTabsCaption; + LANGCannotDetermineDestinationEngine := LANGuaCannotDetermineDestinationEngine; + LANGCannotLoadFile := LANGuaCannotLoadFile; + LANGMountPointDevice := LANGuaMountPointDevice; + LANGMountSC := LANGuaMountSC; + LANGNoPluginsFound := LANGuaNoPluginsFound; + LANGPluginAbout := LANGuaPluginAbout; + LANGCouldntOpenURI := LANGuaCouldntOpenURI; + LANGPluginAboutInside := LANGuaPluginAboutInside; + LANGAreYouSureCloseAllTabs := LANGuaAreYouSureCloseAllTabs; + LANGCouldntOpenURIArchive := LANGuaCouldntOpenURIArchive; + LANGThereIsNoModuleAvailable := LANGuaThereIsNoModuleAvailable; + LANGIgnoreError := LANGuaIgnoreError; + LANGErrorMount := LANGuaErrorMount; + LANGErrorUmount := LANGuaErrorUmount; + LANGErrorEject := LANGuaErrorEject; + + LANGMounterPrefs_Caption := LANGuaMounterPrefs_Caption; + LANGMounterPrefs_TitleLabelCaption := LANGuaMounterPrefs_TitleLabelCaption; + LANGMounterPrefs_ListViewFrameCaption := LANGuaMounterPrefs_ListViewFrameCaption; + LANGMounterPrefs_MountName := LANGuaMounterPrefs_MountName; + LANGMounterPrefs_MountPoint := LANGuaMounterPrefs_MountPoint; + LANGMounterPrefs_Device := LANGuaMounterPrefs_Device; + LANGMounterPrefs_MoveUpButtonTooltip := LANGuaMounterPrefs_MoveUpButtonTooltip; + LANGMounterPrefs_MoveDownButtonTooltip := LANGuaMounterPrefs_MoveDownButtonTooltip; + LANGMounterPrefs_UseFSTabDefaultsCheckBox := LANGuaMounterPrefs_UseFSTabDefaultsCheckBox; + LANGMounterPrefs_UseFSTabDefaultsCheckBoxTooltip := LANGuaMounterPrefs_UseFSTabDefaultsCheckBoxTooltip; + LANGMounterPrefs_ToggleModeCheckBox := LANGuaMounterPrefs_ToggleModeCheckBox; + LANGMounterPrefs_ToggleModeCheckBoxTooltip := LANGuaMounterPrefs_ToggleModeCheckBoxTooltip; + LANGMounterPrefs_PropertiesFrameCaption := LANGuaMounterPrefs_PropertiesFrameCaption; + LANGMounterPrefs_DisplayTextLabelCaption := LANGuaMounterPrefs_DisplayTextLabelCaption; + LANGMounterPrefs_MountPointLabelCaption := LANGuaMounterPrefs_MountPointLabelCaption; + LANGMounterPrefs_MountDeviceLabelCaption := LANGuaMounterPrefs_MountDeviceLabelCaption; + LANGMounterPrefs_DeviceTypeLabelCaption := LANGuaMounterPrefs_DeviceTypeLabelCaption; + LANGMounterPrefs_miLocalDiskCaption := LANGuaMounterPrefs_miLocalDiskCaption; + LANGMounterPrefs_miRemovableCaption := LANGuaMounterPrefs_miRemovableCaption; + LANGMounterPrefs_miCDCaption := LANGuaMounterPrefs_miCDCaption; + LANGMounterPrefs_miFloppyCaption := LANGuaMounterPrefs_miFloppyCaption; + LANGMounterPrefs_miNetworkCaption := LANGuaMounterPrefs_miNetworkCaption; + LANGMounterPrefs_MountCommandLabelCaption := LANGuaMounterPrefs_MountCommandLabelCaption; + LANGMounterPrefs_UmountCommandLabelCaption := LANGuaMounterPrefs_UmountCommandLabelCaption; + LANGMounterPrefs_MountCommandEntryTooltip := LANGuaMounterPrefs_MountCommandEntryTooltip; + LANGMounterPrefs_UmountCommandEntryTooltip := LANGuaMounterPrefs_UmountCommandEntryTooltip; + LANGMounterPrefs_IconLabelCaption := LANGuaMounterPrefs_IconLabelCaption; + + LANGConnMgr_Caption := LANGuaConnMgr_Caption; + LANGConnMgr_ConnectButton := LANGuaConnMgr_ConnectButton; + LANGConnMgr_OpenConnection := LANGuaConnMgr_OpenConnection; + LANGConnMgr_NameColumn := LANGuaConnMgr_NameColumn; + LANGConnMgr_URIColumn := LANGuaConnMgr_URIColumn; + LANGConnMgr_AddConnectionButtonCaption := LANGuaConnMgr_AddConnectionButtonCaption; + LANGConnMgr_AddConnectionButtonTooltip := LANGuaConnMgr_AddConnectionButtonTooltip; + LANGConnMgr_EditButtonCaption := LANGuaConnMgr_EditButtonCaption; + LANGConnMgr_EditButtonTooltip := LANGuaConnMgr_EditButtonTooltip; + LANGConnMgr_RemoveButtonCaption := LANGuaConnMgr_RemoveButtonCaption; + LANGConnMgr_RemoveButtonTooltip := LANGuaConnMgr_RemoveButtonTooltip; + LANGConnMgr_DoYouWantDelete := LANGuaConnMgr_DoYouWantDelete; + + LANGConnProp_FTP := LANGuaConnProp_FTP; + LANGConnProp_SFTP := LANGuaConnProp_SFTP; + LANGConnProp_SMB := LANGuaConnProp_SMB; + LANGConnProp_HTTP := LANGuaConnProp_HTTP; + LANGConnProp_HTTPS := LANGuaConnProp_HTTPS; + LANGConnProp_Other := LANGuaConnProp_Other; + LANGConnProp_Caption := LANGuaConnProp_Caption; + LANGConnProp_VFSModule := LANGuaConnProp_VFSModule; + LANGConnProp_URI := LANGuaConnProp_URI; + LANGConnProp_URIEntryTooltip := LANGuaConnProp_URIEntryTooltip; + LANGConnProp_DetailedInformations := LANGuaConnProp_DetailedInformations; + LANGConnProp_Name := LANGuaConnProp_Name; + LANGConnProp_Server := LANGuaConnProp_Server; + LANGConnProp_Username := LANGuaConnProp_Username; + LANGConnProp_UserNameEntryTooltip := LANGuaConnProp_UserNameEntryTooltip; + LANGConnProp_Password := LANGuaConnProp_Password; + LANGConnProp_TargetDirectory := LANGuaConnProp_TargetDirectory; + LANGConnProp_ServiceType := LANGuaConnProp_ServiceType; + LANGConnProp_MaskPassword := LANGuaConnProp_MaskPassword; + LANGConnProp_MenuItemCaption := LANGuaConnProp_MenuItemCaption; + + LANGConnLogin_Caption := LANGuaConnLogin_Caption; + LANGConnLogin_Login := LANGuaConnLogin_Login; + LANGConnLogin_ExperimentalWarningLabelCaption := LANGuaConnLogin_ExperimentalWarningLabelCaption; + LANGConnLogin_Username := LANGuaConnLogin_Username; + LANGConnLogin_Password := LANGuaConnLogin_Password; + LANGConnLogin_AnonymousCheckButton := LANGuaConnLogin_AnonymousCheckButton; + + LANGColumns_Caption := LANGuaColumns_Caption; + LANGColumns_Title := LANGuaColumns_Title; + LANGColumns_MoveUpButtonTooltip := LANGuaColumns_MoveUpButtonTooltip; + LANGColumns_MoveDownButtonTooltip := LANGuaColumns_MoveDownButtonTooltip; + LANGColumns_TitlesLongName := LANGuaColumns_TitlesLongName; + LANGColumns_TitlesLongNameExt := LANGuaColumns_TitlesLongNameExt; + LANGColumns_TitlesLongExt := LANGuaColumns_TitlesLongExt; + LANGColumns_TitlesLongSize := LANGuaColumns_TitlesLongSize; + LANGColumns_TitlesLongDateTime := LANGuaColumns_TitlesLongDateTime; + LANGColumns_TitlesLongDate := LANGuaColumns_TitlesLongDate; + LANGColumns_TitlesLongTime := LANGuaColumns_TitlesLongTime; + LANGColumns_TitlesLongUser := LANGuaColumns_TitlesLongUser; + LANGColumns_TitlesLongGroup := LANGuaColumns_TitlesLongGroup; + LANGColumns_TitlesLongAttr := LANGuaColumns_TitlesLongAttr; + LANGColumns_TitlesShortName := LANGuaColumns_TitlesShortName; + LANGColumns_TitlesShortNameExt := LANGuaColumns_TitlesShortNameExt; + LANGColumns_TitlesShortExt := LANGuaColumns_TitlesShortExt; + LANGColumns_TitlesShortSize := LANGuaColumns_TitlesShortSize; + LANGColumns_TitlesShortDateTime := LANGuaColumns_TitlesShortDateTime; + LANGColumns_TitlesShortDate := LANGuaColumns_TitlesShortDate; + LANGColumns_TitlesShortTime := LANGuaColumns_TitlesShortTime; + LANGColumns_TitlesShortUser := LANGuaColumns_TitlesShortUser; + LANGColumns_TitlesShortGroup := LANGuaColumns_TitlesShortGroup; + LANGColumns_TitlesShortAttr := LANGuaColumns_TitlesShortAttr; + + LANGTestPlugin_Caption := LANGuaTestPlugin_Caption; + LANGTestPlugin_Title := LANGuaTestPlugin_Title; + LANGTestPlugin_ExperimentalWarningLabelCaption := LANGuaTestPlugin_ExperimentalWarningLabelCaption; + LANGTestPlugin_Plugin := LANGuaTestPlugin_Plugin; + LANGTestPlugin_Command := LANGuaTestPlugin_Command; + LANGTestPlugin_Username := LANGuaTestPlugin_Username; + LANGTestPlugin_Password := LANGuaTestPlugin_Password; + LANGTestPlugin_AnonymousCheckButton := LANGuaTestPlugin_AnonymousCheckButton; + LANGTestPlugin_NoPluginsFound := LANGuaTestPlugin_NoPluginsFound; + + LANGRemoteWait_Caption := LANGuaRemoteWait_Caption; + LANGRemoteWait_OperationInProgress := LANGuaRemoteWait_OperationInProgress; + LANGRemoteWait_ItemsFound := LANGuaRemoteWait_ItemsFound; + + LANGSearch_Bytes := LANGuaSearch_Bytes; + LANGSearch_kB := LANGuaSearch_kB; + LANGSearch_MB := LANGuaSearch_MB; + LANGSearch_days := LANGuaSearch_days; + LANGSearch_weeks := LANGuaSearch_weeks; + LANGSearch_months := LANGuaSearch_months; + LANGSearch_years := LANGuaSearch_years; + LANGSearch_Caption := LANGuaSearch_Caption; + LANGSearch_General := LANGuaSearch_General; + LANGSearch_Advanced := LANGuaSearch_Advanced; + LANGSearch_SearchResults := LANGuaSearch_SearchResults; + LANGSearch_SearchFor := LANGuaSearch_SearchFor; + LANGSearch_FileMaskEntryTooltip := LANGuaSearch_FileMaskEntryTooltip; + LANGSearch_SearchIn := LANGuaSearch_SearchIn; + LANGSearch_SearchArchivesCheckButton := LANGuaSearch_SearchArchivesCheckButton; + LANGSearch_FindText := LANGuaSearch_FindText; + LANGSearch_FindTextEntryTooltip := LANGuaSearch_FindTextEntryTooltip; + LANGSearch_CaseSensitiveCheckButton := LANGuaSearch_CaseSensitiveCheckButton; + LANGSearch_StayCurrentFSCheckButton := LANGuaSearch_StayCurrentFSCheckButton; + LANGSearch_CaseSensitiveMatchCheckButton := LANGuaSearch_CaseSensitiveMatchCheckButton; + LANGSearch_Size := LANGuaSearch_Size; + LANGSearch_Date := LANGuaSearch_Date; + LANGSearch_BiggerThan := LANGuaSearch_BiggerThan; + LANGSearch_SmallerThan := LANGuaSearch_SmallerThan; + LANGSearch_ModifiedBetweenRadioButton := LANGuaSearch_ModifiedBetweenRadioButton; + LANGSearch_NotModifiedAfterRadioButton := LANGuaSearch_NotModifiedAfterRadioButton; + LANGSearch_ModifiedLastRadioButton := LANGuaSearch_ModifiedLastRadioButton; + LANGSearch_ModifiedNotLastRadionButton := LANGuaSearch_ModifiedNotLastRadionButton; + LANGSearch_ModifiedBetweenEntry1 := LANGuaSearch_ModifiedBetweenEntry1; + LANGSearch_ViewButtonCaption := LANGuaSearch_ViewButtonCaption; + LANGSearch_NewSearchButtonCaption := LANGuaSearch_NewSearchButtonCaption; + LANGSearch_GoToFileButtonCaption := LANGuaSearch_GoToFileButtonCaption; + LANGSearch_FeedToListboxButtonCaption := LANGuaSearch_FeedToListboxButtonCaption; + LANGSearch_StatusSC := LANGuaSearch_StatusSC; + LANGSearch_Ready := LANGuaSearch_Ready; + LANGSearch_PreparingToSearch := LANGuaSearch_PreparingToSearch; + LANGSearch_SearchInProgress := LANGuaSearch_SearchInProgress; + LANGSearch_UserCancelled := LANGuaSearch_UserCancelled; + LANGSearch_SearchFinished := LANGuaSearch_SearchFinished; + LANGSearch_FilesFound := LANGuaSearch_FilesFound; + LANGSearch_And := LANGuaSearch_And; + + LANGCloseOpenConnection := LANGuaCloseOpenConnection; + LANGDuplicateTabWarning := LANGuaDuplicateTabWarning; + LANGDontShowAgain := LANGuaDontShowAgain; + LANGSwitchOtherPanelWarning := LANGuaSwitchOtherPanelWarning; + LANGOpenConnectionsWarning := LANGuaOpenConnectionsWarning; + LANGmiDisconnect_Caption := LANGuamiDisconnect_Caption; + LANGDisconnectButton_Tooltip := LANGuaDisconnectButton_Tooltip; + LANGLeaveArchiveButton_Tooltip := LANGuaLeaveArchiveButton_Tooltip; + LANGOpenTerminalButton_Tooltip := LANGuaOpenTerminalButton_Tooltip; + LANGOpenTerminalButton_Caption := LANGuaOpenTerminalButton_Caption; + LANGShowTextUIDsCheckBox_Caption := LANGuaShowTextUIDsCheckBox_Caption; + LANGShowTextUIDsCheckBox_Tooltip := LANGuaShowTextUIDsCheckBox_Tooltip; + + LANGmiNewTab_Caption := LANGuamiNewTab_Caption; + LANGFilePopupMenu_Properties := LANGuaFilePopupMenu_Properties; + LANGCommandEntry_Tooltip := LANGuaCommandEntry_Tooltip; + LANGmiFiles_Caption := LANGuamiFiles_Caption; + + LANGPasswordButton_Tooltip := LANGuaPasswordButton_Tooltip; + LANGHandleRunFromArchive_Bytes := LANGuaHandleRunFromArchive_Bytes; + LANGHandleRunFromArchive_FileTypeDesc_Unknown := LANGuaHandleRunFromArchive_FileTypeDesc_Unknown; + LANGHandleRunFromArchive_NotAssociated := LANGuaHandleRunFromArchive_NotAssociated; + LANGHandleRunFromArchive_SelfExecutable := LANGuaHandleRunFromArchive_SelfExecutable; + LANGHandleRunFromArchive_CouldntCreateTemporaryDirectory := LANGuaHandleRunFromArchive_CouldntCreateTemporaryDirectory; + LANGFRunFromVFS_Caption := LANGuaFRunFromVFS_Caption; + LANGFRunFromVFS_TitleLabel := LANGuaFRunFromVFS_TitleLabel; + LANGFRunFromVFS_FileNameLabel := LANGuaFRunFromVFS_FileNameLabel; + LANGFRunFromVFS_FileTypeLabel := LANGuaFRunFromVFS_FileTypeLabel; + LANGFRunFromVFS_SizeLabel := LANGuaFRunFromVFS_SizeLabel; + LANGFRunFromVFS_PackedSizeLabel := LANGuaFRunFromVFS_PackedSizeLabel; + LANGFRunFromVFS_DateLabel := LANGuaFRunFromVFS_DateLabel; + LANGFRunFromVFS_InfoLabel := LANGuaFRunFromVFS_InfoLabel; + LANGFRunFromVFS_OpensWithLabel := LANGuaFRunFromVFS_OpensWithLabel; + LANGFRunFromVFS_ExecuteButton := LANGuaFRunFromVFS_ExecuteButton; + LANGFRunFromVFS_ExecuteAllButton := LANGuaFRunFromVFS_ExecuteAllButton; + LANGFSetPassword_Caption := LANGuaFSetPassword_Caption; + LANGFSetPassword_Label1_Caption := LANGuaFSetPassword_Label1_Caption; + LANGFSetPassword_Label2_Caption := LANGuaFSetPassword_Label2_Caption; + LANGFSetPassword_ShowPasswordCheckButton := LANGuaFSetPassword_ShowPasswordCheckButton; +end; + +initialization + AddTranslation('uk_UA', @SetTranslation); + AddTranslation('uk_UA.utf8', @SetTranslation); + AddTranslation('UA', @SetTranslation); + AddTranslation('uk', @SetTranslation); +end. diff --git a/tuxcmd.conf b/tuxcmd.conf new file mode 100644 index 0000000..d8946e9 --- /dev/null +++ b/tuxcmd.conf @@ -0,0 +1,32 @@ +-$A4 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q+ +-$R+ +-$S- +-$T- +-$U- +-$V+ +-$W+ +-$X+ +-$YD +-$Z1 +-cg +-H+ +-W+ +-M +-$M1048576 +-K$00400000 diff --git a/tuxcmd.dpr b/tuxcmd.dpr new file mode 100644 index 0000000..f823809 --- /dev/null +++ b/tuxcmd.dpr @@ -0,0 +1,89 @@ +(* + Tux Commander - an open-source file manager with 2 panels side by side written for GTK2 + Copyright (C) 2007 by Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) + +program tuxcmd; + +uses + {$IFDEF __FPC__} + cthreads, + {$ENDIF} + UGTKLoader in 'UGTKLoader.pas', + GTKForms, + UConfig in 'UConfig.pas', + UGnome in 'UGnome.pas', + UMain in 'UMain.pas' {FMain}, + UCore in 'UCore.pas', + UEngines in 'UEngines.pas', + USelect in 'USelect.pas' {FSelect}, + URemoteWait in 'URemoteWait.pas' {FRemoteWait}, + UDirDelete in 'UDirDelete.pas' {FDirDelete}, + UProgress in 'UProgress.pas' {FProgress}, + UCopyMove in 'UCopyMove.pas' {FCopyMove}, + UOverwrite in 'UOverwrite.pas' {FOverwrite}, + UCoreUtils in 'UCoreUtils.pas', + ULocale in 'ULocale.pas', + UChecksum in 'UChecksum.pas' {FChecksum}, + UChecksumDruid in 'UChecksumDruid.pas' {FChecksumDruid}, + USplitFile in 'USplitFile.pas' {FSplitFile}, + UFileAssoc in 'UFileAssoc.pas', + UFileTypeSettings in 'UFileTypeSettings.pas' {FFileTypeSettings}, + UChmod in 'UChmod.pas' {FChmod}, + UChown in 'UChown.pas' {FChown}, + UCoreClasses in 'UCoreClasses.pas', + USymlink in 'USymlink.pas' {FSymlink}, + UPreferences in 'UPreferences.pas' {FPreferences}, + UViewer in 'UViewer.pas' {FViewer}, + UTestPlugin in 'UTestPlugin.pas', + UMounterPrefs in 'UMounterPrefs.pas', + UColumns in 'UColumns.pas', + ModuleLoader in 'vfs/ModuleLoader.pas', + UVFSCore in 'vfs/UVFSCore.pas', + uVFSprototypes in 'vfs/uVFSprototypes.pas', + UToolTips in 'UToolTips.pas', + ULogin in 'ULogin.pas', + UConnectionManager in 'UConnectionManager.pas', + UConnectionProperties in 'UConnectionProperties.pas', + USearch in 'USearch.pas', + UGlibThreads in 'UGlibThreads.pas', + URunFromVFS in 'URunFromVFS.pas', + UGlibC_compat in 'UGlibC_compat.pas', + USetPassword in 'USetPassword.pas', + UTranslation_EN in 'translations/UTranslation_EN.pas', + UTranslation_CZ in 'translations/UTranslation_CZ.pas', + UTranslation_RU in 'translations/UTranslation_RU.pas', + UTranslation_DE in 'translations/UTranslation_DE.pas', + UTranslation_SV in 'translations/UTranslation_SV.pas', + UTranslation_FR in 'translations/UTranslation_FR.pas', + UTranslation_ES in 'translations/UTranslation_ES.pas', + UTranslation_PL in 'translations/UTranslation_PL.pas', + UTranslation_UA in 'translations/UTranslation_UA.pas', + UTranslation_SR in 'translations/UTranslation_SR.pas', + UTranslation_HU in 'translations/UTranslation_HU.pas'; + + +{$IFNDEF __FPC__} + {$R *.res} +{$ENDIF} + +begin + Application.Initialize; + Application.CreateForm(TFMain, FMain); + Application.Run; +end. diff --git a/tuxcmd.res b/tuxcmd.res new file mode 100644 index 0000000..36f26e2 Binary files /dev/null and b/tuxcmd.res differ diff --git a/vfs/ModuleLoader.pas b/vfs/ModuleLoader.pas new file mode 100644 index 0000000..51351dd --- /dev/null +++ b/vfs/ModuleLoader.pas @@ -0,0 +1,156 @@ +{******************************************************************} +{ } +{ Project JEDI } +{ OS independent Dynamic Loading Helpers } +{ } +{ The initial developer of the this code is } +{ Robert Marquardt INVALID_MODULEHANDLE_VALUE; +end; + +// load the .so file FileName +// dlopen() with flags is used to get better control of the loading +// for the allowed values for flags see "man dlopen". + +function LoadModuleEx(var Module: TModuleHandle; FileName: string; Flags: Cardinal): Boolean; +begin + Module := dlopen(PChar(FileName), Flags); + Result := Module <> INVALID_MODULEHANDLE_VALUE; +end; + +// unload a .so loaded with LoadModule or LoadModuleEx +// The procedure will not try to unload a handle with +// value INVALID_MODULEHANDLE_VALUE and assigns this value +// to Module after unload. + +procedure UnloadModule(var Module: TModuleHandle); +begin + if Module <> INVALID_MODULEHANDLE_VALUE then + dlclose(Module); + Module := INVALID_MODULEHANDLE_VALUE; +end; + +// returns the pointer to the symbol named SymbolName +// if it is exported from the .so Module +// nil is returned if the symbol is not available + +function GetModuleSymbol(Module: TModuleHandle; SymbolName: string): Pointer; +begin + Result := nil; + if Module <> INVALID_MODULEHANDLE_VALUE then + Result := dlsym(Module, PChar(SymbolName)); +end; + +// returns the pointer to the symbol named SymbolName +// if it is exported from the .so Module +// nil is returned if the symbol is not available. +// as an extra the boolean variable Accu is updated +// by anding in the success of the function. +// This is very handy for rendering a global result +// when accessing a long list of symbols. + +function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: string; var Accu: Boolean): Pointer; +begin + Result := nil; + if Module <> INVALID_MODULEHANDLE_VALUE then + Result := dlsym(Module, PChar(SymbolName)); + Accu := Accu and (Result <> nil); +end; + +// get the value of variables exported from a .so Module +// Delphi cannot access variables in a .so directly, so +// this function allows to copy the data from the .so. +// Beware! You are accessing the .so memory image directly. +// Be sure to access a variable not a function and be sure +// to read the correct amount of data. + +function ReadModuleData(Module: TModuleHandle; SymbolName: string; var Buffer; Size: Cardinal): Boolean; +var + Sym: Pointer; +begin + Result := True; + Sym := GetModuleSymbolEx(Module, SymbolName, Result); + if Result then + Move(Sym^, Buffer, Size); +end; + +// set the value of variables exported from a .so Module +// Delphi cannot access variables in a .so directly, so +// this function allows to copy the data to the .so! +// BEWARE! You are accessing the .so memory image directly. +// Be sure to access a variable not a function and be sure +// to write the correct amount of data. +// The changes are not persistent. They get lost when the +// .so is unloaded. + +function WriteModuleData(Module: TModuleHandle; SymbolName: string; var Buffer; Size: Cardinal): Boolean; +var + Sym: Pointer; +begin + Result := True; + Sym := GetModuleSymbolEx(Module, SymbolName, Result); + if Result then + Move(Buffer, Sym^, Size); +end; +end. + + + diff --git a/vfs/UVFSCore.pas b/vfs/UVFSCore.pas new file mode 100644 index 0000000..21fc21b --- /dev/null +++ b/vfs/UVFSCore.pas @@ -0,0 +1,1075 @@ +(* + Tux Commander - UVFSCore - VFS Core utilities and management + Copyright (C) 2007 Tomas Bzatek + Check for updates on tuxcmd.sourceforge.net + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UVFSCore; + +{$IFDEF __FPC__} + {$M+} +{$ENDIF} + +interface + +uses GTKForms, Libc, {$IFDEF KYLIX}UGlibC_compat,{$ENDIF} Classes, uVFSprototypes, UEngines, UCoreUtils; + + +type + TVFSPlugin = class + private + FVFSAllocNeeded: TVFSAllocNeeded; + FVFSInit: TVFSInit; + FVFSDestroy: TVFSDestroy; + FVFSVersion: TVFSVersion; + FVFSGetInfo: TVFSGetInfo; + FVFSOpen: TVFSOpen; + FVFSClose: TVFSClose; + FVFSListFirst: TVFSListFirst; + FVFSListNext: TVFSListNext; + FVFSListClose: TVFSListClose; + FVFSChangeDir: TVFSChangeDir; + FVFSGetPath: TVFSGetPath; + FVFSGetPrefix: TVFSGetPrefix; + FVFSGetFileSystemSize: TVFSGetFileSystemSize; + FVFSGetFileSystemFree: TVFSGetFileSystemFree; + FVFSLogin: TVFSLogin; + FVFSFileExists: TVFSFileExists; + FVFSFileInfo: TVFSFileInfo; + FVFSMkDir: TVFSMkDir; + FVFSRemove: TVFSRemove; + FVFSRename: TVFSRename; + FVFSMakeSymLink: TVFSMakeSymLink; + FVFSChmod: TVFSChmod; + FVFSChown: TVFSChown; + FVFSChangeTimes: TVFSChangeTimes; + FVFSGetDirSize: TVFSGetDirSize; + FVFSBreakGetDirSize: TVFSBreakGetDirSize; + FVFSOpenFile: TVFSOpenFile; + FVFSReadFile: TVFSReadFile; + FVFSWriteFile: TVFSWriteFile; + FVFSCloseFile: TVFSCloseFile; + FVFSFileSeek: TVFSFileSeek; + FVFSSetBlockSize: TVFSSetBlockSize; + FVFSCopyOut: TVFSCopyOut; + FVFSCopyIn: TVFSCopyIn; + FVFSIsOnSameFS: TVFSIsOnSameFS; + FVFSTwoSameFiles: TVFSTwoSameFiles; + FVFSGetExts: TVFSGetExts; + FVFSGetServices: TVFSGetServices; + FVFSSetPassword: TVFSSetPassword; + FVFSGetPasswordRequired: TVFSGetPasswordRequired; + public + ModuleHandle: Pointer; + FullPath: string; // module path + Extensions, Services: TOpenStringArray; // the list of the extensions plugin can handle + constructor Create(PluginHandle: Pointer); + destructor Destroy; override; + published + function VFSVersion: integer; + function VFSName: PChar; + function VFSDescription: PChar; + function VFSAbout: PChar; + function VFSCopyright: PChar; + end; + + + TVFSEngine = class(TPanelEngine) + private + FGlobs: Pointer; + FSourcePlugin: TVFSPlugin; + FBlockSize: Cardinal; + FProgressFunc: TEngineProgressFunc; + FSenderThread: Pointer; + BreakProcessingKind: integer; + FPassword: string; + procedure SetFPassword(Value: string); + public + ArchiveMode: boolean; + constructor Create(SourcePlugin: TVFSPlugin); + function VFSOpenURI(OpenFile: string): boolean; + function VFSOpenEx(OpenFile: string): TVFSResult; + function VFSClose: boolean; + + destructor Destroy; override; + function GetListing(var List: TList; const AddDotFiles: boolean): integer; override; + function GetListing(var List: TList; const AddDotFiles: boolean; APath: string): integer; override; + function ChangeDir(const NewPath: string; const ShowProgress: boolean = True): integer; override; + function ExplicitChDir(const NewPath: string): integer; override; + function GetFileSystemSize: Int64; override; + function GetFileSystemSize(const APath: string): Int64; override; + function GetFileSystemFree: Int64; override; + function GetFileSystemFree(const APath: string): Int64; override; + function MakeDir(const NewDir: string): integer; override; + function GetDirSize(APath: string): Int64; override; + function Remove(APath: string): integer; override; + procedure FillDirFiles(APath: string; List: TList; ALevel: word); override; + function GetFileInfoSL(APath: string): PDataItemSL; override; + function FileExists(const FileName: string; const Use_lstat: boolean = False): Boolean; override; + function DirectoryExists(const FileName: string; const Use_lstat: boolean = False): Boolean; override; + function MakeSymLink(const NewFileName, PointTo: string): integer; override; + function Chmod(const FileName: string; const Mode: integer): integer; override; + function Chown(const FileName: string; const UID, GID: integer): integer; override; + procedure BreakProcessing(ProcessingKind: integer); override; + function RenameFile(SourceFile, DestFile: string): integer; override; + function ChangeTimes(APath: string; mtime, atime: Int64): integer; override; + procedure GetFileSystemInfo(const APath: string; var FSSize, FSFree: Int64; var FSName: string); override; + function OpenFile(const APath: string; Mode: integer; var Error: integer): TEngineFileDes; override; + function ReadFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; ABlockSize: integer; var Error: integer): integer; override; + function WriteFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; BytesCount: integer; var Error: integer): integer; override; + function CloseFile(const FileDescriptor: TEngineFileDes): integer; override; + function FileSeek(const FileDescriptor: TEngineFileDes; const AbsoluteOffset: Int64; var Error: integer): Int64; override; + function IsOnROMedium(const FileName: string): boolean; override; + function FileCanRun(const FileName: string): boolean; override; + function GetPath: string; override; + procedure SetPath(Value: string); override; + function GetPrefix: string; override; + function Login(Username, Password: string): integer; override; + + function GetBlockSize: Cardinal; override; + procedure SetBlockSize(Value: Cardinal); override; + function CopyFileIn(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; override; + function CopyFileOut(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; override; + function IsOnSameFS(const Path1, Path2: string): boolean; override; + function TwoSameFiles(const Path1, Path2: string): boolean; override; + + function SetPassword(Password: string): integer; + function GetPasswordRequired: boolean; + published + property Path: string read GetPath write SetPath; + property BlockSize: Cardinal read GetBlockSize write SetBlockSize; + property Password: string read FPassword write SetFPassword; + end; + + + +procedure DoInitPlugins; + +var PluginList: TList; + +implementation + +uses SysUtils, ModuleLoader, UConfig, ULocale; + + +const ConstGlobalModulePath1 = '/usr/lib/tuxcmd'; + ConstGlobalModulePath2 = '/usr/local/lib/tuxcmd'; + ConstLocalModulePath1 = '~/.tuxcmd/plugins'; + ConstLocalModulePath2 = './plugins'; + ConstLocalModulePath3 = '../lib/tuxcmd'; + + ConstVFSVersionRequired = 2; + +var BinaryPath: string; + + +procedure VFSLogFunc(s: PChar); cdecl; +begin + DebugMsg([' ### VFS ###: ', s]); +end; + +(********************************************************************************************************************************) +constructor TVFSPlugin.Create(PluginHandle: Pointer); +begin + inherited Create; + ModuleHandle := PluginHandle; + + // Find the symbols + @FVFSAllocNeeded := GetModuleSymbol(ModuleHandle, 'VFSAllocNeeded'); + @FVFSInit := GetModuleSymbol(ModuleHandle, 'VFSInit'); + @FVFSDestroy := GetModuleSymbol(ModuleHandle, 'VFSDestroy'); + @FVFSVersion := GetModuleSymbol(ModuleHandle, 'VFSVersion'); + @FVFSGetInfo := GetModuleSymbol(ModuleHandle, 'VFSGetInfo'); + @FVFSOpen := GetModuleSymbol(ModuleHandle, 'VFSOpen'); + @FVFSClose := GetModuleSymbol(ModuleHandle, 'VFSClose'); + @FVFSListFirst := GetModuleSymbol(ModuleHandle, 'VFSListFirst'); + @FVFSListNext := GetModuleSymbol(ModuleHandle, 'VFSListNext'); + @FVFSListClose := GetModuleSymbol(ModuleHandle, 'VFSListClose'); + @FVFSGetPath := GetModuleSymbol(ModuleHandle, 'VFSGetPath'); + @FVFSChangeDir := GetModuleSymbol(ModuleHandle, 'VFSChangeDir'); + @FVFSGetPrefix := GetModuleSymbol(ModuleHandle, 'VFSGetPrefix'); + @FVFSGetFileSystemSize := GetModuleSymbol(ModuleHandle, 'VFSGetFileSystemSize'); + @FVFSGetFileSystemFree := GetModuleSymbol(ModuleHandle, 'VFSGetFileSystemFree'); + @FVFSLogin := GetModuleSymbol(ModuleHandle, 'VFSLogin'); + @FVFSFileExists := GetModuleSymbol(ModuleHandle, 'VFSFileExists'); + @FVFSFileInfo := GetModuleSymbol(ModuleHandle, 'VFSFileInfo'); + @FVFSMkDir := GetModuleSymbol(ModuleHandle, 'VFSMkDir'); + @FVFSRemove := GetModuleSymbol(ModuleHandle, 'VFSRemove'); + @FVFSRename := GetModuleSymbol(ModuleHandle, 'VFSRename'); + @FVFSMakeSymLink := GetModuleSymbol(ModuleHandle, 'VFSMakeSymLink'); + @FVFSChmod := GetModuleSymbol(ModuleHandle, 'VFSChmod'); + @FVFSChown := GetModuleSymbol(ModuleHandle, 'VFSChown'); + @FVFSChangeTimes := GetModuleSymbol(ModuleHandle, 'VFSChangeTimes'); + @FVFSGetDirSize := GetModuleSymbol(ModuleHandle, 'VFSGetDirSize'); + @FVFSBreakGetDirSize := GetModuleSymbol(ModuleHandle, 'VFSBreakGetDirSize'); + @FVFSCopyOut := GetModuleSymbol(ModuleHandle, 'VFSCopyOut'); + @FVFSCopyIn := GetModuleSymbol(ModuleHandle, 'VFSCopyIn'); + @FVFSOpenFile := GetModuleSymbol(ModuleHandle, 'VFSOpenFile'); + @FVFSReadFile := GetModuleSymbol(ModuleHandle, 'VFSReadFile'); + @FVFSWriteFile := GetModuleSymbol(ModuleHandle, 'VFSWriteFile'); + @FVFSCloseFile := GetModuleSymbol(ModuleHandle, 'VFSCloseFile'); + @FVFSFileSeek := GetModuleSymbol(ModuleHandle, 'VFSFileSeek'); + @FVFSSetBlockSize := GetModuleSymbol(ModuleHandle, 'VFSSetBlockSize'); + @FVFSIsOnSameFS := GetModuleSymbol(ModuleHandle, 'VFSIsOnSameFS'); + @FVFSTwoSameFiles := GetModuleSymbol(ModuleHandle, 'VFSTwoSameFiles'); + @FVFSGetExts := GetModuleSymbol(ModuleHandle, 'VFSGetExts'); + @FVFSGetServices := GetModuleSymbol(ModuleHandle, 'VFSGetServices'); + @FVFSSetPassword := GetModuleSymbol(ModuleHandle, 'VFSSetPassword'); + @FVFSGetPasswordRequired := GetModuleSymbol(ModuleHandle, 'VFSGetPasswordRequired'); + // Initialize the extensions list + SetLength(Extensions, 0); + SetLength(Services, 0); + if @FVFSGetExts <> nil then ParseString(FVFSGetExts, ';', Extensions); + if @FVFSGetServices <> nil then ParseString(FVFSGetServices, ';', Services); +end; + +destructor TVFSPlugin.Destroy; +begin + if ModuleHandle <> nil then UnloadModule(ModuleHandle); + inherited Destroy; +end; + +(********************************************************************************************************************************) +function TVFSPlugin.VFSVersion: integer; +begin + if @FVFSVersion <> nil then Result := FVFSVersion + else Result := -1; +end; + +function TVFSPlugin.VFSName: PChar; +var Info: TVFSInfo; +begin + if @FVFSGetInfo <> nil then begin + Info := FVFSGetInfo; + Result := Info.Name; + end else Result := nil; +end; + +function TVFSPlugin.VFSDescription: PChar; +var Info: TVFSInfo; +begin + if @FVFSGetInfo <> nil then begin + Info := FVFSGetInfo; + Result := Info.Description; + end else Result := nil; +end; + +function TVFSPlugin.VFSAbout: PChar; +var Info: TVFSInfo; +begin + if @FVFSGetInfo <> nil then begin + Info := FVFSGetInfo; + Result := Info.About; + end else Result := nil; +end; + +function TVFSPlugin.VFSCopyright: PChar; +var Info: TVFSInfo; +begin + if @FVFSGetInfo <> nil then begin + Info := FVFSGetInfo; + Result := Info.Copyright; + end else Result := nil; +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +constructor TVFSEngine.Create(SourcePlugin: TVFSPlugin); +begin + inherited Create; + FSourcePlugin := SourcePlugin; + FBlockSize := 65536; + ArchiveMode := False; + BreakProcessingKind := 0; + if @FSourcePlugin.FVFSAllocNeeded <> nil then begin + FGlobs := Libc.malloc(FSourcePlugin.FVFSAllocNeeded); + Libc.memset(FGlobs, 0, FSourcePlugin.FVFSAllocNeeded); + end else begin + FGlobs := Libc.malloc(SizeOf(FGlobs)); + Libc.memset(FGlobs, 0, SizeOf(FGlobs)); + end; + +{$IFNDEF KYLIX} + DebugMsg(['sizeof(TVFSItem) = ', sizeof(TVFSItem)]); + DebugMsg(['sizeof(TVFSItem.sFileName) = ', sizeof(TVFSItem.sFileName)]); + DebugMsg(['sizeof(TVFSItem.iSize) = ', sizeof(TVFSItem.iSize)]); + DebugMsg(['sizeof(TVFSItem.m_time) = ', sizeof(TVFSItem.m_time)]); + DebugMsg(['sizeof(TVFSItem.a_time) = ', sizeof(TVFSItem.a_time)]); + DebugMsg(['sizeof(TVFSItem.c_time) = ', sizeof(TVFSItem.c_time)]); + DebugMsg(['sizeof(TVFSItem.iMode) = ', sizeof(TVFSItem.iMode)]); + DebugMsg(['sizeof(TVFSItem.sLinkTo) = ', sizeof(TVFSItem.sLinkTo)]); + DebugMsg(['sizeof(TVFSItem.iUID) = ', sizeof(TVFSItem.iUID)]); + DebugMsg(['sizeof(TVFSItem.iGID) = ', sizeof(TVFSItem.iGID)]); + DebugMsg(['sizeof(TVFSItem.ItemType) = ', sizeof(TVFSItem.ItemType)]); +{$ENDIF} + + if @FSourcePlugin.FVFSInit <> nil then FSourcePlugin.FVFSInit(FGlobs, @VFSLogFunc); + FPassword := ''; +end; + +function TVFSEngine.VFSOpenURI(OpenFile: string): boolean; +begin + Result := False; + if @FSourcePlugin.FVFSOpen <> nil then Result := FSourcePlugin.FVFSOpen(FGlobs, PChar(OpenFile)) = cVFS_OK; +end; + +function TVFSEngine.VFSOpenEx(OpenFile: string): TVFSResult; +begin + Result := cVFS_OK; + if @FSourcePlugin.FVFSOpen <> nil then Result := FSourcePlugin.FVFSOpen(FGlobs, PChar(OpenFile)); +end; + +function TVFSEngine.VFSClose: boolean; +begin + Result := False; + if @FSourcePlugin.FVFSClose <> nil then Result := FSourcePlugin.FVFSClose(FGlobs) = cVFS_OK; +end; + +destructor TVFSEngine.Destroy; +begin + try + if @FSourcePlugin.FVFSDestroy <> nil then FSourcePlugin.FVFSDestroy(FGlobs); + libc.free(FGlobs); + except + on E: Exception do DebugMsg(['*** TVFSEngine.Destroy() -Exception: ', E.Message]); + end; +end; + +function TVFSEngine.GetListing(var List: TList; const AddDotFiles: boolean; APath: string): integer; +var P: PVFSItem; + Item: PDataItem; + i, Res: integer; +begin + DebugMsg(['^^VFS (II): GetListing begin']); + Result := 0; + try + if @FSourcePlugin.FVFSListFirst = nil then Exit; + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); +// DebugMsg(['Item = ', Int64(P)]); +// DebugMsg(['FVFSListFirst']); + Res := FSourcePlugin.FVFSListFirst(FGlobs, PChar(APath), P); + if Res <> cVFS_OK then begin + FSourcePlugin.FVFSListClose(FGlobs); + if Res = cVFS_Not_More_Files then Result := 0 + else Result := Res; + Libc.free(P); + Exit; + end; + + repeat +// DebugMsg(['begin--']); + if AddDotFiles or (not ((Length(P^.sFileName) > 1) and (P^.sFileName[0] = '.') and (P^.sFileName[1] <> '.'))) then begin +// DebugMsg(['Checkpoint 1']); + Item := Libc.malloc(SizeOf(TDataItem)); + Libc.memset(Item, 0, SizeOf(TDataItem)); +// DebugMsg(['Checkpoint 2']); + for i := 0 to Length(Item^.ColumnData) - 1 do Item^.ColumnData[i] := nil; +// DebugMsg(['Checkpoint 3']); + with Item^ do + try + AName := strdup(P^.sFileName); + if P^.sLinkTo <> nil + then begin + LnkPointTo := strdup(P^.sLinkTo); + DebugMsg(['LnkPointTo = ', P^.sLinkTo]); + end else LnkPointTo := nil; + Mode := P^.iMode; +// DebugMsg(['Checkpoint 4']); + IsDotFile := (Length(AName) > 1) and (AName[0] = '.') and (AName[1] <> '.'); + IsDir := TVFSItemType(P^.ItemType) = vDirectory; + IsLnk := TVFSItemType(P^.ItemType) = vSymlink; + IsBlk := TVFSItemType(P^.ItemType) = vBlockdev; + IsChr := TVFSItemType(P^.ItemType) = vChardev; + IsFIFO := TVFSItemType(P^.ItemType) = vFifo; + IsSock := TVFSItemType(P^.ItemType) = vSock; +// DebugMsg(['Checkpoint 5']); + ModifyTime := UnixTimeToTDateTime(P^.m_time); +// DebugMsg(['Returned datetime: ', Longword(P^.m_time)]); +// DebugMsg(['Checkpoint 6']); + UID := P^.iUID; +// DebugMsg(['Checkpoint 7']); + GID := P^.iGID; +// DebugMsg(['Checkpoint 8']); + UpDir := False; +// DebugMsg(['Checkpoint 9']); + Selected := False; +// DebugMsg(['Checkpoint 10']); + Size := P^.iSize; +// DebugMsg(['Checkpoint 11']); + List.Add(Item); +// DebugMsg(['Checkpoint 12']); + except + on E: Exception do + DebugMsg(['^^VFS (EE): GetListing: Item-Exception: ', E.Message]); + end; + end; // of if AddDotFiles + Libc.free(P); // Not needed - just zero-erase the memory +// DebugMsg(['Checkpoint 13']); + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); +// DebugMsg(['Item = ', Int64(P)]); +// DebugMsg(['Checkpoint 14']); +// DebugMsg(['FVFSListNext --begin']); + Res := FSourcePlugin.FVFSListNext(FGlobs, PChar(APath), P); +// DebugMsg(['FVFSListNext --end']); +// Sleep(500); + until (Res <> cVFS_OK) or (BreakProcessingKind = 2); + if BreakProcessingKind <> 0 then DebugMsg(['^^VFS (WW): GetListing: stopped by BreakProcessing']); + + Libc.free(P); + FSourcePlugin.FVFSListClose(FGlobs); + if Res <> cVFS_Not_More_Files then Result := Res; + except + on E: Exception do + DebugMsg(['^^VFS (EE): GetListing: Exception: ', E.Message]); + end; + BreakProcessingKind := 0; + DebugMsg(['^^VFS (II): GetListing end.']); +end; + +function TVFSEngine.GetListing(var List: TList; const AddDotFiles: boolean): integer; +begin + Result := GetListing(List, AddDotFiles, GetPath); +end; + +function TVFSEngine.ExplicitChDir(const NewPath: string): integer; +begin + Result := __chdir(PChar(NewPath)); + if Result <> 0 then Result := errno; +end; + +function TVFSEngine.GetFileSystemSize: Int64; +begin + Result := GetFileSystemSize(GetPath); +end; + +function TVFSEngine.GetFileSystemSize(const APath: string): Int64; +begin + if @FSourcePlugin.FVFSGetFileSystemSize <> nil + then Result := FSourcePlugin.FVFSGetFileSystemSize(FGlobs, PChar(APath)) + else Result := 0; +end; + +function TVFSEngine.GetFileSystemFree: Int64; +begin + Result := GetFileSystemFree(GetPath); +end; + +function TVFSEngine.GetFileSystemFree(const APath: string): Int64; +begin + if @FSourcePlugin.FVFSGetFileSystemFree <> nil + then Result := FSourcePlugin.FVFSGetFileSystemFree(FGlobs, PChar(APath)) + else Result := 0; +end; + +procedure TVFSEngine.GetFileSystemInfo(const APath: string; var FSSize, FSFree: Int64; var FSName: string); +begin + FSSize := GetFileSystemSize(APath); + FSFree := GetFileSystemFree(APath); + FSName := 'plugin'; +end; + +function TVFSEngine.IsOnROMedium(const FileName: string): boolean; +begin + Result := True; +end; + +function TVFSEngine.FileCanRun(const FileName: string): boolean; +var Item: PDataItemSL; +begin + Item := GetFileInfoSL(FileName); + Result := Assigned(Item) and Item^.IsExecutable; + FreeDataItem(Item); +end; + +function TVFSEngine.GetPrefix: string; +begin + if @FSourcePlugin.FVFSGetPrefix <> nil then Result := URIHidePassword(FSourcePlugin.FVFSGetPrefix(FGlobs)) + else Result := 'VFS'; +end; + +function TVFSEngine.GetPath: string; +begin + if @FSourcePlugin.FVFSGetPath <> nil then Result := FSourcePlugin.FVFSGetPath(FGlobs) + else Result := '/'; +end; + +function TVFSEngine.ChangeDir(const NewPath: string; const ShowProgress: boolean = True): integer; +begin + DebugMsg(['^^VFS (II): ChangeDir begin']); + Result := 0; + try + Result := FSourcePlugin.FVFSChangeDir(FGlobs, PChar(NewPath)); +// Sleep(3000); + except + on E: Exception do DebugMsg(['^^VFS (EE): ChangeDir: Exception: ', E.Message]); + end; + DebugMsg(['^^VFS (II): ChangeDir end.']); +end; + +procedure TVFSEngine.SetPath(Value: string); +begin + ChangeDir(Value); +end; + +function TVFSEngine.Login(Username, Password: string): integer; +begin + if @FSourcePlugin.FVFSLogin <> nil then Result := FSourcePlugin.FVFSLogin(FGlobs, PChar(Username), PChar(Password)) + else Result := cVFS_OK; +end; + +function TVFSEngine.FileExists(const FileName: string; const Use_lstat: boolean = False): Boolean; +begin + if @FSourcePlugin.FVFSFileExists <> nil then Result := FSourcePlugin.FVFSFileExists(FGlobs, PChar(FileName), Use_lstat) + else Result := False; +end; + +function TVFSEngine.DirectoryExists(const FileName: string; const Use_lstat: boolean = False): Boolean; +var P: PVFSItem; + Res: integer; +begin + if @FSourcePlugin.FVFSFileExists <> nil then begin + Result := FSourcePlugin.FVFSFileExists(FGlobs, PChar(FileName), Use_lstat); + if Result and (@FSourcePlugin.FVFSFileInfo <> nil) then begin + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); + Res := FSourcePlugin.FVFSFileInfo(FGlobs, PChar(FileName), P); + if (Res <> cVFS_OK) or (P = nil) or (TVFSItemType(P^.ItemType) <> vDirectory) then Result := False; + Libc.free(P); + end; + end else Result := False; +end; + +function TVFSEngine.GetFileInfoSL(APath: string): PDataItemSL; +var P: PVFSItem; + Item: PDataItemSL; + Res: integer; +begin + Result := nil; + if @FSourcePlugin.FVFSFileInfo = nil then Exit; + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); + + Res := FSourcePlugin.FVFSFileInfo(FGlobs, PChar(APath), P); + if Res <> cVFS_OK then begin + DebugMsg(['*** VFSFileInfo(', APath, ') failed. Code = ', Res]); + Exit; + end; + + try + Item := Libc.malloc(SizeOf(TDataItemSL)); + Libc.memset(Item, 0, SizeOf(TDataItemSL)); + with Item^ do begin + AName := strdup(P^.sFileName); + if P^.sLinkTo <> nil then LnkPointTo := strdup(P^.sLinkTo) + else LnkPointTo := nil; + ADestination := nil; + Stage1 := True; + Level := 0; + IsDir := TVFSItemType(P^.ItemType) = vDirectory; + IsLnk := TVFSItemType(P^.ItemType) = vSymlink; + ForceMove := False; +{***} IsOnRO := True; + IsExecutable := P^.iMode and S_IXUSR = S_IXUSR; + Mode := P^.iMode; + ModifyTime := UnixTimeToTDateTime(P^.m_time); + mtime := P^.m_time; + atime := P^.a_time; + UID := P^.iUID; + GID := P^.iGID; + Size := P^.iSize; + Libc.free(P); + end; + Result := Item; + except + on E: Exception do DebugMsg(['*** TVFSEngine.GetFileInfoSL(APath=', APath, ') -Exception: ', E.Message]); + end; +end; + +function TVFSEngine.MakeDir(const NewDir: string): integer; +begin + if @FSourcePlugin.FVFSMkDir <> nil then Result := FSourcePlugin.FVFSMkDir(FGlobs, PChar(NewDir)) + else Result := cVFS_Failed; +end; + +function TVFSEngine.Remove(APath: string): integer; +begin + if @FSourcePlugin.FVFSRemove <> nil then Result := FSourcePlugin.FVFSRemove(FGlobs, PChar(APath)) + else Result := cVFS_Failed; +end; + +function TVFSEngine.RenameFile(SourceFile, DestFile: string): integer; +begin + if @FSourcePlugin.FVFSRename <> nil then Result := FSourcePlugin.FVFSRename(FGlobs, PChar(SourceFile), PChar(DestFile)) + else Result := cVFS_Failed; +end; + +procedure TVFSEngine.FillDirFiles(APath: string; List: TList; ALevel: word); +var Item: PDataItemSL; + i, Res: integer; + FilesList: TList; + LocalList: TStringList; + P: PVFSItem; + + + procedure AddEntry(FPath: string; AddCurrDirStage, AStage1: boolean); + begin + Item := Libc.malloc(SizeOf(TDataItemSL)); + Libc.memset(Item, 0, SizeOf(TDataItemSL)); + with Item^ do begin +// AName := Libc.malloc(Length(FPath) + 1); +// Libc.memset(AName, 0, Length(FPath) + 1); + AName := strdup(PChar(FPath)); + if P^.sLinkTo <> nil then LnkPointTo := strdup(P^.sLinkTo) + else LnkPointTo := nil; + ADestination := nil; + Stage1 := AStage1; + IsDir := TVFSItemType(P^.ItemType) = vDirectory; + IsLnk := TVFSItemType(P^.ItemType) = vSymlink; + if IsLnk and AddCurrDirStage then DebugMsg(['*** Assertion failed AddEntry: Item^.IsLnk = True']); + ForceMove := False; +{***} IsOnRO := True; + IsExecutable := AddCurrDirStage or (P^.iMode and S_IXUSR = S_IXUSR); + Mode := P^.iMode; + ModifyTime := UnixTimeToTDateTime(P^.m_time); + mtime := P^.m_time; + atime := P^.a_time; + UID := P^.iUID; + GID := P^.iGID; + Size := P^.iSize; + {$WARNINGS OFF} + Level := ALevel + Ord(not AddCurrDirStage); + {$WARNINGS ON} + end; + if AddCurrDirStage then List.Add(Item) + else FilesList.Add(Item); + end; + +begin + if not Assigned(List) then Exit; + FilesList := TList.Create; + LocalList := TStringList.Create; + try + try + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); + Res := FSourcePlugin.FVFSFileInfo(FGlobs, PChar(APath), P); + if Res <> cVFS_OK then DebugMsg(['*** FillDirFiles - VFSFileInfo(', APath, ') failed. Code = ', Res]); + AddEntry(APath, True, True); + Libc.free(P); + + APath := IncludeTrailingPathDelimiter(APath); + if @FSourcePlugin.FVFSChangeDir <> nil then Res := FSourcePlugin.FVFSChangeDir(FGlobs, PChar(APath)) + else Exit; + if Res <> 0 then Exit; + + if @FSourcePlugin.FVFSListFirst = nil then Exit; + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); + Res := FSourcePlugin.FVFSListFirst(FGlobs, PChar(APath), P); + if Res <> cVFS_OK then begin + FSourcePlugin.FVFSListClose(FGlobs); + Libc.free(P); + Exit; + end; + + repeat + if TVFSItemType(P^.ItemType) = vDirectory + then LocalList.Add(APath + String(P^.sFileName)) + else AddEntry(APath + String(P^.sFileName), False, True); + Libc.free(P); + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); + Res := FSourcePlugin.FVFSListNext(FGlobs, PChar(GetPath), P); + until (Res <> cVFS_OK); + + Libc.free(P); + FSourcePlugin.FVFSListClose(FGlobs); + + {$WARNINGS OFF} + if LocalList.Count > 0 then + for i := 0 to LocalList.Count - 1 do + FillDirFiles(LocalList[i], List, ALevel + 1); + {$WARNINGS ON} + + if FilesList.Count > 0 then + for i := 0 to FilesList.Count - 1 do + List.Add(FilesList[i]); + except + on E: Exception do DebugMsg(['*** TVFSEngine.FillDirFiles(APath=', APath, ', Level=', ALevel, ') -Exception: ', E.Message]); + end; + finally + P := Libc.malloc(SizeOf(TVFSItem)); + Libc.memset(P, 0, SizeOf(TVFSItem)); + Res := FSourcePlugin.FVFSFileInfo(FGlobs, PChar(APath), P); + if Res <> cVFS_OK then DebugMsg(['*** FillDirFiles - VFSFileInfo(', APath, ') failed. Code = ', Res]); + AddEntry(APath, True, False); + Libc.free(P); + + LocalList.Free; + FilesList.Free; + end; +end; + +function TVFSEngine.MakeSymLink(const NewFileName, PointTo: string): integer; +begin + if @FSourcePlugin.FVFSMakeSymLink <> nil then Result := FSourcePlugin.FVFSMakeSymLink(FGlobs, PChar(NewFileName), PChar(PointTo)) + else Result := cVFS_Failed; +end; + +function TVFSEngine.Chmod(const FileName: string; const Mode: integer): integer; +begin + if @FSourcePlugin.FVFSChmod <> nil then Result := FSourcePlugin.FVFSChmod(FGlobs, PChar(FileName), Mode) + else Result := cVFS_Failed; +end; + +function TVFSEngine.Chown(const FileName: string; const UID, GID: integer): integer; +begin + if @FSourcePlugin.FVFSChown <> nil then Result := FSourcePlugin.FVFSChown(FGlobs, PChar(FileName), UID, GID) + else Result := cVFS_Failed; +end; + +function TVFSEngine.ChangeTimes(APath: string; mtime, atime: Int64): integer; +begin + if @FSourcePlugin.FVFSChangeTimes <> nil then Result := FSourcePlugin.FVFSChangeTimes(FGlobs, PChar(APath), mtime, atime) + else Result := cVFS_Failed; +end; + +function TVFSEngine.GetDirSize(APath: string): Int64; +begin + if @FSourcePlugin.FVFSGetDirSize <> nil then Result := FSourcePlugin.FVFSGetDirSize(FGlobs, PChar(APath)) + else Result := 0; +end; + +procedure TVFSEngine.BreakProcessing(ProcessingKind: integer); +begin + case ProcessingKind of + 1: if @FSourcePlugin.FVFSBreakGetDirSize <> nil then FSourcePlugin.FVFSBreakGetDirSize(FGlobs); + end; +end; + +function TVFSEngine.GetBlockSize: Cardinal; +begin + Result := FBlockSize; +end; + +procedure TVFSEngine.SetBlockSize(Value: Cardinal); +begin + if @FSourcePlugin.FVFSSetBlockSize <> nil then FSourcePlugin.FVFSSetBlockSize(FGlobs, Value); +end; + + + +(********************************************************************************************************************************) +function TVFSEngine.IsOnSameFS(const Path1, Path2: string): boolean; +begin + if @FSourcePlugin.FVFSIsOnSameFS <> nil then Result := FSourcePlugin.FVFSIsOnSameFS(FGlobs, PChar(Path1), PChar(Path2)) + else Result := True; +end; + +function TVFSEngine.OpenFile(const APath: string; Mode: integer; var Error: integer): TEngineFileDes; +var i: integer; +begin + if @FSourcePlugin.FVFSOpenFile <> nil then begin + Result := FSourcePlugin.FVFSOpenFile(FGlobs, PChar(APath), Mode, @i); + Error := i; + end else Result := nil; +end; + +function TVFSEngine.ReadFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; ABlockSize: integer; var Error: integer): integer; +var i: integer; +begin + if @FSourcePlugin.FVFSReadFile <> nil then begin + Result := FSourcePlugin.FVFSReadFile(FGlobs, FileDescriptor, Buffer, ABlockSize, @i); + Error := i; + end else Result := -1; +end; + +function TVFSEngine.WriteFile(const FileDescriptor: TEngineFileDes; Buffer: Pointer; BytesCount: integer; var Error: integer): integer; +var i: integer; +begin + if @FSourcePlugin.FVFSWriteFile <> nil then begin + Result := FSourcePlugin.FVFSWriteFile(FGlobs, FileDescriptor, Buffer, BytesCount, @i); + Error := i; + end else Result := -1; +end; + +function TVFSEngine.CloseFile(const FileDescriptor: TEngineFileDes): integer; +begin + if @FSourcePlugin.FVFSCloseFile <> nil then Result := FSourcePlugin.FVFSCloseFile(FGlobs, FileDescriptor) + else Result := 0; +end; + +function TVFSEngine.FileSeek(const FileDescriptor: TEngineFileDes; const AbsoluteOffset: Int64; var Error: integer): Int64; +var i: integer; +begin + if @FSourcePlugin.FVFSFileSeek <> nil then begin + Result := FSourcePlugin.FVFSFileSeek(FGlobs, FileDescriptor, AbsoluteOffset, @i); + Error := i; + end else Result := -1; +end; + +function TVFSEngine.TwoSameFiles(const Path1, Path2: string): boolean; +begin + if @FSourcePlugin.FVFSTwoSameFiles <> nil then Result := FSourcePlugin.FVFSTwoSameFiles(FGlobs, PChar(Path1), PChar(Path2)) + else Result := False; +end; + + + +(********************************************************************************************************************************) + +function VFSCopyCallBackFunc(iPos, iMax:Int64; data: Pointer): LongBool; cdecl; +begin +// DebugMsg(['VFSCopyCallBackFunc called (iPos = ', iPos, ', iMax = ', iMax, ')']); + Result := True; + if not Assigned(data) then Exit; + if Assigned(TVFSEngine(data).FProgressFunc) then + try + Result := TVFSEngine(data).FProgressFunc(TVFSEngine(data).FSenderThread, iPos); + except + on E: Exception do DebugMsg(['*** Exception raised in VFSCopyCallBackFunc(iPos=', iPos, ', iMax=', iMax, ', data=', data, '): (', E.ClassName, '): ', E.Message]); + end; +end; + +function TVFSEngine.CopyFileOut(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; +var Res: TVFSResult; +begin + try + if @FSourcePlugin.FVFSCopyOut <> nil then begin + FSenderThread := Sender; + FProgressFunc := ProgressFunc; +// DebugMsg(['0 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$']); +// DebugMsg([' Pointer(FGlobs) = 0x', IntToHex(Int64(FGlobs), 16), ', Pointer(@NewVFSCopyCallBackFunc) = 0x', IntToHex(Int64(@NewVFSCopyCallBackFunc), 16), ', Pointer(Self) = 0x', IntToHex(Int64(Self), 16)]); + try + Res := FSourcePlugin.FVFSCopyOut(FGlobs, PChar(SourceFile), PChar(DestFile), @VFSCopyCallBackFunc, Self, Append); + except + on E: Exception do begin + DebugMsg(['*** Exception raised in TVFSEngine.CopyFileOut(Sender=', QWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + Res := cVFS_WriteErr; + end; + end; +// DebugMsg(['1 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$']); + Result := Res = cVFS_OK; + if (Res <> cVFS_OK) and Assigned(ErrorFunc) then + case Res of + cVFS_ReadErr: Result := ErrorFunc(Sender, 6, 0, SourceFile); + cVFS_WriteErr: Result := ErrorFunc(Sender, 7, 0, DestFile); + cVFS_mallocFailed: ErrorFunc(Sender, 1, 0, SourceFile); + cVFS_Cancelled: Result := False; + end; + end else Result := False; + except + on E: Exception do DebugMsg(['*** Exception raised in TVFSEngine.CopyFileOut(Sender=', QWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + end; +end; + +function TVFSEngine.CopyFileIn(Sender: Pointer; SourceFile, DestFile: string; ProgressFunc: TEngineProgressFunc; ErrorFunc: TEngineErrorFunc; Append: boolean): boolean; +var Res: TVFSResult; +begin + try + if @FSourcePlugin.FVFSCopyIn <> nil then begin + FSenderThread := Sender; + FProgressFunc := ProgressFunc; + try + Res := FSourcePlugin.FVFSCopyIn(FGlobs, PChar(SourceFile), PChar(DestFile), @VFSCopyCallBackFunc, Self, Append); + except + on E: Exception do begin + DebugMsg(['*** Exception raised in TVFSEngine.CopyFileIn(Sender=', QWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + Res := cVFS_WriteErr; + end; + end; + Result := Res = cVFS_OK; + if (Res <> cVFS_OK) and Assigned(ErrorFunc) then + case Res of + cVFS_ReadErr: Result := ErrorFunc(Sender, 6, 0, SourceFile); + cVFS_WriteErr: Result := ErrorFunc(Sender, 7, 0, DestFile); + cVFS_mallocFailed: ErrorFunc(Sender, 1, 0, SourceFile); + cVFS_Cancelled: Result := False; + end; + end else Result := False; + except + on E: Exception do DebugMsg(['*** Exception raised in TVFSEngine.CopyFileIn(Sender=', QWord(Sender), ', SourceFile=', SourceFile, ', DestFile=', DestFile, '): (', E.ClassName, '): ', E.Message]); + end; +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function TVFSEngine.SetPassword(Password: string): integer; +begin + if @FSourcePlugin.FVFSSetPassword <> nil then Result := FSourcePlugin.FVFSSetPassword(FGlobs, PChar(Password)) + else Result := 0; + FPassword := Password; +end; + +function TVFSEngine.GetPasswordRequired: boolean; +begin + if @FSourcePlugin.FVFSGetPasswordRequired <> nil then Result := FSourcePlugin.FVFSGetPasswordRequired(FGlobs) + else Result := False; +end; + +procedure TVFSEngine.SetFPassword(Value: string); +begin + SetPassword(Value); +end; + + +(********************************************************************************************************************************) +(********************************************************************************************************************************) +function GetBinaryPath: string; +var i: integer; + Buf: array[0..1024] of char; +begin + Result := ParamStr(0); // Fallback + try + DebugMsg(['Trying to determine binary path...']); + DebugMsg(['Fallback path = ', Result]); + Buf[0] := #0; + FillChar(Buf, 1025, 0); + i := readlink(PChar(Format('/proc/%d/exe', [getpid])), @Buf, 1024); + if i < 1 then begin + DebugMsg(['Something went wrong during readlink: ', string(strerror(errno))]); + Exit; + end; + Buf[i] := #0; + Result := string(PChar(@Buf)); + DebugMsg(['Path to executable = ', Result]); + except + on E: Exception do DebugMsg(['*** Exception raised in GetBinaryPath: (', E.ClassName, '): ', E.Message]); + end; +end; + + +procedure QueryModules(APath: string); +var Handle: PDirectoryStream; + DirEnt: PDirent64; + s: string; + PluginItem: TVFSPlugin; + ModuleHandler: TModuleHandle; + VFSVersionFunc: TVFSVersion; + i: integer; + Buf: PChar; + b: boolean; +begin + if Length(APath) < 1 then Exit; + try + try + APath := ReplaceStr(APath, '~', GetHomePath); + DebugMsg(['------------------ Querying modules in ', APath, ' ---']); + + // First change to the program starting directory + if APath[1] <> '/' then begin + s := ExtractFilePath(BinaryPath); + DebugMsg(['----> Changing dir to ', s]); + i := __chdir(PChar(s)); + if i <> 0 then DebugMsg(['Something went wrong during chdir: ', string(strerror(errno))]); + s := get_current_dir_name; + DebugMsg([' [II] Changed dir to ', s]); + end; + + // Change to the required directory + s := APath; + DebugMsg(['----> Changing dir to ', s]); + i := __chdir(PChar(s)); + if i <> 0 then begin + DebugMsg(['Something went wrong during chdir: ', string(strerror(errno))]); + Exit; + end; + s := get_current_dir_name; + DebugMsg([' [II] Changed dir to ', s, ', trying to list the files...']); + + // Going to read the directory and search for the files... + Handle := opendir(PChar(s)); + if not Assigned(Handle) then begin + DebugMsg(['Something went wrong during opendir: ', string(strerror(errno))]); + Exit; + end; + repeat + DirEnt := readdir64(Handle); + if Assigned(DirEnt) then begin + Buf := PChar(@DirEnt^.d_name[0]); + if Assigned(Buf) and (strcmp(Buf, '.') <> 0) and (strcmp(Buf, '..') <> 0) then + begin + DebugMsg(['$$$ Found ', Buf, ', trying to load...']); + + // Try to find the plugin in the plugin list to prevent multiple plugin loading + b := False; + if PluginList.Count > 0 then + for i := 0 to PluginList.Count - 1 do + if CompareStr(TVFSPlugin(PluginList[i]).FullPath, IncludeTrailingPathDelimiter(s) + Buf) = 0 then begin + b := True; + Break; + end; + + ModuleHandler := nil; + if b then DebugMsg(['Module ', s, ' is already loaded --> skipping...']) else + if not LoadModule(ModuleHandler, IncludeTrailingPathDelimiter(s) + Buf) then DebugMsg([' XXX Error loading module: ', dlerror]) + else try + @VFSVersionFunc := GetModuleSymbol(ModuleHandler, 'VFSVersion'); + if (@VFSVersionFunc <> nil) and (VFSVersionFunc >= ConstVFSVersionRequired) then begin + PluginItem := TVFSPlugin.Create(ModuleHandler); + PluginItem.FullPath := IncludeTrailingPathDelimiter(s) + Buf; + PluginList.Add(PluginItem); + end else DebugMsg([' $XXX: Error getting version info or version mismatch']); + except end; + end; + end; + until DirEnt = nil; + closedir(Handle); + except + on E: Exception do DebugMsg(['*** Exception raised in QueryModules(APath = ', APath, '): (', E.ClassName, '): ', E.Message]); + end; + finally + DebugMsg(['------------------ Done querying modules ---------------']); + end; +end; + + +procedure UnloadModules; +var i: integer; +begin + if Assigned(PluginList) and (PluginList.Count > 0) then + for i := PluginList.Count - 1 downto 0 do + try + UnloadModule(TVFSPlugin(PluginList[i]).ModuleHandle); + TVFSPlugin(PluginList[i]).Free; + PluginList.Delete(i); + except + on E: Exception do DebugMsg(['*** Exception raised in UnloadModules(i = ', i, '): (', E.ClassName, '): ', E.Message]); + end; +end; + + +procedure DoInitPlugins; +begin + PluginList := TList.Create; + if not ParamDisablePlugins then begin + BinaryPath := GetBinaryPath; + QueryModules(ConstGlobalModulePath1); + QueryModules(ConstGlobalModulePath2); + QueryModules(ConstLocalModulePath1); + QueryModules(ConstLocalModulePath2); + QueryModules(ConstLocalModulePath3); + end; +end; + +initialization +finalization + UnloadModules; + PluginList.Free; +end. diff --git a/vfs/common/vfs_types.h b/vfs/common/vfs_types.h new file mode 100644 index 0000000..609a78b --- /dev/null +++ b/vfs/common/vfs_types.h @@ -0,0 +1,114 @@ +/* Tux Commander VFS: Virtual File System types and definitions + * - prototypes functions and types + * draft version 3 + * + * Copyright (C) 2003 Radek Cervinka + * Copyright (C) 2008 Tomas Bzatek + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __VFS_TYPES_H__ +#define __VFS_TYPES_H__ + + +#include +#include +#include + +typedef int TVFSResult; + + +typedef void (* TVFSLogFunc)(char *s); +typedef int (* TVFSCopyCallBackFunc)(u_int64_t iPos, u_int64_t iMax, void *data); +typedef void *TVFSFileDes; + +static const int cVFSVersion = 3; // current version of the VFS API + +// Capabilities +static const int capVFS_nil = 0; +static const int capVFS_List = 1 << 0; +static const int capVFS_CopyOut = 1 << 1; +static const int capVFS_CopyIn = 1 << 2; +static const int capVFS_MkDir = 1 << 3; +static const int capVFS_RmDir = 1 << 4; +static const int capVFS_Multiple = 1 << 5; // support multiple files = background copy & thread safe +static const int capVFS_Delete = 1 << 6; +static const int capVFS_Rename = 1 << 7; +static const int capVFS_Execute = 1 << 8; +static const int capVFS_Append = 1 << 9; + +// Error codes (TVFSResult) +enum { + cVFS_OK = 0, + cVFS_Failed = 1, // also No such file + cVFS_Cancelled = 2, + cVFS_Not_Supported = 3, + cVFS_No_More_Files = 4, + cVFS_ReadErr = 5, + cVFS_WriteErr = 6, // also Readonly FileSystem + cVFS_LoginFailed = 7, + cVFS_PermissionDenied = 8, + cVFS_NoSpaceLeft = 9, + cVFS_mallocFailed = 10, + cVFS_BadPassword = 11, + cVFS_MissingVolume = 12, + cVFS_CorruptedArchive = 13 +}; + + +// Open modes +enum { + cVFS_OpenRead, + cVFS_OpenWrite, + cVFS_OpenAppend +}; + + +// Item Type enum +enum TVFSItemType { + vRegular = 0, + vSymlink = 1, + vChardev = 2, + vBlockdev = 3, + vDirectory = 4, + vFifo = 5, + vSock = 6, + vOther = 7 +}; + + +struct TVFSItem { + char *sFileName; + u_int64_t iSize; + __time_t m_time; // numbers should be located before the other variables (bug?) + __time_t a_time; + __time_t c_time; + __mode_t iMode; + char *sLinkTo; + __uid_t iUID; + __gid_t iGID; + enum TVFSItemType ItemType; +}; + +struct TVFSInfo { + const char *Name; + const char *Description; + const char *About; + const char *Copyright; +}; + + +#endif /* __VFS_TYPES_H__ */ diff --git a/vfs/null_plugin/COPYING b/vfs/null_plugin/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/vfs/null_plugin/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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. diff --git a/vfs/null_plugin/Makefile b/vfs/null_plugin/Makefile new file mode 100644 index 0000000..f2c6e7e --- /dev/null +++ b/vfs/null_plugin/Makefile @@ -0,0 +1,22 @@ +# path definitions +DESTDIR = /usr +INSTALL=install -c +INSTALL_DATA = ${INSTALL} -m 644 +LIB_SUFFIX=`if test \`uname -m\` = x86_64; then echo 64; fi` + +# compiler options +CC = gcc +CFLAGS = -Wall -O2 -g + + +all shared static: null_plugin + +null_plugin: null_plugin.c + $(CC) -c null_plugin.c -I. -fPIC -I/usr/include $(CFLAGS) + $(CC) -shared -Wall -o libnull_plugin.so null_plugin.o + +install:: + $(INSTALL) ./libnull_plugin.so $(DESTDIR)/lib$(LIB_SUFFIX)/tuxcmd/ + +clean: + rm -f *.o libnull_plugin.so diff --git a/vfs/null_plugin/README b/vfs/null_plugin/README new file mode 100644 index 0000000..7123ad0 --- /dev/null +++ b/vfs/null_plugin/README @@ -0,0 +1,15 @@ +null plugin for Tux Commander +Plugin API version 2 + + +Copyright (c) 2005 Tomas Bzatek +http://tuxcmd.sourceforge.net + + + +This is the null VFS module for Tux Commander. It is intended as a basic +skeleton structure for writing new plugins. It contains all functions required +for successful access to the fake directory structure it creates. + +Please see vfs/uVFSprototypes.pas file for a brief documentation of the VFS API +and description of each function. diff --git a/vfs/null_plugin/null_plugin.c b/vfs/null_plugin/null_plugin.c new file mode 100644 index 0000000..0d24765 --- /dev/null +++ b/vfs/null_plugin/null_plugin.c @@ -0,0 +1,357 @@ +/* null plugin for Tux Commander + * Copyright (C) 2005 Tomas Bzatek + * Check for updates on tuxcmd.sourceforge.net + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "vfs_types.h" + + +// Declaration of the global plugin object +struct TVFSGlobs { + TVFSLogFunc log_func; + int list_item_id; + char *curr_dir; +}; + + + +// Basic initialization functions +int VFSAllocNeeded() +{ + return sizeof(struct TVFSGlobs); +} + +void VFSInit(struct TVFSGlobs *globs, TVFSLogFunc log_func) +{ + + globs->log_func = log_func; + globs->log_func("null plugin: VFSInit"); + globs->curr_dir = NULL; + +} + +void VFSDestroy(struct TVFSGlobs *globs) +{ + + globs->log_func("null plugin: VFSDestroy"); + +} + +int VFSVersion() +{ + return cVFSVersion; +} + +struct TVFSInfo VFSGetInfo() +{ + + static const struct TVFSInfo info = + { + "Null plugin", + "null testing plugin", + "Plugin API version 2", + "Copyright © 2007 Tomáš Bžatek" + }; + + return info; +} + +char *VFSGetPrefix(struct TVFSGlobs *globs) +{ + return "null"; +} + +TVFSResult VFSOpen(struct TVFSGlobs *globs, char *sName) +{ + return cVFS_OK; +} + +TVFSResult VFSClose(struct TVFSGlobs *globs) +{ + return cVFS_OK; +} + +char *VFSGetPath(struct TVFSGlobs *globs) +{ + return globs->curr_dir; +} + +u_int64_t VFSGetFileSystemFree(struct TVFSGlobs *globs, char *APath) +{ + return 0; +} + +u_int64_t VFSGetFileSystemSize(struct TVFSGlobs *globs, char *APath) +{ + return 0; +} + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// + +TVFSResult VFSChangeDir(struct TVFSGlobs *globs, char *NewPath) +{ + if (globs->curr_dir != NULL) free(globs->curr_dir); + globs->curr_dir = strdup(NewPath); + return cVFS_OK; +} + +int VFSLogin(struct TVFSGlobs *globs, char *user, char *pass) +{ + return cVFS_OK; +} + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// + +static char *items[] = +{ + "This is the first item", + "This is the second item", + "This is the third item", + "This is the fourth item", + "This is the fifth item", + "This is the sixth item", + "This is the seventh item", + "This is the eight item", + "This is the nineth item", + "This is the tenth item", + "This is the eleventh item", + "This is the twelveth item", + "This is the thirteenth item", + "This is the fourteenth item", + "This is the fifteenth item", + "This is the sixteeth item", + "This is the seventeenth item", + "This is the eighteenth item", +}; + + +TVFSResult VFSListFirst(struct TVFSGlobs *globs, char *sDir, struct TVFSItem *Item) +{ + globs->list_item_id = 0; + printf("C Item = %lu \n", (long int)Item); + + Item->sFileName = strdup(items[globs->list_item_id]); +// Item->iSize = rand(); + Item->iSize = globs->list_item_id + 1; + Item->iMode = S_IRWXO + S_IRWXG + S_IRWXU; + Item->sLinkTo = "/tmp"; + Item->ItemType = vSymlink; + Item->iUID = 100; + Item->iGID = 1000; + Item->m_time = time(NULL) + globs->list_item_id; + printf("C sizeof(TVFSItem) = %ld \n", sizeof(struct TVFSItem)); + printf("C sizeof(Item->sFileName) = %ld \n", sizeof(Item->sFileName)); + printf("C sizeof(Item->iSize) = %ld \n", sizeof(Item->iSize)); + printf("C sizeof(Item->m_time) = %ld \n", sizeof(Item->m_time)); + printf("C sizeof(Item->a_time) = %ld \n", sizeof(Item->a_time)); + printf("C sizeof(Item->c_time) = %ld \n", sizeof(Item->c_time)); + printf("C sizeof(Item->iMode) = %ld \n", sizeof(Item->iMode)); + printf("C sizeof(Item->sLinkTo) = %ld \n", sizeof(Item->sLinkTo)); + printf("C sizeof(Item->iUID) = %ld \n", sizeof(Item->iUID)); + printf("C sizeof(Item->iGID) = %ld \n", sizeof(Item->iGID)); + printf("C sizeof(Item->ItemType) = %ld \n", sizeof(Item->ItemType)); + + static struct TVFSItem x; + printf("C sizeof(x.sFileName) = %ld \n", sizeof(x.sFileName)); + printf("C sizeof(x.iSize) = %ld \n", sizeof(x.iSize)); + printf("C sizeof(x.m_time) = %ld \n", sizeof(x.m_time)); + printf("C sizeof(x.a_time) = %ld \n", sizeof(x.a_time)); + printf("C sizeof(x.c_time) = %ld \n", sizeof(x.c_time)); + printf("C sizeof(x.iMode) = %ld \n", sizeof(x.iMode)); + printf("C sizeof(x.sLinkTo) = %ld \n", sizeof(x.sLinkTo)); + printf("C sizeof(x.iUID) = %ld \n", sizeof(x.iUID)); + printf("C sizeof(x.iGID) = %ld \n", sizeof(x.iGID)); + printf("C sizeof(x.ItemType) = %ld \n", sizeof(x.ItemType)); + + return cVFS_OK; +} + +TVFSResult VFSListNext(struct TVFSGlobs *globs, char *sDir, struct TVFSItem *Item) +{ + globs->list_item_id++; + printf("C Item = %lu \n", (long int)Item); + + if (globs->list_item_id >= (sizeof(items) / sizeof(items[0]))) { + Item = NULL; + return cVFS_No_More_Files; + } + + Item->sFileName = strdup(items[globs->list_item_id]); + + Item->iSize = globs->list_item_id + 1; + Item->iMode = S_IRWXO + /* S_IRWXG + */ S_IRWXU; + Item->sLinkTo = NULL; + Item->iUID = 100; + Item->iGID = 1000; + Item->m_time = time(NULL) + globs->list_item_id; + + if (globs->list_item_id < 4) Item->ItemType = vDirectory; + else Item->ItemType = vRegular; + + return cVFS_OK; +} + +TVFSResult VFSListClose(struct TVFSGlobs *globs) +{ + return cVFS_OK; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// +long VFSFileExists(struct TVFSGlobs *globs, const char *FileName, const long Use_lstat) +{ + return 0; +} + +TVFSResult VFSFileInfo(struct TVFSGlobs *globs, char *AFileName, struct TVFSItem *Item) +{ + return cVFS_OK; +} + +TVFSResult VFSMkDir(struct TVFSGlobs *globs, const char *sDirName) +{ + return cVFS_OK; +} + +TVFSResult VFSRemove(struct TVFSGlobs *globs, const char *APath) +{ + return cVFS_OK; +} + +TVFSResult VFSRename(struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName) +{ + return cVFS_OK; +} + +TVFSResult VFSMakeSymLink(struct TVFSGlobs *globs, const char *NewFileName, const char *PointTo) +{ + return cVFS_OK; +} + +TVFSResult VFSChmod(struct TVFSGlobs *globs, const char *FileName, const uint Mode) +{ + return cVFS_OK; +} + +TVFSResult VFSChown(struct TVFSGlobs *globs, const char *FileName, const uint UID, const uint GID) +{ + return cVFS_OK; +} + +TVFSResult VFSChangeTimes(struct TVFSGlobs *globs, char *APath, long mtime, long atime) +{ + return cVFS_OK; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// + +u_int64_t VFSGetDirSize(struct TVFSGlobs *globs, char *APath) +{ + return 0; +} + + +void VFSBreakGetDirSize(struct TVFSGlobs *globs) +{ + +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// + +TVFSFileDes VFSOpenFile(struct TVFSGlobs *globs, const char *APath, int Mode, int *Error) +{ + *Error = 0; + return (TVFSFileDes)0; +} + +TVFSResult VFSCloseFile(struct TVFSGlobs *globs, TVFSFileDes FileDescriptor) +{ + return cVFS_OK; +} + +u_int64_t VFSFileSeek(struct TVFSGlobs *globs, TVFSFileDes FileDescriptor, u_int64_t AbsoluteOffset, int *Error) +{ + *Error = 0; + return 0; +} + +int VFSReadFile(struct TVFSGlobs *globs, TVFSFileDes FileDescriptor, void *Buffer, int ABlockSize, int *Error) +{ + *Error = 0; + return 0; +} + +int VFSWriteFile(struct TVFSGlobs *globs, TVFSFileDes FileDescriptor, void *Buffer, int BytesCount, int *Error) +{ + *Error = 0; + return 0; +} + +void VFSSetBlockSize(struct TVFSGlobs *globs, int Value) +{ + +} + +int VFSIsOnSameFS(struct TVFSGlobs *globs, const char *Path1, const char *Path2) +{ + return 0; +} + +int VFSTwoSameFiles(struct TVFSGlobs *globs, const char *Path1, const char *Path2) +{ + return 0; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////// + +TVFSResult VFSCopyOut(struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, TVFSCopyCallBackFunc pCallBackProgress, void *data, int Append) +{ + return cVFS_OK; +} + +TVFSResult VFSCopyIn(struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, TVFSCopyCallBackFunc pCallBackProgress, void *data, int Append) +{ + return cVFS_OK; +} + +//////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + diff --git a/vfs/null_plugin/vfs_types.h b/vfs/null_plugin/vfs_types.h new file mode 120000 index 0000000..c2235a2 --- /dev/null +++ b/vfs/null_plugin/vfs_types.h @@ -0,0 +1 @@ +../common/vfs_types.h \ No newline at end of file diff --git a/vfs/uVFSprototypes.pas b/vfs/uVFSprototypes.pas new file mode 100644 index 0000000..7a87aa0 --- /dev/null +++ b/vfs/uVFSprototypes.pas @@ -0,0 +1,246 @@ +(* + Virtual File System support + - prototypes functions and types + draft version 24 + + used in Seksi commander and Tux Commander + + Copyright (C) 2003 Radek Cervinka + Copyright (C) 2005-2008 Tomas Bzatek + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) + +unit uVFSprototypes; + +interface + +const + cVFSVersion = 3; // current version of the VFS API + + // Capabilities + capVFS_nil = 0; + capVFS_List = 1; + capVFS_CopyOut = 2; + capVFS_CopyIn = 4; + capVFS_NeedsTemp = 8; // if not set, the seek operation is available + capVFS_Multiple = 16; // support multiple files - ? + capVFS_Execute = 32; + capVFS_Writable = 64; + capVFS_NeedsLogin = 128; // Anonymous is login operation too + + + // Error codes (TVFSResult) + cVFS_OK = 0; + cVFS_Failed = 1; // also No such file + cVFS_Cancelled = 2; + cVFS_Not_Supported = 3; + cVFS_Not_More_Files = 4; // returned while directory listing + cVFS_ReadErr = 5; + cVFS_WriteErr = 6; // also ReadOnlyFileSystem + cVFS_LoginFailed = 7; + cVFS_PermissionDenied = 8; + cVFS_NoSpaceLeft = 9; + cVFS_mallocFailed = 10; + cVFS_BadPassword = 11; + cVFS_MissingVolume = 12; + cVFS_CorruptedArchive = 13; + + + // Open modes (for VFSOpenFile function) + cVFS_OpenRead = 0; + cVFS_OpenWrite = 1; + cVFS_OpenAppend = 2; + + + +type + TVFSResult = longint; + TVFSGlobs = Pointer; + // The plugin can store some data into this object for identify the object instances + // It is allocated in the application side with the size returned by VFSAllocNeeded() + // Generally, it is required for correct cooperation of thread in the module + + // File descriptor for Open, Read, Write, Close, Seek operations + TVFSFileDes = Pointer; + + TVFSItemType = (vRegular=0, vSymlink=1, vChardev=2, vBlockdev=3, vDirectory=4, vFifo=5, vSock=6, vOther=7); + +{$IFDEF KYLIX} + DWORD = Cardinal; +// ShortBool = boolean; +{$ENDIF} +{$IFNDEF CPU64} + ShortBool = boolean; +{$ENDIF} + + PVFSItem = ^TVFSItem; + TVFSItem = packed record +{$IFNDEF CPU64} // 32-bit platform + sFileName: PChar; + iSize: Int64; + m_time: DWORD; + a_time: DWORD; + c_time: DWORD; + iMode: Integer; + sLinkTo: PChar; + iUID: Integer; + iGID: Integer; + ItemType: TVFSItemType; +{$ELSE} // 64-bit platform + sFileName: PChar; + iSize: Int64; + m_time: QWORD; + a_time: QWORD; + c_time: QWORD; + iMode: Longint; + __padding1: array[1..4] of byte; + sLinkTo: PChar; + iUID: Longint; + iGID: Longint; + ItemType: Longint; + __padding: array[1..4] of byte; +{$ENDIF} + end; + + // This structure contains basic informations about the plugin (Name is used to identify the module in the application) + TVFSInfo = packed record + Name: PChar; + Description: PChar; + About: PChar; + Copyright: PChar; + end; + +type + // Log function which could plugin call - the application must handle the messages (e.g. write them to the stdout) + PVFSLogFunc = ^TVFSLogFunc; + TVFSLogFunc = procedure(S: PChar); cdecl; + + TVFSAllocNeeded = function: integer; cdecl; + // Returns sizeof internal structure of TVFSGlobs in the plugin - host application will then allocate corresponding amount of memory + TVFSInit = procedure (g:TVFSGlobs; LogFunc: PVFSLogFunc); cdecl; + // Performs intialization of the plugin and sets the log function for the module (assume allocated memory for TVFSGlobs) + TVFSDestroy = procedure (g:TVFSGlobs); cdecl; + // Performs cleanup and destroy all objects + TVFSVersion = function: integer; cdecl; + // Returns API Version; the host application checks for this number and if the returned number is less than a value required by the host application, the module is not loaded + // The current version for this API is '3' - please use the constant declared above as return value + TVFSGetInfo = function: TVFSInfo; cdecl; + // Returns the structure with module info + TVFSGetPrefix = function (g:TVFSGlobs): PChar; cdecl; + // Returns prefix used in the application to show difference between local and VFS filesystems (e.g. "ftp" or "smb") + TVFSGetCharset = function (g:TVFSGlobs): PChar; cdecl; + // TODO: Returns charset which the plugin uses + TVFSGetExts = function: PChar; cdecl; + // Returns the list of filename extensions which the module can handle separated by ';' (without a leading dots) + TVFSGetServices = function: PChar; cdecl; + // Returns the list of supported remote protocols separated by ';' (without the '://') + TVFSCaps = function (const sExt: PChar): Integer; cdecl; + // TODO: Returns a bit mask of plugin capabilities + TVFSSetProtocolLogFunc = procedure (g:TVFSGlobs; ProtocolLogFunc: TVFSLogFunc); cdecl; + // TODO: Sets the protocol log function (unlike module debug log func this is intended only for server messages (FTP mainly)) + TVFSSetBlockSize = procedure (g:TVFSGlobs; Value: Cardinal); cdecl; + // Sets the block size for I/O operations (not all modules supports this) + + + TVFSOpen = function (g:TVFSGlobs; const sName: PChar): TVFSResult; cdecl; + // TODO: Opens the location (file or URI/URL) + TVFSLogin = function (g:TVFSGlobs; const User, Pass: PChar): TVFSResult; cdecl; + // TODO: Performs login to the server + TVFSClose = function (g:TVFSGlobs): TVFSResult; cdecl; + // Closes the file or connection to the server + TVFSMkDir = function (g:TVFSGlobs; const sDirName: PChar): TVFSResult; cdecl; + TVFSRename = function (g:TVFSGlobs; const sSrcName, sDstName: PChar): TVFSResult; cdecl; + // Only rename/move in this function, the two files/directories have to be on the same filesystem - otherway it needs to be copied and deleted manually + TVFSRemove = function (g:TVFSGlobs; const APath: PChar): TVFSResult; cdecl; + // Removes the file/directory (empty only!) + TVFSFileExists = function (g:TVFSGlobs; const FileName: PChar; const Use_lstat: LongBool): LongBool; cdecl; + // This function checks for existing location; the Use_lstat parameter specifies to not follow the symlinks (default false = follow symlinks) + TVFSMakeSymLink = function (g:TVFSGlobs; const NewFileName, PointTo: PChar): TVFSResult; cdecl; + TVFSChmod = function (g:TVFSGlobs; const FileName: PChar; const Mode: integer): TVFSResult; cdecl; + // The parameter for this function is in classic unix format (glibc) - a bit mask + TVFSChown = function (g:TVFSGlobs; const FileName: PChar; const UID, GID: integer): TVFSResult; cdecl; + TVFSChangeTimes = function (g:TVFSGlobs; APath: PChar; mtime, atime: Longint): TVFSResult; cdecl; + // Changes times for the file/directory - mtime and atime are __time_t parameters (glibc) + TVFSChangeDir = function (g:TVFSGlobs; const NewPath: PChar): TVFSResult; cdecl; + // Try to change the directory when correct permissions + TVFSGetPath = function (g:TVFSGlobs): PChar; cdecl; + // Returns the current working path (not all plugins can support this; just return '/' in this case) + TVFSGetFileSystemSize = function (g:TVFSGlobs; const APath: PChar): Int64; cdecl; + // Gets the size of filesystem; the path is optional, specified to recognize various mounted filesystems in the tree + TVFSGetFileSystemFree = function (g:TVFSGlobs; const APath: PChar): Int64; cdecl; + TVFSGetFSLabel = function (g:TVFSGlobs; const APath: PChar): PChar; cdecl; + // Gets the filesystem label + TVFSIsOnSameFS = function (g:TVFSGlobs; const Path1, Path2: PChar): boolean; cdecl; + TVFSTwoSameFiles = function (g:TVFSGlobs; const Path1, Path2: PChar): boolean; cdecl; + // Checks if the two files are simmilar (used to test the case-insensitive filesystem - or hardlinks) + TVFSGetDirSize = function (g:TVFSGlobs; APath: PChar): Int64; cdecl; + // Calculates recursively the size of the tree specified under the path APath + TVFSBreakGetDirSize = procedure (g:TVFSGlobs); cdecl; + // Call this function to break the calculation performed by VFSGetDirSize + TVFSRun = function (g:TVFSGlobs; const sName: PChar): TVFSResult; cdecl; + // TODO: Runs the command read from inside the archive (typically installing the rpm package) + + + TVFSCopyCallBackFunc = function (iPos, iMax: Int64; data: Pointer):LongBool; cdecl; + // Callback function used during the copy process; return False to break the copy process + + TVFSCopyOut = function (g:TVFSGlobs; const sSrcName, sDstName: PChar; pCallBackProgress: TVFSCopyCallBackFunc; data: Pointer; Append: LongBool): TVFSResult; cdecl; + // Performs the copy process from inside of module to the file in the local system + // (thus sSrcName is a path from inside of module and sDstName is path in the local filesystem where the file should be copied) + // The data pointer is then used to call the callback function in + // Note: if you need to transfer a file between two VFS modules, you need to do it manually - either first copy to local FS or use the Open, Read, Write functions of the module (NOTE: both VFS modules have to support these functions) + + TVFSCopyIn = function (g:TVFSGlobs; const sSrcName, sDstName: PChar; pCallBackProgress: TVFSCopyCallBackFunc; data: Pointer; Append: LongBool): TVFSResult; cdecl; + // Performs the copy process from the local filesystem into the module + + + // This is the set of basic functions which can manipulate with the data + // There is a TVFSFileDes object which identifies the processed file (filedescriptor) + // All these functions needs a pointer to an int variable to store the error code + // NOTE: not all modules could support this set of functions due to its design (unable to set a solid block size) + TVFSOpenFile = function (g:TVFSGlobs; const APath: PChar; Mode: integer; Error: Pinteger): TVFSFileDes; cdecl; + // Opens a file or creates new (the values for the Mode parameter are described above) and returns the assigned filedescriptor + TVFSReadFile = function (g:TVFSGlobs; const FileDescriptor: TVFSFileDes; Buffer: Pointer; ABlockSize: integer; Error: Pinteger): integer; cdecl; + // Returns number of bytes read; the buffer needs to be allocated by a blocksize (set it by VFSSetBlockSize function) + TVFSWriteFile = function (g:TVFSGlobs; const FileDescriptor: TVFSFileDes; Buffer: Pointer; BytesCount: integer; Error: Pinteger): integer; cdecl; + // Returns number of bytes written + TVFSCloseFile = function (g:TVFSGlobs; const FileDescriptor: TVFSFileDes): TVFSResult; cdecl; + TVFSFileSeek = function (g:TVFSGlobs; const FileDescriptor: TVFSFileDes; const AbsoluteOffset: Int64; Error: Pinteger): Int64; cdecl; + // Sets the position in the file from the start and returns real current position + + + // These are the functions used to list the contents of the directory + // First call the VFSListFirst function and then repeat call of VFSListNext until it returns NULL. + // Then call VFSListClose to make cleanup + TVFSListFirst = function (g:TVFSGlobs; const sDir: PChar; VFSItem: PVFSItem): TVFSResult; cdecl; + TVFSListNext = function (g:TVFSGlobs; const sDir: PChar; VFSItem: PVFSItem): TVFSResult; cdecl; + TVFSListClose = function (g:TVFSGlobs): TVFSResult; cdecl; + TVFSFileInfo = function (g:TVFSGlobs; AFileName: PChar; VFSItem: PVFSItem): TVFSResult; cdecl; + // Gets a single info item without need to list a whole directory + + TVFSSetPassword = function (g:TVFSGlobs; pass: PChar): TVFSResult; cdecl; + TVFSGetPasswordRequired = function (g:TVFSGlobs): LongBool; cdecl; + + /// pridat neco jako set_loglevel ?? + +//// pridat typ pluginu - jestli archive nebo protocol - prip. jeste pridat ktery protokoly je to schopno handlovat + + +// TODO: some function to check the CRC of the archive - it should need also some progress feedback - the processed file and percentage progress + +implementation + +end. -- cgit v1.2.3