diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-07 20:34:49 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-07 20:34:49 +0200 |
| commit | ecde167da74c86bc047aaf84c5e548cf65a5da98 (patch) | |
| tree | a015dfda84f28a65811e3aa0d369f8f211ec8c60 | |
| download | tuxcmd-0.6.36.tar.xz | |
Initial commitv0.6.36release-0.6.36-dev
91 files changed, 50247 insertions, 0 deletions
@@ -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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 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. + + <signature of Ty Coon>, 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. @@ -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 <tbzatek@users.sourceforge.net> +# 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 @@ -0,0 +1,61 @@ +Tux Commander development release + Version: 0.6.36 + Release date: 2008-Jun-01 + +Copyright (c) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net> +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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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 := '<span weight="ultrabold">Text:</span> 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 := '<span weight="ultrabold">File:</span> .adobe'#10'<span weight="ultrabold">Text:</span> rw-rw-rw'#10 + + '<span weight="ultrabold">Octal:</span> 666'#10'<span weight="ultrabold">Owner:</span> root'#10 + + '<span weight="ultrabold">Group:</span> 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 <tbzatek@users.sourceforge.net>
+ 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 := '<span weight="ultrabold">File:</span> .adobe'#10'<span weight="ultrabold">Text:</span> rw-rw-rw'#10 + + '<span weight="ultrabold">Octal:</span> 666'#10'<span weight="ultrabold">Owner:</span> root'#10 + + '<span weight="ultrabold">Group:</span> 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 <tbzatek@users.sourceforge.net> + 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('<span size="x-large" weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net> + 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=<profilename> 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=<path> Start left panel at <path>'); + WriteLn(' --right=<path> Start right panel at <path>'); + WriteLn(' --lang=<language> Force GUI language (the string <language> 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 <tbzatek@users.sourceforge.net>
+ 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('<span size="x-large" weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net>
+ 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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [LANGConnProp_DetailedInformations]); + Label3.UseMarkup := True; + Label4 := TGTKLabel.Create(Self); + Label4.XAlign := 0; + Label4.XPadding := 0; + Label4.Caption := Format('<span weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net>', nil); + Translations : PChar = 'Tomáš Bžatek <tbzatek@users.sourceforge.net> - English, Czech'#10 + + 'Maxim Baranov <maxbaranov@hotbox.ru> - Russian'#10 + + 'Sven Laufersweiler <laufersweiler@bettercad.de> - German'#10 + + 'Johan Åkesson <johan@badanka.com> - Swedish'#10 + + 'Marie-Agnès Pauchet-Le Héricy <marie@kerplh.com> - French'#10 + + 'Daniel Areiza <nnoseman@hotmail.com> - Spanish'#10 + + 'Dominik Zabłotny <dominz@wp.pl> - Polish'#10 + + 'Serhij Dubyk <dubyk@ukr.net> - Ukrainian'#10 + + 'Bojan Božović <bojanb@sbb.co.yu> - Serbian'#10 + + 'Marián Képesi <m_kepesi@yahoo.com> - Hungarian'#10 + + 'Francesco Turco <fctk86@gmail.com> - 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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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 = '<directory>'; + ConstFTAMetaFile = '<file>'; + +{$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 <tbzatek@users.sourceforge.net> + 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('<span weight="bold" underline="single">', s, '</span>', nil), nil); + 1: g_object_set(cell, 'markup', g_strconcat('<span style="italic">', s, '</span>', 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('<span weight="bold">', s, '</span>', 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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net>
+ 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('<span size="x-large" weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net> + 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('<Alt>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('<Control>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('<Control>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('<Alt>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('<Control>F'); + mnuNetwork.Add(miOpenConnection); + miQuickConnect := TGTKMenuItem.CreateTyped(Self, itImageText); + miQuickConnect.Caption := LANGmiQuickConnectCaption; + miQuickConnect.Enabled := False; + miQuickConnect.ShortCuts.AddName('<Control>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('<Control>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('<Control>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('<Control>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('<span size="large" weight="ultrabold">%s</span>', [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('<span weight="bold">%s</span>', [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('<Alt>%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('<span weight="bold">%s</span>', [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<span weight="ultrabold"> </span>', [APath]); + if FileTypeDesc = '' then FileTypeDesc := LANGHandleRunFromArchive_FileTypeDesc_Unknown; + FRunFromVFS.FileTypeLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', [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<span weight="ultrabold"> </span>', [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<span weight="ultrabold"> </span>', [ANSIToUTF8(FormatSize(Stat^.Size, 0)), s]); + FRunFromVFS.DateLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', [FormatDateTime('ddddd tt', Stat^.ModifyTime)]); + if (Command = '') and (not Stat^.IsExecutable) then begin + FRunFromVFS.OpensWithLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', [LANGHandleRunFromArchive_NotAssociated]); + FRunFromVFS.ExecuteButton.Enabled := False; + FRunFromVFS.ExecuteAllButton.Enabled := False; + end else begin + if Command = '' then Command := LANGHandleRunFromArchive_SelfExecutable; + FRunFromVFS.OpensWithLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', [Command]); + end; + end else begin + FRunFromVFS.SizeLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['??']); + FRunFromVFS.PackedSizeLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['??']); + FRunFromVFS.DateLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['??']); + FRunFromVFS.OpensWithLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', [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 <tbzatek@users.sourceforge.net> + 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('<span size="x-large" weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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('<span size="x-large" weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', ['_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 <tbzatek@users.sourceforge.net> + 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('<span weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net> + 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('<span size="x-large" weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [LANGFRunFromVFS_FileNameLabel]); + FileNameLabel.UseMarkup := True; + FileNameLabel2 := TGTKLabel.Create(Self); + FileNameLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['/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('<span weight="ultrabold">%s</span>', [LANGFRunFromVFS_FileTypeLabel]); + FileTypeLabel.UseMarkup := True; + FileTypeLabel2 := TGTKLabel.Create(Self); + FileTypeLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['HTML page']); + FileTypeLabel2.XAlign := 0; + FileTypeLabel2.UseMarkup := True; + + SizeLabel := TGTKLabel.Create(Self); + SizeLabel.XAlign := 1; + SizeLabel.Caption := Format('<span weight="ultrabold">%s</span>', [LANGFRunFromVFS_SizeLabel]); + SizeLabel.UseMarkup := True; + SizeLabel2 := TGTKLabel.Create(Self); + SizeLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['192 168 bytes']); + SizeLabel2.XAlign := 0; + SizeLabel2.UseMarkup := True; + + PackedSizeLabel := TGTKLabel.Create(Self); + PackedSizeLabel.XAlign := 1; + PackedSizeLabel.Caption := Format('<span weight="ultrabold">%s</span>', [LANGFRunFromVFS_PackedSizeLabel]); + PackedSizeLabel.UseMarkup := True; + PackedSizeLabel2 := TGTKLabel.Create(Self); + PackedSizeLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['168 192 bytes']); + PackedSizeLabel2.XAlign := 0; + PackedSizeLabel2.UseMarkup := True; + + DateLabel := TGTKLabel.Create(Self); + DateLabel.XAlign := 1; + DateLabel.Caption := Format('<span weight="ultrabold">%s</span>', [LANGFRunFromVFS_DateLabel]); + DateLabel.UseMarkup := True; + DateLabel2 := TGTKLabel.Create(Self); + DateLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['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('<span weight="ultrabold">%s</span>', [LANGFRunFromVFS_OpensWithLabel]); + OpensWithLabel.UseMarkup := True; + OpensWithLabel2 := TGTKLabel.Create(Self); + OpensWithLabel2.Caption := Format('%s<span weight="ultrabold"> </span>', ['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 <tbzatek@users.sourceforge.net> + 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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span>', [LANGSearch_Size]); + Label4.UseMarkup := True; + Label5 := TGTKLabel.Create(Self); + Label5.XAlign := 0; + Label5.XPadding := 0; + Label5.Caption := Format('<span weight="ultrabold">%s</span>', [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('<span weight="ultrabold">%s</span> %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('<span weight="ultrabold">%s</span> %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('<span weight="ultrabold">%s</span> %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('<span weight="ultrabold">%s</span> %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('<span weight="ultrabold">%s</span> (' + LANGSearch_FilesFound + ')', + [LANGSearch_SearchFinished, FSearchThread.FList.Count]) + else StatusLabel.Caption := Format('<span weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net> + 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 := '<span size="large" weight="ultrabold">File Properties</span>'; + 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 <tbzatek@users.sourceforge.net> + 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('<span size="x-large" weight="bold">%s</span>', [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 <tbzatek@users.sourceforge.net>
+ 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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.sourceforge.net> + 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('<span size="x-large" weight="ultrabold">%s</span>', [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 <tbzatek@users.sourceforge.net> + This unit is based on an idea from Gnome File Manager by Miroslav Bajtos <mirco@matfyz.cz> + 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('<span weight="bold">%s</span>', [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('<span weight="bold">%s</span>', [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 <tbzatek@users.sourceforge.net> + 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 <tbzatek@users.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.
+
+*)
+ +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 <tbzatek@users.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.
+
+*)
+ +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 <tbzatek@users.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. + +*) + +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 <tbzatek@users.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.
+
+*)
+ +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 <tbzatek@users.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. + +*) + +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 <tbzatek@users.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. + +*) + +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 <tbzatek@users.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.
+
+*)
+ +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 <tbzatek@users.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. + +*) + +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 <tbzatek@users.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. + +*) + +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 <tbzatek@users.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.
+
+*)
+ +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 <tbzatek@users.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.
+
+*)
+ +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 <tbzatek@users.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. + +*) + +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 <tbzatek@users.sourceforge.net> + 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 = '<DIR>'; + 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 = '<span weight="bold">Stav:</span> Nekontrolováno'; + LANGcsChecksumChecking = '<span weight="bold">Stav:</span> Probíhá kontrola...'; + LANGcsChecksumInterrupted = '<span weight="bold">Stav:</span> Přerušeno'; + LANGcsChecksumDOK = '<span weight="bold">Stav:</span> %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 = '<span size="xx-large" weight="ultrabold">Příprava souborů</span>'; + LANGcsCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Vyberte typ součtového souboru</span>'; + LANGcsCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Zvolte jméno souboru</span>'; + LANGcsCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Připraveno pro operaci</span>'; + LANGcsCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Probíhá kontrola...</span>'; + LANGcsCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Chyba!</span>'; + LANGcsCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Dokončeno</span>'; + 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 = '<span size="x-large" weight="ultrabold">Typy souborů</span>'; + 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 = '<span weight="ultrabold">Textové vyjádření:</span> %s'; + LANGcsFChmod_FileLabel = '<span weight="ultrabold">Zvolený soubor:</span> %s'#10'<span weight="ultrabold">Textové vyjádření:</span> %s'#10 + + '<span weight="ultrabold">Číselné vyjádření:</span> %d'#10'<span weight="ultrabold">Vlastník:</span> %s'#10 + + '<span weight="ultrabold">Skupina:</span> %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 = '<span size="x-large" weight="ultrabold">Nastavení aplikace</span>'; + 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 = '<span weight="ultrabold">Externí programy</span>'; + 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 = '<span weight="ultrabold">Varování:</span> 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í <span style="italic">(prosím upřesněte v adrese)</span>'; + 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í <span style="italic">(všsechny dostupné moduly)</span>'; + + 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 = '<span weight="ultrabold">Varování:</span> 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 <laufersweiler@bettercad.de> + !! 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 = '<DIR>'; + 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 = '<span weight="bold">Status:</span> Nicht geprüft'; + LANGdeChecksumChecking = '<span weight="bold">Status:</span> Prüfe...'; + LANGdeChecksumInterrupted = '<span weight="bold">Status:</span> Unterbrochen'; + LANGdeChecksumDOK = '<span weight="bold">Status:</span> %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 = '<span size="xx-large" weight="ultrabold">Vorbereiten der Dateien zur Checksummenberechnung</span>'; + LANGdeCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Wählen Sie den Prüfsummen Dateityp aus</span>'; + LANGdeCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Dateiname auswählen</span>'; + LANGdeCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Bereit zum prüfen</span>'; + LANGdeCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Ausführung...</span>'; + LANGdeCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Fehler!</span>'; + LANGdeCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Fertig</span>'; + 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 = '<span size="x-large" weight="ultrabold">Konfiguration der Dateitypen</span>'; + 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 = '<span weight="ultrabold">Text:</span> %s'; + LANGdeFChmod_FileLabel = '<span weight="ultrabold">Datei:</span> %s'#10'<span weight="ultrabold">Text:</span> %s'#10 + + '<span weight="ultrabold">Oktal:</span> %d'#10'<span weight="ultrabold">Eigentuemer:</span> %s'#10 + + '<span weight="ultrabold">Gruppe:</span> %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 = '<span size="x-large" weight="ultrabold">Programm Einstellungen</span>'; + 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 = '<span weight="ultrabold">Externe Programme</span>'; + 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 = '<span weight="ultrabold">Warning:</span> 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 <span style="italic">(please specify in URI)</span>'; + 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 <span style="italic">(all suitable modules)</span>'; + + 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 = '<span weight="ultrabold">Warning:</span> 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 <tbzatek@users.sourceforge.net> + 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 = '<span weight="bold">%s</span> of <span weight="bold">%s</span> free'; + LANGenDiskStatVolNameFmt = '[%s] %s of %s free'; +// LANGenDiskStatVolNameFmt = '[%s] <span weight="bold">%s</span> of <span weight="bold">%s</span> free'; +// LANGenDiskStatVolNameFmt = '<span style="italic">[%s]</span> <span weight="bold">%s</span> of <span weight="bold">%s</span> free'; + LANGenStatusLineFmt = '%s of %s in %d of %d files selected'; + LANGenPanelStrings : array[boolean] of string = ('right', 'left'); + + LANGenDIR = '<DIR>'; + 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 = '<span weight="bold">Status:</span> Not checked'; + LANGenChecksumChecking = '<span weight="bold">Status:</span> Checking...'; + LANGenChecksumInterrupted = '<span weight="bold">Status:</span> Interrupted'; + LANGenChecksumDOK = '<span weight="bold">Status:</span> %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 = '<span size="xx-large" weight="ultrabold">Prepare files for checksum</span>'; + LANGenCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Select checksums file type</span>'; + LANGenCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Choose filename</span>'; + LANGenCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Ready to check</span>'; + LANGenCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Processing...</span>'; + LANGenCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Error!</span>'; + LANGenCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Finished</span>'; + 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 = '<span size="x-large" weight="ultrabold">File Types Configuration</span>'; + 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 = '<span weight="ultrabold">Text:</span> %s'; + LANGenFChmod_FileLabel = '<span weight="ultrabold">File:</span> %s'#10'<span weight="ultrabold">Text:</span> %s'#10 + + '<span weight="ultrabold">Octal:</span> %d'#10'<span weight="ultrabold">Owner:</span> %s'#10 + + '<span weight="ultrabold">Group:</span> %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 = '<span size="x-large" weight="ultrabold">Application Preferences</span>'; + 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 = '<span weight="ultrabold">External programs</span>'; + 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 = '<span weight="ultrabold">Warning:</span> 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 <span style="italic">(please specify in URI)</span>'; + 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 <span style="italic">(all suitable modules)</span>'; + + 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 = '<span weight="ultrabold">Warning:</span> 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 <nnoseman@hotmail.com> + 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 = '<DIR>'; + 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 = '<span weight="bold">Estado:</span> No seleccionado'; + LANGesChecksumChecking = '<span weight="bold">Estado:</span> Comprobando...'; + LANGesChecksumInterrupted = '<span weight="bold">Estado:</span> Interrumpido'; + LANGesChecksumDOK = '<span weight="bold">Estado:</span> %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 = '<span size="xx-large" weight="ultrabold">Preparar archivos</span>'; + LANGesCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Seleccione el tipo de archivo</span>'; + LANGesCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Elige nombre de archivo</span>'; + LANGesCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Listos</span>'; + LANGesCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Procesando...</span>'; + LANGesCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">¡Error!</span>'; + LANGesCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Finalizado</span>'; + 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 = '<span size="x-large" weight="ultrabold">Configuración de Tipos de Archivo</span>'; + 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 = '<span weight="ultrabold">Texto:</span> %s'; + LANGesFChmod_FileLabel = '<span weight="ultrabold">Archivo:</span> %s'#10'<span weight="ultrabold">Texto:</span> %s'#10 + + '<span weight="ultrabold">Octal:</span> %d'#10'<span weight="ultrabold">Dueño:</span> %s'#10 + + '<span weight="ultrabold">Grupo:</span> %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 = '<span size="x-large" weight="ultrabold">Preferencias</span>'; + 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 = '<span weight="ultrabold">Programas Externos</span>'; + 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 = '<span weight="ultrabold">Advertencia:</span> 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 <span style="italic">(por favor especificarlo en URI)</span>'; + 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 <span style="italic">(todos los módulos)</span>'; + + 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 = '<span weight="ultrabold">Advertencia:</span> 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 <marie@kerplh.com> + 2007 by Stanislas Zeller <skogkatt@orange.fr> + + 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 = '<DIR>'; + 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 = '<span weight="bold">Statut :</span> Non contrôlé'; + LANGfrChecksumChecking = '<span weight="bold">Statut :</span> contrôle en cours...'; + LANGfrChecksumInterrupted = '<span weight="bold">Statut :</span> Interrompu'; + LANGfrChecksumDOK = '<span weight="bold">Statut :</span> %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 = '<span size="xx-large" weight="ultrabold">Préparer les fichiers pour le calcul des sommes de contrôle</span>'; + LANGfrCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Sélectionner le type de somme de contrôle</span>'; + LANGfrCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Choisir le nom de fichier</span>'; + LANGfrCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">prêt à contrôler</span>'; + LANGfrCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">En cours...</span>'; + LANGfrCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Erreur!</span>'; + LANGfrCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Terminé</span>'; + 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 = '<span size="x-large" weight="ultrabold">Configuration des types de fichier</span>'; + 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 = '<span weight="ultrabold">Texte :</span> %s'; + LANGfrFChmod_FileLabel = '<span weight="ultrabold">Fichier :</span> %s'#10'<span weight="ultrabold">Texte :</span> %s'#10 + + '<span weight="ultrabold">Octal :</span> %d'#10'<span weight="ultrabold">Propriétaire :</span> %s'#10 + + '<span weight="ultrabold">Groupe :</span> %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 = '<span size="x-large" weight="ultrabold"> Préférences de l''application</span>'; + 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 = '<span weight="ultrabold"> programmes externes</span>'; + 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 <Inser>'; + LANGfrPreferencesSpaceMovesDownCheckBox_Caption = 'Déplacement vers le bas après <Espace>'; + LANGfrPreferencesViewer = 'Visionneuse'; + LANGfrPreferencesCommandSC = 'Commande:'; + LANGfrPreferencesUseInternalViewer = 'Utiliser la visionneuse interne'; + LANGfrPreferencesEditor = 'Editeur'; + LANGfrPreferencesTerminal = 'Terminal'; + LANGfrPreferencesExperimentalFeatures = 'Fonctionnalités expérimentales'; + LANGfrPreferencesExperimentalWarningLabel_Caption = '<span weight="ultrabold">Attention :</span> 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 <span style="italic">(à spécifier dans l''URI)</span>'; + 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 <span style="italic">(tous les modules appropriés)</span>'; + + 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 = '<span weight="ultrabold">Avertissement:</span> 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 <m_kepesi@yahoo.com> + 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 = '<DIR>'; + 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 = '<span weight="bold">Stav:</span> Nincs ellenörizve'; + LANGhuChecksumChecking = '<span weight="bold">Stav:</span> Ellenörzés folyamatban...'; + LANGhuChecksumInterrupted = '<span weight="bold">Stav:</span> Megszakítva'; + LANGhuChecksumDOK = '<span weight="bold">Állapot:</span> %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 = '<span size="xx-large" weight="ultrabold">Fájl(ok) elökészítése</span>'; + LANGhuCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Válassza ki a kívánt Chechsum típusát</span>'; + LANGhuCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Válasszon fájlnevet</span>'; + LANGhuCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Müveletre felkészülve</span>'; + LANGhuCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Az ellenörzes folyamatban...</span>'; + LANGhuCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Hiba!</span>'; + LANGhuCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Végrehajtva</span>'; + 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 = '<span size="x-large" weight="ultrabold">Fájltípusok</span>'; + 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 = '<span weight="ultrabold">Szimbolikus kifejezés:</span> %s'; + LANGhuFChmod_FileLabel = '<span weight="ultrabold">Választott fájl:</span> %s'#10'<span weight="ultrabold">Szimbolikus kifejezés:</span> %s'#10 + + '<span weight="ultrabold">Számeli kifejezés:</span> %d'#10'<span weight="ultrabold">Tulajdonos:</span> %s'#10 + + '<span weight="ultrabold">Csoport:</span> %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 = '<span size="x-large" weight="ultrabold">Applikáció beállítása</span>'; + 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 = '<span weight="ultrabold">Külsö applikációk</span>'; + 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 = '<span weight="ultrabold">Figyelmeztetés:</span> 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 <span style="italic">(Kérem, pontosítsa a címben)</span>'; + 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 <span style="italic">(Minden elérhetö modul)</span>'; + + 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 = '<span weight="ultrabold">Figyelmeztetés:</span> 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 <fctk86@gmail.com> + 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 = '<DIR>'; + 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 = '<span weight="bold">Status:</span> Non controllato'; + LANGitChecksumChecking = '<span weight="bold">Status:</span> Controllo in corso...'; + LANGitChecksumInterrupted = '<span weight="bold">Status:</span> Interrotto'; + LANGitChecksumDOK = '<span weight="bold">Status:</span> %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 = '<span size="xx-large" weight="ultrabold">Prepara i file per la checksum</span>'; + LANGitCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Seleziona il tipo di checksum</span>'; + LANGitCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Scegli il nome del file</span>'; + LANGitCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Pronto per controllare</span>'; + LANGitCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Processo in corso...</span>'; + LANGitCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Errore!</span>'; + LANGitCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Finito</span>'; + 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 = '<span size="x-large" weight="ultrabold">Configurazione dei Tipi di File</span>'; + 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 = '<span weight="ultrabold">Testo:</span> %s'; + LANGitFChmod_FileLabel = '<span weight="ultrabold">File:</span> %s'#10'<span weight="ultrabold">Testo:</span> %s'#10 + + '<span weight="ultrabold">Ottale:</span> %d'#10'<span weight="ultrabold">Proprietario:</span> %s'#10 + + '<span weight="ultrabold">Gruppo:</span> %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 = '<span size="x-large" weight="ultrabold">Preferenze Applicazione</span>'; + 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 = '<span weight="ultrabold">Programmi Esterni</span>'; + 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 = '<span weight="ultrabold">Attenzione:</span> 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 <span style="italic">(specificare l''URI)</span>'; + 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 <span style="italic">(tutti i moduli adatti)</span>'; + + 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 = '<span weight="ultrabold">Warning:</span> 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 <doza@sztorm.net> + 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 = '<span weight="bold">Stan</span> Nie sprawdzone'; + LANGplChecksumChecking = '<span weight="bold">Stan:</span> Trwa sprawdzanie...'; + LANGplChecksumInterrupted = '<span weight="bold">Stan:</span> Przerwane'; + LANGplChecksumDOK = '<span weight="bold">Stan:</span> %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 = '<span size="xx-large" weight="ultrabold">Przygotuj pliki</span>'; + LANGplCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Wybierz typ sumy kontrolnej</span>'; + LANGplCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Gotowy do obliczenia</span>'; + LANGplCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Przetwarzanie...</span>'; + LANGplCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Błąd!</span>'; + LANGplCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Ukończone</span>'; + 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 = '<span weight="ultrabold">Tekst:</span> %s'; + LANGplFChmod_FileLabel = '<span weight="ultrabold">Plik:</span> %s'#10'<span weight="ultrabold">Tekst:</span> %s'#10 + + '<span weight="ultrabold">Ósemkowo:</span> %d'#10'<span weight="ultrabold">Właściciel</span> %s'#10 + + '<span weight="ultrabold">Grupa:</span> %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 = '<span size="x-large" weight="ultrabold">Preferencje aplikacji</span>'; + 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 = '<span weight="ultrabold">Zewnętrzne programy</span>'; + 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 = '<span weight="ultrabold">Uwaga:</span> 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 <span style="italic">(podaj URI)</span>'; + 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 <span style="italic">(wszystkie pasujące moduły)</span>'; + + 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 = '<span weight="ultrabold">Uwaga:</span> 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 <maxbaranov@hotbox.ru> + !! 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 = '<DIR>'; + 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 = '<span weight="bold">Статус:</span> Не Проверен'; + LANGruChecksumChecking = '<span weight="bold">Статус:</span> Проверяю...'; + LANGruChecksumInterrupted = '<span weight="bold">Статус:</span> Проверка прервана'; + LANGruChecksumDOK = '<span weight="bold">Статус:</span> %d%% ОК'; + + LANGrumiCreateChecksumsCaption = '_Создать контрольные суммы...'; + LANGruYouMustSelectAtLeastOneFileToCalculateChecksum = 'Нужно выбрать по крайней мере один файл для создания контрольной суммы!'; + LANGruCreateChecksumsCaption = 'Создание контрольных сумм'; + LANGruCCHKSUMPage1Text = 'Если Вы не выбрали'#10'все нужные Вам файлы, закройте это окно и'#10'выберите остальные файлы.'; + LANGruCCHKSUMPage4Text = 'Друид готов к созданию контрольных сумм'#10'для выбраных файлов. Это может занять несколько минут.'#10'Нажмите "Вперед" для продолжения.'; + LANGruCCHKSUMPage6Text = 'Ошибка создания контрольной суммы:'; + LANGruCCHKSUMPage7Text = 'Создание контрольных сумм завершено.'#10#10'Нажмите "Завершить" для выхода.'; + LANGruCCHKSUMPage1Title = '<span size="xx-large" weight="ultrabold">Подготовка к созданию контрольной суммы</span>'; + LANGruCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Выберите тип контрольной суммы</span>'; + LANGruCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Выберите имя файла</span>'; + LANGruCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Готов к созданию контрольных сумм</span>'; + LANGruCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">В процессе...</span>'; + LANGruCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Ошибка!</span>'; + LANGruCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Готово</span>'; + 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 = '<span size="x-large" weight="ultrabold">Конфигурация типов файлов</span>'; + 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 = '<span weight="ultrabold">Текст:</span> %s'; + LANGruFChmod_FileLabel = '<span weight="ultrabold">Файл:</span> %s'#10'<span weight="ultrabold">Текст:</span> %s'#10 + + '<span weight="ultrabold">Восьмеричный:</span> %d'#10'<span weight="ultrabold">Владелец:</span> %s'#10 + + '<span weight="ultrabold">Группа:</span> %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 = '<span size="x-large" weight="ultrabold">Настройки программы</span>'; + LANGruPreferences_GeneralPage = 'Общие'; + LANGruPreferences_FontsPage = 'Шрифты'; + LANGruPreferences_ColorsPage = 'Цвета'; + LANGruPreferences_RowHeight = ' _Высота строк:'; + LANGruPreferences_NumHistoryItems = '_Элементы командной строки:'; + LANGruPreferences_Default = 'По умолчанию'; + LANGruPreferences_ClearReadonlyAttribute = 'Во время копирования с CD-ROM сбрасывать _атрибут "только для чтения"'; + LANGruPreferences_DisableMouseRenaming = 'Запретить переименование _мышью'; + LANGruPreferences_ShowFiletypeIconsInList = 'Показывать _значки'; + LANGruPreferences_ExternalAppsLabel = '<span weight="ultrabold">Внешние программы</span>'; + 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 = '<span weight="ultrabold">Warning:</span> 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 <span style="italic">(please specify in URI)</span>'; + 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 <span style="italic">(all suitable modules)</span>'; + + 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 = '<span weight="ultrabold">Warning:</span> 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 <bojanb@sbb.co.yu> + !! 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 = '<span weight="bold">Статус:</span> Није проверено'; + LANGsrChecksumChecking = '<span weight="bold">Статус:</span> Проверавам...'; + LANGsrChecksumInterrupted = '<span weight="bold">Статус:</span> Прекинуто'; + LANGsrChecksumDOK = '<span weight="bold">Статус:</span> %d%% У реду'; + + LANGsrmiCreateChecksumsCaption = '_Направи чексуму...'; + LANGsrYouMustSelectAtLeastOneFileToCalculateChecksum = 'Морате изабрати бар један фајл како би чексума била израчуната!'; + LANGsrCreateChecksumsCaption = 'Направи чексуме'; + LANGsrCCHKSUMPage1Text = 'Направићете чексуме за'#10'изабраних фајлова. Ако нисте изабрали'#10'све фајлове које желите, затворите овај друид и'#10'изаберите још фајлова.'; + LANGsrCCHKSUMPage4Text = 'Друид је спреман да направи чексуме за '#10' фајлова које сте изабрали. ' + + 'Ово може да потраје неколико минута.'#10'Притисните Напред да бисте наставили.'; + LANGsrCCHKSUMPage6Text = 'Дошло је до грешака при прављењу чексума:'; + LANGsrCCHKSUMPage7Text = 'Прављење чексума је завршено и'#10'Ваших фајлова је спремно.'#10#10'Кликните "Заврши" да бисте изашли.'; + LANGsrCCHKSUMPage1Title = '<span size="xx-large" weight="ultrabold">Припремите фајлове за чексуме</span>'; + LANGsrCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Изаберите врсту фајлова за чексуме</span>'; + LANGsrCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Изаберите имена фајлова</span>'; + LANGsrCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Спреман за проверу</span>'; + LANGsrCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Обрађујем...</span>'; + LANGsrCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Грешка!</span>'; + LANGsrCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Готово</span>'; + 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 = '<span size="x-large" weight="ultrabold">Подешавање врста фајлова</span>'; + 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 = '<span weight="ultrabold">Текст:</span> %s'; + LANGsrFChmod_FileLabel = '<span weight="ultrabold">Фајл:</span> %s'#10'<span weight="ultrabold">Текст:</span> %s'#10 + + '<span weight="ultrabold">Octal:</span> %d'#10'<span weight="ultrabold">Власник:</span> %s'#10 + + '<span weight="ultrabold">Група:</span> %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 = '<span size="x-large" weight="ultrabold">Поставке програма</span>'; + LANGsrPreferences_GeneralPage = 'Опште'; + LANGsrPreferences_FontsPage = 'Фонтови'; + LANGsrPreferences_ColorsPage = 'Боје'; + LANGsrPreferences_RowHeight = '_Висина реда:'; + LANGsrPreferences_NumHistoryItems = 'Историја Ко_мандне линије:'; + LANGsrPreferences_Default = '_Подразумевано'; + LANGsrPreferences_ClearReadonlyAttribute = 'Уклони _readonly атрибуте при копирању са CD-ROM-а'; + LANGsrPreferences_DisableMouseRenaming = 'Онемогући преименовање помоћу _миша '; + LANGsrPreferences_ShowFiletypeIconsInList = 'Прикажи иконе за _врсте фајлова'; + LANGsrPreferences_ExternalAppsLabel = '<span weight="ultrabold">Спољни програми</span>'; + 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 = '<span weight="ultrabold">Упозорење:</span> Ове могућности су тренутно у развоју и можда не раде како треба. Користите их на сопствени ризик!'; + 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 = 'Друго <span style="italic">(молим Вас наведите у URI)</span>'; + 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 = 'Подразумевано <span style="italic">(сви погодни модули)</span>'; + + 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 = '<span weight="ultrabold">Упозорење:</span> 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 <johan@badanka.com> + !! 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 = '<DIR>'; + 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 = '<span weight="bold">Status:</span> Inte kontrollerad'; + LANGsvChecksumChecking = '<span weight="bold">Status:</span> Kontrollerar...'; + LANGsvChecksumInterrupted = '<span weight="bold">Status:</span> Avbruten'; + LANGsvChecksumDOK = '<span weight="bold">Status:</span> %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 = '<span size="xx-large" weight="ultrabold">Förbered filer för checksum</span>'; + LANGsvCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Välj checksums-filtyper</span>'; + LANGsvCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Välj filnamn</span>'; + LANGsvCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Redo att kontrollera</span>'; + LANGsvCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">Kontrollerar...</span>'; + LANGsvCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Fel!</span>'; + LANGsvCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Färdig</span>'; + 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 = '<span size="x-large" weight="ultrabold">Filtypskonfiguration</span>'; + 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 = '<span weight="ultrabold">Text:</span> %s'; + LANGsvFChmod_FileLabel = '<span weight="ultrabold">Fil:</span> %s'#10'<span weight="ultrabold">Text:</span> %s'#10 + + '<span weight="ultrabold">Oktal:</span> %d'#10'<span weight="ultrabold">Ägare:</span> %s'#10 + + '<span weight="ultrabold">Grupp:</span> %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 = '<span size="x-large" weight="ultrabold">Applikationsinställningar</span>'; + 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 = '<span weight="ultrabold">Externa program</span>'; + 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 = '<span weight="ultrabold">Warning:</span> 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 <span style="italic">(please specify in URI)</span>'; + 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 <span style="italic">(all suitable modules)</span>'; + + 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 = '<span weight="ultrabold">Warning:</span> 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 <dubyk@ukr.net> + 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 = '<DIR>'; + 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 = '<span weight="bold">Статус:</span> не перевірено'; + LANGuaChecksumChecking = '<span weight="bold">Статус:</span> перевіряю...'; + LANGuaChecksumInterrupted = '<span weight="bold">Статус:</span> перевірку перервано'; + LANGuaChecksumDOK = '<span weight="bold">Статус:</span> %d%% гаразд'; + + LANGuamiCreateChecksumsCaption = '_Створити контрольні суми...'; + LANGuaYouMustSelectAtLeastOneFileToCalculateChecksum = 'Потрібно вибрати хоча б один файл для створення контрольної суми!'; + LANGuaCreateChecksumsCaption = 'Створення контрольних сум'; + LANGuaCCHKSUMPage1Text = 'Якщо Ви не вибрали'#10'усі необхідні Вам файли, закрийте це вікно та'#10'виберіть решту файлів.'; + LANGuaCCHKSUMPage4Text = 'Друїд готовий до створення контрольних сум'#10'для вибраних файлів. Це може зайняти декілька хвилин.'#10'Натисніть "Вперед" для продовження.'; + LANGuaCCHKSUMPage6Text = 'Помилка створення контрольної суми:'; + LANGuaCCHKSUMPage7Text = 'Створення контрольних сум завершено.'#10#10'Натисніть "Завершити" для виходу.'; + LANGuaCCHKSUMPage1Title = '<span size="xx-large" weight="ultrabold">Підготовка до створення контрольної суми</span>'; + LANGuaCCHKSUMPage2Title = '<span size="xx-large" weight="ultrabold">Виберіть тип контрольної суми</span>'; + LANGuaCCHKSUMPage3Title = '<span size="xx-large" weight="ultrabold">Виберіть ім''я файлу</span>'; + LANGuaCCHKSUMPage4Title = '<span size="xx-large" weight="ultrabold">Готовий до створення контрольних сум</span>'; + LANGuaCCHKSUMPage5Title = '<span size="xx-large" weight="ultrabold">В процесі...</span>'; + LANGuaCCHKSUMPage6Title = '<span size="xx-large" weight="ultrabold">Помилка!</span>'; + LANGuaCCHKSUMPage7Title = '<span size="xx-large" weight="ultrabold">Готово</span>'; + 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 = '<span size="x-large" weight="ultrabold">Конфігурація типів файлів</span>'; + 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 = '<span weight="ultrabold">Текст:</span> %s'; + LANGuaFChmod_FileLabel = '<span weight="ultrabold">Файл:</span> %s'#10'<span weight="ultrabold">Текст:</span> %s'#10 + + '<span weight="ultrabold">Вісімковий:</span> %d'#10'<span weight="ultrabold">Власник:</span> %s'#10 + + '<span weight="ultrabold">Група:</span> %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 = '<span size="x-large" weight="ultrabold">Налаштування програми</span>'; + LANGuaPreferences_GeneralPage = 'Загальні'; + LANGuaPreferences_FontsPage = 'Шрифти'; + LANGuaPreferences_ColorsPage = 'Кольори'; + LANGuaPreferences_RowHeight = ' _Висота рядків:'; + LANGuaPreferences_NumHistoryItems = '_Елементи командного рядка:'; + LANGuaPreferences_Default = 'За умовчанням'; + LANGuaPreferences_ClearReadonlyAttribute = 'Під час копіювання зі CD-ROM знімати _атрибут "лише для читання"'; + LANGuaPreferences_DisableMouseRenaming = 'Заборонити перейменування _мишкою'; + LANGuaPreferences_ShowFiletypeIconsInList = 'Показувати _іконки'; + LANGuaPreferences_ExternalAppsLabel = '<span weight="ultrabold">Зовнішні програми</span>'; + 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 = '<span weight="ultrabold">Попередження:</span> Робота над цими можливостями ще не завершена наразі, отож, вони ' + + 'можуть не працювати належним чином. Використовуйте їх на Ваш власний ризик!'; + 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 = 'Інше <span style="italic">(будь-ласка, вкажіть в Універсальному Ідентифікаторі Ресурсів (URI))</span>'; + 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 = 'За умовчанням <span style="italic">(усі підходящі модулі)</span>'; + + 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 = '<span weight="ultrabold">Застереження:</span> Підсистема Віртуальної Файлової Системи (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 <tbzatek@users.sourceforge.net> + 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 Binary files differnew file mode 100644 index 0000000..36f26e2 --- /dev/null +++ b/tuxcmd.res 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 <robert_marquardt@gmx.de) } +{ } +{ Copyright (C) 2000, 2001 Robert Marquardt. } +{ } +{ Obtained through: } +{ Joint Endeavour of Delphi Innovators (Project JEDI) } +{ } +{ You may retrieve the latest version of this file at the Project } +{ JEDI home page, located at http://delphi-jedi.org } +{ } +{ The contents of this file are used with permission, subject to } +{ the Mozilla Public License Version 1.1 (the "License"); you may } +{ not use this file except in compliance with the License. You may } +{ obtain a copy of the License at } +{ http://www.mozilla.org/NPL/NPL-1_1Final.html } +{ } +{ Software distributed under the License is distributed on an } +{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or } +{ implied. See the License for the specific language governing } +{ rights and limitations under the License. } +{ } +{******************************************************************} + +unit ModuleLoader; + +interface +{$WEAKPACKAGEUNIT ON} + + +uses + Libc; +type + // Handle to a loaded .so + TModuleHandle = Pointer; + +const + // Value designating an unassigned TModuleHandle od a failed loading + INVALID_MODULEHANDLE_VALUE = TModuleHandle(nil); + +function LoadModule(var Module: TModuleHandle; FileName: string): Boolean; +function LoadModuleEx(var Module: TModuleHandle; FileName: string; Flags: Cardinal): Boolean; +procedure UnloadModule(var Module: TModuleHandle); +function GetModuleSymbol(Module: TModuleHandle; SymbolName: string): Pointer; +function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: string; var Accu: Boolean): Pointer; +function ReadModuleData(Module: TModuleHandle; SymbolName: string; var Buffer; Size: Cardinal): Boolean; +function WriteModuleData(Module: TModuleHandle; SymbolName: string; var Buffer; Size: Cardinal): Boolean; + +implementation + +// load the .so file FileName +// the rules for FileName are those of dlopen() +// Returns: True = success, False = failure to load +// Assigns: the handle of the loaded .so to Module +// Warning: if Module has any other value than INVALID_MODULEHANDLE_VALUE +// on entry the function will do nothing but returning success. + +function LoadModule(var Module: TModuleHandle; FileName: string): Boolean; +begin + Module := dlopen(PChar(FileName), RTLD_LAZY); + Result := Module <> 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 <tbzatek@users.sourceforge.net> + 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 <radek.cervinka@centrum.cz> + * Copyright (C) 2008 Tomas Bzatek <tbzatek@users.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 + */ + +#ifndef __VFS_TYPES_H__ +#define __VFS_TYPES_H__ + + +#include <stdio.h> +#include <stdint.h> +#include <sys/types.h> + +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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 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. + + <signature of Ty Coon>, 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 <tbzatek@users.sourceforge.net> +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 <tbzatek@users.sourceforge.net> + * 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 <string.h> +#include <stdlib.h> +#include <stdint.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <errno.h> +#include <time.h> +#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 <radek.cervinka@centrum.cz> + Copyright (C) 2005-2008 Tomas Bzatek <tbzatek@users.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 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. |
