changeset 80:fcd146072e0c

0.9.93
author joachim99
date Tue, 06 Jan 2009 17:51:29 +0000
parents 881e47f5076b
children 5d7e91c44e6d
files kdiff3/ChangeLog kdiff3/INSTALL kdiff3/README kdiff3/TODO kdiff3/diff_ext_for_kdiff3/diff_ext.cpp kdiff3/doc/Makefile.am kdiff3/doc/createpdfdoc kdiff3/doc/da/Makefile.am kdiff3/doc/de/Makefile.am kdiff3/doc/en/Makefile.am kdiff3/doc/en/common/bottom-left.png kdiff3/doc/en/common/bottom-middle.png kdiff3/doc/en/common/bottom-right.png kdiff3/doc/en/common/fdl-license.html kdiff3/doc/en/common/footer.html kdiff3/doc/en/common/gpl-license.html kdiff3/doc/en/common/header.html kdiff3/doc/en/common/kde-default.css kdiff3/doc/en/common/kde_logo_bg.png kdiff3/doc/en/common/lgpl-license.html kdiff3/doc/en/common/mainfooter.html kdiff3/doc/en/common/mainheader.html kdiff3/doc/en/common/top-left.png kdiff3/doc/en/common/top-middle.png kdiff3/doc/es/Makefile.am kdiff3/doc/es/index.docbook kdiff3/doc/et/Makefile.am kdiff3/doc/et/index.docbook kdiff3/doc/fr/Makefile.am kdiff3/doc/it/Makefile.am kdiff3/doc/nl/Makefile.am kdiff3/doc/pt/Makefile.am kdiff3/doc/pt/index.docbook kdiff3/doc/sv/Makefile.am kdiff3/doc/sv/index.docbook kdiff3/kdiff3.spec kdiff3/po/Makefile.am kdiff3/po/README kdiff3/po/kdiff3.pot kdiff3/src-QT4/Makefile.am kdiff3/src-QT4/ccInstHelper.cpp kdiff3/src-QT4/common.cpp kdiff3/src-QT4/common.h kdiff3/src-QT4/diff.cpp kdiff3/src-QT4/diff.h kdiff3/src-QT4/difftextwindow.cpp kdiff3/src-QT4/directorymergewindow.cpp kdiff3/src-QT4/directorymergewindow.h kdiff3/src-QT4/fileaccess.cpp kdiff3/src-QT4/fileaccess.h kdiff3/src-QT4/gnudiff_system.h kdiff3/src-QT4/gnudiff_xmalloc.cpp kdiff3/src-QT4/hi16-app-kdiff3.png kdiff3/src-QT4/hi32-app-kdiff3.png kdiff3/src-QT4/kdiff3.cpp kdiff3/src-QT4/kdiff3.desktop kdiff3/src-QT4/kdiff3.h kdiff3/src-QT4/kdiff3.pro kdiff3/src-QT4/kdiff3_part.cpp kdiff3/src-QT4/kdiff3_part.h kdiff3/src-QT4/kdiff3_shell.cpp kdiff3/src-QT4/kdiff3_shell.h kdiff3/src-QT4/kdiff3_shell.rc kdiff3/src-QT4/kdiff3part.desktop kdiff3/src-QT4/kreplacements/kreplacements.cpp kdiff3/src-QT4/kreplacements/kreplacements.h kdiff3/src-QT4/lo16-app-kdiff3.png kdiff3/src-QT4/lo32-app-kdiff3.png kdiff3/src-QT4/main.cpp kdiff3/src-QT4/mergeresultwindow.cpp kdiff3/src-QT4/mergeresultwindow.h kdiff3/src-QT4/optiondialog.cpp kdiff3/src-QT4/optiondialog.h kdiff3/src-QT4/pdiff.cpp kdiff3/src-QT4/smalldialogs.cpp kdiff3/src-QT4/smalldialogs.h kdiff3/src-QT4/stable.cpp kdiff3/src-QT4/stable.h kdiff3/src-QT4/version.h kdiff3/windows_installer/README_WIN.txt kdiff3/windows_installer/kdiff3.nsi
diffstat 81 files changed, 6132 insertions(+), 4393 deletions(-) [+]
line wrap: on
line diff
--- a/kdiff3/ChangeLog	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/ChangeLog	Tue Jan 06 17:51:29 2009 +0000
@@ -1,3 +1,11 @@
+Version 0.9.93 - 2008/01/06
+===========================
+- Support for KDE4 (with much porting help from Valentin Rusu)
+- Fix for diff_ext_for_kdiff3 (by Sergey Zorin)
+- Win32-Installation: SendTo-integration fixed for Vista.
+- Optional auto detection of line end style for saving.
+- Option to close on ESC (default is off)
+
 Version 0.9.92 - 2007/04/15
 ===========================
 - Windows installer now allows to install KDiff3 as Clearcase Diff and Merge Tool
--- a/kdiff3/INSTALL	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/INSTALL	Tue Jan 06 17:51:29 2009 +0000
@@ -1,168 +1,4 @@
-Basic Installation
-==================
+Please read the README-file.
 
-   These are generic installation instructions.
-   Please read the README-file for most needed steps first.
+Joachim
 
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
-   The file `configure.in' is used to create `configure' by a program
-called `autoconf'.  You only need `configure.in' if you want to change
-it or regenerate `configure' using a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes a while.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Type `make install' to install the programs and any data files and
-     documentation.
-
-  4. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  You can give `configure'
-initial values for variables by setting them in the environment.  Using
-a Bourne-compatible shell, you can do that on the command line like
-this:
-     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-
-Or on systems that have the `env' program, you can do it like this:
-     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   If you have to use a `make' that does not supports the `VPATH'
-variable, you have to compile the package for one architecture at a time
-in the source code directory.  After you have installed the package for
-one architecture, use `make distclean' before reconfiguring for another
-architecture.
-
-Installation Names
-==================
-
-   By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on.  Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
-     CPU-COMPANY-SYSTEM
-
-See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
-   If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Operation Controls
-==================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
-     Use and save the results of the tests in FILE instead of
-     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
-     debugging `configure'.
-
-`--help'
-     Print a summary of the options to `configure', and exit.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--version'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
-
--- a/kdiff3/README	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/README	Tue Jan 06 17:51:29 2009 +0000
@@ -2,24 +2,50 @@
 =============
 
 Author: Joachim Eibl  (joachim.eibl at gmx.de)
-Copyright: (C) 2002-2006 by Joachim Eibl
-KDiff3-Version: 0.9.92
+Copyright: (C) 2002-2008 by Joachim Eibl
+KDiff3-Version: 0.9.93
 
+KDiff3 runs best on KDE but can be built without it, depending only on Qt-libs.
+These are available for Un*x, Windows, Mac.
+Thus there are many setup possibilities to consider.
+
+From version 0.9.93 on the main target platform is KDE4/Qt4.
+For KDiff3 for KDE3/Qt3 use KDiff3-0.9.92 or older.
+
+Contents
+--------
+
+- Introduction
+- License
+- Requirements & Installation
+  - For KDE4
+  - With Qt4-libs, without KDE
+    - for Linux/Un*x
+    - for Windows
+    - Debugging with MinGW under Windows:
+    - for Mac: Building KDiff3 for Mac OSX (with Intel processor) as a universal binary
+- Additional hints
+
+
+Introduction
+------------
 
 KDiff3 is a program that
 - compares and merges two or three input files or directories,
 - shows the differences line by line and character by character (!),
 - provides an automatic merge-facility and
 - an integrated editor for comfortable solving of merge-conflicts
-- has support for KDE-KIO (ftp, sftp, http, fish, smb)
-- and has an intuitive graphical user interface,
-- also supports 64 bit systems. (Some build issues are discussed in here.)
-
+- has support for KDE-KIO (ftp, sftp, http, fish, smb),
+- has an intuitive graphical user interface,
+- provides a context menu for KDE-Konqueror and Windows-Explorer,
+- supports 64 bit systems. (Some build issues are discussed in here.)
 
 Do you want help translating? Read the README in the po-subdirectory!
 
 
-License:
+License
+-------
+
     GNU GENERAL PUBLIC LICENSE, Version 2, June 1991
     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
@@ -39,242 +65,143 @@
 
 Exception from the GPL:
     As a special exception, the copyright holder Joachim Eibl gives permission
-    to link this program with the Qt-library (commercial or non-commercial edition)
+    to link this program with the Qt-library (commercial or open source edition)
     from Trolltech (www.trolltech.com), and he permits to distribute the resulting
     executable, without including the source code for the Qt-library in the
     source distribution.
 
 
-Requirements & Installation:
-   Version 0.9.91 provides special support for KDE3, but it can also be
-   built without KDE3 if the Qt-libraries are available.
-   (I also test and use the program under Windows.)
-   It is now also possible to build with Qt4 (See further below).
+Requirements & Installation
+---------------------------
+
+- for KDE4:
+   From version 0.9.93 on KDiff3 supports KDE4.
+   For installation on most distributions you usually also require these packages (names as on opensuse):
+   - g++ (g++, version 3.4 or newer)
+   - libqt4-devel (Qt4-libs, version 4.4.0 or newer)
+   - libkde4-devel (KDE4 Header files and development libraries)
+   - libkonq-devel (optional, needed for the kdiff3-plugin, if not installed 
+                    then the contextmenu plugin for konqueror won't be built.)
+   - cmake (>2.6, checks dependencies and creates the Makefiles appopriate for your system)
+
+   Typically in a terminal (e.g. konsole) you cd into the kdiff3-directory and run these commands.
+
+      mkdir release                                  # create sub directory
+      cd release                                     # cd into that directory
+      kde4-config --prefix                           # Find out your KDE4-directory and note the result
+      cmake .. -DCMAKE_INSTALL_PREFIX=<KDE4-prefix>  # create Makefile, replace <KDE4-prefix> with the prior result
+      make                                           # run make (compile and link)
+      sudo make install                              # install as root user
+
+   Now KDiff3 should be ready to use. Type "kdiff3" to start it.
+   There should also be a entry in your KDE-start menu in "(Applications->)Development".
+
+   For creating a debug version:
+      mkdir debug
+      cd debug
+      kde4-config --prefix                           # Find out your KDE4-directory and note the result
+      cmake .. -DCMAKE_INSTALL_PREFIX=<KDE4-prefix>  -DCMAKE_BUILD_TYPE=debugfull
+      make
+      sudo make install
+
+   The <KDE4-prefix> depends on your distribution:
+   The command "kde4-config --prefix" should tell you.
+   - For opensuse 11 use "/usr".
+
+- Building KDiff3 with Qt4-libs, but without KDE
+    - for Linux/Un*x
+    - for Windows
+    - for Mac
+
+   The version 0.9.93 requires Qt 4.4.0 or newer (from www.trolltech.com) for compilation. 
 
    You always need
-      - kdiff3-0.9.91.tar.gz
-
-   For building the KDE3-version
-      - KDE>=3.3 and QT>=3.3-libraries. (but not with KDE4)
-      - gcc, g++ with version >=3.2
-
-   For building the Qt-only-version
-      - QT-libraries (version >=3.3.0, but <4.0 or >=4.2.0).
-        (www.trolltech.com)
-      - for Un*x:    gcc, g++ with version >=3.2
-      - for Windows: VC6 / VC7.1
-
-   On some distributions it will be necessary to install developer
-   packages (RPMs) that contain include files for compilation:
-      - xorg-x11-devel (or x11-devel)
-      - qt-devel
-      - kdelibs-devel
-
-Installation for KDE3:
-   - Make sure your shell-variable QTDIR is correct. (echo $QTDIR).
-     If it doesn't contain the correct path, type
-        export QTDIR=your_path_to_qt  (e.g. /usr/lib/qt3)
-   - cd into the directory kdiff3-0.9.91 and type
-   - ./configure --prefix=/opt/kde3           (your KDE3 directory here)
-   - (make clean)                    (Required if you already compiled once.)
-   - make                            (Run compilation)
-   - make install                    (You must have root-rights for this step.)
-
-   For details also see the generic instructions in file "INSTALL".
-
-   If some icons are not visible or don't seem right, probably the prefix
-   was wrong. Check where your KDE3 installation is located and
-   use that directory with the prefix-option of configure.
-
-   This command should tell you: kde-config --prefix
-
-   For SuSE and most distributions the prefix usually is /opt/kde3.
-   For Redhat/Fedora and Mandrake the prefix usually is /usr.
-   For a local installation, that doesn't need root rights try
-   - ./configure --prefix=$KDEHOME  ($KDEHOME probably is the same as $HOME/.kde)
-   - make
-   - make install    (Installs everything in $KDEHOME. No root rights required.)
-   - Run $KDEHOME/bin/kdiff3. ($KDEHOME/bin is probably not in your path.)
-   Warning: If a local installation and a global installation exist, the local
-            menu, toolbar, help etc. will be used, even if you start the global
-            executable. To avoid confusion, better remove the local version then.
-            (rm -R `find $KDEHOME -name "*kdiff3*" -not -name "kdiff3*rc"`)
-
-   On Fedora-64-bit systems the following configure-line was reported to work:
-   ./configure --prefix=`kde-config --prefix` --enable-libsuffix=64 --with-qt-libraries=/usr/lib64/qt-3.3/lib/
-   Both --enable-libsuffix=64 and -with-qt-libraries=/usr/lib64/qt-3.3/lib/ are needed;
-   without the first one it fails to find the KDE libraries,
-   and without the second one it fails to find libqt-mt
-   (strangely enough: libqt-mt is in /usr/lib64/qt-3.3/lib, 
-   and "configure" tries /usr/lib64/qt-3.3/lib64)
-   If your qt-libraries are elsewhere please adapt the path accordingly.
-
-   Some secondary dependencies aren't correctly discovered by configure.
-   If e.g the a linker error appears telling you something like
-   "Can't find -lacl" this probably means that you have to install 
-   libacl-devel-*.rpm etc.
-
-   If you run an older version of KDE and the make-process fails in the
-   doc- or po-directory, cd to the src-directory and run "make" there. Also run 
-   "make install" there. This hopefully will create a working kdiff3-binary,
-   although without doc and language support.
-
-Upgrading KDiff3 for KDE:
-   If you already installed an older version or KDiff3 and you have the 
-   impression, that the new version doesn't work as described, you should try to 
-   remove all files belonging to KDiff3 before reinstalling. 
-   Try this search command to locate KDiff3-related files:
-      find $HOME/.kde /usr /opt -iname "*kdiff3*"
-   (Will take a few minutes.)
-
-
-Building an RPM for Fedora Core (by Vadim Likhota)
-   Copy kdiff3-0.9.91.tar.gz into /usr/src/redhat/SOURCE
-   Copy kdiff3.spec into /usr/src/redhat/SPEC
-   Run rpmbuild -bb --target i686 kdiff3.spec
-   Find kdiff3-0.9.91-fc.i686.rpm in /usr/src/redhat/RPMS/I386
-
-
-Installation for the Qt-only-platforms for Un*x:
-   (for Qt >=3.3.0 but <4.0)
-   - Make sure your shell-variable QTDIR is correct. (echo $QTDIR).
-     If it doesn't contain the correct path, type
-        export QTDIR=your_path_to_qt  (e.g. /usr/lib/qt)
-   - cd into the directory kdiff3-0.9.91/src and type
-   - make -f Makefile.qt
-   - make -f Makefile.qt install     (You must have root-rights for this step.)
-     (copies the files into /usr/local/bin and /usr/local/share/doc/kdiff3)
-   - Note: The file kdiff3.pro was used to generate the Makefile.qt:
-           qmake kdiff3.pro -o Makefile.qt
-   If you want to build the Qt-only version _and_ the KDE-version, do this
-   in separate directories, otherwise there will be errors. 
-   - A user reported that on his 64-bit machine running FC4 he had to edit his Makefile.qt
-     LIBS = $(SUBLIBS) -L/usr/lib64/ -L$(QTDIR)/lib64/ -L/usr/lib -L$(QTDIR)/lib/ -L/usr/X11R6/lib/ -L/usr/X11R6/lib64/ -lqt-mt -lXext -lX11 -lm -lpthread 
- 
-
-Build for Windows:
- Use qmake and kdiff3.pro to generate
- an appropriate Makefile.
-     qmake kdiff3.pro -o Makefile
-
-
-Building KDiff3 (Qt3) for Mac OSX 10.3.8 (by Mark Teel)
--------------------------------------------------------
-   1) Install Qt/Mac with thread support and static libraries.
-   2) cd .../kdiff3-0.9.91/src
-   3) Create a makefile for kdiff3 by executing:
-      qmake kdiff3.pro -o Makefile.qt
-   4) Edit Makefile.qt and change the include path like so:
-      (old) INCPATH  = -I/Library/qt3/mkspecs/default -Isrc ...
-      (new) INCPATH  = -I/Library/qt3/mkspecs/macx-g++ -Isrc ...
-   5) Execute:
-      make -f Makefile.qt
-   6) After the build completes copy kdiff3 from the kdiff3-0.9.91/src directory to
-      /Applications
-
-Building KDiff3 (Qt4) for Mac OSX (with Intel processor) as a universal binary (by Michael Schmidt)
----------------------------------------------------------------------------------------------------
-   1) Install Qt/Mac 4.x with thread support, static libraries and universal flag.
-   2) cd .../kdiff3-0.9.91/src-QT4
-   3a) Create a makefile for kdiff3 by executing:
-      qmake kdiff3.pro
-   3b) optionally generate XCode-Project (for debugging purposes only) by executing:
-      qmake -spec macx-xcode kdiff3.pro
-   4) Execute:
-      make
-   5) After the build completes copy kdiff3 from the kdiff3-0.9.91/src-QT4 directory to
-      /Applications
-
-----------------------------------------------------------------
-
-Building KDiff3 with Qt4:
-
-Requirements & Installation:
-   The version 0.9.91 requires Qt 4.2.0 (from www.trolltech.com) for compilation. 
-
-   You always need
-      - kdiff3-0.9.91.tar.gz
+      - kdiff3-0.9.93.tar.gz
 
       - for Un*x:    gcc, g++ with version >=3.4.2
                      Qt-X11-libraries
 
       - for Windows: Qt-win-libs
-                     If you have the Qt4 commercial edition, then compile with Visual Studio.
+                     If you have the Qt4 commercial edition, then compile with Visual Studio.NET2003 or newer.
                      If you use the Qt4 open source edition, then you'll need MinGW.
                      I verified that compilation and debugging works with these packages (probably newer ones will also work):
-                     - gcc-core-3.4.2-20040916-1.tar.gz  
-                     - binutils-2.15.91-20040904-1.tar.gz  
-                     - gcc-g++-3.4.2-20040916-1.tar.gz   
-                     - mingw-runtime-3.9.tar.gz 
-                     - mingw32-make-3.80.0-3.tar.gz 
-                     - w32api-3.6.tar.gz (see also the note below)
-                     - gdb-5.2.1-1.exe (for debugging)
- 
-                     (Note: At the time of writing this README, the MinGW-package that was part
-                     of qt-win-opensource-4.1.2-mingw.exe lacked the latest w32api needed for 
-                     KDiff3-compilation. You will need to unpack w32api-3.6.tar.gz or newer
-                     from www.mingw.org into your MinGW-directory.)
+                     - Use MinGW-5.1.4.exe or newer to install the following or newer:
+                       - gcc-core-3.4.5-20060117-1.tar.gz
+                       - binutils-2.17.50-20060824-1.tar.gz
+                       - gcc-g++-3.4.5-20060117-1.tar.gz
+                       - mingw-runtime-3.14.tar.gz
+                       - mingw32-make-3.81-2.tar.gz
+                       - w32api-3.11.tar.gz
+                     - gdb-6.3-2.exe (for debugging)
 
       - for Mac:     gcc, g++ with version >=3.4.2
                      Qt-Mac-libraries
+      - Optional: Qt Creator IDE: Development environment optimized for Qt (http://trolltech.com/developer/qt-creator)
 
+  Build-instructions (Un*x):
+    - Make sure your shell-variable QTDIR is correct and that 
+      your path contains the Qt4-bin-directory.
+    - cd into the directory kdiff3-0.9.93/src-QT4 and type
+    - qmake kdiff3.pro
+    - make (or "gmake" for GNU-Make)
 
-Note for KDE-users:
-   The version 0.9.91-Qt4 doesn't provide support for KDE-3.x
-   because KDE-3.x.y requires Qt3. 
-   If you need KDE-specific features like KIO-support stick to the
-   normal version 0.9.91.
+  Build-instructions (Windows):
+    - set QTDIR=<QT4-dir>         e.g.: c:\qt\4.4.1
+      set "PATH=%QTDIR%\bin;%PATH%"
+    - cd into the directory kdiff3-0.9.93\src-Qt4 and type
+    - qmake kdiff3.pro
+    - Either "nmake" for Visual Studio or "mingw32-make" depending on what you have.
 
-Build-instructions (Unix or Mac):
-   - Make sure your shell-variable QTDIR is correct and that 
-     your path contains the Qt4-bin-directory.
-   - cd into the directory kdiff3-0.9.91/src-QT4 and type
-   - qmake kdiff3.pro
-   - make (or "gmake" for GNU-Make)
+  Debugging with MinGW under Windows:
+    - Qt Creator worked very good as debugger frontend too!
+    - Debugging without gdb on the console:
+      - The qt-win-opensource-4.4.1-mingw.exe only installs release dlls. You will have to compile the
+         debug dlls yourself. Enter the qt-4.4.1-directory and run "configure -debug" and then "mingw32-make".
+      - cd into the directory kdiff3-0.9.93\src-Qt4
+      - edit the file "Makefile.Debug" and in the LFLAGS replace "-Wl,-subsystem,windows" with "-Wl,-subsystem,console"
+         (this is necessary so that gdb can send a break signal to the running program)
+      - mingw32-make debug (create a debuggable executable)
+      - gdb debug\kdiff3.exe
+      - At the "(gdb)"-prompt type "run" and enter to start.
+      - While the program runs you can't set breakpoints, first interrupt it with Ctrl-C.
+      - Use "help" to find out about how to use gdb. (Important commands: run, break, backtrace, print, quit)
+         Using break with c++-methods requires to specify the parameter types too. Breakpoints in constructors might not work.
 
-Build-instructions (Windows):
-   - Run your qtvars.bat in the Qt4-bin directory.
-     (This should set your QTDIR, QMAKESPEC and PATH-environment-variables.)
-   - cd into the directory kdiff3-0.9.91/src-Qt4 and type
-   - qmake kdiff3.pro
-   - make (which calls either "mingw32-make" or "nmake")
+  Building KDiff3 (Qt4) for Mac OSX (with Intel processor) as a universal binary (by Michael Schmidt)
+    1) Install Qt/Mac 4.x with thread support, static libraries and universal flag.
+       (For Qt4 run "configure -static"; only necessary if the final binary should not require shared Qt4-libs.)
+    2) cd .../kdiff3-0.9.93/src-QT4
+    3a) Create a makefile for kdiff3 by executing:
+       qmake kdiff3.pro
+    3b) optionally generate XCode-Project (for debugging purposes only) by executing:
+       qmake -spec macx-xcode kdiff3.pro
+    4) Execute:
+       make
+    5) After the build completes copy kdiff3 from the kdiff3-0.9.93/src-QT4 directory to
+       /Applications
 
-Debugging with MinGW under Windows:
-- The qt-win-opensource-4.2.0-mingw.exe only installs release dlls. You will have to compile the
-  debug dlls yourself. Enter the qt-4.2.0-directory and run "configure -debug" and then "make".
-- cd into the directory kdiff3-0.9.91/src-Qt4
-- edit the file "Makefile.Debug" and in the LFLAGS replace "-Wl,-subsystem,windows" with "-Wl,-subsystem,console"
-  (this is necessary so that gdb can send a break signal to the running program)
-- make debug (create a debuggable executable)
-- gdb debug\kdiff3.exe
-- At the "(gdb)"-prompt type "run" and enter to start.
-- While the program runs you can't set breakpoints, first interrupt it with Ctrl-C.
-- Use "help" to find out about how to use gdb. (Important commands: run, break, backtrace, print, quit)
-  Using break with c++-methods requires to specify the parameter types too. Breakpoints in constructors might not work.
-- I've tested graphical gdb-frontends too: 
-    1. Insight (also from mingw.org) worked until I wanted to interrupt the program for setting breakpoints.
-    2. Dev-Cpp: The debugger said that the app crashed before even launching it.
-  Result: For Windows I recommend gdb on the console. Please tell me when things have improved!
 
 (End of KDiff3 with Qt4-instructions)
 ------------------------------------------------------------------------
 
+Additional hints
+----------------
 
-Start from commandline:
-- Comparing 2 files:     kdiff3 file1 file2
-- Merging 2 files:       kdiff3 file1 file2 -o outputfile
-- Comparing 3 files:     kdiff3 file1 file2 file3
-- Merging 3 files:       kdiff3 file1 file2 file3 -o outputfile
-     Note that file1 will be treated as base of file2 and file3.
+   Start from commandline:
+   - Comparing 2 files:     kdiff3 file1 file2
+   - Merging 2 files:       kdiff3 file1 file2 -o outputfile
+   - Comparing 3 files:     kdiff3 file1 file2 file3
+   - Merging 3 files:       kdiff3 file1 file2 file3 -o outputfile
+        Note that file1 will be treated as base of file2 and file3.
 
-If all files have the same name but are in different directories, you can
-reduce typework by specifying the filename only for the first file. E.g.:
-- Comparing 3 files:     kdiff3 dir1/filename dir2 dir3
-(This also works in the open-dialog.)
+   If all files have the same name but are in different directories, you can
+   reduce typework by specifying the filename only for the first file. E.g.:
+   - Comparing 3 files:     kdiff3 dir1/filename dir2 dir3
+   (This also works in the open-dialog.)
 
-If you start without arguments, then a dialog will appear where you can
-select your files via a filebrowser.
+   If you start without arguments, then a dialog will appear where you can
+   select your files via a filebrowser.
 
-For more documentation, see the help-menu or the subdirectory doc.
+   For more documentation, see the help-menu or the subdirectory doc.
 
-Have fun!
+   Have fun!
--- a/kdiff3/TODO	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/TODO	Tue Jan 06 17:51:29 2009 +0000
@@ -2,6 +2,10 @@
 
 TODO
 ====
+- Verknüpfungsziel für Links relativ anzeigen
+- KDiff3-Plugin sollte auch in Dolphin arbeiten
+- Alignmenttechnik bei Merge von 3 Dateien wählbar
+- Horizontales Scrolling reparieren
 
 - Fix drawing in columns A/B/C-directory window
 - Qt4-translation files
--- a/kdiff3/diff_ext_for_kdiff3/diff_ext.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/diff_ext_for_kdiff3/diff_ext.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -371,7 +371,7 @@
          tstring firstFileName;
          if( nrOfRecentFiles>=1 )
          {
-            tstring firstFileName = TEXT("'") + cut_to_length( m_recentFiles.front() ) + TEXT("'");
+            firstFileName = TEXT("'") + cut_to_length( m_recentFiles.front() ) + TEXT("'");
          } 
          replaceArgs( menuStringCompare, firstFileName );
          replaceArgs( menuStringMerge,   firstFileName );
@@ -504,6 +504,10 @@
          ERRORLOG(verb);
       }
    }
+   else
+   {
+      ret = E_INVALIDARG;
+   }
 
    return ret;
 }
--- a/kdiff3/doc/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-# the SUBDIRS is filled automatically by am_edit. If files are 
-# in this directory they are installed into the english dir
-
-KDE_LANG = en da de es et fr it nl pt sv
-KDE_DOCS = kdiff3
-SUBDIRS = $(AUTODIRS)  
--- a/kdiff3/doc/createpdfdoc	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/createpdfdoc	Tue Jan 06 17:51:29 2009 +0000
@@ -1,8 +1,14 @@
+# html2ps is from the "html2ps"-package
+# ps2pdf is part of the "ghostscript-library"-package
 for i in `find * -maxdepth 0 -type d`; do
-cd $i
-echo $i
-LANG=de_DE meinproc --check index.docbook --stylesheet /opt/kde3/share/apps/ksgmltools2/customization/kde-nochunk.xsl
-html2ps -D -u -n index.html >index.ps
-ps2pdf index.ps ../kdiff3_$i.pdf
-cd ..
+  cd $i
+  echo $i
+  if [ $i != "en" ]; then
+     for j in `ls ../en | grep png`; do ln -s ../en/$j $j; done
+     ln -s ../en/common common
+  fi
+  LANG=de_DE meinproc4 --check index.docbook --stylesheet /usr/share/kde4/apps/ksgmltools2/customization/kde-nochunk.xsl
+  html2ps --rcfile /usr/lib/html2ps/html2psrc -D -u -n index.html >index.ps
+  ps2pdf index.ps ../kdiff3_$i.pdf
+  cd ..
 done
--- a/kdiff3/doc/da/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = da
-
-
--- a/kdiff3/doc/de/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = de
-
-
--- a/kdiff3/doc/en/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = en
-man1_MANS=kdiff3.1
-
-
Binary file kdiff3/doc/en/common/bottom-left.png has changed
Binary file kdiff3/doc/en/common/bottom-middle.png has changed
Binary file kdiff3/doc/en/common/bottom-right.png has changed
--- a/kdiff3/doc/en/common/fdl-license.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/fdl-license.html	Tue Jan 06 17:51:29 2009 +0000
@@ -12,342 +12,501 @@
     <LINK REL="stylesheet" HREF="kde-default.css" TYPE="text/css">
   </HEAD>
   <BODY CLASS="license">
-<H1>GNU Free Documentation License</H1>
-		   Version 1.1, March 2000
+<h3>GNU Free Documentation License</h3>
+<p>
+  Version 1.2, November 2002
+</p>
 
-<P>Copyright (C) 2000  Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA<BR>
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.</P>
+<pre>
+  Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+  51 Franklin St, 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.
+</pre>
 
-<H2>0. Preamble</H2>
+<p>
+  <strong>0. PREAMBLE</strong>
+</p>
 
-<P>The purpose of this License is to make a manual, textbook, or other
-written document "free" in the sense of freedom: to assure everyone
-the effective freedom to copy and redistribute it, with or without
-modifying it, either commercially or noncommercially.  Secondarily,
-this License preserves for the author and publisher a way to get
-credit for their work, while not being considered responsible for
-modifications made by others.</P>
+<p>
+  The purpose of this License is to make a manual, textbook, or other
+  functional and useful document "free" in the sense of freedom: to
+  assure everyone the effective freedom to copy and redistribute it,
+  with or without modifying it, either commercially or noncommercially.
+  Secondarily, this License preserves for the author and publisher a way
+  to get credit for their work, while not being considered responsible
+  for modifications made by others.
+</p>
 
-<P>This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense.  It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.</P>
+<p>
+  This License is a kind of "copyleft", which means that derivative
+  works of the document must themselves be free in the same sense.  It
+  complements the GNU General Public License, which is a copyleft
+  license designed for free software.
+</p>
 
-<P>We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does.  But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book.  We recommend this License
-principally for works whose purpose is instruction or reference.</P>
+<p>
+  We have designed this License in order to use it for manuals for free
+  software, because free software needs free documentation: a free
+  program should come with manuals providing the same freedoms that the
+  software does.  But this License is not limited to software manuals;
+  it can be used for any textual work, regardless of subject matter or
+  whether it is published as a printed book.  We recommend this License
+  principally for works whose purpose is instruction or reference.
+</p>
 
-<H2>1. Applicability And Definitions</H2>
+<p>
+  <strong>1. APPLICABILITY AND DEFINITIONS</strong>
+</p>
 
-<P>This License applies to any manual or other work that contains a
-notice placed by the copyright holder saying it can be distributed
-under the terms of this License.  The "Document", below, refers to any
-such manual or work.  Any member of the public is a licensee, and is
-addressed as "you".</P>
+<p>
+  This License applies to any manual or other work, in any medium, that
+  contains a notice placed by the copyright holder saying it can be
+  distributed under the terms of this License.  Such a notice grants a
+  world-wide, royalty-free license, unlimited in duration, to use that
+  work under the conditions stated herein.  The "Document", below,
+  refers to any such manual or work.  Any member of the public is a
+  licensee, and is addressed as "you".  You accept the license if you
+  copy, modify or distribute the work in a way requiring permission
+  under copyright law.
+</p>
 
-<P>A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.</P>
+<p>
+  A "Modified Version" of the Document means any work containing the
+  Document or a portion of it, either copied verbatim, or with
+  modifications and/or translated into another language.
+</p>
 
-<P>A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject.  (For example, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.)  The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.</P>
+<p>
+  A "Secondary Section" is a named appendix or a front-matter section of
+  the Document that deals exclusively with the relationship of the
+  publishers or authors of the Document to the Document's overall subject
+  (or to related matters) and contains nothing that could fall directly
+  within that overall subject.  (Thus, if the Document is in part a
+  textbook of mathematics, a Secondary Section may not explain any
+  mathematics.)  The relationship could be a matter of historical
+  connection with the subject or with related matters, or of legal,
+  commercial, philosophical, ethical or political position regarding
+  them.
+</p>
 
-<P>The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.</P>
+<p>
+  The "Invariant Sections" are certain Secondary Sections whose titles
+  are designated, as being those of Invariant Sections, in the notice
+  that says that the Document is released under this License.  If a
+  section does not fit the above definition of Secondary then it is not
+  allowed to be designated as Invariant.  The Document may contain zero
+  Invariant Sections.  If the Document does not identify any Invariant
+  Sections then there are none.
+</p>
 
-<P>The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.</P>
+<p>
+  The "Cover Texts" are certain short passages of text that are listed,
+  as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+  the Document is released under this License.  A Front-Cover Text may
+  be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</p>
 
-<P>A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, whose contents can be viewed and edited directly and
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters.  A copy made in an otherwise Transparent file
-format whose markup has been designed to thwart or discourage
-subsequent modification by readers is not Transparent.  A copy that is
-not "Transparent" is called "Opaque".</P>
+<p>
+  A "Transparent" copy of the Document means a machine-readable copy,
+  represented in a format whose specification is available to the
+  general public, that is suitable for revising the document
+  straightforwardly with generic text editors or (for images composed of
+  pixels) generic paint programs or (for drawings) some widely available
+  drawing editor, and that is suitable for input to text formatters or
+  for automatic translation to a variety of formats suitable for input
+  to text formatters.  A copy made in an otherwise Transparent file
+  format whose markup, or absence of markup, has been arranged to thwart
+  or discourage subsequent modification by readers is not Transparent.
+  An image format is not Transparent if used for any substantial amount
+  of text.  A copy that is not "Transparent" is called "Opaque".
+</p>
 
-<P>Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML designed for human modification.  Opaque formats include
-PostScript, PDF, proprietary formats that can be read and edited only
-by proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML produced by some word processors for output
-purposes only.</P>
+<p>
+  Examples of suitable formats for Transparent copies include plain
+  ASCII without markup, Texinfo input format, LaTeX input format, SGML
+  or XML using a publicly available DTD, and standard-conforming simple
+  HTML, PostScript or PDF designed for human modification.  Examples of
+  transparent image formats include PNG, XCF and JPG.  Opaque formats
+  include proprietary formats that can be read and edited only by
+  proprietary word processors, SGML or XML for which the DTD and/or
+  processing tools are not generally available, and the
+  machine-generated HTML, PostScript or PDF produced by some word
+  processors for output purposes only.
+</p>
 
-<P>The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page.  For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.</P>
+<p>
+  The "Title Page" means, for a printed book, the title page itself,
+  plus such following pages as are needed to hold, legibly, the material
+  this License requires to appear in the title page.  For works in
+  formats which do not have any title page as such, "Title Page" means
+  the text near the most prominent appearance of the work's title,
+  preceding the beginning of the body of the text.
+</p>
 
-<H2>2. Verbatim Copying</H2>
+<p>
+  A section "Entitled XYZ" means a named subunit of the Document whose
+  title either is precisely XYZ or contains XYZ in parentheses following
+  text that translates XYZ in another language.  (Here XYZ stands for a
+  specific section name mentioned below, such as "Acknowledgements",
+  "Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+  of such a section when you modify the Document means that it remains a
+  section "Entitled XYZ" according to this definition.
+</p>
 
-<P>You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License.  You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute.  However, you may accept
-compensation in exchange for copies.  If you distribute a large enough
-number of copies you must also follow the conditions in section 3.</P>
+<p>
+  The Document may include Warranty Disclaimers next to the notice which
+  states that this License applies to the Document.  These Warranty
+  Disclaimers are considered to be included by reference in this
+  License, but only as regards disclaiming warranties: any other
+  implication that these Warranty Disclaimers may have is void and has
+  no effect on the meaning of this License.
+</p>
 
-<P>You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.</P>
+<p>
+  <strong>2. VERBATIM COPYING</strong>
+</p>
 
-<H2>3. Copying In Quantity</H2>
+<p>
+  You may copy and distribute the Document in any medium, either
+  commercially or noncommercially, provided that this License, the
+  copyright notices, and the license notice saying this License applies
+  to the Document are reproduced in all copies, and that you add no other
+  conditions whatsoever to those of this License.  You may not use
+  technical measures to obstruct or control the reading or further
+  copying of the copies you make or distribute.  However, you may accept
+  compensation in exchange for copies.  If you distribute a large enough
+  number of copies you must also follow the conditions in section 3.
+</p>
 
-<P>If you publish printed copies of the Document numbering more than 100,
-and the Document's license notice requires Cover Texts, you must enclose
-the copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover.  Both covers must also clearly and legibly identify
-you as the publisher of these copies.  The front cover must present
-the full title with all words of the title equally prominent and
-visible.  You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.</P>
+<p>
+  You may also lend copies, under the same conditions stated above, and
+  you may publicly display copies.
+</p>
 
-<P>If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.</P>
+<p>
+  <strong>3. COPYING IN QUANTITY</strong>
+</p>
 
-<P>If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a publicly-accessible computer-network location containing a complete
-Transparent copy of the Document, free of added material, which the
-general network-using public has access to download anonymously at no
-charge using public-standard network protocols.  If you use the latter
-option, you must take reasonably prudent steps, when you begin
-distribution of Opaque copies in quantity, to ensure that this
-Transparent copy will remain thus accessible at the stated location
-until at least one year after the last time you distribute an Opaque
-copy (directly or through your agents or retailers) of that edition to
-the public.</P>
+<p>
+  If you publish printed copies (or copies in media that commonly have
+  printed covers) of the Document, numbering more than 100, and the
+  Document's license notice requires Cover Texts, you must enclose the
+  copies in covers that carry, clearly and legibly, all these Cover
+  Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+  the back cover.  Both covers must also clearly and legibly identify
+  you as the publisher of these copies.  The front cover must present
+  the full title with all words of the title equally prominent and
+  visible.  You may add other material on the covers in addition.
+  Copying with changes limited to the covers, as long as they preserve
+  the title of the Document and satisfy these conditions, can be treated
+  as verbatim copying in other respects.
+</p>
 
-<P>It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.</P>
+<p>
+  If the required texts for either cover are too voluminous to fit
+  legibly, you should put the first ones listed (as many as fit
+  reasonably) on the actual cover, and continue the rest onto adjacent
+  pages.
+</p>
 
-<H2>4. Modifications</H2>
+<p>
+  If you publish or distribute Opaque copies of the Document numbering
+  more than 100, you must either include a machine-readable Transparent
+  copy along with each Opaque copy, or state in or with each Opaque copy
+  a computer-network location from which the general network-using
+  public has access to download using public-standard network protocols
+  a complete Transparent copy of the Document, free of added material.
+  If you use the latter option, you must take reasonably prudent steps,
+  when you begin distribution of Opaque copies in quantity, to ensure
+  that this Transparent copy will remain thus accessible at the stated
+  location until at least one year after the last time you distribute an
+  Opaque copy (directly or through your agents or retailers) of that
+  edition to the public.
+</p>
 
-<P>You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it.  In addition, you must do these things in the Modified Version:</P>
+<p>
+  It is requested, but not required, that you contact the authors of the
+  Document well before redistributing any large number of copies, to give
+  them a chance to provide you with an updated version of the Document.
+</p>
 
-<OL STYLE="list-style-type: upper-alpha;">
-<LI>Use in the Title Page (and on the covers, if any) a title distinct
-    from that of the Document, and from those of previous versions
-    (which should, if there were any, be listed in the History section
-    of the Document).  You may use the same title as a previous
-    version if the original publisher of that version gives
-    permission.</LI>
+<p>
+  <strong>4. MODIFICATIONS</strong>
+</p>
 
-<LI>List on the Title Page, as authors, one or more persons or
-    entities responsible for authorship of the modifications in the
-    Modified Version, together with at least five of the principal
-    authors of the Document (all of its principal authors, if it has
-    less than five).</LI>
+<p>
+  You may copy and distribute a Modified Version of the Document under
+  the conditions of sections 2 and 3 above, provided that you release
+  the Modified Version under precisely this License, with the Modified
+  Version filling the role of the Document, thus licensing distribution
+  and modification of the Modified Version to whoever possesses a copy
+  of it.  In addition, you must do these things in the Modified Version:
+</p>
 
-<LI>State on the Title page the name of the publisher of the Modified
-    Version, as the publisher.</LI>
+<ul>
+  <li><strong>A.</strong> Use in the Title Page (and on the covers, if any) a title distinct
+  from that of the Document, and from those of previous versions
+  (which should, if there were any, be listed in the History section
+  of the Document).  You may use the same title as a previous version
+  if the original publisher of that version gives permission.</li>
+  <li><strong>B.</strong> List on the Title Page, as authors, one or more persons or entities
+  responsible for authorship of the modifications in the Modified
+  Version, together with at least five of the principal authors of the
+  Document (all of its principal authors, if it has fewer than five),
+  unless they release you from this requirement.</li>
+  <li><strong>C.</strong> State on the Title page the name of the publisher of the
+  Modified Version, as the publisher.</li>
+  <li><strong>D.</strong> Preserve all the copyright notices of the Document.</li>
+  <li><strong>E.</strong> Add an appropriate copyright notice for your modifications
+  adjacent to the other copyright notices.</li>
+  <li><strong>F.</strong> Include, immediately after the copyright notices, a license notice
+  giving the public permission to use the Modified Version under the
+  terms of this License, in the form shown in the Addendum below.</li>
+  <li><strong>G.</strong> Preserve in that license notice the full lists of Invariant Sections
+  and required Cover Texts given in the Document's license notice.</li>
+  <li><strong>H.</strong> Include an unaltered copy of this License.</li>
+  <li><strong>I.</strong> Preserve the section Entitled "History", Preserve its Title, and add
+  to it an item stating at least the title, year, new authors, and
+  publisher of the Modified Version as given on the Title Page.  If
+  there is no section Entitled "History" in the Document, create one
+  stating the title, year, authors, and publisher of the Document as
+  given on its Title Page, then add an item describing the Modified
+  Version as stated in the previous sentence.</li>
+  <li><strong>J.</strong> Preserve the network location, if any, given in the Document for
+  public access to a Transparent copy of the Document, and likewise
+  the network locations given in the Document for previous versions
+  it was based on.  These may be placed in the "History" section.
+  You may omit a network location for a work that was published at
+  least four years before the Document itself, or if the original
+  publisher of the version it refers to gives permission.</li>
+  <li><strong>K.</strong> For any section Entitled "Acknowledgements" or "Dedications",
+  Preserve the Title of the section, and preserve in the section all
+  the substance and tone of each of the contributor acknowledgements
+  and/or dedications given therein.</li>
+  <li><strong>L.</strong> Preserve all the Invariant Sections of the Document,
+  unaltered in their text and in their titles.  Section numbers
+  or the equivalent are not considered part of the section titles.</li>
+  <li><strong>M.</strong> Delete any section Entitled "Endorsements".  Such a section
+  may not be included in the Modified Version.</li>
+  <li><strong>N.</strong> Do not retitle any existing section to be Entitled "Endorsements"
+  or to conflict in title with any Invariant Section.</li>
+  <li><strong>O.</strong> Preserve any Warranty Disclaimers.</li>
+</ul>
 
-<LI>Preserve all the copyright notices of the Document.</LI>
+<p>
+  If the Modified Version includes new front-matter sections or
+  appendices that qualify as Secondary Sections and contain no material
+  copied from the Document, you may at your option designate some or all
+  of these sections as invariant.  To do this, add their titles to the
+  list of Invariant Sections in the Modified Version's license notice.
+  These titles must be distinct from any other section titles.
+</p>
 
-<LI>Add an appropriate copyright notice for your modifications
-    adjacent to the other copyright notices.</LI>
+<p>
+  You may add a section Entitled "Endorsements", provided it contains
+  nothing but endorsements of your Modified Version by various
+  parties--for example, statements of peer review or that the text has
+  been approved by an organization as the authoritative definition of a
+  standard.
+</p>
 
-<LI>Include, immediately after the copyright notices, a license notice
-    giving the public permission to use the Modified Version under the
-    terms of this License, in the form shown in the Addendum
-    below.</LI>
+<p>
+  You may add a passage of up to five words as a Front-Cover Text, and a
+  passage of up to 25 words as a Back-Cover Text, to the end of the list
+  of Cover Texts in the Modified Version.  Only one passage of
+  Front-Cover Text and one of Back-Cover Text may be added by (or
+  through arrangements made by) any one entity.  If the Document already
+  includes a cover text for the same cover, previously added by you or
+  by arrangement made by the same entity you are acting on behalf of,
+  you may not add another; but you may replace the old one, on explicit
+  permission from the previous publisher that added the old one.
+</p>
 
-<LI>Preserve in that license notice the full lists of Invariant
-    Sections and required Cover Texts given in the Document's license
-    notice.</LI>
+<p>
+  The author(s) and publisher(s) of the Document do not by this License
+  give permission to use their names for publicity for or to assert or
+  imply endorsement of any Modified Version.
+</p>
 
-<LI>Include an unaltered copy of this License.</LI>
+<p>
+  <strong>5. COMBINING DOCUMENTS</strong>
+</p>
 
-<LI>Preserve the section entitled "History", and its title, and add to
-    it an item stating at least the title, year, new authors, and
-    publisher of the Modified Version as given on the Title Page.  If
-    there is no section entitled "History" in the Document, create one
-    stating the title, year, authors, and publisher of the Document as
-    given on its Title Page, then add an item describing the Modified
-    Version as stated in the previous sentence.</LI>
+<p>
+  You may combine the Document with other documents released under this
+  License, under the terms defined in section 4 above for modified
+  versions, provided that you include in the combination all of the
+  Invariant Sections of all of the original documents, unmodified, and
+  list them all as Invariant Sections of your combined work in its
+  license notice, and that you preserve all their Warranty Disclaimers.
+</p>
 
-<LI>Preserve the network location, if any, given in the Document for
-    public access to a Transparent copy of the Document, and likewise
-    the network locations given in the Document for previous versions
-    it was based on.  These may be placed in the "History" section.
-    You may omit a network location for a work that was published at
-    least four years before the Document itself, or if the original
-    publisher of the version it refers to gives permission.</LI>
-    
-<LI>In any section entitled "Acknowledgements" or "Dedications",
-    preserve the section's title, and preserve in the section all the
-    substance and tone of each of the contributor acknowledgements
-    and/or dedications given therein.</LI>
+<p>
+  The combined work need only contain one copy of this License, and
+  multiple identical Invariant Sections may be replaced with a single
+  copy.  If there are multiple Invariant Sections with the same name but
+  different contents, make the title of each such section unique by
+  adding at the end of it, in parentheses, the name of the original
+  author or publisher of that section if known, or else a unique number.
+  Make the same adjustment to the section titles in the list of
+  Invariant Sections in the license notice of the combined work.
+</p>
 
-<LI>Preserve all the Invariant Sections of the Document, unaltered in
-    their text and in their titles.  Section numbers or the equivalent
-    are not considered part of the section titles.</LI>
+<p>
+  In the combination, you must combine any sections Entitled "History"
+  in the various original documents, forming one section Entitled
+  "History"; likewise combine any sections Entitled "Acknowledgements",
+  and any sections Entitled "Dedications".  You must delete all sections
+  Entitled "Endorsements."
+</p>
 
-<LI>Delete any section entitled "Endorsements".  Such a section may
-    not be included in the Modified Version.</LI>
+<p>
+  <strong>6. COLLECTIONS OF DOCUMENTS</strong>
+</p>
 
-<LI>Do not retitle any existing section as "Endorsements" or to
-    conflict in title with any Invariant Section.</LI>
-</OL>
+<p>
+  You may make a collection consisting of the Document and other documents
+  released under this License, and replace the individual copies of this
+  License in the various documents with a single copy that is included in
+  the collection, provided that you follow the rules of this License for
+  verbatim copying of each of the documents in all other respects.
+</p>
 
-<P>If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant.  To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.</P>
+<p>
+  You may extract a single document from such a collection, and distribute
+  it individually under this License, provided you insert a copy of this
+  License into the extracted document, and follow this License in all
+  other respects regarding verbatim copying of that document.
+</p>
 
-<P>You may add a section entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.</P>
+<p>
+  <strong>7. AGGREGATION WITH INDEPENDENT WORKS</strong>
+</p>
 
-<P>You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version.  Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity.  If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.</P>
+<p>
+  A compilation of the Document or its derivatives with other separate
+  and independent documents or works, in or on a volume of a storage or
+  distribution medium, is called an "aggregate" if the copyright
+  resulting from the compilation is not used to limit the legal rights
+  of the compilation's users beyond what the individual works permit.
+  When the Document is included in an aggregate, this License does not
+  apply to the other works in the aggregate which are not themselves
+  derivative works of the Document.
+</p>
 
-<P>The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.</P>
+<p>
+  If the Cover Text requirement of section 3 is applicable to these
+  copies of the Document, then if the Document is less than one half of
+  the entire aggregate, the Document's Cover Texts may be placed on
+  covers that bracket the Document within the aggregate, or the
+  electronic equivalent of covers if the Document is in electronic form.
+  Otherwise they must appear on printed covers that bracket the whole
+  aggregate.
+</p>
 
-<H2>5. Combining Documents</H2>
+<p>
+  <strong>8. TRANSLATION</strong>
+</p>
 
-<P>You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice.</P>
+<p>
+  Translation is considered a kind of modification, so you may
+  distribute translations of the Document under the terms of section 4.
+  Replacing Invariant Sections with translations requires special
+  permission from their copyright holders, but you may include
+  translations of some or all Invariant Sections in addition to the
+  original versions of these Invariant Sections.  You may include a
+  translation of this License, and all the license notices in the
+  Document, and any Warranty Disclaimers, provided that you also include
+  the original English version of this License and the original versions
+  of those notices and disclaimers.  In case of a disagreement between
+  the translation and the original version of this License or a notice
+  or disclaimer, the original version will prevail.
+</p>
 
-<P>The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy.  If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.</P>
+<p>
+  If a section in the Document is Entitled "Acknowledgements",
+  "Dedications", or "History", the requirement (section 4) to Preserve
+  its Title (section 1) will typically require changing the actual
+  title.
+</p>
 
-<P>In the combination, you must combine any sections entitled "History"
-in the various original documents, forming one section entitled
-"History"; likewise combine any sections entitled "Acknowledgements",
-and any sections entitled "Dedications".  You must delete all sections
-entitled "Endorsements."</P>
+<p>
+  <strong>9. TERMINATION</strong>
+</p>
 
-<H2>6. Collections Of Documents</H2>
+<p>
+  You may not copy, modify, sublicense, or distribute the Document except
+  as expressly provided for under this License.  Any other attempt to
+  copy, modify, sublicense or distribute the Document 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.
+</p>
 
-<P>You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.</P>
+<p>
+  <strong>10. FUTURE REVISIONS OF THIS LICENSE</strong>
+</p>
 
-<P>You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.</P>
+<p>
+  The Free Software Foundation may publish new, revised versions
+  of the GNU Free Documentation 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.  See
+  http://www.gnu.org/copyleft/.
+</p>
 
-<H2>7. Aggregation With Independent Works</H2>
+<p>
+  Each version of the License is given a distinguishing version number.
+  If the Document specifies that a particular numbered version of this
+  License "or any later version" applies to it, you have the option of
+  following the terms and conditions either of that specified version or
+  of any later version that has been published (not as a draft) by the
+  Free Software Foundation.  If the Document does not specify a version
+  number of this License, you may choose any version ever published (not
+  as a draft) by the Free Software Foundation.
+</p>
 
-<P>A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, does not as a whole count as a Modified Version
-of the Document, provided no compilation copyright is claimed for the
-compilation.  Such a compilation is called an "aggregate", and this
-License does not apply to the other self-contained works thus compiled
-with the Document, on account of their being thus compiled, if they
-are not themselves derivative works of the Document.</P>
+<h3>How to use this License for your documents</h3>
 
-<P>If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one quarter
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that surround only the Document within the aggregate.
-Otherwise they must appear on covers around the whole aggregate.</P>
+<p>
+  To use this License in a document you have written, include a copy of
+  the License in the document and put the following copyright and
+  license notices just after the title page:
+</p>
 
-<H2>8. Translation</H2>
+<pre>
+  Copyright (c)  YEAR  YOUR NAME.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled "GNU
+  Free Documentation License".
+</pre>
 
-<P>Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections.  You may include a
-translation of this License provided that you also include the
-original English version of this License.  In case of a disagreement
-between the translation and the original English version of this
-License, the original English version will prevail.</P>
+<p>
+  If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+  replace the "with...Texts." line with this:
+</p>
 
-<H2>9. Termination</H2>
+<pre>
+  with the Invariant Sections being LIST THEIR TITLES, with the
+  Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+</pre>
 
-<P>You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License.  Any other attempt to
-copy, modify, sublicense or distribute the Document 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.</P>
+<p>
+  If you have Invariant Sections without Cover Texts, or some other
+  combination of the three, merge those two alternatives to suit the
+  situation.
+</p>
 
-<H2>10. Future Revisions Of This License</H2>
-
-<P>The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation 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. See
-<A HREF="http:///www.gnu.org/copyleft/">http:///www.gnu.org/copyleft/</A>.</P>
-
-<P>Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation.  If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.</P>
+<p>
+  If your document contains nontrivial examples of program code, we
+  recommend releasing these examples in parallel under your choice of
+  free software license, such as the GNU General Public License,
+  to permit their use in free software.
+</p>
   </BODY>
 </HTML>
--- a/kdiff3/doc/en/common/footer.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/footer.html	Tue Jan 06 17:51:29 2009 +0000
@@ -1,14 +1,64 @@
+            </div>
+          </div>
+        </div>
+        <div id="left">
+          <div class="menu_box">
+<a name="cp-menu" /><div class="menutitle"><div>
+<h2 id="cp-menu-project">$projectname</h2>
+<a href="#cp-skip-project" class="cp-doNotDisplay">Skip menu "$projectname"</a>
+</div></div>
+<!-- menu -->
+<!-- cmenu.begin -->
+<h2>Class Picker</h2>
+<div style="text-align: center;">
+<form name="guideform">
+<select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value">
+<option value="annotated.html">-- Choose --</option>
+<!-- cmenu -->
+</select>
+</form>
 </div>
-<div id="bottom-nav">
-<img src="../../common/bottom2.png" align="right" height="59" width="227" alt="KDE Logo">
-</div>
-<div class="bottom">
-This file is part of the documentation for $projectname $projectnumber.
-</div>
-<div class="bottom" style="color:#cccccc">
-Documentation copyright &copy; 1996-2003 the KDE developers.<br>
-Generated on $datetime by
-<a href="http://www.doxygen.org/index.html">doxygen</a> $doxygenversion written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, &copy;&nbsp;1997-2001
-</div>
+<!-- cmenu.end -->
+
+<div class="menu_box">
+<a name="cp-menu" /><div class="menutitle"><div>
+<h2 id="cp-menu-project">@topname@</h2>
+<a href="#cp-skip-project" class="cp-doNotDisplay">Skip menu "@topname@"</a>
+</div></div>
+<div class="nav_list">
+<ul>
+<!-- gmenu -->
+</ul></div></div>
+
+          </div>
+        </div>
+        <div class="clearer"></div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+
+
+    <div id="end_body"></div>
+
+
+    <div id="footer"><div id="footer_text">
+    Generated for @topname@ by
+    <a href="http://www.doxygen.org/index.html">doxygen</a> $doxygenversion<br />
+
+    This website is maintained by <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;groo&#116;&#64;kde&#46;or&#x67;">Adriaan de Groot</a>
+and
+<a href="&#109;a&#105;&#108;&#116;&#111;&#58;w&#105;n&#116;er&#64;kde&#46;or&#x67;">Allen Winter</a>.<br />
+        KDE<sup>&#174;</sup> and <a href="@topdir@/kde_gear_black.png">the K Desktop Environment<sup>&#174;</sup> logo</a> are registered trademarks of <a href="http://ev.kde.org/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> |
+        <a href="http://www.kde.org/contact/impressum.php">Legal</a>
+    </div></div>
+  </div>
+
+<!--
+WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL
+BE BLOCKED INSTANTLY AND PERMANENTLY!
+<a href="mailto:aaaatrap-45abe0e0c3bebc77@kde.org">Block me</a>
+WARNING END
+-->
+
 </body>
 </html>
--- a/kdiff3/doc/en/common/gpl-license.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/gpl-license.html	Tue Jan 06 17:51:29 2009 +0000
@@ -16,7 +16,7 @@
 <P>Version 2, June 1991</P>
 
 <P>Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307  USA<BR>
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA<BR>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.</P>
 
@@ -341,7 +341,7 @@
 
     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</pre>
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA</pre>
 
 <p>Also add information on how to contact you by electronic and paper
 mail.</p>
--- a/kdiff3/doc/en/common/header.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/header.html	Tue Jan 06 17:51:29 2009 +0000
@@ -1,34 +1,67 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-  <title>$title ($projectname)</title>
-  <link href="../../common/doxygen.css" rel="stylesheet" type="text/css">
+  <title>$title</title>
+
+<style type="text/css">
+  .cp-doNotDisplay { display: none; }
+  @media aural, braille, handheld, tty { .cp-doNotDisplay { display: inline; speak: normal; }}
+  .cp-edit { text-align: right; }
+  @media print, embossed { .cp-edit { display: none; }}
+</style>
+
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta http-equiv="Content-Style-Type" content="text/css" />
+  <link rel="meta" href="http://www.kde.org/labels.rdf" type="application/rdf+xml" title="ICRA labels" />
+  <meta name="trademark" content="KDE e.V." />
+  <meta name="description" content="K Desktop Environment Homepage, KDE.org" />
+  <meta name="MSSmartTagsPreventParsing" content="true" />
+  <meta name="robots" content="all" />
+  <meta name="no-email-collection" content="http://www.unspam.com/noemailcollection" />
+  <link rel="shortcut icon" href="@topdir@/favicon.ico" /><link rel="icon" href="@topdir@/favicon.ico" />
+  <link rel="stylesheet" type="text/css" href="@topdir@/doxygen.css" />
+  <link rel="stylesheet" type="text/css" href="@topdir@/tabs.css" />
+  <link rel="stylesheet" media="screen" type="text/css" title="KDE Colors" href="@topdir@/kde.css" />
+  <link rel="stylesheet" media="print, embossed" type="text/css" href="@topdir@/print.css" />
+  <link rel="stylesheet" media="screen, aural, handheld, tty, braille" type="text/css" title="Flat" href="@topdir@/flat.css" />
 </head>
-<div class="header">
-<table border="0" cellspacing="0" cellpadding="0">
-<tr>
-<td rowspan="2" width="92">
-<a href="../../index.html" title="The API documentation main page"><img src="../../common/docheadergears.png" style="border:0px;" alt=""></a>
-</td>
-<td width="95%">
-<h1>$projectname API Documentation</h1>
-</td>
-</tr>
-<tr>
-<td valign="bottom">
-<table class="links" border=0 cellspacing=0>
-<tr>
-<td><a href="index.html">Overview</a></td>
-<td><a href="hierarchy.html" title="Inheritance list, sorted roughly  alphabetically">Class&nbsp;Hierarchy</a></td>
-<td><a href="classes.html" title="Alphabetical list of classes">Classes</a></td>
-<td><a href="annotated.html" title="Classes, structs, unions and interfaces with brief descriptions">Classes&nbsp;(annotated)</a></td>
-<td><a href="functions.html" title="Documented class members with links to the classes they belong to">Members</a></td>
-<td><a href="namespaces.html" title="All documented namespaces with brief descriptions">Namespaces</a></td>
-<td><a href="files.html" title="A list of all documented files with brief descriptions">Source&nbsp;Files</a></td>
-</tr>
-</table>
-</td></tr></table>
+
+<body>
+
+<ul class="cp-doNotDisplay">
+  <li><a href="#cp-content" accesskey="2">Skip to content</a></li>
+  <li><a href="#cp-menu" accesskey="5">Skip to link menu</a></li>
+</ul>
+
+<div id="container">
+<div id="header">
+  <div id="header_top"><div><div>
+    <img alt ="" src="@topdir@/top-kde.jpg"/>
+    KDE 4.1 API Reference  </div></div></div>
+  <div id="header_bottom">
+    <div id="location">
+      <ul>
+        <li><a href="http://api.kde.org">KDE API Reference</a></li>
+        <li><a href="@topdir@/index.html">@topname@</a></li>
+      </ul>
+    </div>
+
+    <div id="menu">
+<ul><li><a href="http://kde.org/family/">Sitemap</a></li>
+<li><a href="http://kde.org/contact/">Contact Us</a></li>
+</ul>    </div>
+  </div>
 </div>
-<div id="hgrad"></div>
-<div class="text">
+<!-- End page header -->
+    <div id="body_wrapper">
+      <div id="body">
+        <!-- begin main content -->
+        <div id="right">
+          <div class="content">
+          <div id="main">
+            <div class="clearer">&nbsp;</div>
+<h2><a name="content"></a>$projectname</h2>
+
+<!-- BC -->
--- a/kdiff3/doc/en/common/kde-default.css	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/kde-default.css	Tue Jan 06 17:51:29 2009 +0000
@@ -33,7 +33,7 @@
   background: white none;
   color: black;
   font-family: sans-serif;
-  padding: 0;
+  padding: 0 15px 0 0;
   margin: 0; 
 }
 
@@ -52,7 +52,7 @@
 }
 
 .sect1, .chapter, .synopsis, .appendix, .preface, .article, .refsect1, .index, .glossary, .section {
-  padding: 1em;
+  padding-left: 1em;
 }
 
 .toc .chapter {
@@ -223,22 +223,22 @@
 /* Visual cues for GUI elements etc in the text */
 
 .guimenu, .guimenuitem, .guisubmenu { 
-  background-color: rgb(250,250,250);
+  background-color: rgb(220,220,220);
   color: rgb(0,0,0); /* should be inherit */
 }
 
 .guilabel, .interface, .guibutton { 
-  background-color: rgb(250,250,250);
+  background-color: rgb(220,220,220);
   color: rgb(0,0,0); /* should be inherit */
 }
 
 .shortcut { 
-  background-color: rgb(250,250,250);
+  background-color: rgb(220,220,220);
   color: rgb(0,0,0); /* should be inherit */
 }
 
 .shortcut .keycap { 
-  background-color: rgb(250,250,250);
+  background-color: rgb(220,220,220);
   color: rgb(0,0,0); /* should be inherit */
 }
 
@@ -247,7 +247,7 @@
 }
 
 .accel { 
-  background-color: rgb(250,250,250);
+  background-color: rgb(220,220,220);
   color: rgb(0,0,0); 
   text-decoration: underline;
 }
@@ -270,7 +270,7 @@
 }
 
 .screen, .programlisting { 
-  background-color: rgb(250,250,250);
+  background-color: rgb(220,220,220);
   color: rgb(0,0,0); /* should be inherit */
   border-style: dotted;
   border-color: rgb(0,0,0);
Binary file kdiff3/doc/en/common/kde_logo_bg.png has changed
--- a/kdiff3/doc/en/common/lgpl-license.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/lgpl-license.html	Tue Jan 06 17:51:29 2009 +0000
@@ -16,7 +16,7 @@
 <P>Version 2.1, February 1999</P>
 
 <P>Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307  USA<BR>
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA<BR>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.</P>
 
--- a/kdiff3/doc/en/common/mainfooter.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/mainfooter.html	Tue Jan 06 17:51:29 2009 +0000
@@ -1,14 +1,72 @@
+<div class="copyrights">
+This file is part of the documentation for $projectname $projectnumber.<br/>
+Documentation copyright &copy; @copyright@.<br/>
+Generated on $datetime by
+<a href="http://www.doxygen.org/index.html">doxygen</a> $doxygenversion written
+by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, &copy;&nbsp;1997-2006
+<p>
+KDE's <a href="http://techbase.kde.org/Policies/Library_Documentation_Policy">Doxygen guidelines</a> are available online.
+Questions about the reference manuals should be sent to 
+<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;groo&#116;&#64;kde&#46;or&#x67;">Adriaan de Groot</a>
+or 
+<a href="&#109;a&#105;&#108;&#116;&#111;&#58;w&#105;n&#116;er&#64;kde&#46;or&#x67;">Allen Winter</a>.
+
+</p>
 </div>
-<div id="bottom-nav">
-<img src="common/bottom2.png" align="right" height="59" width="227" alt="KDE Logo">
+            </div>
+          </div>
+        </div>
+        <div id="left">
+          <div class="menu_box">
+
+<!-- menu -->
+<!-- cmenu.begin -->
+<h2>Class Picker</h2>
+<div style="text-align: center;">
+<form name="guideform">
+<select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value">
+<option value="annotated.html">Choose...</option>
+<!-- cmenu -->
+</select>
+</form>
 </div>
-<div class="bottom">
-This file is part of the documentation for kdelibs $projectnumber.
-</div>
-<div class="bottom" style="color:#cccccc">
-Documentation copyright &copy; 1996-2003 the KDE developers.<br>
-Generated on $datetime by
-<a href="http://www.doxygen.org/index.html">doxygen</a> $doxygenversion written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, &copy;&nbsp;1997-2001
-</div>
+<!-- cmenu.end -->
+
+<div class="menu_box">
+<a name="cp-menu" /><div class="menutitle"><div>
+<h2 id="cp-menu-project">@topname@</h2>
+<a href="#cp-skip-project" class="cp-doNotDisplay">Skip menu "$projectname"</a>
+</div></div>
+<div class="nav_list">
+<ul>
+<!-- gmenu -->
+</ul></div></div>
+
+          </div>
+        </div>
+        <div class="clearer"></div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+
+
+    <div id="end_body"></div>
+
+    <div id="footer"><div id="footer_text">
+    This website is maintained by <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;groo&#116;&#64;kde&#46;or&#x67;">Adriaan de Groot</a>
+and
+<a href="&#109;a&#105;&#108;&#116;&#111;&#58;w&#105;n&#116;er&#64;kde&#46;or&#x67;">Allen Winter</a>.<br />
+        KDE<sup>&#174;</sup> and <a href="@topdir@/kde_gear_black.png">the K Desktop Environment<sup>&#174;</sup> logo</a> are registered trademarks of <a href="http://ev.kde.org/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> |
+        <a href="http://www.kde.org/contact/impressum.php">Legal</a>
+    </div></div>
+  </div>
+
+<!--
+WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL
+BE BLOCKED INSTANTLY AND PERMANENTLY!
+<a href="mailto:aaaatrap-45abe0e0c3bebc77@kde.org">Block me</a>
+WARNING END
+-->
+
 </body>
 </html>
--- a/kdiff3/doc/en/common/mainheader.html	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/en/common/mainheader.html	Tue Jan 06 17:51:29 2009 +0000
@@ -1,29 +1,66 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-  <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-  <title>$title ($projectname)</title>
-  <link href="common/doxygen.css" rel="stylesheet" type="text/css">
+  <title>$title</title>
+
+<style type="text/css">
+  .cp-doNotDisplay { display: none; }
+  @media aural, braille, handheld, tty { .cp-doNotDisplay { display: inline; speak: normal; }}
+  .cp-edit { text-align: right; }
+  @media print, embossed { .cp-edit { display: none; }}
+</style>
+
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <meta http-equiv="Content-Style-Type" content="text/css" />
+  <link rel="meta" href="http://www.kde.org/labels.rdf" type="application/rdf+xml" title="ICRA labels" />
+  <meta name="trademark" content="KDE e.V." />
+  <meta name="description" content="K Desktop Environment Homepage, KDE.org" />
+  <meta name="MSSmartTagsPreventParsing" content="true" />
+  <meta name="robots" content="all" />
+  <meta name="no-email-collection" content="http://www.unspam.com/noemailcollection" />
+  <link rel="shortcut icon" href="@topdir@/favicon.ico" /><link rel="icon" href="@topdir@/favicon.ico" />
+  <link rel="stylesheet" type="text/css" href="@topdir@/doxygen.css" />
+  <link rel="stylesheet" type="text/css" href="@topdir@/tabs.css" />
+  <link rel="stylesheet" media="screen" type="text/css" title="KDE Colors" href="@topdir@/kde.css" />
+  <link rel="stylesheet" media="print, embossed" type="text/css" href="@topdir@/print.css" />
+  <link rel="stylesheet" media="screen, aural, handheld, tty, braille" type="text/css" title="Flat" href="@topdir@/flat.css" />
 </head>
-<div class="header">
-<table border="0" cellspacing="0" cellpadding="0">
-<tr>
-<td rowspan="2" width="92">
-<a href="index.html" title="The API documentation main page"><img src="common/docheadergears.png" style="border:0px;" alt=""></a>
-</td>
-<td width="95%">
-<h1>$projectname</h1>
-</td>
-</tr>
-<tr>
-<td valign="bottom">
-<table class="links" border=0 cellspacing=0>
-<tr>
-<td><a href="index.html">Home</a></td>
-<td><a href="search.html" title="Search page">Search</a></td>
-</tr>
-</table>
-</td></tr></table>
+
+<body>
+
+<ul class="cp-doNotDisplay">
+  <li><a href="#cp-content" accesskey="2">Skip to content</a></li>
+  <li><a href="#cp-menu" accesskey="5">Skip to link menu</a></li>
+</ul>
+
+<div id="container">
+<div id="header">
+  <div id="header_top"><div><div>
+    <img alt ="" src="@topdir@/top-kde.jpg"/>
+    KDE 4.1 API Reference  </div></div></div>
+  <div id="header_bottom">
+    <div id="location">
+      <ul>
+        <li><a href="http://api.kde.org">KDE API Reference</a></li>
+      </ul>
+    </div>
+
+    <div id="menu">
+<ul><li><a href="http://kde.org/family/">Sitemap</a></li>
+<li><a href="http://kde.org/contact/">Contact Us</a></li>
+</ul>    </div>
+  </div>
 </div>
-<div id="hgrad"></div>
-<div class="text">
+<!-- End page header -->
+    <div id="body_wrapper">
+      <div id="body">
+        <!-- begin main content -->
+        <div id="right">
+          <div class="content">
+          <div id="main">
+            <div class="clearer">&nbsp;</div>
+<h2><a name="content"></a>$projectname</h2>
+
+<!-- BC -->
Binary file kdiff3/doc/en/common/top-left.png has changed
Binary file kdiff3/doc/en/common/top-middle.png has changed
--- a/kdiff3/doc/es/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = es
-
-
--- a/kdiff3/doc/es/index.docbook	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/es/index.docbook	Tue Jan 06 17:51:29 2009 +0000
@@ -50,7 +50,7 @@
 
 <copyright>
 <year
->2002-2006</year>
+>2002-2007</year>
 <holder
 >Joachim Eibl</holder>
 </copyright>
@@ -68,9 +68,9 @@
 Do NOT change these in the translation. -->
 
 <date
->2006-04-09</date>
+>2007-31-03</date>
 <releaseinfo
->0.9.89</releaseinfo>
+>0.9.92</releaseinfo>
 
 
 <abstract>
@@ -115,7 +115,7 @@
 </itemizedlist>
 </para
 ><para
->Este documento describe la versión 0.9.89 de &kdiff3;. </para>
+>Este documento describe la versión 0.9.92 de &kdiff3;. </para>
 </abstract>
 
 <!-- This is a set of Keywords for indexing by search engines.
@@ -637,6 +637,16 @@
 >Algunas veces el algoritmo sitúa líneas incorrectas unas al lado de otras. O desea comparar un trozo de texto con otro texto que está en una posición completamente diferente en el otro archivo. Para estas situaciones puede indicar a &kdiff3; manualmente que alinee algunas líneas. Marque el texto que quiera alinear con el ratón, como si estuviera copiando y pegando, en la primera vista de diferencia y seleccione «Añadir alineación manual de diferencias» en el menú «Diffview» (acceso rápido de teclado «Ctrl-Y»). Aparecerá una barra naranja en la columna resumen al lado del texto seleccionado. Repita esto para la segunda y (si está disponible) para la tercera vista. &kdiff3; recalculará inmediatamente las diferencias cada vez que haga esto, y alineará las líneas elegidas. Por supuesto, alguna de las líneas que antes coincidían puede que ya no coincidan. </para
 ><para
 >En estos momentos el fusionado no soporta el uso de ayuda de diff manual. </para
+></sect2
+><sect2 id="joinsplitsections"
+><title
+>Secciones de división y unión manual</title
+><para
+>En algunos casos &kdiff3; verá muy pocas o demasiadas secciones diff para fusionar. Si éste es el caso puede unir o dividir las secciones existentes. </para
+><para
+>Añada secciones nuevas seleccionando primero el texto de las líneas situadas junto a las ventanas de entrada (para copiarlo al portapapeles). A continuación elija «Dividir Diff en la selección» en el menú «Fusionar». Las divisiones se añadirán encima de la primera línea bajo el texto seleccionado. Si solo desea añadir una sección, seleccione el texto por el que comienza la sección que desea dividir. </para
+><para
+>Para unir secciones en las ventanas de entrada seleccione varias líneas en las secciones que desea unir (puede unir varias secciones en un solo paso). A continuación elija «Unir las diferencias seleccionadas» en el menú «Fusionar». </para
 ></sect2>
 </sect1>
 
@@ -700,13 +710,13 @@
 ><title
 >Fusión automática de las claves de control de versión y del historial (registro)</title
 ><para
->Many version control systems support special keywords in the file. (e.g. "&#36;Date: 2006-04-21 17:24:21 -0400 (Fri, 21 Apr 2006) &#36;", "&#36;Header&#36;", "&#36;Author: toma &#36;", "&#36;Log&#36;" etc.) During the check-in the version control system (VCS) changes these lines. For instance "&#36;Date: 2006-04-21 17:24:21 -0400 (Fri, 21 Apr 2006) &#36;" will turn into "&#36;Date: 2006-04-21 17:24:21 -0400 (Fri, 21 Apr 2006) &#36;". Since this line will be different in every version of the file, it would require manual interaction during the merge. </para
+>Muchos sistemas de control de versión soportan claves especiales en el archivo (p. ej.: «&#36;Date&#36;$», «&#36;Header&#36;», «&#36;Author&#36;», «&#36;Log&#36;», etc.) Durante la descarga el sistema de control de versiones (VCS) cambia estas líneas. Por ejemplo, «&#36;Date&#36;» se cambiará por «&#36;Date: 2005/03/22 18:45:01 &#36;». Como esta línea será diferente en cada versión del archivo, podría requerir interacción manual durante la fusión. </para
 ><para
 >&kdiff3; ofrece fusionado automático para estos elementos. Para las líneas que coincidan con la opción «Fusionar automáticamente expresión regular» en todos los archivos de entrada de &kdiff3; se elegirá la línea desde B o -si está disponible- desde C (adicionalmente es necesario que las líneas en cuestión si las comparamos con las líneas anteriores no han de tener conflictos). Esta fusión automática también se puede ejecutar de forma inmediata después de iniciar la fusión (active la opción «Ejecutar expresión regular de fusión automática al iniciar la fusión») o posteriormente a través del menú de fusión «Ejecutar expresión regular de fusión automática»). </para
 ><para
 >También está soportada la fusión automática para el historial de control de versión (también llamado «registro»). El historial de fusión automática se puede ejecutar automáticamente cuando se inicie la fusión activando la opción «Resolver automáticamente los conflictos del historial». </para
 ><para
->Usually the version control history begins with a line containing the keyword "$Log$". This must be matched by the "History start regular expression"-option. &kdiff3; detects which subsequent lines are in the history by analysing the leading characters that came before the "$Log$"-keyword. If the same "leading comment" also appears in the following lines, then they are also included in the history. </para
+>Normalmente el historial de control de versión comienza con una línea que contiene la palabra clave «&#36;Log&#36;». Ésta deberá coincidir con la opción «El historial comienza con la expresión regular». &kdiff3; detecta que las siguientes líneas se encuentran en el historial analizando los caracteres importantes que se encuentran delante de la palabra clave «&#36;Log&#36;». Si el mismo «comentario importante» también aparece en las siguientes líneas, también éstas se incluirán en el historial. </para
 ><para
 >Durante cada descarga el VCS escribe una única línea especificando la versión, fecha, e información horaria seguida de líneas con comentarios del usuario. Estas líneas forman una entrada de historial. Esta sección del historial crece cada vez que descarga de forma que las entrada más recientes aparecerán en la parte superior (después de la línea de inicio del historial). </para
 ><para
@@ -720,29 +730,31 @@
 ><para
 >Debido a que no es sencillo de hacer al primer intento, podrá comprobar y mejorar la expresión regular y la generación de clave en un diálogo dedicado pulsando el botón «Comprobar sus expresiones regulares». </para
 ><para
->Example: Assume a history that looks like this: <screen>
+>Ejemplo: Supongamos que tenemos un historial similar a este: <screen>
 /**************************************************************************
-** HISTORY:    $Log: \toms_merge_main_view\MyApplication\src\complexalgorithm.cpp $
+** HISTORIAL:    &#36;Log: \vista_principal_de_tom\MiAplicación\src\algoritmocomplejo.cpp &#36;
 **
-**     \main\integration_branch_12   2 Apr 2001 10:45:41   tom
-**  Merged branch simon_branch_15.
+**     \main\rama_integración_12   2 Abr 2001 10:45:41   tom
+**  rama fusionada simon_rama_15.
 **
-**     \main\henry_bugfix_branch_7\1   30 Mar 2001 19:22:05   henry
-**  Improved the speed for subroutine convertToMesh().
-**  Fixed crash.
+**     \main\henry_correccionerrores_rama_7\1   30 Mar 2001 19:22:05   henry
+**  mejora la velocidad de la subrutina convertToMesh().
+**  Eliminación de fallo.
 **************************************************************************/
 </screen
-> The history start line matches the regular expression ".*\$Log.*\$.*". Then follow the history entries. </para
+> La línea de comienzo del historial es la que coincida con la expresión regular ".*\&#36;Log.*\&#36;.*". Las siguientes son las entradas del historial. </para
 ><para
->The line with the "$Log$"-keyword begins with two "*" after which follows a space. &kdiff3; uses the first non-white-space string as "leading comment" and assumes that the history ends in the first line without this leading comment. In this example the last line ends with a string that also starts with two "*", but instead of a space character more "*" follow. Hence this line ends the history. </para
+>La línea con «&#36;Log&#36;» -la palabra clave comienza con dos «*» seguidos de un espacio. &kdiff3; utiliza la cadena con el primer espacio no vacío como «comentario importante» y asume que el historial finaliza en la primera línea sin este comentario importante. En este ejemplo la última línea finaliza con una cadena que también comienza con dos «*», pero en lugar de un caracter de espacio le siguen más «*». Por tanto, esta línea finalizará el historial. </para
 ><para
->Sino es necesaria la ordenación del historial entonces la entrada del historial comenzará con una línea de expresión regular como esta (esta línea se divide en dos porque sino no se puede ajustar) <screen>
+>Sino es necesaria la ordenación del historial entonces la entrada del historial comenzará con una línea de expresión regular como ésta (esta línea se divide en dos porque sino no se puede ajustar) <screen>
 \s*\\main\\\S+\s+[0-9]+ (Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)
  [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*
 </screen
 > Para obtener detalles sobre las expresiones regulares por favor, consulte la <ulink url="http://doc.trolltech.com/3.3/qregexp.html#details"
 >documentación de las expresiones regulares de Trolltech</ulink
->. Tenga en cuenta que "\s" (con la «s» minúscula) coincidirá con cualquier espacio y "\S" (con «S» mayúscula) coincidirá con lo que no sean espacios en blanco. En nuestro ejemplo la entrada del historial deberá contener primero la versión de información de la expresión regular "\\main\\\S+", la fecha formada por el día «[0-9]+», més «(Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)» y año «[0-9][0-9][0-9][0-9]», la hora «[0-9][0-9]:[0-9][0-9]:[0-9][0-9]» y finalmente el nombre de registro del desarrollador «.*». Vea que el comentario importante (en el ejemplo «**») lo eliminará KDiff3 antes de buscar la coincidencia, de ahí que la expresión regular comience con con una expresión regular para ninguno o más espacios en blanco «\s*». </para
+>. Tenga en cuenta que «\s» (con la «s» minúscula) coincidirá con cualquier espacio y «\S» (con «S» mayúscula) coincidirá con lo que no sean espacios en blanco. En nuestro ejemplo la entrada del historial deberá contener primero la versión de información de la expresión regular "\\main\\\S+", la fecha formada por el día «[0-9]+», més «(Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)» y año «[0-9][0-9][0-9][0-9]», la hora «[0-9][0-9]:[0-9][0-9]:[0-9][0-9]» y finalmente el nombre de registro del desarrollador «.*». </para
+><para
+>Observe que el «comentario importante» (en el ejemplo «**») lo eliminará &kdiff3; antes de buscar la coincidencia, de ahí que la expresión regular comience con con una expresión regular para ninguno o más espacios en blanco «.*». Puesto que los caracteres de comentario puede ser diferentes en cada archivo (por ejemplo, C/C++ utilizan caracteres de comentarios diferentes a los que utiliza Perl script) &kdiff3; tiene en cuenta los caracteres de los comentarios y no debería especificarlos en la expresión regular. </para
 ><para
 >Si necesita un historial ordenado, se calculará la clave de ordenación. Para esta las partes relevantes en la expresión regular se deben agrupar entre paréntesis (los paréntesis adicionales puede mantenerse aunque desactive la ordenación del historial). <screen>
 (Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)
@@ -755,8 +767,8 @@
 </screen>
 </para
 ><para
->Para obtener más detalles consulte también <link linkend="diffmergeoptions"
->Configuración de Diff y Merge</link
+>Para obtener más detalles consulte también <link linkend="mergeoptions"
+>Preferencias de fusionado</link
 >. </para>
 </sect2>
 </sect1>
@@ -1120,9 +1132,9 @@
 </variablelist>
 </sect2>
 
-<sect2 id="diffmergeoptions"
+<sect2 id="diffoptions"
 ><title
->Preferencias de Diff y fusión</title>
+>Preferencias de fusionado</title>
 <para
 >Cuando se comparan archivos, &kdiff3; primero intenta hacer coincidir las líneas que sean iguales en todos los archivos de entrada. Solo durante este paso se ignorarán los espacios en blanco. El segundo paso compara cada línea. En este paso los espacios en blanco no se ignorarán. Los espacios en blanco tampoco se ignorarán durante la fusión. </para>
 
@@ -1201,6 +1213,13 @@
 >Intenta encontrar más a fondo una delta más pequeña (de forma predeterminada estará activada). Debería ser efectivo para archivos grandes y complicados. Y lento para archivos muy grandes. </para
 ></listitem
 ></varlistentry>
+</variablelist>
+</sect2>
+
+<sect2 id="mergeoptions"
+><title
+>Preferencias de fusionado</title>
+<variablelist>
    <varlistentry
 ><term
 ><emphasis
@@ -1250,7 +1269,7 @@
 ></term
 ><listitem
 ><para
->Regular expression for the start of the merge history entry. Usually this line contains the "$Log$"-keyword. Default value: ".*\$Log.*\$.*" </para
+>Expresión regular para el inicio de la entrada del historial de fusionado. Normalmente esta línea contiene la palabra clave «&#36;Log&#36;». El valor predeterminado es «.*\&#36;Log.*\&#36;.*». </para
 ></listitem
 ></varlistentry>
    <varlistentry
@@ -1300,6 +1319,16 @@
    <varlistentry
 ><term
 ><emphasis
+>Número máximo  de entradas en el historial:</emphasis
+></term
+><listitem
+><para
+>&kdiff3; corta la lista del historial después del número especificado de entradas. Utilice -1 para evitar el corte (el valor predeterminado es -1). </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
 >Compruebe sus expresiones regulares</emphasis
 ></term
 ><listitem
@@ -1999,7 +2028,7 @@
 ><para
 >De forma predeterminada los directorios están contraídos. Puede expandirlos y contraerlos pulsando en «+»/«-», con una doble pulsación, o utilizando las teclas Flecha izquierda o Flecha derecha. El menú «Directorio» también contiene dos acciones «Plegar todos los subdirectorios» y «Desplegar todos los subdirectorios» con los que podrá contraer y expandir todos los directorios de una vez. </para
 ><para
->Si hace una doble pulsación sobre un elemento de fichero comenzará la comparación y aparecerá la ventana de diferencias de archivos. </para>
+>Si hace una doble pulsación sobre un elemento de archivo comenzará la comparación y aparecerá la ventana de diferencias de archivos. </para>
 <para
 >La imagen de la columna nombre reflejará el tipo de archivo en el primer directorio («A»). Puede ser uno de estos: </para>
 <itemizedlist>
@@ -2819,16 +2848,16 @@
 <para
 >&kdiff3; - Herramienta de comparación y fusionado de archivos y directorios. </para>
 <para
->Program copyright 2002-2005 Joachim Eibl <email
->joachim.eibl at gmx.de</email
-> </para>
+>Derechos de autor del programa. 2002-2007. Joachim Eibl <email
+>joachim.eibl en gmx.de</email
+>. </para>
 <para
 >Algunas buenas ideas e informes de fallos me llegaron de colegas y de mucha gente a lo largo de la red ¡Gracias! </para>
 
 <para
->Documentation Copyright &copy; 2002-2005 Joachim Eibl <email
->joachim.eibl at gmx.de</email
-> </para>
+>Derechos de autor de la documentación. &copy; 2002-2007. Joachim Eibl <email
+>joachim.eibl en gmx.de</email
+>. </para>
 
 <para
 >Traducido por Santiago Fernández Sancho <email
--- a/kdiff3/doc/et/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = et
-
-
--- a/kdiff3/doc/et/index.docbook	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/et/index.docbook	Tue Jan 06 17:51:29 2009 +0000
@@ -1,10 +1,10 @@
 <?xml version="1.0" ?>
-<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
   <!ENTITY kdiff3 "<application
 >KDiff3</application
 >">
   <!ENTITY kappname "&kdiff3;">
-  <!ENTITY package "kdeextragear-1">
+  <!ENTITY package "extragear-utils">
   <!ENTITY % addindex "IGNORE">
   <!ENTITY % Estonian  "INCLUDE">
 ]>
@@ -31,8 +31,6 @@
 </address
 ></affiliation>
 </author>
-</authorgroup>
-
 <othercredit role="translator"
 ><firstname
 >Marek</firstname
@@ -41,17 +39,18 @@
 > <affiliation
 ><address
 ><email
->bald@online.ee</email
+>bald@starman.ee</email
 ></address
 ></affiliation
 ><contrib
 >Tõlge eesti keelde</contrib
 ></othercredit
 > 
+</authorgroup>
 
 <copyright>
 <year
->2002-2005</year>
+>2002-2007</year>
 <holder
 >Joachim Eibl</holder>
 </copyright>
@@ -69,15 +68,13 @@
 Do NOT change these in the translation. -->
 
 <date
->2005-01-30</date>
+>2007-31-03</date>
 <releaseinfo
->0.9.87</releaseinfo>
+>0.9.92</releaseinfo>
 
 
 <abstract>
 <para
-></para>
-<para
 >&kdiff3; on failide ja kataloogide võrdlemise ja ühendamise vahend, mis <itemizedlist>
 <listitem
 ><para
@@ -107,10 +104,18 @@
 ><para
 >toetab Unicode'i, UTF-8 ja muid kodeeringuid.</para
 ></listitem>
+<listitem
+><para
+>näitab erinevusi,</para
+></listitem>
+<listitem
+><para
+>toetab versioonikontrolli võtmesõnade ja ajaloo ühendamist.</para
+></listitem>
 </itemizedlist>
 </para
 ><para
->Käesolev käsiraamat kirjeldab KDiff3 versiooni 0.9.87. </para>
+>Käesolev käsiraamat kirjeldab &kdiff3; versiooni 0.9.92. </para>
 </abstract>
 
 <!-- This is a set of Keywords for indexing by search engines.
@@ -169,9 +174,9 @@
 ><title
 >Veel üks võrdlemisrakendus?</title>
 <para
->Teatavasti on olemas üsna mitu graafilist võrdlusrakendust. Miks siis veel KDiff3? Siin ma selgitan veidi selle loomise tagamaid. </para
+>Teatavasti on olemas üsna mitu graafilist võrdlusrakendust. Miks siis veel &kdiff3;? Siin ma selgitan veidi selle loomise tagamaid. </para
 ><para
->KDiff3 nägi ilmavalgust sellepärast, et mul oli raskusi ühendamisega. Ühendamine on hädavajalik, kui mingi projekti failide kallal töötab korraga mitu inimest. Ühendamine peab olema mingil määral automatiseeritud, kui arvestada seda, et ühendamisvahend tegeleb nii uute, muudetud failidega (niinimetatud harudega) kui ka algse failiga (niinimetatud baas). Ühendamisvahend valib automaatselt muudatuse, mis mingis harus on tehtud. Kui mitu arendajat on muutnud üht ja sama rida, tuvastab ühendamisvahend konflikti, mis tuleb lahendada käsitsi. </para
+>&kdiff3; nägi ilmavalgust sellepärast, et mul oli raskusi ühendamisega. Ühendamine on hädavajalik, kui mingi projekti failide kallal töötab korraga mitu inimest. Ühendamine peab olema mingil määral automatiseeritud, kui arvestada seda, et ühendamisvahend tegeleb nii uute, muudetud failidega (niinimetatud harudega) kui ka algse failiga (niinimetatud baas). Ühendamisvahend valib automaatselt muudatuse, mis mingis harus on tehtud. Kui mitu arendajat on muutnud üht ja sama rida, tuvastab ühendamisvahend konflikti, mis tuleb lahendada käsitsi. </para
 ><para
 >Ühendamine oli sellisel juhul keeruline, sest üks arendaja muutis hulk asju ja lisaks sellele parandas veel paljudes kohtades näiteks taanet. Samal ajal muutis teine arendaja samuti üsna palju samas failis ja nii tekkiski korraga mitu ühendamiskonflikti. </para
 ><para
@@ -183,7 +188,7 @@
 ><para
 >Päris suurt pingutust nõudvaks võimaluseks osutus kataloogide võrdlemine ja ühendamine, mille tulemusena sündis peaaegu juba brauseri mõõtu lisandus. </para
 ><para
->Ma loodan, et KDiff3 rahuldab ka sinu vajadused. Edu sulle! </para
+>Ma loodan, et &kdiff3; rahuldab ka sinu vajadused. Edu sulle! </para
 ><para
 >Joachim Eibl (2003) </para>
 </sect1>
@@ -194,7 +199,7 @@
 <para
 >See pilt näitab erinevust kahe tekstifaili vahel</para>
 <para
->(KDiff3 üks varasemaid versioone):</para>
+>(&kdiff3; üks varasemaid versioone):</para>
 <screenshot
 ><mediaobject>
    <imageobject
@@ -203,7 +208,7 @@
 ></screenshot>
 
 <para
->Kolmikühendamine on täielikult toetatud. See on abiks juhul, kui kaks inimest on koodi teineteisest sõltumatult muutnud. Algne fail (baas) võimaldab KDiff3 automaatselt valida korrektsed muudatused. Võrdlusakende all asuv ühendamisredaktor lubab konflikte lahendada ja näitab, milline on sellisel juhul tulemus. Isegi seda tulemust saab kohe edasi redigeerida. See pilt näitab kolme sisendfaili ühendamist: </para
+>Kolmikühendamine on täielikult toetatud. See on abiks juhul, kui kaks inimest on koodi teineteisest sõltumatult muutnud. Algne fail (baas) võimaldab &kdiff3; automaatselt valida korrektsed muudatused. Võrdlusakende all asuv ühendamisredaktor lubab konflikte lahendada ja näitab, milline on sellisel juhul tulemus. Isegi seda tulemust saab kohe edasi redigeerida. See pilt näitab kolme sisendfaili ühendamist: </para
 ><para>
 <screenshot
 ><mediaobject>
@@ -214,7 +219,7 @@
 </para>
 
 <para id="dirmergebigscreenshot"
->KDiff3 aitab ka võrrelda ja ühendada terveid katalooge. See pilt näitabki KDiff3 kataloogide ühendamisel: </para
+>&kdiff3; aitab ka võrrelda ja ühendada terveid katalooge. See pilt näitabki &kdiff3; kataloogide ühendamisel: </para
 ><para>
 <screenshot
 ><mediaobject>
@@ -232,7 +237,7 @@
 ><title
 >Võrdlemine rida realt ja märk märgilt</title>
 <para
->Graafiliselt, värvidega näitab KDiff3 täpselt, milles peituvad erinevused Kui tegeled palju koodi (ümber)kirjutamisega, on see kindlasti abiks. </para>
+>Graafiliselt, värvidega näitab &kdiff3; täpselt, milles peituvad erinevused. Kui tegeled palju koodi (ümber)kirjutamisega, on see kindlasti abiks. </para>
 <screenshot
 ><mediaobject>
    <imageobject
@@ -275,7 +280,7 @@
 ><title
 >Kahe või kolme sisendfaili hõlpus ühendamine</title>
 <para
->KDiff3 võib ühendada kaks või kolm sisendfaili, sealjuures võimalikult palju juba automaatselt. Tulemust näidatakse redigeeritavas aknas, kus enamiku konflikte saab lahendada üheainsa hiireklõpsuga: vali nupuribalt A, B või C määramaks, millist allikat kasutada. Valida võib ka enam kui ühe allika. Kuna väljundiaken on samal ajal redaktor, siis saab isegi selliseid konflikte, mille puhul tuleb midagi täiendavalt teha, lahendada ilma mingit muud abivahendit kasutamata. </para>
+>&kdiff3; võib ühendada kaks või kolm sisendfaili, sealjuures võimalikult palju juba automaatselt. Tulemust näidatakse redigeeritavas aknas, kus enamiku konflikte saab lahendada üheainsa hiireklõpsuga: vali nupuribalt A, B või C määramaks, millist allikat kasutada. Valida võib ka enam kui ühe allika. Kuna väljundiaken on samal ajal redaktor, siis saab isegi selliseid konflikte, mille puhul tuleb midagi täiendavalt teha, lahendada ilma mingit muud abivahendit kasutamata. </para>
 </sect2>
 
 <sect2
@@ -328,7 +333,7 @@
 ></listitem>
    <listitem
 ><para
->Võrguläbipaistvus KIO moodulite vahendusel.</para
+>Võrguläbipaistvus KIO-moodulite vahendusel.</para
 ></listitem>
    <listitem
 ><para
@@ -357,7 +362,7 @@
 
 <chapter id="documentation"
 ><title
->Failide võrdlemise ja ühendamise seletused</title>
+>Failide võrdlemine ja ühendamine</title>
 
 <sect1 id="commandline"
 ><title
@@ -483,24 +488,67 @@
 
 <sect2
 ><title
->Rohkem infot käsurea võtmete kohta annab käsk: </title>
+>Muud käsurea võtmed</title>
+<para
+>Kõiki käsurea võtmeid näitab käsk</para>
 <screen
 ><command
 >kdiff3</command
 > --help
-Võtmed:
+</screen>
+<para
+>Näidisväljund:</para>
+<screen
+>Võtmed:
   -m, --merge               Sisendi liitmine.
-  -b, --base file           Baasfail. Ühilduvuseks teatud vahenditega.
-  -o, --output file         Väljundfail. Eelduseks -m. Nt.: -o newfile.txt
-  --out file                Taas väljundfail. (Ühilduvuseks teatud vahenditega.)
+  -b, --base fail           Baasfail. Ühilduvuseks teatud tööriistadega.
+  -o, --output fail         Väljundfail. Eelduseks -m. Nt.: -o newfile.txt
+  --out fail                Taas väljundfail. (Ühilduvuseks teatud tööriistadega.)
   --auto                    GUI puudub, kui kõik konfliktid on automaatselt lahenevad. (Vajalik on -o file)
   --qall                    Konflikte ei lahendata automaatselt. (Ühilduvuseks...)
   --L1 alias1               Sisendfaili 1 (baas) näidatava nime asendus.
   --L2 alias2               Sisendfaili 2 näidatava nime asendus.
   --L3 alias3               Sisendfaili 3 näidatava nime asendus.
   -L, --fname alias         Alternatiivne näidatava nime asendus. Tuleb anda kord iga sisendi kohta.
-  -u                        Toimeta. Ühilduvuseks teatud vahenditega.
+  --cs string               Tühistab seadistuse. Tuleb anda eraldi iga seadistuse kohta. Näide: --cs "AutoAdvance=1"
+  --confighelp              Näitab seadistusi ja nende kehtivaid väärtusi.
+  --config fail             Mõne muu seadistustefaili kasutamine.
 </screen>
+<para
+>Võti <option
+>--cs</option
+> võimaldab muuta seadistuse väärtust, mida muidu saab muuta ainult seadistustedialoogi vahendusel. Kuid arvesta, et kui &kdiff3; töö lõpetab, salvestatakse muudetud väärtus. Võtmega <option
+>--confighelp</option
+> näeb saadaolevate seadistuste nimesid ja nende kehtivaid väärtusi.</para>
+<para
+>Võtmega <option
+>--config</option
+> saab määrata mõne muu seadistustefaili kasutamise. Kui kasutad sageli &kdiff3; mitme täiesti erineva seadistusega, lubab see võti variantide vahel hõlpsasti lülituda.</para>
+</sect2>
+<sect2
+><title
+>Eiratavad käsurea võtmed</title>
+<para
+>Paljud soovivad kasutada &kdiff3; mõne versioonikontrollisüsteemiga. Aga kui versioonikontrollisüsteem kutsub &kdiff3; välja käsureaparameetriga, mida &kdiff3; ei tunne, lõpetab &kdiff3; töö veaga. Lõimimisseadistused lubavad määrata kindlaks käsureaparameetrid, mida &kdiff3; peab eirama. Neid näidatakse abiteates umbes nii:</para>
+<screen
+><replaceable
+>miski</replaceable
+>                     Eiratakse (kasutaja määratud).
+</screen>
+<variablelist>
+  <varlistentry
+><term
+><emphasis
+>Eiratavad käsureavõtmed:</emphasis
+></term
+><listitem
+><para
+>Võtmete nimekiri, eraldajaks semikoolon ';'. Kui käsureal esineb mõni määratud võtmetest, eirab &kdiff3; seda ja töötab edasi veast teatamata. (Vaikimisi "u;query;html;abort").</para
+></listitem
+></varlistentry>
+</variablelist>
+<para
+>Kui sellest ei piisa, on soovitatav kirjutada shelliskript, mis seab võtmed vastavusse.</para>
 </sect2>
 
 </sect1>
@@ -517,9 +565,9 @@
 </mediaobject
 ></screenshot>
 <para
->Avamisdialoog võimaldab redigeerida failinimesid käsitsi, valida need failidialoogis ("Fail...") või kasutada hüpikmenüüs olevaid hiljuti avatud faile. Kui avad dialoogi uuesti, on seal kirjas parajasti aktiivsed failinimed. Kolmanda sisendvälja täitmine ei ole kohustuslik. Kui "C" tühjaks jätta, analüüsitakse ainult kahe faili erinevusi. </para
+>Avamisdialoog võimaldab redigeerida failinimesid käsitsi, valida need failidialoogis ("Fail...") või kasutada rippmenüüs olevaid viimati kasutatud faile. Kui avad dialoogi uuesti, on seal kirjas parajasti aktiivsed failinimed. Kolmanda sisendvälja täitmine ei ole kohustuslik. Kui "C" tühjaks jätta, analüüsitakse ainult kahe faili erinevusi. </para
 ><para
->Nupule "Kataloog..." klõpsates saab valida kataloogi. Kui A jaoks on määratud kataloog, saab alustada kataloogide võrdlemist-ühendamist. Kui A on fail, kuid B, C või väljund kataloogid, kasutab KDiff3 A failinime määratud kataloogides. </para
+>Nupule "Kataloog..." klõpsates saab valida kataloogi. Kui A jaoks on määratud kataloog, saab alustada kataloogide võrdlemist-ühendamist. Kui A on fail, kuid B, C või väljund kataloogid, kasutab &kdiff3; A failinime määratud kataloogides. </para
 ><para
 >Kui märkida "Ühenda", saab kasutada ka välja "Väljund". Siiski ei ole nõutav väljundfaili nime kohe määrata, selle võib edasi lükata ka salvestamise ajale. </para
 ><para
@@ -530,40 +578,76 @@
 ><title
 >Sisendi asetamine ja lohistamine</title>
 <para
->Vahel võib tekkida vajadus võrrelda tekstilõke, mis ei kujuta endast omaette faile. KDiff3 võimaldab väga lihtsalt asetada teksti lõikepuhvrist parajasti fookuses olevasse võrdlemise sisendaknasse. Võrdlusanalüüs algab kohe seejärel. Avamisdialoogis ei ole sellisel juhul vajalik määrata faile, vaid selle võib kohe sulgeda klõpsuga nupule "Loobu". </para
+>Vahel võib tekkida vajadus võrrelda tekstilõke, mis ei kujuta endast omaette faile. &kdiff3; võimaldab väga lihtsalt asetada teksti lõikepuhvrist parajasti fookuses olevasse võrdlemise sisendaknasse. Võrdlusanalüüs algab kohe seejärel. Avamisdialoogis ei ole sellisel juhul vajalik määrata faile, vaid selle võib kohe sulgeda klõpsuga nupule "Loobu". </para
 ><para
 >Samuti võib kasutada lohistamist: lohista fail failihalduris või valitud tekst redaktorist ning kukuta see võrdlemise sisendaknasse. </para
 ><para
 >Milleks see hea on? Mõnikord võib fail sisaldada kaht sarnast funktsiooni, kuid kontrollimine, kui sarnased nad ikkagi on, võib olla päris tülikas, kui sa pead näiteks kõigepealt looma kaks faili ja siis nad mõlemad avama. Nüüd aga on võimalik vajalikud osad lihtsalt kopeerida, asetada ja võrdlemine võibki alata. </para
 ><para
->Märkus: praegu ei ole võimalik midagi KDiff3-st välja lohistada, toetatud on ainult lohistamine võrdlemise sisendaknasse. </para
+>Märkus: praegu ei ole võimalik midagi &kdiff3;-st välja lohistada, toetatud on ainult lohistamine võrdlemise sisendaknasse. </para
 ><para
 >Hoiatus: mõned redaktorid tõlgendavad lohistamist muusse rakendusse mitte kopeerimise, vaid lõikamisena. See tähendab, et sa võid kaotada oma esialgsed andmed. </para>
 </sect1>
 
 <sect1 id="interpretinginformation"
 ><title
->Info tõlgendamine sisendaknas</title>
+>Failide võrdlemine ja info tõlgendamine sisendaknas</title>
 <screenshot
 ><mediaobject>
 <imageobject
 ><imagedata fileref="screenshot_diff.png" format="PNG"/></imageobject>
 </mediaobject
 ></screenshot>
-<para
->Iga tekstiakna ülaservas asub "inforiba". Sisendakende inforibal seisab täht "A", "B" või "C", failinimi ning aknas esimesena näha oleva rea number. (Pane tähele, et akent "C" ei pruugi olemas olla.) Iga inforiba on erinevat värvi. Kui näiteks failinimi on liiga pikk, et ära mahtuda, võib hiire viia riba kohale ning näha täielikku nime ilmuval kohtspikril. </para
+<sect2
+><title
+>Inforiba</title
+><para
+>Iga tekstiakna ülaservas asub "inforiba". Sisendakende inforibal seisab täht "A", "B" või "C", failinimi, sirvimisnupp ning aknas esimesena näha oleva rea number. (Pane tähele, et akent "C" ei pruugi olemas olla.) Iga inforiba on erinevat värvi. </para
+><para
+>Kui valid sirvides mõne muu faili või lõpetad failinime redigeerimise klahvile Enter vajutades, laaditakse uus fail ja võrreldakse seda juba laaditud faili(de)ga. </para
+></sect2
+><sect2
+><title
+>Värvid</title
 ><para
 >Kolmele sisendaknale on omistatud tähed "A", "B" ja "C". "A" värviks on sinine, "B" roheline ja "C" magenta. Need on vaikeväärtused, mida saab muuta seadistustemenüüst. </para
 ><para
 >Erinevuse avastamisel näitab värv, milline sisendfail erineb. Kui erinevad mõlemad sisendfailid, siis väljendab seda vaikimisi punane värv (seadistuste kohaselt "konflikti värv"). Värviskeem tuleb eriti kasuks kolme sisendfaili korral, mida võib näha järgmises osas (<link linkend="merging"
->Ühjendamine</link
+>Ühendamine</link
 >). </para
+></sect2
+><sect2
+><title
+>Kokkuvõttetulp</title
 ><para
 >Igast tekstist vasakul asub "kokkuvõttetulp". Kui real on erinevusi, näitab kokkuvõttetulp vastavat värvi. Ainult tühimärkide erinevuse korral on kokkuvõttetulbal näha ruuduline muster. See on abiks programmeerimiskeelte korral, kus tühimärkidel ei ole erilist tähendust, võimaldades ühe hetkega tuvastada, kas on ka mingeid olulisi muudatusi (näiteks C/C++ korral on tühimärkidel mingi roll ainult stringides, kommentaarides, preprotsessoris ja veel mõnel äärmiselt esoteerilisel juhtumil). </para
 ><para
 >Kokkuvõttetulpa ja teksti lahutav püstjoon on katkestatud, kui sisendfailis pole selles kohas ühtki rida. Reamurdmise lubamisel on püstjoon murtud ridade juures punkteeritud. </para
+></sect2
+><sect2
+><title
+>Ülevaateriba</title
 ><para
->Paremal on otse kerimisriba kõrval näha "ülevaateriba". See näitab kokkusurutult sisendfaili "A" kokkuvõttetulpa. Nii on kõik erinevused ja konfliktid korraga näha. Kui kasutada ainult kaht sisendakent, on kõik erinevused punased, sest iga erinevus on sellisel juhul ju ka konflikt. Must ristkülik tähistab parajasti aknas näha olevat tekstiosa. Väga pikkade sisendfailide korral, kus sisendi ridade arv on suurem kui ülevaatetulba kõrgus pikslites, mahutatakse ühele ülevaatereale mitu sisendirida. Konflikti näitamist eelistatakse sellisel juhul tavalisele erinevusele ning viimast muutmata olekule, nii ei jää kindlasti nägemata ükski erinevus või konflikt. Ülevaateribale klõpsates näidatakse vastavat kohta tekstis. </para>
+>Paremal on otse kerimisriba kõrval näha "ülevaateriba". See näitab kokkusurutult sisendfaili "A" kokkuvõttetulpa. Nii on kõik erinevused ja konfliktid korraga näha. Kui kasutada ainult kaht sisendakent, on kõik erinevused punased, sest iga erinevus on sellisel juhul ju ka konflikt. Must ristkülik tähistab parajasti aknas näha olevat tekstiosa. Väga pikkade sisendfailide korral, kus sisendi ridade arv on suurem kui ülevaatetulba kõrgus pikslites, mahutatakse ühele ülevaatereale mitu sisendirida. Konflikti näitamist eelistatakse sellisel juhul tavalisele erinevusele ning viimast muutmata olekule, nii ei jää kindlasti nägemata ükski erinevus või konflikt. Ülevaateribale klõpsates näidatakse vastavat kohta tekstis. </para
+></sect2
+><sect2 id="manualdiffhelp"
+><title
+>Ridade joondamine käsitsi</title
+><para
+>Vahel seab algoritm kõrvuti valed read. Võib ka juhtuda, et soovid võrrelda mingit tekstilõiku teises failis täiesti teises kohas asuva lõiguga. Sel juhul saad anda &kdiff3;-le käsitsi korralduse teatud read joondada. Märgi esimeses vaates tekst, mida soovid kasutada (tee seda hiirega, nagu kopeerimise puhul), ning seejärel vali käsk "Lisa käsitsi samasus" menüüst "Võrdlemine" (kiirklahv "Ctrl+Y"). Valitud teksti kõrvale ilmub kokkuvõttetulbas oranž riba. Korda sama tegevust teises ja vajaduse korral kolmandaski vaates. &kdiff3; leiab iga toimingu järel automaatselt erinevused ja joondab valitud read. Loomulikult on sel juhul võimalik, et teatud varasemad sobivused kuskil vahepeal enam ei klapi. </para
+><para
+>Praegu ei ole ühendamisel toetatud käsitsi erinevuste kasutamine. </para
+></sect2
+><sect2 id="joinsplitsections"
+><title
+>Erinevuse osade käsitsi ühendamine ja lahutamine</title
+><para
+>Mõnel juhul võib tekstis olla &kdiff3; jaoks liiga vähe või liiga palju erinevaid osasid, et neid ühendada. Sel juhul võib olemasolevad osad liita või lahutada. </para
+><para
+>Uute lõikude lisamiseks vali kõigepealt mõnes sisendaknas read, mis kuuluvad kokku (tee seda samamoodi nagu lõikepuhvrisse kopeerimisel). Seejärel vali käsk "Jaga erinevused valiku juures" menüüst "Ühendamine". Jagatud osad lisatakse valitud teksti esimese rea ette ja viimase rea järele. Kui soovid lisada ainult ühe lõigu, vali tekst mõne muu lõigujagamise alguses. </para
+><para
+>Lõikude liitmiseks ükspuha kumbas sisendaknas vali read lõikudes, mida soovid liita (ühekorraga võib liita mitu lõiku). Seejärel vali käsk "Ühenda valitud erinevused" menüüst "Ühendamine". </para
+></sect2>
 </sect1>
 
 
@@ -584,22 +668,109 @@
 >Kui on ainult kaks sisendfaili, on iga erinevus ühtlasi konflikt, mis tuleb käsitsi lahendada. </para
 ><para
 >Kolme sisendfaili korral käsitletakse esimest baasina, teist ja kolmandat aga potentsiaalseid muudatusi sisaldavate failidena. Kui muudetud on rida ainult sisendis B või C, aga mitte mõlemas, valitakse automaatselt muudetud allikas. Kui aga nii B kui C on (erinevalt) muutnud üht ja sama rida, märgitakse see konfliktina, mis tuleb käsitsi lahendada. Kui B ja C on ühesugused, aga erinevad A-st, valitakse C. </para
+><sect2
+><title
+>Kokkuvõttetulp</title
 ><para
->Ka ühendamisväljundi redigeerimisaknal on vasakus servas kokkuvõtteriba. See näitab sisendi tähte, millest rida on valitud, või mitte midagi, kui rida on kõigis kolmes allikas võrdne. Konflikti korral on seal küsimärk "?" ning real endal seisab "&lt;Ühendamise konflikt&gt;, kõik ilusasti puust ja punaseks tehtud. Kuna konfliktide lahendamine rida-realt võib võtta päris palju aega, on read rühmitatud gruppidesse, millel on ühesugused erinevuse ja konflikti omadused. Samas on ainult tühimärkide konfliktid eraldatud muudest konfliktidest, et hõlbustada selliste failide ühendamist, kus taanet on muudetud paljudel ridadel. </para
+>Ka ühendamisväljundi redigeerimisaknal on vasakus servas kokkuvõttetulp. See näitab sisendi tähte, millest rida on valitud, või mitte midagi, kui rida on kõigis kolmes allikas võrdne. Konflikti korral on seal küsimärk "?" ning real endal seisab "&lt;Ühendamise konflikt&gt;, kõik ilusasti puust ja punaseks tehtud. Kuna konfliktide lahendamine rida-realt võib võtta päris palju aega, on read rühmitatud gruppidesse, millel on ühesugused erinevuse ja konflikti omadused. Samas on ainult tühimärkide konfliktid eraldatud muudest konfliktidest, et hõlbustada selliste failide ühendamist, kus taanet on muudetud paljudel ridadel. </para
+></sect2
+><sect2 id="synchronise_views"
+><title
+>Aktiivse grupi määramine ning ühendamise ja võrdlemise vaadete sünkroniseerimine</title
 ><para
 >Kui klõpsata hiire vasaku nupuga kokkuvõttetulbal mis tahes aknas, siis valitakse selle rea grupp kõigis akendes ning näidatakse antud grupi algust (see võib kaasa tuua automaatse asukohavahetuse akendes, kui grupi algus ei ole parajasti näha). Valitud grupp muutub sellega "aktiivseks grupiks", see tõstetakse esile "praeguse vahemiku tausta värviga" ning tekstist vasakule ilmub must tulbake. </para
+></sect2
+><sect2
+><title
+>Sisendi A, B või C valimine aktiivse konflikti ja redigeerimise jaoks</title
 ><para
->Pane tähele tähtedega "A", "B" ja "C" sisendivalija nuppe menüüriba all. Mõnele neist klõpsates lisatakse selle sisendi read valitud grupi lõppu, kui grupp ei sisaldanud varem seda allikat. Vastasel juhul eemaldatakse selle allika read. </para
+>Nupureal menüüriba all on näha kolm sisendi valimise nuppu tähtedega "A", "B" ja "C". Klõpsa ühele neist vastava allika ridade lisamiseks (või eemaldamiseks, kui need on juba lisatud). Mitme sisendi ridade valimiseks klõpsa vajalikele nuppudele vajalikus järjekorras. Kui näiteks soovid, et "B" read oleks väljundis "A" ridadest eespool, klõpsa kõigepealt "B" ja siis "A". </para
 ><para
->Lisaks saab vahetult redigeerida mis tahes rida. Kokkuvõttetulp näitab tähte "m" iga muudetud rea kohta. </para
+>Kui kasutad automaatse edasiliikumise võimalust (<link linkend="autoadvance"
+>"Automaatne liikumine järgmisele lahendamata konfliktile pärast allika valimist"</link
+>), tuleb see välja lülitada, enne kui valid mitme sisendi read või soovid pärast valikut ridu redigeerida. Vastasel juhul hüppab &kdiff3; pärast esimese sisendi valimist järgmise konflikti juurde. </para
+><para
+>Sageli on kasulik ühendamise väljundit otseselt redigeerida. Kokkuvõttetulp näitab iga käsitsi muudetud rea juures tähte "m". Kui erinevused paiknevad viisil, et lihtne sisendi valimine ei anna rahuldavat tulemust, võid märkida vajaliku teksti, selle <link linkend="selections"
+>kopeerida ja asetada</link
+> otse ühendamise väljundisse. </para
 ><para
 >Vahel võib juhtuda, et rida eemaldatakse automaatse liitmisega või redigeerides. Kui gruppi ei ole jäänud enam ühtki rida, ilmub sellele reale tekst &lt;Lähterida puudub&gt;. See on kõigest grupi kohatäitja juhuks, kui muudad meelt ja valid taas mõne allika. Seda teksti ei ole näha ei salvestatud failis ega kopeeritavates/asetatavates valikutes. </para
 ><para
 >Tekst "&lt;Ühendamise konflikt&gt;" seevastu liigub küll lõikepuhvrisse, kui valida ja kopeerida/asetada sellist rida sisaldav tekst. Seepärast tasuks sellise võimalusega ettevaatlik olla. </para
+></sect2
+><sect2
+><title
+>Sisendi A, B või C valimine kõigile konfliktidele</title
 ><para
->Tavaline ühendamine lahendab lihtsad konfliktid automaatselt. Menüü "Ühendamine" pakub lisaks mõningaid toiminguid muude levinumate vajaduste rahuldamiseks. Kui sul tuleb enamasti konfliktide puhul valida üks ja sama baas, võid valida kõikjal "A", "B" või "C" või ainult veel lahendamata konfliktidele või ainult lahendamata tühimärkide konfliktidele. Kui soovid lahendada iga erinevuse ise käsitsi, võid lülitada sisse võimaluse "Määra erinevused konfliktideks". Kui soovid aga taas panna KDiff3 automaatselt konflikte lahendama, vali "Lahenda automaatselt lihtsad konfliktid". Seejärel alustab KDiff3 uuesti ühendamist. Kui selle käigus muudetakse midagi, mida oled varem muutnud, küsib KDiff3 enne jätkamist, mida soovid teha. </para
+>Tavaline ühendamine lahendab lihtsad konfliktid automaatselt. Menüü "Ühendamine" pakub lisaks mõningaid toiminguid muude levinumate vajaduste rahuldamiseks. Kui sul tuleb enamasti konfliktide puhul valida üks ja sama baas, võid valida kõikjal "A", "B" või "C" või ainult veel lahendamata konfliktidele või ainult lahendamata tühimärkide konfliktidele. Kui soovid lahendada iga erinevuse ise käsitsi, võid lülitada sisse võimaluse "Määra erinevused konfliktideks". Kui soovid aga taas panna &kdiff3; automaatselt konflikte lahendama, vali "Lahenda automaatselt lihtsad konfliktid". Seejärel alustab &kdiff3; uuesti ühendamist. Kui selle käigus muudetakse midagi, mida oled varem muutnud, küsib &kdiff3; enne jätkamist, mida soovid teha. </para
 ><para
->Märkus: kui valid lahendamata tühimärkide konfliktide baasi ning võimalus "Numbreid ignoreeritakse" või "C/C++ kommentaare ignoreeritakse" on sisse lülitatud, koheldakse muutusi numbrites või kommentaarides samuti tühimärkidena. </para>
+>Märkus: kui valid lahendamata tühimärkide konfliktide baasi ning võimalus "Numbreid ignoreeritakse" või "C/C++ kommentaare ignoreeritakse" on sisse lülitatud, koheldakse muutusi numbrites või kommentaarides samuti tühimärkidena. </para
+></sect2
+><sect2 id="vcskeywordsmergesupport"
+><title
+>Versioonikontrolli võtmesõnade ja ajaloo (logi) automaatne ühendamine</title
+><para
+>Paljud versioonikontrollisüsteemid toetavad failis spetsiaalsete võtmesõnade kasutamist (nt. "&#36;Date&#36;", "&#36;Header&#36;", "&#36;Author&#36;", "&#36;Log&#36;" jne.). Väljavõtte tegemise ajal muudab versioonikontrollisüsteem neid ridu. Näiteks "&#36;Date&#36;" asemele tuleb "&#36;Date: 2005/03/22 18:45:01 &#36;".  Et selline rida on faili iga versiooni puhul erinev, on ühendamise ajal vajalik käsitsi sekkumine. </para
+><para
+>&kdiff3; võimaldab neid automaatselt ühendada. Lihtsate ridade puhul, mis sobivad valikuga "Automaatse ühendamise regulaaravaldis" kõigis sisendfailides, valib &kdiff3; rea B-st või, kui see on olemas, C-st. (Lisaks on vajalik, et mainitud read oleks võrdluses kõrvuti ja eelmine rida ei sisaldaks konflikti.) Automaatse ühendamise saab sooritada kohe ühendamise alates (selleks peab olema sisse lülitatud "Regulaaravaldisega automaatne ühendamine ühendamise alustamisel") või hiljem menüükäsuga "Käivita regulaaravaldisega automaatne ühendamine". </para
+><para
+>Automaatne ühendamine on toetatud ka versioonikontrolli ajaloo ehk logi puhul. Ajaloo automaatse ühendamise võib käivitada ühendamise alustamisel, kui sisse on lülitatud "Versioonikontrolli ajaloo ühendamine ühendamise alustamisel", või hiljem menüükäsuga "Lahenda automaatselt ajalookonfliktid". </para
+><para
+>Tavaliselt algab versioonikontrolli ajalugu reaga, kus seisab võtmesõna "&#36;Log&#36;". See peab sobima kokku valikuga "Ajaloo alguse regulaaravaldis". &kdiff3; tuvastab seejärel, millised järgnevad read kuuluvad ajalukku, anaküüsides juhtmärke enne võtmesõna "&#36;Log&#36;". Kui samasugused "kommentaari sissejuhatuse" märgid esinevad ka järgnevate ridade alguses, kuuluvad need ajalukku. </para
+><para
+>Iga väljavõtte ajal kirjutab versioonikontrollisüsteem unikaalse rea, mis määrab ära versiooni, kuupäeva ja kellaaja, sellele järgnevad kasutaja kommentaariga read. Need moodustavadki ühe ajalookirje. Ajaloosektsioon kasvab iga versioonikontrolli toiminguga, kusjuures viimane kirje on alati kõige ees (otse ajaloo algusrea järel). </para
+><para
+>Paralleelse arendustegevuse ajal võivad kaks või enam arendajat failiga tegelda, millisel juhul ühendamise ajalugu sisaldab mitut kirjet, mis harude ühendamisel satuvad konflikti. Et nende ühendamine võib olla üsna vaevaline, toetab &kdiff3; kaht strateegiat: mõlema/kõigi arendajate ajaloo lisamine etteotsa või ajaloo sorteerimine kasutaja määratud võtme järgi. </para
+><para
+>Esimene variant on kõige lihtsam. &kdiff3; peab lihtsalt tuvastama, millised read moodustavad ühe ajalookirje. Enamik versioonikontrollisüsteeme lisab iga ajalookirje järele tühja rea. Kui muid tühje ridu pole, piisab sellest &kdiff3;-le. Sel juhul olgu "Ajaloo alguse regulaaravaldis" lihtsalt tühi. Kui tühjast reast ainuüksi ei piisa, võid koostada regulaaravaldise, mis tuvastab ajalookirje alguse. </para
+><para
+>Pane tähele, et &kdiff3; eemaldab topeltajalookirjed. Kui sisendfailis esineb ajalookirje mitmel korral, siis väljundisse jääb alles ainult üks kirje. </para
+><para
+>Kui soovid ajalugu sortida, tuleb määrata sorteerimisvõti. Kasuta väljal "Ajaloo alguse regulaaravaldis" sulge regulaaravaldise nende osade rühmitamiseks, mida hiljem kasutada sorteerimisvõtmena. Seejärel määra "ajaloo sortimisvõtmete järjekord", milles komaga (",") eraldatud arvud viitavad grupi positsioonile regulaaravaldises. </para
+><para
+>See ei pruugi otsekohe õnnestuda, mistõttu tasub regulaaravaldist ja võtme genereerimist testida spetsiaalses dialoogis, mis avaneb klõpsuga nupule "Regulaaravaldiste test". </para
+><para
+>Näide: oletame, et ajalugu näeb välja nii: <screen>
+/**************************************************************************
+** HISTORY:    &#36;Log: \toms_merge_main_view\MyApplication\src\complexalgorithm.cpp &#36;
+**
+**     \main\integration_branch_12   2 Apr 2001 10:45:41   tom
+**  Merged branch simon_branch_15.
+**
+**     \main\henry_bugfix_branch_7\1   30 Mar 2001 19:22:05   henry
+**  Improved the speed for subroutine convertToMesh().
+**  Fixed crash.
+**************************************************************************/
+</screen
+> Ajaloo algusrida vastab regulaaravaldisele ".*\&#36;Log.*\&#36;.*". Sellele järgnevad ajalookirjed. </para
+><para
+>Real võtmesõnaga "&#36;Log&#36;" seisab alguses kaks "*", millele järgneb tühik. &kdiff3; hindab esimese mittetühimärgist stringi "kommentaari alguseks" ning eeldab, et ajalugu lõpeb esimesel real, millel kommentaari algust enam ei seisa. Näites lõpeb viimane rida stringiga, mille alguses on samuti kaks "*", kuid tühimärgi asemel järgneb veel rida märke "*". Seetõttu hinnatakse seda ajaloo lõpuks. </para
+><para
+>Kui ajaloo sortimist pole vaja, siis võib ajalookirje alguse regulaaravaldis näha välja umbes järgmine (rida on jagatud kaheks, sest see ei mahu muidu ära). <screen>
+\s*\\main\\\S+\s+[0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
+ [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*
+</screen
+> Täpsemalt kõneleb regulaaravaldistest <ulink url="http://doc.trolltech.com/3.3/qregexp.html#details"
+> Trolltechi regulaaravaldiste dokumentatsioon</ulink
+>. Pane tähele, et "\s" (väike "s") on suvaline tühik, "\S" (suur "S") iga mittetühik. Meie näites sisaldab ajalookirje algul versiooniteavet vastavalt regulaaravaldisele "\\main\\\S+", kuupäeva päevaga  "[0-9]+", kuuga "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)" ja aastaga "[0-9][0-9][0-9][0-9]", kellaaega "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" ning lõpuks ka arendaja kasutajanime ".*". </para
+><para
+>Pane tähele, et kommentaari alguse märgid (näites  "**") eemaldab &kdiff3; juba enne otsingu alustamist, mistõttu regulaaravaldise alguses seisab nulli või enama tühimärgi vaste "\s*". Et kommentaarimärgid võivad failiti erineda (nt. C/C++ kasutab teistsuguseid kommentaarimärke kui Perli skript), kannab &kdiff3; ise alguses seisvate kommentaarimärkide eest hoolt ja sul pole vaja neid regulaaravaldises määrata. </para
+><para
+>Kui soovid ajalugu sortida, tuleb arvutada sortimisvõti. Selleks tuleb regulaaravaldise vajalikud osad sulgude abil rühmitada (need sulud võivad avaldisse jääda ka siis, kui ajaloo sortimine välja lülitatakse).<screen>
+\s*\\main\\(\S+)\s+([0-9]+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
+ ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)
+</screen
+> Sulgudes on nüüd 1) versiooniteave, 2) kuupäev, 3) kuu, 4) aasta, 5) kellaaeg, 6) nimi. Aga kui me soovime sortida kuupäeva ja kellaaja järgi, tuleb luua võti, milles elemendid on teises järjekoras: esimesena aasta, siis kuu, päev, kellaaaeg, versiooniteave ja nimi. Sestap tuleb sortimisvõtme järjekorraks määrata "4,3,2,5,1,6". </para
+><para
+>Et kuunimed ei ole sortimiseks kuigi head ("Apr" oleks esimene), tuvastab &kdiff3; kuude järjekorra ja kasutab nende nime asemel hoopis järjekorranumbrit ("Apr"->"04"). Kui leitakse number, teisendatakse see neljakohaliseks, lisades sortimise huvides ette nullid. Lõpuks näeb esimese ajalookirje algusrea sortimisvõti välja järgmine: <screen
+>2001 04 0002 10:45:41 integration_branch_12   tom 
+</screen>
+</para
+><para
+>Täpsemalt räägib sellest ka osa <link linkend="mergeoptions"
+>Ühendamise seadistused</link
+>. </para>
+</sect2>
 </sect1>
 
 <sect1 id="navigation"
@@ -610,15 +781,19 @@
 ><para
 >Üles-alla kerimiseks saab kasutada ka hiireratast. </para
 ><para
->Ühndamisväljundi redigeerimisaknas saab samuti kasutada kõiki tavalisi teksti redigeerimisel kasutatavaid klahve. Klahviga Insert saab lülitada lisamis- ja ülekirjutamisrežiimi (vaikimisi kehtib lisamisrežiim). </para
+>Ühendamisväljundi redigeerimisaknas saab samuti kasutada kõiki tavalisi teksti redigeerimisel kasutatavaid klahve. Klahviga Insert saab lülitada lisamis- ja ülekirjutamisrežiimi (vaikimisi kehtib lisamisrežiim). </para
 ><para
->Klõps hiire vasaku nupuga mis tahes kokkuvõttetulbal sünkroniseerib kõik aknad, nii et neid näitavad üht ridadegruppi (seda selgitas lähemalt osa <link linkend="merging"
->Ühendamine</link
+>Klõps hiire vasaku nupuga mis tahes kokkuvõttetulbal sünkroniseerib kõik aknad, nii et neid näitavad üht ridadegruppi (seda selgitas lähemalt osa <link linkend="synchronise_views"
+>Grupi määramine ning ühendamis- ja võrdlemisvaate asukoha sünkroniseerimine</link
 >). </para
 ><para
->Nupureal on seitse liikumisnuppu, millega saab hüpata praegusele/esimesele/viimasele erinevusele, eelmisele/järgmisele erinevusele (Ctrl+Nool üles/Ctrl+Nool alla), eelmisele/järgmisele konfliktile (Ctrl+Page Down/Ctrl+Page Up) või eelmisele/järgmisele lahendamata konfliktile. Pane tähele, et KDiff3 jaoks jääb "konflikt", mida ei lahendata automaatselt ühendamise alguses, "konfliktiks" ka pärast selle käsitsi lahendamist. Seepärast on ka eristatud "lahendamata konfliktid". </para
-><para
->Lisaks neile on nupp "Pärast allikavalikut liigutakse automaatselt järgmisele lahendamata konfliktile". Seda sisse lülitades hüppab KDiff3 allika valimisel automaatsel selles leiduval lahendamata konfliktile. See on abiks, kui soovid tavaliselt valida ainult ühe allika. Kui sul läheb vaja mõlemat allikat või soovid pärast valimist tegelda redigeerimisega, on tõenäoliselt mõttekas see välja lülitada. Enne järgmisele lahendamata konfliktile liikumist näitab KDiff3 hetkeks langetatud valiku toimet. Kui kaua see näitamine kestab, saab määrata seadistustes: "automaatse edasiliikumise viivitus" on võimalik määrata millisekundites 0 ja 2000 vahel. Vihje: kas oled tüdinud kogu aeg klõpsimast? Kasuta siis pisikest automaatse edasiliikumise viivitust ning kiirklahve Ctrl+1/2/3 A/B/C valimiseks. </para>
+>Nupureal on üheksa liikumisnuppu, millega saab hüpata aktiivsele/esimesele/viimasele erinevusele, eelmisele/järgmisele erinevusele (Ctrl+Nool üles/Ctrl+Nool alla), eelmisele/järgmisele konfliktile (Ctrl+Page Down/Ctrl+Page Up) või eelmisele/järgmisele lahendamata konfliktile. Pane tähele, et &kdiff3; jaoks jääb "konflikt", mida ei lahendata automaatselt ühendamise alguses, "konfliktiks" ka pärast selle käsitsi lahendamist. Seepärast on ka eristatud "lahendamata konfliktid". </para>
+<sect2 id="autoadvance"
+><title
+>Automaatne edasiliikumine</title>
+<para
+>Lisaks neile on nupp "Pärast allikavalikut liigutakse automaatselt järgmisele lahendamata konfliktile". Seda sisse lülitades hüppab &kdiff3; allika valimisel automaatsel selles leiduval lahendamata konfliktile. See on abiks, kui soovid tavaliselt valida ainult ühe allika. Kui sul läheb vaja mõlemat allikat või soovid pärast valimist tegelda redigeerimisega, on tõenäoliselt mõttekas see välja lülitada. Enne järgmisele lahendamata konfliktile liikumist näitab &kdiff3; hetkeks langetatud valiku toimet. Kui kaua see näitamine kestab, saab määrata seadistustes: "automaatse edasiliikumise viivitus" on võimalik määrata millisekundites 0 ja 2000 vahel. Vihje: kas oled tüdinud kogu aeg klõpsamast? Kasuta siis pisikest automaatse edasiliikumise viivitust ning kiirklahve Ctrl+1/2/3 A/B/C valimiseks. </para>
+</sect2>
 </sect1>
 
 <sect1 id="selections"
@@ -627,33 +802,109 @@
 <para
 >Sisendaknas kursorit ei näidata, seepärast tuleb valimine teha hiirega, klõpsates vasaku nupuga valiku alguses, hoides nuppu all ja liikudes valiku lõppu, pärast mida võib nupu vabastada. Sõna saab valida ka sellel topeltklõpsu tehes. Ühendamisväljundi redigeerimisaknas saab valida ka klaviatuuri abil, hoides all klahvi Shift ja liikudes noolenuppudega. </para
 ><para
+>Kui valik ulatub üle nähtava ala, võib viia hiire üle akna piirde, millisel juhul &kdiff3; kerib hiirekursori suunas. </para
+><para
+>Väga suure valiku korral võib kasutada ka hiirenuppu all hoides navigeerimisklahve. Näiteks konkreetsesse kohta jõudmiseks võib tarvitada klahve Page Up ja Page down. Õigesse kohta jõudes vabasta hiirenupp. </para
+><para
+>Aktiivses aknas kõige valimiseks kasuta menüükäsku "Redigeerimine"->"Vali kõik" (Ctrl+A). </para
+><para
 >Lõikepuhvrisse kopeerimiseks tuleb vajutada nuppu "Kopeeri" (Ctrl+C või Ctrl+Insert). Lisaks sellele on olemas ka võimalus "Valiku automaatne kopeerimine". Selle sisselülitamisel kopeeritakse kõik, mida oled valinud, automaatselt ning sul puudub vajadus anda mis tahes moel kopeerimiskäsku. Kuid ole selle võimalusega ettevaatlik, sest nii võib kogemata üle kirjutada vajaliku lõikepuhvri sisu. </para
 ><para
->Käsk "Lõika" (Ctrl+X või Shift+Delete) kopeerib valitud teksti lõikepuhvisse ning kustutab selle, "Aseta" (Ctrl+V või Shift+Insert) aga asetab lõikepuhvris oleva teksti kursori asukohta või aktiivse valiku asemele. </para>
+>"Lõika" (Ctrl+X või Shift+Delete) kopeerib valiku lõikepuhvrisse ja kustutab selle failist. </para
+><para
+>"Aseta" (Ctrl+V või Shift+Insert) lisab lõikepuhvris oleva teksti kursori asukohta või asendab lõikepuhvri sisuga parajasti valitud teksti. Kui asetad lõikepuhvri sisu ükspuha millisesse sisendaknasse, näidatakse seda seal otsekohe ja alustatakse aega viitmata uuesti võrdlemist. See on kasulik siis, kui soovid kiiresti kuskilt teksti võtta ja võrrelda seda millegi muuga, ilma et peaksid eelnevalt faili looma hakkama. </para>
 </sect1>
 
 <sect1 id="saving"
 ><title
 >Salvestamine</title>
 <para
->Salvestamine on võimalik ainult siis, kui kõik konfliktid on lahendatud. Kui fail on juba olemas ning sisse on lülitatud valik "Failidest tehakse varukoopia", antakse olemasolevale failile laiend ".orig". Kui selline peaks juba olemas olema, see kustutatakse. Kui väljud või oled alustanud uud võrdlusanalüüsi ning andmeid ei ole veel salvestatud, pärib KDiff3 sinu käest, kas soovid salvestada, loobuda või jätkata ilma salvestamata (KDiff3 ei salvesta andmeid seesmiselt, nii et kui KDiff3 väljastpoolt "tappa", lähevad andmed kaotsi). </para
+>Salvestamine on võimalik ainult siis, kui kõik konfliktid on lahendatud. Kui fail on juba olemas ning sisse on lülitatud valik "Failidest tehakse varukoopia", antakse olemasolevale failile laiend ".orig". Kui selline peaks juba olemas olema, see kustutatakse. Kui väljud või oled alustanud uud võrdlusanalüüsi ning andmeid ei ole veel salvestatud, pärib &kdiff3; sinu käest, kas soovid salvestada, loobuda või jätkata ilma salvestamata (&kdiff3; ei salvesta andmeid seesmiselt, nii et kui &kdiff3; väljastpoolt "tappa", lähevad andmed kaotsi). </para
 ><para
->Realõpud salvestatakse vastavalt operatsioonisüsteemi tavale. UNIXi korral lõpetab rea reavahetusmärk "\n", Win32 süsteemides kelgu tagastamise sümbol pluss reavahetusmärk "\r\n". KDiff3 ei säilita sisendfailide realõppe, mis ühtlasi tähendab, et KDiff3 kasutamisel binaarfailidega peaks olema erakordselt ettevaatlik. </para>
+>Realõpud salvestatakse vastavalt operatsioonisüsteemi tavale. UNIXi korral lõpetab rea reavahetusmärk "\n", Win32 süsteemides kelgu tagastamise sümbol pluss reavahetusmärk "\r\n". &kdiff3; ei säilita sisendfailide realõppe, mis ühtlasi tähendab, et &kdiff3; kasutamisel binaarfailidega peaks olema erakordselt ettevaatlik. </para>
 </sect1>
 
 <sect1 id="find"
 ><title
 >Stringide otsimine</title>
 <para
->Stringe saab otsida KDiff3 kõigis tekstiakendes. Redigeerimismenüü käsk "Otsi..." (Ctrl+F) avab dialoogi, kus saab määrata, mida otsida. Samuti saab valida, millises aknas otsida. Otsimine algab alati teksti algusest. Käsk "Otsi järgmine" (F3) viib otsitava stringi järgmise esinemise juurde (kui seda muidugi on). Kui valid otsimise mitmes aknas, otsitakse esmalt ülalt alla läbi esimene aken, seejärel taas ülalt alla teine aken jne. </para>
+>Stringe saab otsida &kdiff3; kõigis tekstiakendes. Redigeerimismenüü käsk "Otsi..." (Ctrl+F) avab dialoogi, kus saab määrata, mida otsida. Samuti saab valida, millises aknas otsida. Otsimine algab alati teksti algusest. Käsk "Otsi järgmine" (F3) viib otsitava stringi järgmise esinemise juurde (kui seda muidugi on). Kui valid otsimise mitmes aknas, otsitakse esmalt ülalt alla läbi esimene aken, seejärel taas ülalt alla teine aken jne. </para>
 </sect1>
 
+<sect1 id="printing"
+><title
+>Trükkimine</title>
+<para
+>&kdiff3; toetab tekstifailide erinevuste trükkimist. Menüüs fail leiduv käsk "Trüki..." (Ctrl+P) avab dialoogi, kus saab valida printeri ja muuta teatud valikuid. </para
+><para
+>Mitmel moel saab kindlaks määrata, millist vahemikku trükkida. Et erinevates operatsioonisüsteemides on trükkimisdialoog erinev, siis on ka trükkimisvahemiku määramises teatud erinevusi. </para>
+<variablelist>
+   <varlistentry
+><term
+>Kõik:</term
+><listitem
+><para
+>Trükitakse kõik.</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+>Aktiivne:</term
+><listitem
+><para
+>Trükitakse lehekülg alates aknas esimesena näha olevast reast (süsteemides, kus seda valikut pole, saab sama tulemusi, kui määrata trükkimiseks lehkülg 10000).</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+>Valik:</term
+><listitem
+><para
+>Enne trükkimiskäsku tuleb sel juhul valida mõnes sisendaknas hiirega tekst (nagu kopeerimisel), mis paneb paika trükitava valiku algus- ja lõpurea. Kui üheski sisendaknas pole midagi valitud, ei saa seda võimalust kasutada (süsteemides, kus see valik üldse puudub, saab sama tulemuse, kui määrata trükkimiseks lehekülg 9999).</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+>Vahemik:</term
+><listitem
+><para
+>Trükitakse määratud esimesest kuni määratud viimase leheküljeni. </para
+></listitem
+></varlistentry>
+</variablelist>
+<para
+>Ülejäänud trükkimisvalikud on tavapärasemad: </para
+><itemizedlist>
+   <listitem
+><para
+>Font, fondi suurus</para
+></listitem>
+   <listitem
+><para
+>Reanumbrite näitamine</para
+></listitem>
+   <listitem
+><para
+>Reamurdmine</para
+></listitem>
+   <listitem
+><para
+>Värvid</para
+></listitem>
+   <listitem
+><para
+>jne.</para
+></listitem>
+</itemizedlist>
+<para
+>Trükkida on soovitatav rõhtpaigutusega. </para>
+</sect1>
 
 <sect1 id="options"
 ><title
 >Valikud</title>
 <para
->Valikud ja viimati avatud failide nimekiri salvestatakse alati, kui rakendusest väljud, ning laaditakse uuesti rakenduse taaskäivitamisel (menüükäsk Seadistused -> KDiff3 seadistamine...) </para>
+>Valikud ja viimati avatud failide nimekiri salvestatakse alati, kui rakendusest väljud, ning laaditakse uuesti rakenduse taaskäivitamisel (menüükäsk Seadistused -> &kdiff3; seadistamine...) </para>
 <sect2
 ><title
 >Font</title>
@@ -767,8 +1018,60 @@
 >Tavaliselt tumekollane.</para
 ></listitem
 ></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Käsitsi määratud samasuse vahemiku värv:</emphasis
+></term
+><listitem
+><para
+>Tavaliselt oranž.</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Uusima faili värv kataloogide võrdlemisel:</emphasis
+></term
+><listitem
+><para
+>Tavaliselt roheline.</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Vanima faili värv kataloogide võrdlemisel:</emphasis
+></term
+><listitem
+><para
+>Tavaliselt punane.</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Keskmise vanusega faili värv kataloogide võrdlemisel:</emphasis
+></term
+><listitem
+><para
+>Tavaliselt tumekollane.</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Puuduvate failide värv kataloogide võrdlemisel:</emphasis
+></term
+><listitem
+><para
+>Tavaliselt must.</para
+></listitem
+></varlistentry>
 </variablelist>
 <para
+>Kataloogide võrdlemise värvide muutmine rakendub alles järgmise kataloogide võrdlemise ajal. </para>
+<para
 >Ainult 16 või 256 värviga süsteemides ei pruugi mõned värvid puhtal kujul saadaval olla. Sellistes süsteemides valib puhta värvi nupp "Vaikeväärtused". </para>
 </sect2>
 
@@ -826,24 +1129,14 @@
 >Salvestamisel saab valida, millist realõpu stiili eelistada. Vaikimisi on see valitud operatsioonisüsteemi põhjal. </para
 ></listitem
 ></varlistentry>
-   <varlistentry
-><term
-><emphasis
->Kohaliku kodeeringu kasutamine:</emphasis
-></term
-><listitem
-><para
->Mitte-ladina sümbolite näitamiseks. Tasub kasutada, kui mõningaid sinu keele sümboleid ei näidata korrektselt. </para
-></listitem
-></varlistentry>
 </variablelist>
 </sect2>
 
-<sect2
+<sect2 id="diffoptions"
 ><title
->Erinevuse ja ühendamise seadistused</title>
+>Erinevuse seadistused</title>
 <para
->Faile võrreldes püüab KDiff3 kõigepealt seada kokku read, mis on kõigis sisendfailides ühtmoodi. Ainult sel etapil võib ta eirata tühimärke. Teisel etapil võrreldakse iga rida ning nüüd võetakse arvesse ka tühimärgid. Tühimärke ei ignoreerita ka ühendamisel. </para>
+>Faile võrreldes püüab &kdiff3; kõigepealt seada kokku read, mis on kõigis sisendfailides ühtmoodi. Ainult sel etapil võib ta eirata tühimärke. Teisel etapil võrreldakse iga rida ning nüüd võetakse arvesse ka tühimärgid. Tühimärke ei ignoreerita ka ühendamisel. </para>
 
 <variablelist>
    <varlistentry
@@ -853,7 +1146,7 @@
 ></term
 ><listitem
 ><para
->Mõned redaktorid mõnes süsteemis salvestavad iga rea lõpu kelgu tagastuse märgiga '\r' ning reavahetusmärgiga '\n', teised aga ainult reavahetusmärgiga '\n'. Üldiselt KDiff3 ignoreerib kelgu tagastuse sümbolit, kuid sellisel juhul võivad tegelikult erineva suurusega failid paista võrdlemisel ühesugustena. Selle valiku sisselülitamisel on kelgutagatusmärgid näha, kuid neid koheldakse tühimärkidena. Ühendamise ajal tuleb see võimalus välja lülitada. Vaikimisi on väljas.</para
+>Mõned redaktorid mõnes süsteemis salvestavad iga rea lõpu kelgu tagastuse märgiga '\r' ning reavahetusmärgiga '\n', teised aga ainult reavahetusmärgiga '\n'. Üldiselt &kdiff3; ignoreerib kelgu tagastuse sümbolit, kuid sellisel juhul võivad tegelikult erineva suurusega failid paista võrdlemisel ühesugustena. Selle valiku sisselülitamisel on kelgutagatusmärgid näha, kuid neid koheldakse tühimärkidena. Ühendamise ajal tuleb see võimalus välja lülitada. Vaikimisi on väljas.</para
 ></listitem
 ></varlistentry>
    <varlistentry
@@ -883,7 +1176,7 @@
 ></term
 ><listitem
 ><para
->Vaikimisi väljas. Tähtede tõstu erinevusi (näiteks 'A' vs. 'a') tõlgendatakse tühimärkide muudatustena. </para
+>Vaikimisi väljas. Märkide tõstu erinevusi (nt 'A' ja 'a') tõlgendatakse nagu tühimärkide muudatusi. </para
 ></listitem
 ></varlistentry>
    <varlistentry
@@ -920,6 +1213,13 @@
 >Püüab tuvastada ka kõige pisemad erinevused. Vaikimisi sees. Ilmselt on sellest rohkem kasu keerulisemate ja suurte failide korral. Aga mõistagi on see väga suurte failide puhul ka väga aeglane. </para
 ></listitem
 ></varlistentry>
+</variablelist>
+</sect2>
+
+<sect2 id="mergeoptions"
+><title
+>Ühendamise seadistused</title>
+<variablelist>
    <varlistentry
 ><term
 ><emphasis
@@ -940,6 +1240,112 @@
 >Lahendab automaatselt kõik tühimärkide konfliktid määratud faili valides (vaikimisi käsitsivalik). Kasulik, kui tühimärgid pole olulise tähtsusega. Kui seda läheb ainult mõnikord vaja, kasuta parem ühendamismenüü käske "Vali A/B/C kõigi lahendamata tühimärgikonfliktide korral". Pane tähele, et kui sees on "Numbreid ignoreeritakse" või "C/C++ kommentaare ignoreeritakse", rakendub see automaatne valik ka kõigile numbrite või kommentaaride konfliktidele. </para
 ></listitem
 ></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Automaatühendamise regulaaravaldis:</emphasis
+></term
+><listitem
+><para
+>Regulaaravaldis ridadele, mille puhul &kdiff3; peab automaatselt valima allika. Vt. ka <link linkend="vcskeywordsmergesupport"
+>Automaatne ühendamine...</link
+> </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Regulaaravaldisega automaatühendamine ühendamise alustamisel:</emphasis
+></term
+><listitem
+><para
+>Valimise korral käivitab &kdiff3; ühendamise alustamisel automaatse ühendamise, kasutades selleks "automaatühendamise regulaaravaldist". </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Ajaloo alguse regulaaravaldis:</emphasis
+></term
+><listitem
+><para
+>REgulaaravaldis ajalookirje alguse tuvastamiseks. Tavaliselt sisaldab see rida võtmesõna "&#36;Log&#36;". Vaikimisi: ".*\&#36;Log.*\&#36;.*" </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Ajalookirje alguse regulaaravaldis:</emphasis
+></term
+><listitem
+><para
+>Ühendamise ajaloo kirje koosneb mitmest reast. Siin saab koostada regulaaravaldise, mis tuvastab esimese rea (ilma alustavate kommentaarimärkideta). Sulgudega saab rühmitada võtmed, mida soovid kasutada sortimisel. Tühjaksjätmise korral eeldab &kdiff3;, et ajalookirjeid eraldavad tühjad read. Vaata ka <link linkend="vcskeywordsmergesupport"
+>Automaatne ühendamine...</link
+> </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Ajaloo ühendamise sortimine:</emphasis
+></term
+><listitem
+><para
+>Versioonikontrolli ajaloo sortimise lubamine. </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Ajalookirje alguse sortimisvõtmete järjekord:</emphasis
+></term
+><listitem
+><para
+>Ajalookirje alguse tuvastamiseks kasutatavas regulaaravaldises võib tarvitada sulge, millega rühmitatakse sortimiseks pruugitavad võtmed. Võtmete järjekorra määramiseks (need kujutavad endast arve alates 1) kirjuta nad komaga eraldatult (nt. "4,5,6,1,2,3,7"). Kui see andmata jätta, ei sordita. Vaata ka <link linkend="vcskeywordsmergesupport"
+>Automaatne ühendamine...</link
+> </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Versioonikontrolli ajaloo ühendamine ühendamise alustamisel:</emphasis
+></term
+><listitem
+><para
+>Sisselülitamisel käivitab &kdiff3; ühendamise alustamisel eelnevalt määratud tingimustel automaatse ajaloo ühendamise. </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Ajalookirjete maks. arv:</emphasis
+></term
+><listitem
+><para
+>&kdiff3; kärbib ajaloo, säilitades ainult määratud hulga kirjeid. Kärpimise vältimiseks määra väärtuseks -1. Vaikimisi: -1. </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Regulaaravaldiste test</emphasis
+></term
+><listitem
+><para
+>See nupp avab dialoogi, kus saab sisestatud regulaaravaldist testida ja parandada. Kopeeri lihtsalt vajalikud andmed oma failidest siia. "Sobivuse tulemused" näitavad kohe, kas avaldis sobib või mitte. "Sorteerimisvõtme tulemus" näitab ajaloo ühendamise sortimisel kasutatavat võtit. </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Ebaolulise ühendamise käsk:</emphasis
+></term
+><listitem
+><para
+>Siin saab määrata käsu, mis antakse siis, kui &kdiff3; avastab kolme faili ühendamisel, et fail B ei sisalda mingeid olulisi andmeid, mida poleks juba failis C. Käsk kutsutakse välja kolmest failinimest parameetriga. Andmeid, mis sobivad "automaatse ühendamise regulaaravaldisega" või ajalooga, ei peeta oluliseks. </para
+></listitem
+></varlistentry>
 </variablelist>
 
 </sect2>
@@ -978,7 +1384,7 @@
 ></term
 ><listitem
 ><para
->Kasutajaliidese keele määramine. Selle muutmine ei mõjuta töötavat rakendust. Keele muutmiseks tuleb KDiff3 sulgeda ja uuesti käivitada. (See valik ei ole kasutatav KDiff3 KDE versioonis, sest seal saab keele määrata KDE üldises seadistuses.) </para
+>Kasutajaliidese keele määramine. Selle muutmine ei mõjuta töötavat rakendust. Keele muutmiseks tuleb &kdiff3; sulgeda ja uuesti käivitada. (See valik ei ole kasutatav &kdiff3; KDE versioonis, sest seal saab keele määrata KDE üldises seadistuses.) </para
 ></listitem
 ></varlistentry>
     <varlistentry
@@ -1038,7 +1444,7 @@
 ></term
 ><listitem
 ><para
->Mõningaid keeli kirjutatakse paremalt vasakule. Selle valiku sisselülitamisel näitab KDiff3 võrdluse sisendakendes ja ühendamise väljundaknas teksti paremalt vasakule. Pane tähele, et kui käivitad KDiff3 käsurealt võtmega "--reverse", kasutab kogu rakendus paremalt vasakule paigutust (seda võimaldab Qt). Käesolev käsiraamat on kirjutatud eeldusel, et "Paremalt vasakule keeled" ega võti "reverse" ei ole kasutusel. Sestap tuleb nende kasutamisel mõningaid "vasakul" või "paremal" antud kirjeldusi lugeda lihtsalt selle teadmise valguses vastupidi. </para
+>Mõningaid keeli kirjutatakse paremalt vasakule. Selle valiku sisselülitamisel näitab &kdiff3; võrdluse sisendakendes ja ühendamise väljundaknas teksti paremalt vasakule. Pane tähele, et kui käivitad &kdiff3; käsurealt võtmega "--reverse", kasutab kogu rakendus paremalt vasakule paigutust (seda võimaldab Qt). Käesolev käsiraamat on kirjutatud eeldusel, et "Paremalt vasakule keeled" ega võti "reverse" ei ole kasutusel. Sestap tuleb nende kasutamisel mõningaid "vasakul" või "paremal" antud kirjeldusi lugeda lihtsalt selle teadmise valguses vastupidi. </para
 ></listitem
 ></varlistentry>
 
@@ -1150,7 +1556,7 @@
 ><title
 >Eeltöötluse käsud:</title>
 <para
->KDiff3 toetab kaht eeltöötluse võimalust. </para
+>&kdiff3; toetab kaht eeltöötluse võimalust. </para
 ><para>
 <variablelist>
    <varlistentry
@@ -1222,7 +1628,7 @@
 ><title
 ><command
 >sed</command
-> põhitõed</title>
+>'i põhitõed</title>
 <para
 >Selles osas tutvustame ainult programmi <command
 >sed</command
@@ -1234,11 +1640,15 @@
 > http://unxutils.sourceforge.net</ulink
 >. Pane tähele, et järgmistes näidetes eeldame, et käsk <command
 >sed</command
-> asub mõnes keskkonnamuutujaga PATH määratud kataloogis. Kui see nii ei ole, tuleb sul määrata käsu täielik asukoht. Pane tähele ka seda, et järgnevates näidetes on kasutatud ühekordset jutumärki ('), mis Windowsis ei toimi - seal tuleb kasutada topeltjutumärke ("). </para>
+> asub mõnes keskkonnamuutujaga PATH määratud kataloogis. Kui see nii ei ole, tuleb sul määrata käsu täielik asukoht. </para>
+<note
+><para
+>Pane tähele ka seda, et järgnevates näidetes on kasutatud ühekordset jutumärki ('), mis Windowsis ei toimi - seal tuleb kasutada topeltjutumärke (").</para
+></note>
 <para
 >Antud kontekstis kasutatakse ainult <command
 >sed</command
->-i asenduskäsku: <screen>
+>'i 'asenduskäsku: <screen>
    <command
 >sed</command
 > 's/<replaceable
@@ -1249,7 +1659,7 @@
 >LIPUD</replaceable
 >'
 </screen
-> Enne uue käsu kasutamist KDiff3-ga võiks seda esmalt testida konsoolil. Siin tuleb kasuks käsk <command
+> Enne uue käsu kasutamist &kdiff3;-ga võiks seda esmalt testida konsoolil. Siin tuleb kasuks käsk <command
 >echo</command
 >. Näide: <screen>
    <command
@@ -1259,7 +1669,7 @@
 > 's/a/o/'
    -> obrakadabra
 </screen
-> Toodud näites on tegemist äärmiselt lihtsa sed-käsuga, kus asendatakse esimene "a" "o"-ga. Kui soovid asendada kõik esinemiskorrad, tuleb kasutada lippu "g"-flag: <screen>
+> Toodud näites on tegemist äärmiselt lihtsa sed-käsuga, kus asendatakse esimene "a" "o"-ga. Kui soovid asendada kõik esinemiskorrad, tuleb kasutada lippu "g": <screen>
    <command
 >echo</command
 > abrakadabra | <command
@@ -1290,12 +1700,12 @@
 ><title
 >Näited <command
 >sed</command
->-i kasutamise kohta KDiff3-ga</title>
+>'i kasutamise kohta &kdiff3;-ga</title>
 <sect3
 ><title
 >Muud tüüpi kommentaaride ignoreerimine</title>
 <para
->Praegu mõistab KDiff3 ainult C/C++ kommentaare. Reasobivuse eeltöötluse käsuga saab aga ignoreerida ka muud tüüpi kommentaare, teisendades need C/C++ kommentaarideks. Näide: kui soovid ignoreerida kommentaare, mille alguses on "#", tuleks need teisendada nii, et alguses oleks "//". Pane tähele, et seejuureks peaks olema võimalus "C/C++ kommentaare ignoreeritakse" olema sisse lülitatud, muidu pole asjal mõtet. Vastav reasobivuse eeltöötluse käsk näeb välja selline: <screen>
+>Praegu mõistab &kdiff3; ainult C/C++ kommentaare. Reasobivuse eeltöötluse käsuga saab aga ignoreerida ka muud tüüpi kommentaare, teisendades need C/C++ kommentaarideks. Näide: kui soovid ignoreerida kommentaare, mille alguses on "#", tuleks need teisendada nii, et alguses oleks "//". Pane tähele, et seejuureks peaks olema võimalus "C/C++ kommentaare ignoreeritakse" sisse lülitatud, muidu pole asjal mõtet. Vastav reasobivuse eeltöötluse käsk näeb välja selline: <screen>
    <command
 >sed</command
 > 's/#/\/\//'
@@ -1304,7 +1714,9 @@
 >sed</command
 > omistab sümbolile "/" eritähenduse, on oluline asetada asendusstringis iga "/" ette sümbol "\". Mõnikord on "\" vajalik teatud ertähendusega sümbolite lisamiseks või eemaldamiseks. Nüüd on olulised üksikjutumärgid (') enne ja pärast asenduskäsku, sest vastasel juhul püüab shell mõningaid erisümboleid, näiteks '#', '$' või '\' tõlgendada juba enne nende edastamist käsule <command
 >sed</command
->. Pane tähele, et Windowsis tuleb anda topeltjutumärgid ("). Windows asendab ka muid sümboleid, näiteks '%', nii et siin võib olla vajalik veidi eksperimenteerida. </para>
+>. <emphasis
+>Pane tähele, et Windowsis tuleb anda topeltjutumärgid ("). Windows asendab ka muid sümboleid, näiteks '%', nii et siin võib olla vajalik veidi eksperimenteerida.</emphasis
+> </para>
 </sect3>
 <sect3
 ><title
@@ -1322,7 +1734,7 @@
 ><title
 >Versioonikontrolli võtmesõnade ignoreerimine</title>
 <para
->CVS ja muud versioonikontrolli süsteemid kasutavad mitmeid võtmesõnu automaatselt genereeritavate stringide lisamiseks (<ulink url="info:/cvs/Keyword substitution"
+>CVS ja muud versioonikontrollisüsteemid kasutavad mitmeid võtmesõnu automaatselt genereeritavate stringide lisamiseks (<ulink url="info:/cvs/Keyword substitution"
 >info:/cvs/Keyword substitution</ulink
 >). Kõik need järgivad mustrit "$VÕTMESÕNA genereeritud tekst$". Nüüd läheb meil vaja reasobivuse eeltöötluse käsku, mis eemaldaks ainult genereeritud teksti: <screen>
    <command
@@ -1333,7 +1745,7 @@
 <para
 >Kui katsetad <command
 >sed</command
->-iga, hakkad arvatavasti veidi aduma regulaaravaldiste mõtet ja võib-olla isegi neid armastama. Iseenesest on regulaaravaldised väga kasulikud, sest päris paljud programmid toetavad sarnast võimalust. </para>
+>'iga, hakkad arvatavasti veidi aduma regulaaravaldiste mõtet ja võib-olla isegi neid armastama. Iseenesest on regulaaravaldised väga kasulikud, sest päris paljud programmid toetavad sarnast võimalust. </para>
 </sect3>
 
 <sect3
@@ -1379,13 +1791,13 @@
 ><title
 ><command
 >perl</command
->-i kasutamine <command
+>i kasutamine <command
 >sed</command
->-i asemel</title>
+>'i asemel</title>
 <para
 ><command
 >sed</command
->-i asemel võib kasutada ka midagi muud, näiteks <command
+>'i asemel võib kasutada ka midagi muud, näiteks <command
 >perl</command
 >. <screen>
    <command
@@ -1459,7 +1871,7 @@
 <para
 >Eeltöötluse käsud on sageli vägagi kasulikud, aga nagu ikka võimalustega, mis muudavad sinu teksti või peidavad automaatselt teatud erinevused, võib sel moel kogemata mõningad erinevused kahe silma vahele jätta või eriti halval juhul isegi olulised andmed hävitada. </para
 ><para
->Seetõttu teatab KDiff3 ühendamisel sellest, et kasutatakse tavalist eeltöötluse käsku, ning pärib, kas seda lubada vi mitte. Kuid sind ei hoiatata, kas reasobivuse eeltöötluse on aktiivne või mitte. Ühendamine on valmis alles siis, kui kõik konfliktid on lahendatud. Kui lülitad välja võimaluse "Tühimärkide näitamine", siis on nähtamatud ka erinevused, mis eemaldati reasobivuse eeltöötluse käsuga. Kui ühendamisel ei saa kasutada nuppu 'Salvesta' (sest failis on veel konflikte), lülita "tühimärkide näitamine" sisse. Kui sa ei soovi neid enamasti vähese tähtsusega erinevusi käsitsi ühendada, vali ühendamismenüüst käsk "Vali [A|B|C] kõigi lahendamata tühimärgikonfliktide korral". </para>
+>Seetõttu teatab &kdiff3; ühendamisel sellest, et kasutatakse tavalist eeltöötluse käsku, ning pärib, kas seda lubada või mitte. Kuid sind ei hoiatata, kas reasobivuse eeltöötluse on aktiivne või mitte. Ühendamine on valmis alles siis, kui kõik konfliktid on lahendatud. Kui lülitad välja võimaluse "Tühimärkide näitamine", siis on nähtamatud ka erinevused, mis eemaldati reasobivuse eeltöötluse käsuga. Kui ühendamisel ei saa kasutada nuppu 'Salvesta' (sest failis on veel konflikte), lülita "tühimärkide näitamine" sisse. Kui sa ei soovi neid enamasti vähese tähtsusega erinevusi käsitsi ühendada, vali ühendamismenüüst käsk "Vali [A|B|C] kõigi lahendamata tühimärgikonfliktide korral". </para>
 </sect2>
 </sect1>
 </chapter>
@@ -1467,14 +1879,14 @@
 
 <chapter id="dirmerge"
 ><title
->Kataloogide võrdlemine ja ühendamine</title>
+>Kataloogide võrdlemine ja ühendamine &kdiff3;-s</title>
 <sect1 id="dirmergeintro"
 ><title
->Sissejuhatus</title>
+>Kataloogide võrdlemise ja ühendamise sissejuhatus</title>
 <para
->Programmeerijad peavad sageli oma eesmärgi saavutamiseks muutma kataloogis paljusid faile. Selle ülesande kergendamiseks võimaldab KDiff3 võrrelda ja ühendada ka terveid katalooge koos nende alamkataloogidega! </para
+>Programmeerijad peavad sageli oma eesmärgi saavutamiseks muutma kataloogis paljusid faile. Selle ülesande kergendamiseks võimaldab &kdiff3; võrrelda ja ühendada ka terveid katalooge koos nende alamkataloogidega! </para
 ><para
->Kuigi kataloogide võrdlemine ja ühendamine tundub olevat üsna lihtne ja selge, tuleks siin siiski arvestada mitme asjaga. Kõige olulisem on kahtlemata see, et sellisel juhul puudutab iga operatsioon paljusid faile korraga. Kui sa ei ole esialgsetest andmetest varukoopiat teinud, võib algoleku taastamine olla väga raske või isegi võimatu. Seepärast kontrolli enne ühendamise alustamist alati, et andmed on turvaliselt varundatud ja et sul on alati võimalus tagasi minna. Kas kasutada arhiveerimist või mõnda versioonide kontrollimise süsteemi, on sinu enda otsustada, kuid pea silmas, et ka ülikogenud programmeerijad vajavad aeg-ajalt vanu alliktekste. Ning ühtlasi arvesta sedagi, et kuigi mina (see tähendab, KDiff3 autor) olen püüdnud anda endast parima, ei saa ma täie kindlusega öelda, et rakendus on ideaalne ja täiesti veatu. Nagu ütleb GNU Üldine Avalik Litsents, ei ole sellel rakendusel MITTE MINGIT garantiid. Seepärast pea alati meeles, et </para>
+>Kuigi kataloogide võrdlemine ja ühendamine tundub olevat üsna lihtne ja selge, tuleks siin siiski arvestada mitme asjaga. Kõige olulisem on kahtlemata see, et sellisel juhul puudutab iga operatsioon paljusid faile korraga. Kui sa ei ole esialgsetest andmetest varukoopiat teinud, võib algoleku taastamine olla väga raske või isegi võimatu. Seepärast kontrolli enne ühendamise alustamist alati, et andmed on turvaliselt varundatud ja et sul on alati võimalus tagasi minna. Kas kasutada arhiveerimist või mõnda versioonikontrollisüsteemi, on sinu enda otsustada, kuid pea silmas, et ka ülikogenud programmeerijad vajavad aeg-ajalt vanu alliktekste. Ning ühtlasi arvesta sedagi, et kuigi mina (see tähendab, &kdiff3; autor) olen püüdnud anda endast parima, ei saa ma täie kindlusega öelda, et rakendus on ideaalne ja täiesti veatu. Nagu ütleb GNU Üldine Avalik Litsents, ei ole sellel rakendusel MITTE MINGIT garantiid. Seepärast pea alati meeles, et </para>
 <blockquote
 ><para>
    <emphasis
@@ -1482,7 +1894,7 @@
 </para
 ></blockquote>
 <para
->Vaatame siis, mida meie rakendus suudab teha. KDiff3... </para>
+>Vaatame siis, mida meie rakendus suudab teha. &kdiff3;... </para>
 <itemizedlist>
      <listitem
 ><para
@@ -1510,7 +1922,7 @@
 ></listitem>
      <listitem
 ><para
->... võimaldab käivitada valitud toimingu kõigil elementidel (klahv F7) või ainult valitud elemendil (klahv F6)</para
+>... võimaldab käivitada valitud toimingu kõigi elementidega (klahv F7) või ainult valitud elemendiga (klahv F6)</para
 ></listitem>
      <listitem
 ><para
@@ -1545,11 +1957,11 @@
 > <replaceable
 >kataloog1 kataloog2</replaceable
 > -o <replaceable
->sihtkataloogr</replaceable
+>sihtkataloog</replaceable
 >
 </screen>
 <para
->Kui sihtkataloogi ei määrata, on KDiff3 jaoks selleks <replaceable
+>Kui sihtkataloogi ei määrata, kasutab &kdiff3; sellena kataloogi <replaceable
 >kataloog2</replaceable
 >. </para>
 </sect2>
@@ -1573,7 +1985,7 @@
 <para
 >Kolme kataloogi ühendamisel võetakse <replaceable
 >kataloog1</replaceable
-> ühendamise baasiks. Kui sihtkataloogi ei ole määratud, on selleks KDiff3 silmis <replaceable
+> ühendamise baasiks. Kui sihtkataloogi ei ole määratud, on selleks &kdiff3; silmis <replaceable
 >kataloog3</replaceable
 >. </para>
 
@@ -1584,11 +1996,11 @@
 
 <sect1 id="dirmergevisible"
 ><title
->Nähtav info</title>
+>Kataloogide ühendamise nähtav info</title>
 <para
 >Kataloogide lugemisel ilmub teatekast, mis näitab edenemise käiku. Kui katkestad kataloogi läbiuurimise, näidatakse ainult neid faile, mida selle hetkeni jõuti võrrelda. </para
 ><para
->Kui kataloogide skaneerimine on lõpule jõudnud, näitab KDiff3 nimekirjakasti, kus vasakul on tulemused... </para>
+>Kui kataloogide skaneerimine on lõpule jõudnud, näitab &kdiff3; nimekirjakasti, kus vasakul on tulemused... </para>
 <screenshot
 ><mediaobject>
 <imageobject
@@ -1610,7 +2022,7 @@
 ><title
 >Nimeveerg</title>
 <para
->Iga skaneerimisel leitud faili ja kataloogi näidatakse puus. Vajaliku elemendi saab valida sellel hiirega klõpsates. </para
+>Kõiki skaneerimisel leitud faile ja katalooge näidatakse puus. Vajaliku elemendi saab valida sellel hiirega klõpsates. </para
 ><para
 >Vaikimisi on kataloogid suletud. Neid saab avada või sulgeda klõpsuga nende ees seisvale "+"/"-" või topeltklõpsuga kirjel või klahvidega Nool vasakule/paremale. Menüüs "Kataloog" on käsud "Ava kõik alamkataloogid" ja "Sule kõik alamkataloogid", mis lubavad korraga avada/sulgeda kõik alamkataloogid. </para
 ><para
@@ -1676,7 +2088,7 @@
 ><title
 >Operatsiooniveerg</title>
 <para
->Pärast kataloogide võrdlemist hindab KDiff3 ühendamise võimalusi. Seda näitab veerg "Operatsioon". Operatsiooni on võimalik muuta, kui klõpsata sellel operatsioonil, mida soovid muuta. Ilmub väike hüpikmenüü, mis lubab valida antud elemendile vajaliku operatsiooni. (Kõige vajalikumad operatsioonid saab valida ka klaviatuurilt, näiteks Ctrl+1/2/3/4/Del valib vastavalt võimalusele A/B/C/Ühenda/Kustuta.) Valitud operatsioon tehakse teoks ühendamise käigus. Valikud sõltuvad elemendist ning ühendamisrežiimist. Viimaseks võib olla üks järgmistest: </para>
+>Pärast kataloogide võrdlemist hindab &kdiff3; ühendamise võimalusi. Seda näitab veerg "Operatsioon". Operatsiooni on võimalik muuta, kui klõpsata sellel operatsioonil, mida soovid muuta. Ilmub väike hüpikmenüü, mis lubab valida antud elemendile vajaliku operatsiooni. (Kõige vajalikumad operatsioonid saab valida ka klaviatuurilt, näiteks Ctrl+1/2/3/4/Del valib vastavalt võimalusele A/B/C/Ühenda/Kustuta.) Valitud operatsioon tehakse teoks ühendamise käigus. Valikud sõltuvad elemendist ning ühendamisrežiimist. Viimaseks võib olla üks järgmistest: </para>
 <itemizedlist>
      <listitem
 ><para
@@ -1688,7 +2100,7 @@
 ></listitem>
      <listitem
 ><para
->Kataloogide sünkroniseerimine (selle saab aktiveerida valikuga "Kataloogide sünkroniseerimine").</para
+>Kahe kataloogi sünkroniseerimine (selle saab aktiveerida valikuga "Kataloogide sünkroniseerimine").</para
 ></listitem>
 </itemizedlist>
 <para
@@ -1728,7 +2140,7 @@
 ></listitem>
      <listitem
 ><para
->... A, B ja C ei ole sama tüüpi (nt. A on kataloog, B fail): "Viga: failitüüpide vastuolu". Kui elemendid on sellised, ei saa kataloogide ühendamist alustada.</para
+>... A, B ja C ei ole sama tüüpi (nt. A on kataloog, B fail): "Viga: failitüüpide konflikt". Kui elemendid on sellised, ei saa kataloogide ühendamist alustada.</para
 ></listitem>
 </itemizedlist>
 <para
@@ -1752,15 +2164,15 @@
 ></listitem>
      <listitem
 ><para
->... A ja B ei ole sama tüüpi (nt. A on kataloog, B fail): "Viga: failitüüpide vastuolu". Kui elemendid on sellised, ei saa kataloogide ühendamist alustada.</para
+>... A ja B ei ole sama tüüpi (nt. A on kataloog, B fail): "Viga: failitüüpide konflikt". Kui elemendid on sellised, ei saa kataloogide ühendamist alustada.</para
 ></listitem>
 </itemizedlist>
 <para
->Sünkroniseerimisrežiimi saab kasutada ainult siis, kui tegemist on kahe kataloogiga, märgitud ei ole konkreetset sihtmärki ning sisse on lülitatud valik "Kataloogide sünkroniseerimine". KDiff3 valib sel juhul vaikeoperatsiooni, et muuta mõlemad kataloogid võrdseks. Juhul kui... </para>
+>Sünkroniseerimisrežiimi saab kasutada ainult siis, kui tegemist on kahe kataloogiga, märgitud ei ole konkreetset sihtmärki ning sisse on lülitatud valik "Kataloogide sünkroniseerimine". &kdiff3; valib sel juhul vaikeoperatsiooni, et muuta mõlemad kataloogid võrdseks. Juhul kui... </para>
 <itemizedlist>
      <listitem
 ><para
->... mõlemad kataloogid on võrdsed: midagi pole teha.</para
+>... mõlemad kataloogid on võrdsed: midagi ei tehta.</para
 ></listitem>
      <listitem
 ><para
@@ -1772,15 +2184,15 @@
 ></listitem>
      <listitem
 ><para
->... A ja B on mõlemad olemas, aga mitte võrdsed: ühenda ja salvesta tulemus mõlemas kataloogis (kasutaja näeb B salvestamist, kuid KDiff3 kopeerib ka B-st A-sse).</para
+>... A ja B on mõlemad olemas, aga mitte võrdsed: ühenda ja salvesta tulemus mõlemas kataloogis (kasutaja näeb B salvestamist, kuid &kdiff3; kopeerib ka B-st A-sse).</para
 ></listitem>
      <listitem
 ><para
->... A ja B ei ole sama tüüpi (nt. A on kataloog, B fail): "Viga: failitüüpide vastuolu". Kui elemendid on sellised, ei saa kataloogide ühendamist alustada.</para
+>... A ja B ei ole sama tüüpi (nt. A on kataloog, B fail): "Viga: failitüüpide konflikt". Kui elemendid on sellised, ei saa kataloogide ühendamist alustada.</para
 ></listitem>
 </itemizedlist>
 <para
->Kui kahe kataloogi ühendamisel on sisse lülitatud valik "Ühendamise asemel kopeeritakse uuem", uurib KDiff3 kuupäevi ning pakub välja uuema faili valimise. Kui failid ei ole võrdsed, ent on sama kuupäevaga, näitab operatsiooniveerg teadet "Viga: kuupäevad on samad, aga mitte failid." Kui kataloogis on selliseid elemente, ei ole võimalik ühendamist alustada. </para>
+>Kui kahe kataloogi ühendamisel on sisse lülitatud valik "Ühendamise asemel kopeeritakse uuem", uurib &kdiff3; kuupäevi ning pakub välja uuema faili valimise. Kui failid ei ole võrdsed, ent on sama kuupäevaga, näitab operatsiooniveerg teadet "Viga: kuupäevad on samad, aga mitte failid." Kui kataloogis on selliseid elemente, ei ole võimalik ühendamist alustada. </para>
 </sect2>
 
 <sect2 id="status"
@@ -1794,7 +2206,46 @@
 ><title
 >Statistikaveerg</title>
 <para
->Kui seadistustes on sisse lülitatud failide võrdlemise režiim "Täielik analüüs", näitab KDiff3 lisatuple, kus on kirjas lahendamata, lahendatud, tühimärkide ja mitte-tühimärkide konfliktide arv. (Lahendatud konflitkide arvuga tulpa näidatakse ainult kolme kataloogi võrdlemisel või ühendamisel.) </para>
+>Kui seadistustes on sisse lülitatud failide võrdlemise režiim "Täielik analüüs", näitab &kdiff3; lisatulpasid, kus on kirjas lahendamata, lahendatud, tühimärkide ja mitte-tühimärkide konfliktide arv. (Lahendatud konflitkide arvuga tulpa näidatakse ainult kolme kataloogi võrdlemisel või ühendamisel.) </para>
+</sect2>
+
+<sect2 id="selectingvisiblefiles"
+><title
+>Nimekirja failide valimine</title>
+<para
+>Seda, millised failid nimekirjas asuvad, saab mitmeti mõjutada. Mõningad valikud leiab <link linkend="dirmergeoptions"
+>seadistustedialoogist</link
+>. Menüü 'Kataloog' sisaldab järgmisi kirjeid: </para
+><para
+><itemizedlist>
+     <listitem
+><para
+>"Näita identseid faile": failid, mis on võrdsed kõigis sisendkataloogides.</para
+></listitem>
+     <listitem
+><para
+>"Näita erinevaid faile": failid, mis on kahes või enamas kataloogis, aga pole võrdsed.</para
+></listitem>
+     <listitem
+><para
+>"Näita ainult A faile": failid, mis on ainult A-s, aga mitte B-s ega C-s.</para
+></listitem>
+     <listitem
+><para
+>"Näita ainult B faile": failid, mis on ainult B-s, aga mitte A-s ega C-s.</para
+></listitem>
+     <listitem
+><para
+>"Näita ainult C faile": failid, mis on ainult C-s, aga mitte A-s ega B-s.</para
+></listitem>
+</itemizedlist
+></para>
+<para
+>Aktiveeri ainult need näitamiskäsud, milliseid elemente soovid näha. Kui tahad näiteks, et nimekirjas oleks kõik elemendid, mis on kas A-s või B-s, aga mitte mõlemas korraga, vali "Näita ainult A faile" ja "Näita ainult B faile" ning lülita välja kõik ülejäänud ("Näita identseid faile", "Näita erinevaid faile", "Näita ainult C faile"). Nimekiri kajastab otsekohe muudatusi. </para
+><para
+>Need käsud rakenduvad ka kataloogidele, kuid ühe erandiga: "Näita erinevaid faile " ei peida ühtegi faile sisaldavat kataloogi. See käib ainult nende sees paiknevate failide kohta. </para
+><para
+>Pane tähele, et ainult käsk "Näita identseid faile" jätab oma oleku meelde, teised on &kdiff3; käivitumisel sisse lülitatud. </para>
 </sect2>
 
 </sect1>
@@ -1802,7 +2253,7 @@
 
 <sect1 id="dothemerge"
 ><title
->Ühendamine</title>
+>Kataloogide ühendamine</title>
 <para
 >Ühendada on võimalik parajasti valitud element (fail või kataloog) või kõik elemendid. Kui oled langetanud kõik operatsioonivalikud (ka alamkataloogides), võid alustada tegelikku ühendamist. </para
 ><para
@@ -1824,11 +2275,15 @@
 ></listitem>
      <listitem
 ><para
->"Ainult erinevuste näitamine": failid, mis on kõigis kataloogides ühesugused, jäävad puus näitamata ja seega ei ole neid ka sihtkataloogis.</para
+><link linkend="selectingvisiblefiles"
+>Näitamisvalikud</link
+> (Näita identseid/erinevaid faile, ainult A/B/C faile)</para
 ></listitem>
 </itemizedlist>
 <para
->(Praeguses versioonis tuleb taasskaneerimine pärast kataloogide skaneerimist mõjutavate valikute muutmist käsuga "Kataloog"->"Uuri uuesti läbi" uuesti ette võtta.) </para
+>Kui muudad seadistusi, et nimekirjas oleks rohkem faile, pead need uuesti läbi uurima menüükäsuga "Kataloog"->"Uuri uuesti" (põhjus seisab selles, et võrdlemiskiiruse tõstmise nimel jätab &kdiff3; vahele nende kriteeriumidega nähtamatuks muudetud failide võrdlemise). Kui muudad faili- ja kataloogimustrit failide väljajätmiseks, uuendatakse failinimekirja otsekohe pärast valikute dialoogi sulgemist. </para
+><para
+>Pane tähele, et kui kirjutad täiesti uude kataloogi, on tavaliselt mõttekas kopeerida ka identsed failid. Selleks tuleb sisse lülitada valik "Näita identseid faile". Kui sihtkataloogiks on mõni sisendkataloogidest, siis ei ole seda vaja, sest fail on ju juba seal olemas. </para
 ><para
 >Kui kõik on korras, siis ülejäänud on juba lihtne. </para
 ><para
@@ -1848,24 +2303,24 @@
 ></listitem>
 </itemizedlist>
 <para
->Seejärel asub KDiff3 kõigi elementidega läbi viima neile määratud operatsioone. Kui vaja läheb käsitsi sekkumist (konkreetse faili ühendamisel), ilmub ühendamisaken (<link linkend="dirmergebigscreenshot"
+>Seejärel asub &kdiff3; kõigi elementidega läbi viima neile määratud operatsioone. Kui vaja läheb käsitsi sekkumist (konkreetse faili ühendamisel), ilmub ühendamisaken (<link linkend="dirmergebigscreenshot"
 >vaata suurt pilti</link
 >). </para
 ><para
->Kui oled faili kallal kõik vajaliku ära teinud, vali uuesti menüükäsk "Alusta/jätka kataloogi ühendamist" või vajuta klahvi F7. Kui sa ei ole veel salvestanud, ilmub dialoog, mis teeb sulle vastava ettepaneku. Seejärel võtab KDiff3 ette järgmise elemendi. </para
+>Kui oled faili kallal kõik vajaliku ära teinud, vali uuesti menüükäsk "Alusta/jätka kataloogi ühendamist" või vajuta klahvi F7. Kui sa ei ole veel salvestanud, ilmub dialoog, mis teeb sulle vastava ettepaneku. Seejärel võtab &kdiff3; ette järgmise elemendi. </para
 ><para
->Kui KDiff3 satub silmitsi veaga, annab ta sellest sulle teada ning näitab ka põhjalikku infot vea kohta, mis võib aidata kaasa arusaamisele, mis viga põhjustas. Kui valid ühendamise jätkamise (klahv F7), võimaldab KDiff3 sul antud elemendi ühendamist uuesti proovida või see vahele jätta. See tähendab, et sa saad enne jätkamist valida mõne muu operatsiooni või jätta hetkel asi nii, nagu on, et leida lahendus hiljem. </para
+>Kui &kdiff3; satub silmitsi veaga, annab ta sellest sulle teada ning näitab ka põhjalikku infot vea kohta, mis võib aidata kaasa arusaamisele, mis viga põhjustas. Kui valid ühendamise jätkamise (klahv F7), võimaldab &kdiff3; sul antud elemendi ühendamist uuesti proovida või see vahele jätta. See tähendab, et sa saad enne jätkamist valida mõne muu operatsiooni või jätta hetkel asi nii nagu on, et leida lahendus hiljem. </para
 ><para
->Kui ühendamine on lõpule jõudnud, annab KDiff3 sellest teatekastiga sulle märku. </para
+>Kui ühendamine on lõpule jõudnud, annab &kdiff3; sellest teatekastiga sulle märku. </para
 ><para
->Kui mõned elemendi on ühendatud individuaalselt, jätab KDiff3 selle (antud ühendamisseansi ajal) meelde ega hakka neid enam ühendama, kui valid hiljem kõigi elementide ühendamise. Isegi juhul, kui ühendamine jäeti tegelikult vahele või midagi ei salvestatud, peetakse neid elemente ühendatuks, nii et nendega saab hakata uuesti tegelema alles siis, kui oled vahetanud ühendamisoperatsiooni. </para>
+>Kui mõned elemendi on ühendatud individuaalselt, jätab &kdiff3; selle (antud ühendamisseansi ajal) meelde ega hakka neid enam ühendama, kui valid hiljem kõigi elementide ühendamise. Isegi juhul, kui ühendamine jäeti tegelikult vahele või midagi ei salvestatud, peetakse neid elemente ühendatuks, nii et nendega saab hakata uuesti tegelema alles siis, kui oled vahetanud ühendamisoperatsiooni. </para>
 </sect1>
 
 <sect1 id="dirmergeoptions"
 ><title
 >Kataloogide võrdlemise ja ühendamise valikud</title>
 <para
->KDiff3 seadistustes (menüükäsk "Seadistused"-&gt;"KDiff3 seadistamine") on sektsioon "Kataloogide ühendamine" järgmiste valikutega: </para>
+>&kdiff3; seadistustes (menüükäsk "Seadistused"-&gt;"&kdiff3; seadistamine") on sektsioon "Kataloogide ühendamine" järgmiste valikutega: </para>
 
 <variablelist>
    <varlistentry
@@ -1895,7 +2350,17 @@
 ></term
 ><listitem
 ><para
->Selle mustriga sobivad failid ja kataloogid jäetakse puust välja. Rohkem kui ühe mustri saab valida, kui kasutada eraldajana semikoolonit ";". Kasutada tohib metamärke '*' ja '?'. Vaikimisi on muster "*.orig;*.o".</para
+>Selle mustriga sobivad failid ja kataloogid jäetakse puust välja. Rohkem kui ühe mustri saab valida, kui kasutada eraldajana semikoolonit ";". Kasutada tohib metamärke '*' ja '?'. Vaikimisi on muster "*.orig;*.o;*.obj".</para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
+>Kataloogide anti-failimustrid:</emphasis
+></term
+><listitem
+><para
+>Selle mustriga sobivad failid ja kataloogid jäetakse puust välja. Rohkem kui ühe mustri saab valida, kui kasutada eraldajana semikoolonit ";". Kasutada tohib metamärke '*' ja '?'. Vaikimisi on muster "CVS;deps;.svn".</para
 ></listitem
 ></varlistentry>
    <varlistentry
@@ -1939,19 +2404,17 @@
 ><para
 >Kui on väljas, võrreldakse nimeviitu, kui sees, peetakse viitu kataloogideks ning neid skaneeritakse rekursiivselt. (Pane tähele, et programm ei kontrolli, kas viit on "rekursiivne", nii et kui viita kataloogile sisaldav kataloog tekitab lõputu silmuse, siis mõne aja pärast, kui pinu on ületäidetud või mälu otsa saab, elab programm üle krahhi.) Vaikimisi väljas.</para
 ></listitem
-></varlistentry
->   
+></varlistentry>
    <varlistentry
 ><term
 ><emphasis
->Ainult erinevuste näitamine:</emphasis
+>Tõstutundlik failinimede võrdlemine:</emphasis
 ></term
 ><listitem
 ><para
->Näidatakse ainult elemente, mis ei ole sisendkataloogides võrdsed ning muudetud faile. Seepärast ei kopeerita ka kataloogides võrdseid faile ühendamisele ning kui sihtkataloog sellist faili eelnevalt ei sisaldanud, võibki see ilma selliste failideta jääda (võimalik, et tulevastes versioonides see valik muutub). Vaikimisi väljas.</para
+>Vaikimisi väär Windowsi ja tõene teiste operatsioonosüsteemide korral.</para
 ></listitem
 ></varlistentry>
-
    <varlistentry
 ><term
 ><emphasis
@@ -2043,21 +2506,33 @@
 
 <sect1 id="other"
 ><title
->Muud funktsioonid</title>
+>Muud funktsioonid kataloogide ühendamise aknas</title>
 <sect2
 ><title
 >Ekraani poolitamine ja täisekraanirežiim</title>
 <para
->Tavaliselt jääb faili võrdlemisel või ühendamisel kataloogi ühndamise nimekiri nähtavale. Hiirega võid aga liigutada failide nimekirja võrdlusaknast eraldavat riba. Kui sa seda soovi, võid menüüst "Kataloog" võmaluse "Poolitamisvaade" välja lülitada. Seejärel võid kasutada menüüs "Kataloog" olevat võimalust "Lülita vaadet", et vahetada kogu ekraani täitvat failinimekirja või võrdlusakna vaadet. </para>
+>Tavaliselt jääb faili võrdlemisel või ühendamisel kataloogi ühendamise nimekiri nähtavale. Hiirega võid aga liigutada failide nimekirja võrdlusaknast eraldavat riba. Kui sa seda ei soovi, võid menüüst "Kataloog" võmaluse "Poolitamisvaade" välja lülitada. Seejärel võid kasutada menüüs "Kataloog" olevat võimalust "Lülita vaadet", et vahetada kogu ekraani täitvat failinimekirja või võrdlusakna vaadet. </para>
 </sect2>
 <sect2
 ><title
 >Ühe faili võrdlemine või ühendamine</title>
 <para
->Võib juhtuda, et eelistad võrdlemiseks kasutada lihtsalt klõpsu failil. Samasugune käsk on siiski olemas ka menüüs "Kataloog". Samuti saab vahetult ühendada konkreetse faili ilma kataloogide ühendamist käivitamata, kui valida menüst "Kataloog" käsk "Ühenda üks fail". Tulemuse salvestamisel märgitakse selles staatuseks "Tehtud" ning kui seejärel käivitada kataloogide ühendamine, seda faili enam ei kaasata. </para
+>Võib juhtuda, et eelistad võrdlemiseks kasutada lihtsalt klõpsu failil. Samasugune käsk on siiski olemas ka menüüs "Kataloog". Samuti saab vahetult ühendada konkreetse faili ilma kataloogide ühendamist käivitamata, kui valida menüüst "Kataloog" käsk "Ühenda üks fail". Tulemuse salvestamisel märgitakse selles staatuseks "Tehtud" ning kui seejärel käivitada kataloogide ühendamine, seda faili enam ei kaasata. </para
 ><para
 >Kuid pane tähele, et see staatus läheb kaduma, kui käivitad uuesti kataloogi skaneerimise (menüü "Kataloog", käsk "Uuri uuesti läbi") </para>
 </sect2>
+<sect2
+><title
+>Erineva nimeta failide võrdlemine või ühendamine</title>
+<para
+>Mõnikord on vaja võrrelda või ühendada erineva nimega faile (nt. aktiivne fail ja sellesama faili varukoopia samas kataloogis). </para
+><para
+>Vali vajalik fail veerus A, B või C ikoonile klõpsates. Esimene nii valitud fail märgitakse A-na, teine ja kolmas B ja C-na sõltumata sellest, millises veerus nad paiknevad. Nii saab valida ainult kuni kolm faili. </para
+><para
+>Jätkamiseks vali menüüst "Kataloog" käsk "Võrdle valitud faile" või "Ühenda valitud failid". Samu käske saab valida ka kontekstimenüüst, kui klõpsata valitud failile hiire parema nupuga. </para
+><para
+>Faili võrdlemine või ühendamine toimub samas aknas. Kataloogide korral avatakse uus aken. </para
+></sect2>
 </sect1>
 </chapter>
 
@@ -2066,12 +2541,12 @@
 >Mitmesugused teemad</title>
 <sect1 id="networktransparency">
 <title
->Võrguläbipaistvus KIO vahendusel</title>
+>Võrguläbipaistvus KIO-moodulite vahendusel</title>
 <sect2
 ><title
 >KIO moodulid</title>
 <para
->KDE toetab võrguläbipaistvust oma KIO moodulite abil. KDiff3 kasutab neid sisendfailide lugemiseks ja kataloogide läbiuurimiseks. See tähendab, et võid faile ja katalooge määrata URL-e kasutades nii kohalikul kui võrgumasinal. </para
+>KDE toetab võrguläbipaistvust oma KIO-moodulite abil. &kdiff3; kasutab neid sisendfailide lugemiseks ja kataloogide läbiuurimiseks. See tähendab, et võid faile ja katalooge määrata URL-e kasutades nii kohalikul kui võrgumasinal. </para
 ><para
 >Näide: </para
 ><para>
@@ -2085,17 +2560,17 @@
 </screen>
 </para>
 <para
->Esimene rida võrdleb kohalikku faili failiga FTP serveril. Teine rida võrdleb kataloogi arhiivifailis kohaliku kataloogiga. </para
+>Esimene rida võrdleb kohalikku faili failiga FTP-serveris. Teine rida võrdleb kataloogi arhiivifailis kohaliku kataloogiga. </para
 ><para
->Muud huvipakkuvad KIO moodulid: </para>
+>Muud huvipakkuvad KIO-moodulid: </para>
 <itemizedlist>
 <listitem
 ><para
->WWW failid (http:)</para
+>WWW-failid (http:)</para
 ></listitem>
 <listitem
 ><para
->FTP failid (ftp:)</para
+>FTP-failid (ftp:)</para
 ></listitem>
 <listitem
 ><para
@@ -2136,7 +2611,7 @@
 ></listitem
 ><listitem
 ><para
->Erisümbolid tuleb alati "päästa" ("#" -> "%23", tühik -> "%20" jne.). Näiteks failil nimega "/#foo#" on URL "file:/%23foo%23". </para
+>Erisümbolid tuleb alati "päästa" ehk varjestada ("#" -> "%23", tühik -> "%20" jne.). Näiteks failil nimega "/#foo#" on URL "file:/%23foo%23". </para
 ></listitem
 ><listitem
 ><para
@@ -2148,11 +2623,11 @@
 
 <sect2
 ><title
->KIO moodulite võimalused</title>
+>KIO-moodulite võimalused</title>
 <para
 >Võrguläbipaistvusel on üks puudus: mitte kõik ressurssid ei paku ühesuguseid võimalusi. </para
 ><para
->Vahel sõltub see serveri failisüsteemis, vahel protokollist. Toome siin ära lühikese piirangute loetelu: </para>
+>Vahel sõltub see serveri failisüsteemist, vahel protokollist. Toome siin ära lühikese piirangute loetelu: </para>
 <itemizedlist>
 <listitem
 ><para
@@ -2184,15 +2659,15 @@
 <para
 >&kdiff3; on KPart. Hetkel on teostatud liides KParts::ReadOnlyPart. </para
 ><para
->Selle peamine kasutusala on erinevuste vaatamine KDevelopis. KDevelop käivitab alati esmalt oma seesmise erinevuste näitaja. KDiff3 väljakutsumiseks klõpsa hiire parema nupuga erinevuste näitaja aknal ja vali kontekstimenüüst "Näita KDiff3-s". </para
+>Selle peamine kasutusala on erinevuste vaatamine KDevelopis. KDevelop käivitab alati esmalt oma seesmise erinevuste näitaja. &kdiff3; väljakutsumiseks klõpsa hiire parema nupuga erinevuste näitaja aknal ja vali kontekstimenüüst "Näita KDiff3-s". </para
 ><para
->KDiff3 vajab tavaliselt sisendiks kaht faili. Komponendina kasutades eeldab KDiff3, et sisendfail on paigafail unifitseeritud vormingus. Seejärel hangib KDiff3 paigafailist algupärased failinimed. Vähemalt üks kahest failist peab olema kättesaadav. Seejärel kutsub KDiff3 välja käsu <command
+>&kdiff3; vajab tavaliselt sisendiks kaht faili. Komponendina kasutades eeldab &kdiff3;, et sisendfail on paigafail unifitseeritud vormingus. Seejärel hangib &kdiff3; paigafailist algupärased failinimed. Vähemalt üks kahest failist peab olema kättesaadav. Seejärel kutsub &kdiff3; välja käsu <command
 >patch</command
 > teise faili taasloomiseks. </para
 ><para
 >Konqueroris võib valida paigafaili ning seejärel kontekstimenüüst "Eelvaatlus KDiff3-s". Arvesta, et see ei toimi, kui ühtegi algupärast faili ei ole saadaval, ning see ei ole eriti usaldusväärne, kui algfaili või ka mõlemat algfaili on muudetud pärast paigafaili loomist. </para
 ><para
->Komponendina käivitades pakub KDiff3 ainult kahe faili võrdlemist, väga pisikest tööriistariba ja menüüd. Ühendamine ega kataloogide võrdlemine ei ole praegu toetatud. </para>
+>Komponendina käivitades pakub &kdiff3; ainult kahe faili võrdlemist, väga pisikest tööriistariba ja menüüd. Ühendamine ega kataloogide võrdlemine ei ole praegu toetatud. </para>
 </sect1>
 </chapter>
 
@@ -2204,7 +2679,7 @@
 <qandaentry
 ><question
 ><para
->Miks on selle nimi "KDiff3"? </para
+>Miks on selle nimi "&kdiff3;"? </para
 ></question
 ><answer
 ><para
@@ -2230,7 +2705,7 @@
 ></question
 ><answer
 ><para
->Kompileerisid ilmselt rakenduse lähtekoodist, kuid jätsid konfigureerimisel korrektse KDE prefiksi määramata. Vaikimisi igatseb .configure paigalduse ette võtta kataloogis /usr/local, kuid sellisel juhul ei leia KDE kasutajaliides ressursifaili (st. kdiff3ui.rc). Korrektsest prefiksist räägib pikemalt fail README. </para
+>Kompileerisid ilmselt rakenduse lähtekoodist, kuid jätsid konfigureerimisel korrektse KDE prefiksi määramata. Vaikimisi igatseb .configure paigalduse ette võtta kataloogis /usr/local, kuid sellisel juhul ei leia KDE kasutajaliides ressursifaili (s.t kdiff3ui.rc). Korrektsest prefiksist räägib pikemalt fail README. </para
 ></answer
 ></qandaentry>
 
@@ -2241,7 +2716,9 @@
 ></question
 ><answer
 ><para
->Ridu, mis erinevad ainult tühimärkide arvu poolest, peetakse algul "võrdseks", samas muudab ka üksainus teistsugune tühimärk failid "erinevaks". Kui sarnased read satuvad teineteise kõrvale, on see tegelikult kokkusattumus, aga õnneks esineb seda päris sageli. </para
+>Ridu, mis erinevad ainult tühimärkide arvu poolest, peetakse algul "võrdseks", samas muudab ka üksainus teistsugune tühimärk failid "erinevaks". Kui sarnased read satuvad teineteise kõrvale, on see tegelikult kokkusattumus, aga õnneks esineb seda päris sageli. Vaata ka <link linkend="manualdiffhelp"
+>Käsitsi erinevused</link
+>. </para
 ></answer
 ></qandaentry>
 
@@ -2259,7 +2736,20 @@
 <qandaentry
 ><question
 ><para
->Miks puudub redaktoril ühendamise tulemuste aknas "tagasivõtmise" funtksioon? </para
+>Kuidas sünkroniseerida erinevuse ja ühendamise vaated, et kõik vaated näitaksid teksti sama asukohta? </para
+></question
+><answer
+><para
+>Klõpsa kokkuvõtetulbal tekstist vasakul (<link linkend="synchronise_views"
+>vaata ka siit</link
+>). </para
+></answer
+></qandaentry>
+
+<qandaentry
+><question
+><para
+>Miks puudub redaktoril ühendamise tulemuste aknas "tagasivõtmise" funktsioon? </para
 ></question
 ><answer
 ><para
@@ -2281,11 +2771,56 @@
 <qandaentry
 ><question
 ><para
->Miks KDiff3 ei toeta süntaksi esiletõstu? </para
+>Miks &kdiff3; ei toeta süntaksi esiletõstu? </para
 ></question
 ><answer
 ><para
->KDiff3 kasutab niigi palju värve erinevuste esiletõstmiseks. Veelgi rohkem värve ajaks asja ainult arusaamatult kirjuks. Kui sa siiski soovid süntaksi esiletõstu, tuleb sul leppida mõne muu redaktoriga. </para
+>&kdiff3; kasutab niigi palju värve erinevuste esiletõstmiseks. Veelgi rohkem värve ajaks asja ainult arusaamatult kirjuks. Kui sa siiski soovid süntaksi esiletõstu, tuleb sul leppida mõne muu redaktoriga. </para
+></answer
+></qandaentry>
+
+<qandaentry
+><question
+><para
+>Kas &kdiff3; võib võrrelda OpenOffice.Org-i, Wordi, Exceli, PDF-faile &etc;? </para
+></question
+><answer
+><para
+>Kuigi &kdiff3; võib analüüsida mis tahes faile, ei ole selle tulemus arvatavasti päris rahuldav. </para
+><para
+>&kdiff3; on mõeldud puhaste tekstifailide võrdlemiseks. OpenOffice, Word, Excel jne. salvestavad oma failidesse märksa rohkem teavet (fontide, piltide, lehekülgede, värvide jms. kohta), millest &kdiff3; ei tea midagi. Seepärast näitab &kdiff3; nende failide sisu puhtalt tekstina tõlgendades, aga see võib osutuda loetamatuks või vähemalt paista üsna veidrana. </para
+><para
+>Et enamik rakendusi salvestab tänapäeval oma failid XML-vormingus, võib seda lugeda ka klaartekstina. Sel juhul võib &kdiff3;-st väikeste erinevuste korral ka abi olla. </para
+><para
+>Kui soovid võrrelda ainult teksti (ilma põimitud objektide, näiteks piltideta), on kõige mõistlikum valida oma rakenduses "Vali kõik" ja "Kopeeri", et kopeerida huvipakkuv tekst lõikepuhvrisse, kust &kdiff3; saab selle asetada mõnda sisendaknasse (vaata ka <link linkend="selections"
+>Valimine, kopeerimine ja asetamine</link
+>). </para
+></answer
+></qandaentry>
+
+<qandaentry
+><question
+><para
+>Kuhu on kadunud kataloogide valik "Näita ainult erinevusi"? </para
+></question
+><answer
+><para
+>Kataloogimenüüs on nüüd mitu <link linkend="selectingvisiblefiles"
+>näitamiskäsku</link
+>. Kui eemaldada märge käsu "Näita identseid faile", on tulemus samasugune nagu varem "Näita ainult erinevusi" korral. </para
+></answer
+></qandaentry>
+
+<qandaentry
+><question
+><para
+>Kuidas valida erinevuse sisendaknas suur hulk teksti - kerimine on nii aeglane? </para
+></question
+><answer
+><para
+>Alusta valimist tavapäraselt (klõpsa ja hoia hiire vasakut nuppu all). Seejärel kasutada vasakut nuppu jätkuvalt all hoides liikumisklahve (nt. Page Up, Page Down). (Vaata ka <link linkend="selections"
+>Valimine, kopeerimine ja asetamine</link
+>.) </para
 ></answer
 ></qandaentry>
 
@@ -2311,20 +2846,20 @@
 <para
 >&kdiff3; - failide ja kataloogide võrdlemise ja ühendamise vahend </para>
 <para
->Rakenduse autoriõigus 2002-2005: Joachim Eibl <email
->joachim.eibl AT gmx.de</email
+>Rakenduse autoriõigus 2002-2007: Joachim Eibl <email
+>joachim.eibl at gmx.de</email
 > </para>
 <para
 >Mitmed lahedad ideed ja vearaportid on pärit minu kolleegidelt ning paljudelt metsiku veebi asukatelt. Tänud teile kõigile! </para>
 
 <para
->Dokumentatsiooni autoriõigus &copy; 2002-2005: Joachim Eibl <email
->joachim.eibl AT gmx.de</email
+>Dokumentatsiooni autoriõigus &copy; 2002-2007: Joachim Eibl <email
+>joachim.eibl at gmx.de</email
 > </para>
 
 <para
 >Tõlge eesti keelde: Marek Laane <email
->bald@online.ee</email
+>bald@starman.ee</email
 ></para
 > 
 &underFDL; &underGPL; </chapter>
@@ -2338,11 +2873,11 @@
 >&kdiff3; hankimine</title>
 
 <para
->KDiff3 uusima versiooni saab alla laadida selle koduleheküljelt <ulink url="http://kdiff3.sourceforge.net"
+>&kdiff3; uusima versiooni saab alla laadida selle koduleheküljelt <ulink url="http://kdiff3.sourceforge.net"
 >http://kdiff3.sourceforge.net</ulink
 >. </para
 ><para
->KDiff3 on saadaval ka muudele platvormidele. Vaata lähemalt koduleheküljelt. </para>
+>&kdiff3; on saadaval ka muudele platvormidele. Vaata lähemalt koduleheküljelt. </para>
 
 
 </sect1>
@@ -2355,7 +2890,7 @@
 >&kdiff3; kõigi omaduste edukaks kasutamiseks on vajalik &kde; 
 >3.1. </para
 ><para
->Infot selle kohta, kuidas panna KDiff3 tööle muudel platvormidel ilma KDE-ta, vaata palun <ulink url="http://kdiff3.sourceforge.net"
+>Infot selle kohta, kuidas panna &kdiff3; tööle muudel platvormidel ilma KDE-ta, vaata palun <ulink url="http://kdiff3.sourceforge.net"
 >koduleheküljelt</ulink
 >. </para
 ><para
@@ -2399,6 +2934,10 @@
 >kde-kataloog</replaceable
 > määrab kataloogi süsteemis, kuhu on paigaldatud KDE. Kui sa ei ole selles kindel, loe faili README. </para>
 <para
+>Kui sa ei kasuta KDE-d, ära kasuta ka skripti <command
+>configure</command
+>, vaid järgi failis README toodud juhiseid ainult Qt-ga süsteemidele.</para>
+<para
 >Kuna &kdiff3; kasutab programme <command
 >autoconf</command
 > ja <command
--- a/kdiff3/doc/fr/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = fr
-
-
--- a/kdiff3/doc/it/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = it
-
-
--- a/kdiff3/doc/nl/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = nl
-
-
--- a/kdiff3/doc/pt/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = pt
-
-
--- a/kdiff3/doc/pt/index.docbook	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/pt/index.docbook	Tue Jan 06 17:51:29 2009 +0000
@@ -33,13 +33,13 @@
 </author>
 <othercredit role="translator"
 ><firstname
->Pedro</firstname
+>José</firstname
 ><surname
->Morais</surname
+>Pires</surname
 ><affiliation
 ><address
 ><email
->morais@kde.org</email
+>jncp@netcabo.pt</email
 ></address
 ></affiliation
 ><contrib
@@ -50,7 +50,7 @@
 
 <copyright>
 <year
->2002-2006</year>
+>2002-2007</year>
 <holder
 >Joachim Eibl</holder>
 </copyright>
@@ -68,9 +68,9 @@
 Do NOT change these in the translation. -->
 
 <date
->2006-05-14</date>
+>2007-31-03</date>
 <releaseinfo
->0.9.90</releaseinfo>
+>0.9.92</releaseinfo>
 
 
 <abstract>
@@ -115,7 +115,7 @@
 </itemizedlist>
 </para
 ><para
->Este documento descreve o &kdiff3; versão 0.9.89. </para>
+>Este documento descreve o &kdiff3; versão 0.9.92. </para>
 </abstract>
 
 <!-- This is a set of Keywords for indexing by search engines.
@@ -650,6 +650,16 @@
 >Em alguns casos, o algoritmo coloca as linhas erradas a seguir umas às outras. Ou se deseja comparar um pedaço de texto com outro que se encontra numa posição completamente diferente no outro ficheiro. Para esses casos, poderá indicar manualmente ao &kdiff3; para alinhar certas linhas. Marque o texto, com o qual deseja melhorar o alinhamento, com o rato como faria na cópia e colagem na primeira janela de diferenças e escolhe então o "Adicionar o Alinhamento Manual das Diferenças" na janela de "Diferenças" (atalho de teclado "Ctrl-Y") . Irá aparecer uma barra laranja na coluna do resumo, a seguir ao texto escolhido. Repita isto para a segunda e (se disponível) a terceira janela de diferenças. O &kdiff3; irá calcular imediatamente de novo as diferenças sempre que fizer isto, alinhando as linhas escolhidas. Obviamente, algumas das linhas anteriormente correspondentes poderão não corresponder mais de novo. </para
 ><para
 >De momento, a junção não suporta a utilização da ajuda de diferenças manual. </para
+></sect2
+><sect2 id="joinsplitsections"
+><title
+>Juntar e Dividir Manualmente Secções de Diferenças</title
+><para
+>Em alguns casos, o &kdiff3; irá ver secções de diferenças a mais ou a menos para a junção. Nesse caso, poderá juntar ou dividir as secções existentes. </para
+><para
+>Adicione secções novas, seleccionando primeiro o texto nas linhas que pertencem em conjunto a qualquer uma das janelas de entrada (como acontece na cópia para a área de transferência). Depois, seleccione a opção "Dividir a Diferença na Selecção", do menu "Juntar". Serão adicionadas divisões antes da primeira linha e depois da última linha do texto seleccionado. Se só quiser adicionar uma secção, então seleccione o texto que começa noutra divisão de secção. </para
+><para
+>Para juntar as secções, seleccione algo nas linhas das secções a juntar, em qualquer uma das janelas de entrada. (Poderá também juntar diversas secções de uma vez). Depois, escolha "Juntar as diferenças seleccionadas" do menu "Juntar". </para
 ></sect2>
 </sect1>
 
@@ -755,7 +765,9 @@
 </screen
 > Para mais detalhes sobre as expressões regulares, veja por favor a <ulink url="http://doc.trolltech.com/3.3/qregexp.html#details"
 >documentação da Trolltech sobre expressões regulares</ulink
->. Repare que o "\s" (com o "s" minúsculo) corresponde a qualquer espaço em branco e o "\S" (com o "S" maiúsculo) corresponde a qualquer carácter não-branco. No nosso exemplo, o início do item de histórico, contém primeiro a informação da versão com a expressão regular "\\principal\\\S+", a data consiste no dia "[0-9]+", mês "(Jan|Fev|Mar|Abr|Mai|Jun|Jul|Ago|Set|Out|Nov|Dez)" e no ano "[0-9][0-9][0-9][0-9]", a hora "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" e, finalmente, o nomes do programador ".*". Lembre-se que o comentário inicial (no exemplo "**") já será removido pelo &kdiff3; antes de tentar a correspondência, logo a expressão regular começa com uma correspondência para zero ou mais caracteres em branco "\s*". </para
+>. Repare que o "\s" (com o "s" minúsculo) corresponde a qualquer espaço em branco e o "\S" (com o "S" maiúsculo) corresponde a qualquer carácter não-branco. No nosso exemplo, o início do item de histórico, contém primeiro a informação da versão com a expressão regular "\\principal\\\S+", a data consiste no dia "[0-9]+", mês "(Jan|Fev|Mar|Abr|Mai|Jun|Jul|Ago|Set|Out|Nov|Dez)" e no ano "[0-9][0-9][0-9][0-9]", a hora "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" e, finalmente, o nomes do programador ".*". </para
+><para
+>Repare nos caracteres do "comentário inicial" (no exemplo "**"), que terão já sido removidos pelo &kdiff3; antes de tentar a junção; como tal, a expressão regular começa com uma correspondência a zero ou mais espaços em branco "\s*". Dado que os caracteres de comentários poderão ser diferentes para cada ficheiro (p.ex., o C/C++ usa caracteres de comentários diferentes de um programa em Perl), o &kdiff3; toma conta dos caracteres de comentário iniciais e você não os deverá definir na expressão regular. </para
 ><para
 >Se precisar de um histórico ordenado, então deverá ser calculada a chave de ordenação. Para tal, as partes relevantes da expressão regular deverão ser agrupadas entre parêntesis. (os parêntesis extra poderão ficar à mesma, mesmo que a ordenação do histórico esteja desactivada.) <screen>
 \s*\\principal\\(\S+)\s+([0-9]+) (Jan|Fev|Mar|Abr|Mai|Jun|Jul|Ago|Set|Out|Nov|Dez)
@@ -768,8 +780,8 @@
 </screen>
 </para
 ><para
->Para mais informações, veja também a <link linkend="diffmergeoptions"
->Configuração de Diferenças e Junção</link
+>Para mais informações, veja também a <link linkend="mergeoptions"
+>Opções de Junção</link
 >. </para>
 </sect2>
 </sect1>
@@ -1133,9 +1145,9 @@
 </variablelist>
 </sect2>
 
-<sect2 id="diffmergeoptions"
+<sect2 id="diffoptions"
 ><title
->Configuração da Diferença e Junção</title>
+>Opções do Diff</title>
 <para
 >Ao comparar os ficheiros, o &kdiff3; tenta primeiro corresponder as linhas iguais em todos os ficheiros de entrada. Só durante este passo é que poderá ignorar os espaços em branco. O segundo passo compara cada uma das linhas. Neste passo, os espaços em branco não serão ignorados. Também durante a junção os espaços em branco não serão ignorados. </para>
 
@@ -1214,6 +1226,13 @@
 >Tenta com mais afinco encontrar um delta ainda menor. (Por omissão está ligado). Isto irá ser efectivo provavelmente para os ficheiros grandes e complicados. Será também lento para os ficheiros muito grandes. </para
 ></listitem
 ></varlistentry>
+</variablelist>
+</sect2>
+
+<sect2 id="mergeoptions"
+><title
+>Configuração da Junção</title>
+<variablelist>
    <varlistentry
 ><term
 ><emphasis
@@ -1313,6 +1332,16 @@
    <varlistentry
 ><term
 ><emphasis
+>Número máximo de itens do histórico:</emphasis
+></term
+><listitem
+><para
+>O &kdiff3; limita a lista do histórico ao número de itens indicado. Use -1 para evitar a limitação. (Por omissão, é igual a -1). </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
 >Testar as suas expressões regulares</emphasis
 ></term
 ><listitem
@@ -2858,20 +2887,20 @@
 <para
 >&kdiff3; - Ferramenta de Comparação e Junção de Ficheiros e Pastas </para>
 <para
->Programa com 'copyright' 2002-2006 de Joachim Eibl <email
+>Programa com 'copyright' 2002-2007 de Joachim Eibl <email
 >joachim.eibl at gmx.de</email
 > </para>
 <para
 >Vieram várias ideias giras e relatórios de erros dos colegas do autor e de pessoas da Wild Wild Web. Muito obrigado! </para>
 
 <para
->Documentação Copyright &copy; 2002-2006 Joachim Eibl <email
+>Documentação Copyright &copy; 2002-2007 Joachim Eibl <email
 >joachim.eibl at gmx.de</email
 > </para>
 
 <para
->Tradução de Pedro Morais <email
->morais@kde.org</email
+>Tradução de José Nuno Pires <email
+>jncp@netcabo.pt</email
 ></para
 > 
 &underFDL; &underGPL; </chapter>
--- a/kdiff3/doc/sv/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-KDE_DOCS = kdiff3
-KDE_LANG = sv
-
-
--- a/kdiff3/doc/sv/index.docbook	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/doc/sv/index.docbook	Tue Jan 06 17:51:29 2009 +0000
@@ -50,7 +50,7 @@
 
 <copyright>
 <year
->2002-2006</year>
+>2002-2007</year>
 <holder
 >Joachim Eibl</holder>
 </copyright>
@@ -68,9 +68,9 @@
 Do NOT change these in the translation. -->
 
 <date
->2006-05-14</date>
+>2007-31-03</date>
 <releaseinfo
->0.9.90</releaseinfo>
+>0.9.92</releaseinfo>
 
 
 <abstract>
@@ -115,7 +115,7 @@
 </itemizedlist>
 </para
 ><para
->Det här dokumentet beskriver &kdiff3; version 0.9.89. </para>
+>Det här dokumentet beskriver &kdiff3; version 0.9.92. </para>
 </abstract>
 
 <!-- This is a set of Keywords for indexing by search engines.
@@ -637,6 +637,16 @@
 >Ibland placerar algoritmen fel rader intill varandra, eller så vill du jämföra ett textstycke med text på en helt annan position i den andra filen. I dessa fall kan du manuellt tala om för &kdiff3; att vissa rader ska arrangeras i rak linje. Markera texten som du vill arrangera med musen, som du skulle göra vid kopiera och klistra in, i det första jämförelsefönstret och välj därefter "Lägg till manuell justering av jämförelse" i menyn "Jämförelsevy" (snabbtangenten "Ctrl+Y"). En orange rad visas i sammanfattningskolumnen intill den markerade texten. Upprepa det för den andra och (om tillgänglig) tredje jämförelsevyn. &kdiff3; beräknar omedelbart om jämförelsen varje gång du gör det, och radar upp de markerade raderna. Naturligtvis kanske några av raderna som tidigare matchade inte längre matchar. </para
 ><para
 >För närvarande stöder inte sammanfogning användning av manuell hjälp vid jämförelse. </para
+></sect2
+><sect2 id="joinsplitsections"
+><title
+>Manuell ihopfogning och delning av jämförelseavsnitt</title
+><para
+>I vissa fall ser &kdiff3; för många eller för få avsnitt att sammanfoga. I ett sådant fall kan du foga ihop eller dela befintliga avsnitt. </para
+><para
+>Lägg till nya avsnitt genom att först markera texten på raderna som hör ihop i något av indatafönstren (som vid kopiering till klippbordet). Välj därefter "Dela jämförelse vid markering" i menyn "Sammanfoga". Delningen görs ovanför den första raden och under den sista raden i den markerade texten. Om du bara vill lägga till ett avsnitt, markera text som börjar på ett annat avsnitts delning. </para
+><para
+>För att foga ihop avsnitt i något indatafönster, markera någonting på raderna i avsnitten som ska fogas ihop. (Du kan också foga ihop flera avsnitt i ett steg.) Välj därefter "Foga ihop markerade jämförelser" i menyn "Sammanfoga". </para
 ></sect2>
 </sect1>
 
@@ -742,7 +752,9 @@
 </screen
 > För detaljinformation om reguljära uttryck se <ulink url="http://doc.trolltech.com/3.3/qregexp.html#details"
 >Trolltechs dokumentation av reguljära uttryck</ulink
->. Observera att "\s" (med ett litet "s") matchar alla blanktecken och  "\S" (med ett stort "S") matchar alla tecken som inte är blanktecken. I vårt exempel innehåller historikpostens början först versionsinformation med det reguljära uttrycket "\\main\\\S+", datumet som består av dagen "[0-9]+", månaden "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)" och året "[0-9][0-9][0-9][0-9]", tiden "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" och till sist utvecklarens inloggningsnamn ".*". Observera att den inledande kommentaren (i exemplet "**") redan har tagits bort av &kdiff3; innan matchningsförsöket, därför börjar det reguljära uttrycket med en matchning av en eller flera blanktecken "\s*". </para
+>. Observera att "\s" (med ett litet "s") matchar alla blanktecken och  "\S" (med ett stort "S") matchar alla tecken som inte är blanktecken. I vårt exempel innehåller historikpostens början först versionsinformation med det reguljära uttrycket "\\main\\\S+", datumet som består av dagen "[0-9]+", månaden "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)" och året "[0-9][0-9][0-9][0-9]", tiden "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" och till sist utvecklarens inloggningsnamn ".*". </para
+><para
+>Observera att de "inledande kommentartecknen" (i exemplet "**") redan har tagits bort av &kdiff3; innan försöket att matcha, alltså börjar det reguljära uttrycket med att matcha ett eller flera blanktecken "\s*". Eftersom kommentartecken kan skilja sig åt i varje fil (C/C++ använder t.ex. andra kommentartecken än ett Perl-skript), tar &kdiff3; hand om de inledande kommentartecknen och du ska inte ange dem i det reguljära uttrycket. </para
 ><para
 >Om du kräver sorterad historik måste sorteringsnyckeln beräknas. För att göra det måste relevanta delar i det reguljära uttrycket grupperas med parenteser. (De extra parenteserna kan också vara kvar även om historiksortering inaktiveras.) <screen>
 \s*\\main\\(\S+)\s+([0-9]+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
@@ -755,8 +767,8 @@
 </screen>
 </para
 ><para
->För mer information, se också <link linkend="diffmergeoptions"
->Inställningar av jämför och sammanfoga</link
+>För mer information, se också <link linkend="mergeoptions"
+>Inställningar av sammanfoga</link
 >. </para>
 </sect2>
 </sect1>
@@ -1120,9 +1132,9 @@
 </variablelist>
 </sect2>
 
-<sect2 id="diffmergeoptions"
+<sect2 id="diffoptions"
 ><title
->Inställningar av jämför och sammanfoga</title>
+>Inställningar av jämför</title>
 <para
 >När filer jämförs försöker &kdiff3; först att matcha rader som är lika i alla indatafiler. Det är bara under detta steg som blanktecken kan ignoreras. Det andra steget jämför varje rad. Under detta steg ignoreras inte blanktecken. Under sammanfogning ignoreras inte heller blanktecken. </para>
 
@@ -1201,6 +1213,13 @@
 >Gör en ansträngning att hitta en ännu mindre skillnad (Normalvärdet är på). Det här är troligen effektivt för komplicerade och stora filer, och långsamt för mycket stora filer. </para
 ></listitem
 ></varlistentry>
+</variablelist>
+</sect2>
+
+<sect2 id="mergeoptions"
+><title
+>Inställningar av sammanfoga</title>
+<variablelist>
    <varlistentry
 ><term
 ><emphasis
@@ -1300,6 +1319,16 @@
    <varlistentry
 ><term
 ><emphasis
+>Maximalt antal historikposter:</emphasis
+></term
+><listitem
+><para
+>&kdiff3; kortar av historiklistan till angivet antal poster. Använd -1 för att undvika avkortning. (Standardvärde är -1). </para
+></listitem
+></varlistentry>
+   <varlistentry
+><term
+><emphasis
 >Prova dina reguljära uttryck</emphasis
 ></term
 ><listitem
@@ -2821,14 +2850,14 @@
 <para
 >&kdiff3;: Verktyg för jämförelser och sammanfogning av filer och kataloger </para>
 <para
->Program copyright 2002-2006 Joachim Eibl <email
+>Program copyright 2002-2007 Joachim Eibl <email
 >joachim.eibl snabela gmx.de</email
 > </para>
 <para
 >Flera häftiga idéer och felrapporter kom från kolleger och många personer ute i den Vida Vilda Världen. Tack! </para>
 
 <para
->Dokumentation Copyright &copy; 2002-2006 Joachim Eibl <email
+>Dokumentation Copyright &copy; 2002-2007 Joachim Eibl <email
 >joachim. eibl snabela gmx.de</email
 > </para>
 
--- a/kdiff3/kdiff3.spec	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/kdiff3.spec	Tue Jan 06 17:51:29 2009 +0000
@@ -1,6 +1,6 @@
 Name: kdiff3
-Version: 0.9.91
-Release: 1.fc
+Version: 0.9.93
+Release: 1
 
 URL: http://www.kde-apps.org/content/show.php?content=9807
 License: GPL
@@ -10,11 +10,11 @@
 Source: http://heanet.dl.sourceforge.net/sourceforge/kdiff3/kdiff3-%{version}.tar.gz
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
 
-Requires: kdelibs > 3.3
-BuildRequires: gcc-c++ >= 3.2
+Requires: kdelibs > 4.1
+BuildRequires: gcc-c++ >= 4.1
 BuildRequires: xorg-x11-devel
-BuildRequires: qt-devel >= 3.3
-BuildRequires: kdelibs-devel >= 3.3
+BuildRequires: qt-devel >= 4.4
+BuildRequires: kdelibs-devel >= 4.1
 
 %description
 Shows the differences line by line and character by character (!).
@@ -53,9 +53,11 @@
 %{_datadir}/locale/*
 %{_datadir}/man/man1/kdiff3*
 %{_datadir}/services/kdiff3*
-%{_libdir}/kde3/libkdiff3*
+%{_libdir}/kde4/libkdiff3*
 
 %changelog
+* Fri Nov 21 2008 Joachim Eibl - 0.9.93-1
+- Untested changes for KDE4.
 * Mon May 15 2006 Vadim Likhota <vadim-lvv@yandex.ru> - 0.9.90-1.fc
 - write spec for fc/rhel/centos/asp for kdiff3
 
--- a/kdiff3/po/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-POFILES = AUTO
--- a/kdiff3/po/README	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/po/README	Tue Jan 06 17:51:29 2009 +0000
@@ -46,6 +46,9 @@
    
    It contains all translatable strings of the program, but no translations.
    (xgettext is usually part of package gettext-devel)
+   Better to get version from kde svn:
+   wget http://websvn.kde.org/*checkout*/trunk/l10n-kde4/templates/messages/extragear-utils/kdiff3.pot
+   wget http://websvn.kde.org/*checkout*/trunk/l10n-kde4/templates/messages/extragear-utils/kdiff3plugin.pot
    
 2. Translators create a translation for a specific language. Because we don't want 
    to modify the template now, we'll create a copy for each language.
@@ -66,22 +69,21 @@
 ============
    
 The following is for my own memory and for those who really want to learn dirty tricks and details:
+The script "update_po_dirs" does all in here automatically. Read on if you want details.
    
 The KDE-i18n team stores their results in SVN. But I would like to have an independent 
 copy of all translations in the po-directory of the source package. Actually it's just
 copying and renaming, but simplified with these commands:
 
-
 First fetch all available translations from the SVN-repository (access via websvn and wget)
    wget http://websvn.kde.org/*checkout*/trunk/l10n/subdirs
-   for i in `cat subdirs`; do wget http://websvn.kde.org/*checkout*/trunk/l10n/$i/messages/extragear-utils/kdiff3.po -O $i.po; done
-   
+   for i in `cat subdirs`; do wget http://websvn.kde.org/*checkout*/trunk/l10n-kde4/$i/messages/extragear-utils/kdiff3.po -O $i.po; done
    
 This was the explanation for translations within KDE. 
 But KDiff3 can also be compiled and run without KDE:
 
 Since Qt was used for KDiff3, the first part is quite the same: Only the fast lookup-table 
-(*.qm-files) must be created with $QTDIR/bin/msg2qm (instead of msgfmt). ($QTDIR/tools/msg2qm)
+(*.qm-files) must be created with $QTDIR/bin/msg2qm (instead of msgfmt). ($QTDIR/tools/msg2qm in the "qt3-devel-tools"-package))
 
 Still one detail isn't right: Some strings are not translated, because under KDE their 
 translation is within KDE-libs or within Qt. But the translations are available:
@@ -91,7 +93,7 @@
 For KDE-libs in the SVN-repository, where we can reuse the previous trick to get 
 all kdelibs*.po-files:
 
-   for i in `cat subdirs`; do wget http://websvn.kde.org/*checkout*/trunk/l10n/$i/messages/kdelibs/kdelibs.po -O kdelibs_$i.po; done
+   for i in `cat subdirs`; do wget http://websvn.kde.org/*checkout*/trunk/l10n-kde4/$i/messages/kdelibs/kdelibs4.po -O kdelibs_$i.po; done
    
 Finally the program must only read the correct translation tables:
 
@@ -114,6 +116,7 @@
 Because it's too much effort to copy all kdelibs*.po-files along: Here is a little info
 about how to extract only the needed strings and to create the qm-files.
 
+Steps 1-3 are obsolete for translations that are up to date because kreplacements.pot is now in kde-svn-repository.
 1. Only src/kreplacements/kreplacements.cpp contains strings, that were not covered by 
    the normal translations. Hence a special pot-file is needed.
    xgettext --keyword=i18n --keyword=I18N_NOOP -C ../src/kreplacements/kreplacements.cpp -o kreplacements.pot
@@ -121,13 +124,19 @@
    
 2. Take only needed strings and translations from kdelibs*.po:
    msgmerge --no-fuzzy-matching kdelibs_de.po kreplacements.pot >kreplacements_de.po
+   ("msgmerge" and "msgcat" are part of the "gettext-tools"-package.)
 
 3. Concatenate the normal de.po and kreplacements_de.po:
    msgcat --use-first de.po kreplacements_de.po >kdiff3_de.po
+   The resulting file is huge, but most stuff is commented out.
 
-4. Finally create the fast lookup table:
+4. Finally create the fast lookup table (msg2qm is from "qt3-devel-tools"-package):
    $QTDIR/bin/msg2qm kdiff3_de.po kdiff3_de.qm
 
 5. The intermediate files can then be deleted.
 
-The script createqm does steps 2-5 for languages where a kdiff3.po-translation exists.
+Creating the directory structure needed for KDE4 and cmake.
+for i in *.po; do echo $i; export j=`echo $i | sed s/.po//`; echo $j; md $j; cp $j.po $j/kdiff3.po; sed s/xx/$j/ CMakeLists_xx.txt >$j/CMakeLists.txt ; done
+(For each po-file create the subdir, copy outer po-file to subdir/kdiff3.po and create a CMakeLists.txt file.)
+ls */kdiff3.po | sed 's/\(.*\)\/.*/add_subdirectory(\1)/' >CMakeLists.txt
+
--- a/kdiff3/po/kdiff3.pot	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/po/kdiff3.pot	Tue Jan 06 17:51:29 2009 +0000
@@ -1,41 +1,559 @@
 # SOME DESCRIPTIVE TITLE.
-# This file is put in the public domain.
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-14 15:14+0200\n"
+"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
+"POT-Creation-Date: 2008-12-08 10:27+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: LANGUAGE <kde-i18n-doc@kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: _translatorinfo.cpp:1
+#: kdiff3.cpp:167
+msgid "Current Configuration:"
+msgstr ""
+
+#: kdiff3.cpp:172
+msgid "Config Option Error:"
+msgstr ""
+
+#: kdiff3.cpp:217
+msgid "Option --auto used, but no output file specified."
+msgstr ""
+
+#: kdiff3.cpp:366
+msgid "Option --auto ignored for directory comparison."
+msgstr ""
+
+#: kdiff3.cpp:402
+msgid "Saving failed."
+msgstr ""
+
+#: kdiff3.cpp:437 pdiff.cpp:1080 pdiff.cpp:1151
+msgid "Opening of these files failed:"
+msgstr ""
+
+#: kdiff3.cpp:446
+msgid "File Open Error"
+msgstr ""
+
+#: kdiff3.cpp:474
+msgid "Opens documents for comparison..."
+msgstr ""
+
+#: kdiff3.cpp:476
+msgid "Reload"
+msgstr ""
+
+#: kdiff3.cpp:479
+msgid "Saves the merge result. All conflicts must be solved!"
+msgstr ""
+
+#: kdiff3.cpp:481
+msgid "Saves the current document as..."
+msgstr ""
+
+#: kdiff3.cpp:483
+msgid "Print the differences"
+msgstr ""
+
+#: kdiff3.cpp:485
+msgid "Quits the application"
+msgstr ""
+
+#: kdiff3.cpp:487
+msgid "Cuts the selected section and puts it to the clipboard"
+msgstr ""
+
+#: kdiff3.cpp:489
+msgid "Copies the selected section to the clipboard"
+msgstr ""
+
+#: kdiff3.cpp:491
+msgid "Pastes the clipboard contents to actual position"
+msgstr ""
+
+#: kdiff3.cpp:493
+msgid "Select everything in current window"
+msgstr ""
+
+#: kdiff3.cpp:495
+msgid "Search for a string"
+msgstr ""
+
+#: kdiff3.cpp:497
+msgid "Search again for the string"
+msgstr ""
+
+#: kdiff3.cpp:502
+msgid "Enables/disables the statusbar"
+msgstr ""
+
+#: kdiff3.cpp:506
+msgid "Configure KDiff3..."
+msgstr ""
+
+#: kdiff3.cpp:527
+msgid "Go to Current Delta"
+msgstr ""
+
+#: kdiff3.cpp:527
 msgid ""
-"_: NAME OF TRANSLATORS\n"
-"Your names"
-msgstr ""
-
-#: _translatorinfo.cpp:3
+"Current\n"
+"Delta"
+msgstr ""
+
+#: kdiff3.cpp:529
+msgid "Go to First Delta"
+msgstr ""
+
+#: kdiff3.cpp:529
 msgid ""
-"_: EMAIL OF TRANSLATORS\n"
-"Your emails"
-msgstr ""
-
-#: diff.cpp:245
+"First\n"
+"Delta"
+msgstr ""
+
+#: kdiff3.cpp:531
+msgid "Go to Last Delta"
+msgstr ""
+
+#: kdiff3.cpp:531
+msgid ""
+"Last\n"
+"Delta"
+msgstr ""
+
+#: kdiff3.cpp:533
+msgid "(Skips white space differences when \"Show White Space\" is disabled.)"
+msgstr ""
+
+#: kdiff3.cpp:534
+msgid ""
+"(Does not skip white space differences even when \"Show White Space\" is "
+"disabled.)"
+msgstr ""
+
+#: kdiff3.cpp:535
+msgid "Go to Previous Delta"
+msgstr ""
+
+#: kdiff3.cpp:535
+msgid ""
+"Prev\n"
+"Delta"
+msgstr ""
+
+#: kdiff3.cpp:537
+msgid "Go to Next Delta"
+msgstr ""
+
+#: kdiff3.cpp:537
+msgid ""
+"Next\n"
+"Delta"
+msgstr ""
+
+#: kdiff3.cpp:539
+msgid "Go to Previous Conflict"
+msgstr ""
+
+#: kdiff3.cpp:539
+msgid ""
+"Prev\n"
+"Conflict"
+msgstr ""
+
+#: kdiff3.cpp:541
+msgid "Go to Next Conflict"
+msgstr ""
+
+#: kdiff3.cpp:541
+msgid ""
+"Next\n"
+"Conflict"
+msgstr ""
+
+#: kdiff3.cpp:543
+msgid "Go to Previous Unsolved Conflict"
+msgstr ""
+
+#: kdiff3.cpp:543
+msgid ""
+"Prev\n"
+"Unsolved"
+msgstr ""
+
+#: kdiff3.cpp:545
+msgid "Go to Next Unsolved Conflict"
+msgstr ""
+
+#: kdiff3.cpp:545
+msgid ""
+"Next\n"
+"Unsolved"
+msgstr ""
+
+#: kdiff3.cpp:547
+msgid "Select Line(s) From A"
+msgstr ""
+
+#: kdiff3.cpp:547
+msgid ""
+"Choose\n"
+"A"
+msgstr ""
+
+#: kdiff3.cpp:548
+msgid "Select Line(s) From B"
+msgstr ""
+
+#: kdiff3.cpp:548
+msgid ""
+"Choose\n"
+"B"
+msgstr ""
+
+#: kdiff3.cpp:549
+msgid "Select Line(s) From C"
+msgstr ""
+
+#: kdiff3.cpp:549
+msgid ""
+"Choose\n"
+"C"
+msgstr ""
+
+#: kdiff3.cpp:550
+msgid "Automatically Go to Next Unsolved Conflict After Source Selection"
+msgstr ""
+
+#: kdiff3.cpp:550
+msgid ""
+"Auto\n"
+"Next"
+msgstr ""
+
+#: kdiff3.cpp:552
+msgid "Show Space && Tabulator Characters for Differences"
+msgstr ""
+
+#: kdiff3.cpp:552
+msgid ""
+"White\n"
+"Characters"
+msgstr ""
+
+#: kdiff3.cpp:553
+msgid "Show White Space"
+msgstr ""
+
+#: kdiff3.cpp:553
+msgid ""
+"White\n"
+"Deltas"
+msgstr ""
+
+#: kdiff3.cpp:555
+msgid "Show Line Numbers"
+msgstr ""
+
+#: kdiff3.cpp:555
+msgid ""
+"Line\n"
+"Numbers"
+msgstr ""
+
+#: kdiff3.cpp:556
+msgid "Choose A Everywhere"
+msgstr ""
+
+#: kdiff3.cpp:557
+msgid "Choose B Everywhere"
+msgstr ""
+
+#: kdiff3.cpp:558
+msgid "Choose C Everywhere"
+msgstr ""
+
+#: kdiff3.cpp:559
+msgid "Choose A for All Unsolved Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:560
+msgid "Choose B for All Unsolved Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:561
+msgid "Choose C for All Unsolved Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:562
+msgid "Choose A for All Unsolved Whitespace Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:563
+msgid "Choose B for All Unsolved Whitespace Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:564
+msgid "Choose C for All Unsolved Whitespace Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:565
+msgid "Automatically Solve Simple Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:566
+msgid "Set Deltas to Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:567
+msgid "Run Regular Expression Auto Merge"
+msgstr ""
+
+#: kdiff3.cpp:568
+msgid "Automatically Solve History Conflicts"
+msgstr ""
+
+#: kdiff3.cpp:569
+msgid "Split Diff At Selection"
+msgstr ""
+
+#: kdiff3.cpp:570
+msgid "Join Selected Diffs"
+msgstr ""
+
+#: kdiff3.cpp:572
+msgid "Show Window A"
+msgstr ""
+
+#: kdiff3.cpp:573
+msgid "Show Window B"
+msgstr ""
+
+#: kdiff3.cpp:574
+msgid "Show Window C"
+msgstr ""
+
+#: kdiff3.cpp:575 kdiff3.cpp:586
+msgid "Focus Next Window"
+msgstr ""
+
+#: kdiff3.cpp:577
+msgid "Normal Overview"
+msgstr ""
+
+#: kdiff3.cpp:578
+msgid "A vs. B Overview"
+msgstr ""
+
+#: kdiff3.cpp:579
+msgid "A vs. C Overview"
+msgstr ""
+
+#: kdiff3.cpp:580
+msgid "B vs. C Overview"
+msgstr ""
+
+#: kdiff3.cpp:581
+msgid "Word Wrap Diff Windows"
+msgstr ""
+
+#: kdiff3.cpp:582
+msgid "Add Manual Diff Alignment"
+msgstr ""
+
+#: kdiff3.cpp:583
+msgid "Clear All Manual Diff Alignments"
+msgstr ""
+
+#: kdiff3.cpp:588
+msgid "Focus Prev Window"
+msgstr ""
+
+#: kdiff3.cpp:589
+msgid "Toggle Split Orientation"
+msgstr ""
+
+#: kdiff3.cpp:591
+msgid "Dir && Text Split Screen View"
+msgstr ""
+
+#: kdiff3.cpp:593
+msgid "Toggle Between Dir && Text View"
+msgstr ""
+
+#: kdiff3.cpp:615 kdiff3.cpp:707 kdiff3.cpp:732 kdiff3.cpp:1003
+#: kdiff3.cpp:1024 pdiff.cpp:1098 pdiff.cpp:1170 pdiff.cpp:1208 pdiff.cpp:1224
+#: pdiff.cpp:1254 pdiff.cpp:1265 directorymergewindow.cpp:739
+msgid "Ready."
+msgstr ""
+
+#: kdiff3.cpp:649 pdiff.cpp:1753
+msgid "The merge result hasn't been saved."
+msgstr ""
+
+#: kdiff3.cpp:650 kdiff3.cpp:660 kdiff3.cpp:672 pdiff.cpp:1016 pdiff.cpp:1754
+#: pdiff.cpp:1764 directorymergewindow.cpp:407 mergeresultwindow.cpp:303
+msgid "Warning"
+msgstr ""
+
+#: kdiff3.cpp:651
+msgid "Save && Quit"
+msgstr ""
+
+#: kdiff3.cpp:652
+msgid "Quit Without Saving"
+msgstr ""
+
+#: kdiff3.cpp:660 pdiff.cpp:1764
+msgid "Saving the merge result failed."
+msgstr ""
+
+#: kdiff3.cpp:671 pdiff.cpp:1015
+msgid ""
+"You are currently doing a directory merge. Are you sure, you want to abort?"
+msgstr ""
+
+#: kdiff3.cpp:696
+msgid "Saving file..."
+msgstr ""
+
+#: kdiff3.cpp:713
+msgid "Saving file with a new filename..."
+msgstr ""
+
+#: kdiff3.cpp:715 kreplacements/kreplacements.cpp:620
+msgid "Save As..."
+msgstr ""
+
+#: kdiff3.cpp:974
+msgid "Exiting..."
+msgstr ""
+
+#: kdiff3.cpp:987
+msgid "Toggling toolbar..."
+msgstr ""
+
+#: kdiff3.cpp:1008
+msgid "Toggle the statusbar..."
+msgstr ""
+
+#: fileaccess.cpp:612
+msgid ""
+"While trying to make a backup, deleting an older backup failed. \n"
+"Filename: "
+msgstr ""
+
+#: fileaccess.cpp:619
+msgid ""
+"While trying to make a backup, renaming failed. \n"
+"Filenames: "
+msgstr ""
+
+#: fileaccess.cpp:643
+#, kde-format
+msgid "Getting file status: %1"
+msgstr ""
+
+#: fileaccess.cpp:686
+#, kde-format
+msgid "Reading file: %1"
+msgstr ""
+
+#: fileaccess.cpp:723
+#, kde-format
+msgid "Writing file: %1"
+msgstr ""
+
+#: fileaccess.cpp:751
+msgid "Out of memory"
+msgstr ""
+
+#: fileaccess.cpp:786
+#, kde-format
+msgid "Making directory: %1"
+msgstr ""
+
+#: fileaccess.cpp:806
+#, kde-format
+msgid "Removing directory: %1"
+msgstr ""
+
+#: fileaccess.cpp:821
+#, kde-format
+msgid "Removing file: %1"
+msgstr ""
+
+#: fileaccess.cpp:837
+#, kde-format
+msgid "Creating symbolic link: %1 -> %2"
+msgstr ""
+
+#: fileaccess.cpp:864
+#, kde-format
+msgid "Renaming file: %1 -> %2"
+msgstr ""
+
+#: fileaccess.cpp:897
+#, kde-format
+msgid "Copying file: %1 -> %2"
+msgstr ""
+
+#: fileaccess.cpp:911
+#, kde-format
+msgid ""
+"Error during file copy operation: Opening file for reading failed. Filename: "
+"%1"
+msgstr ""
+
+#: fileaccess.cpp:917
+#, kde-format
+msgid ""
+"Error during file copy operation: Opening file for writing failed. Filename: "
+"%1"
+msgstr ""
+
+#: fileaccess.cpp:932
+#, kde-format
+msgid "Error during file copy operation: Reading failed. Filename: %1"
+msgstr ""
+
+#: fileaccess.cpp:941
+#, kde-format
+msgid "Error during file copy operation: Writing failed. Filename: %1"
+msgstr ""
+
+#: fileaccess.cpp:1237
+msgid "Reading directory: "
+msgstr ""
+
+#: fileaccess.cpp:1361
+#, kde-format
+msgid "Listing directory: %1"
+msgstr ""
+
+#: fileaccess.cpp:1495 smalldialogs.cpp:179 smalldialogs.cpp:396
+msgid "&Cancel"
+msgstr ""
+
+#: diff.cpp:250
 msgid "Writing clipboard data to temp file failed."
 msgstr ""
 
-#: diff.cpp:249
+#: diff.cpp:254
 msgid "From Clipboard"
 msgstr ""
 
-#: diff.cpp:451
+#: diff.cpp:502
+#, kde-format
 msgid ""
 "Preprocessing possibly failed. Check this command:\n"
 "\n"
@@ -44,7 +562,8 @@
 "The preprocessing command will be disabled now."
 msgstr ""
 
-#: diff.cpp:486
+#: diff.cpp:542
+#, kde-format
 msgid ""
 "The line-matching-preprocessing possibly failed. Check this command:\n"
 "\n"
@@ -53,263 +572,1522 @@
 "The line-matching-preprocessing command will be disabled now."
 msgstr ""
 
-#: diff.cpp:1587 diff.cpp:1601
+#: diff.cpp:1658 diff.cpp:1672
 msgid ""
 "Data loss error:\n"
 "If it is reproducable please contact the author.\n"
 msgstr ""
 
-#: diff.cpp:1589 diff.cpp:1603
+#: diff.cpp:1660 diff.cpp:1674
 msgid "Severe Internal Error"
 msgstr ""
 
-#: difftextwindow.cpp:1637 kdiff3.cpp:743
+#: smalldialogs.cpp:58
+msgid "A (Base):"
+msgstr ""
+
+#: smalldialogs.cpp:65 smalldialogs.cpp:82 smalldialogs.cpp:99
+#: smalldialogs.cpp:142
+msgid "File..."
+msgstr ""
+
+#: smalldialogs.cpp:67 smalldialogs.cpp:84 smalldialogs.cpp:101
+#: smalldialogs.cpp:144
+msgid "Dir..."
+msgstr ""
+
+#: smalldialogs.cpp:93
+msgid "C (Optional):"
+msgstr ""
+
+#: smalldialogs.cpp:110 optiondialog.cpp:873 directorymergewindow.cpp:1893
+#: directorymergewindow.cpp:1894 directorymergewindow.cpp:3011
+msgid "Merge"
+msgstr ""
+
+#: smalldialogs.cpp:116
+msgid "Swap/Copy Names ..."
+msgstr ""
+
+#: smalldialogs.cpp:121 smalldialogs.cpp:122 smalldialogs.cpp:123
+#, kde-format
+msgid "Swap %1<->%2"
+msgstr ""
+
+#: smalldialogs.cpp:124 smalldialogs.cpp:125 smalldialogs.cpp:126
+#, kde-format
+msgid "Copy %1->Output"
+msgstr ""
+
+#: smalldialogs.cpp:127 smalldialogs.cpp:128 smalldialogs.cpp:129
+#, kde-format
+msgid "Swap %1<->Output"
+msgstr ""
+
+#: smalldialogs.cpp:136
+msgid "Output (optional):"
+msgstr ""
+
+#: smalldialogs.cpp:168
+msgid "Configure..."
+msgstr ""
+
+#: smalldialogs.cpp:174
+msgid "&OK"
+msgstr ""
+
+#: smalldialogs.cpp:362
+msgid "Search text:"
+msgstr ""
+
+#: smalldialogs.cpp:369
+msgid "Case sensitive"
+msgstr ""
+
+#: smalldialogs.cpp:372
+msgid "Search A"
+msgstr ""
+
+#: smalldialogs.cpp:377
+msgid "Search B"
+msgstr ""
+
+#: smalldialogs.cpp:382
+msgid "Search C"
+msgstr ""
+
+#: smalldialogs.cpp:387
+msgid "Search output"
+msgstr ""
+
+#: smalldialogs.cpp:392
+msgid "&Search"
+msgstr ""
+
+#: smalldialogs.cpp:409
+msgid "Regular Expression Tester"
+msgstr ""
+
+#: smalldialogs.cpp:414 optiondialog.cpp:940
+msgid "Auto merge regular expression:"
+msgstr ""
+
+#: smalldialogs.cpp:422
+msgid "Example auto merge line:"
+msgstr ""
+
+#: smalldialogs.cpp:424
+msgid "For auto merge test copy a line as used in your files."
+msgstr ""
+
+#: smalldialogs.cpp:430 smalldialogs.cpp:459 smalldialogs.cpp:496
+msgid "Match result:"
+msgstr ""
+
+#: smalldialogs.cpp:441 optiondialog.cpp:966
+msgid "History start regular expression:"
+msgstr ""
+
+#: smalldialogs.cpp:449
+msgid "Example history start line (with leading comment):"
+msgstr ""
+
+#: smalldialogs.cpp:452
+msgid ""
+"Copy a history start line as used in your files,\n"
+"including the leading comment."
+msgstr ""
+
+#: smalldialogs.cpp:470 optiondialog.cpp:976
+msgid "History entry start regular expression:"
+msgstr ""
+
+#: smalldialogs.cpp:478
+msgid "History sort key order:"
+msgstr ""
+
+#: smalldialogs.cpp:486
+msgid "Example history entry start line (without leading comment):"
+msgstr ""
+
+#: smalldialogs.cpp:488
+msgid ""
+"Copy a history entry start line as used in your files,\n"
+"but omit the leading comment."
+msgstr ""
+
+#: smalldialogs.cpp:503
+msgid "Sort key result:"
+msgstr ""
+
+#: smalldialogs.cpp:510
+msgid "OK"
+msgstr ""
+
+#: smalldialogs.cpp:514 kreplacements/kreplacements.h:103
+#: kreplacements/kreplacements.cpp:164 kreplacements/kreplacements.cpp:195
+msgid "Cancel"
+msgstr ""
+
+#: smalldialogs.cpp:554 smalldialogs.cpp:564 smalldialogs.cpp:585
+msgid "Match success."
+msgstr ""
+
+#: smalldialogs.cpp:558 smalldialogs.cpp:568 smalldialogs.cpp:591
+msgid "Match failed."
+msgstr ""
+
+#: smalldialogs.cpp:576
+msgid "Opening and closing parentheses don't match in regular expression."
+msgstr ""
+
+#: optiondialog.cpp:367
+msgid "Unicode, 8 bit"
+msgstr ""
+
+#: optiondialog.cpp:368
+msgid "Unicode"
+msgstr ""
+
+#: optiondialog.cpp:369
+msgid "Latin1"
+msgstr ""
+
+#: optiondialog.cpp:388
+msgid "Change this if non-ASCII characters are not displayed correctly."
+msgstr ""
+
+#: optiondialog.cpp:465
+msgid "Configure"
+msgstr ""
+
+#: optiondialog.cpp:531
+msgid "Font"
+msgstr ""
+
+#: optiondialog.cpp:532
+msgid "Editor & Diff Output Font"
+msgstr ""
+
+#: optiondialog.cpp:556
+msgid "Italic font for deltas"
+msgstr ""
+
+#: optiondialog.cpp:559
+msgid ""
+"Selects the italic version of the font for differences.\n"
+"If the font doesn't support italic characters, then this does nothing."
+msgstr ""
+
+#: optiondialog.cpp:568
+msgid "Color"
+msgstr ""
+
+#: optiondialog.cpp:569
+msgid "Colors Settings"
+msgstr ""
+
+#: optiondialog.cpp:588
+msgid "Editor and Diff Views:"
+msgstr ""
+
+#: optiondialog.cpp:596
+msgid "Foreground color:"
+msgstr ""
+
+#: optiondialog.cpp:603
+msgid "Background color:"
+msgstr ""
+
+#: optiondialog.cpp:612
+msgid "Diff background color:"
+msgstr ""
+
+#: optiondialog.cpp:620
+msgid "Color A:"
+msgstr ""
+
+#: optiondialog.cpp:628
+msgid "Color B:"
+msgstr ""
+
+#: optiondialog.cpp:636
+msgid "Color C:"
+msgstr ""
+
+#: optiondialog.cpp:643
+msgid "Conflict color:"
+msgstr ""
+
+#: optiondialog.cpp:651
+msgid "Current range background color:"
+msgstr ""
+
+#: optiondialog.cpp:659
+msgid "Current range diff background color:"
+msgstr ""
+
+#: optiondialog.cpp:666
+msgid "Color for manually aligned difference ranges:"
+msgstr ""
+
+#: optiondialog.cpp:672
+msgid "Directory Comparison View:"
+msgstr ""
+
+#: optiondialog.cpp:678
+msgid "Newest file color:"
+msgstr ""
+
+#: optiondialog.cpp:682
+msgid ""
+"Changing this color will only be effective when starting the next directory "
+"comparison."
+msgstr ""
+
+#: optiondialog.cpp:687
+msgid "Oldest file color:"
+msgstr ""
+
+#: optiondialog.cpp:695
+msgid "Middle age file color:"
+msgstr ""
+
+#: optiondialog.cpp:703
+msgid "Color for missing files:"
+msgstr ""
+
+#: optiondialog.cpp:717
+msgid "Editor"
+msgstr ""
+
+#: optiondialog.cpp:718
+msgid "Editor Behavior"
+msgstr ""
+
+#: optiondialog.cpp:732
+msgid "Tab inserts spaces"
+msgstr ""
+
+#: optiondialog.cpp:735
+msgid ""
+"On: Pressing tab generates the appropriate number of spaces.\n"
+"Off: A Tab-character will be inserted."
+msgstr ""
+
+#: optiondialog.cpp:741
+msgid "Tab size:"
+msgstr ""
+
+#: optiondialog.cpp:747
+msgid "Auto indentation"
+msgstr ""
+
+#: optiondialog.cpp:750
+msgid "On: The indentation of the previous line is used for a new line.\n"
+msgstr ""
+
+#: optiondialog.cpp:754
+msgid "Auto copy selection"
+msgstr ""
+
+#: optiondialog.cpp:757
+msgid ""
+"On: Any selection is immediately written to the clipboard.\n"
+"Off: You must explicitely copy e.g. via Ctrl-C."
+msgstr ""
+
+#: optiondialog.cpp:762
+msgid "Line end style:"
+msgstr ""
+
+#: optiondialog.cpp:776
+msgid ""
+"Sets the line endings for when an edited file is saved.\n"
+"DOS/Windows: CR+LF; UNIX: LF; with CR=0D, LF=0A"
+msgstr ""
+
+#: optiondialog.cpp:788
+msgid "Diff"
+msgstr ""
+
+#: optiondialog.cpp:789
+msgid "Diff Settings"
+msgstr ""
+
+#: optiondialog.cpp:813
+msgid "Treat as white space."
+msgstr ""
+
+#: optiondialog.cpp:815
+msgid "Ignore numbers"
+msgstr ""
+
+#: optiondialog.cpp:818
+msgid ""
+"Ignore number characters during line matching phase. (Similar to Ignore "
+"white space.)\n"
+"Might help to compare files with numeric data."
+msgstr ""
+
+#: optiondialog.cpp:823
+msgid "Ignore C/C++ comments"
+msgstr ""
+
+#: optiondialog.cpp:825
+msgid "Treat C/C++ comments like white space."
+msgstr ""
+
+#: optiondialog.cpp:829
+msgid "Ignore case"
+msgstr ""
+
+#: optiondialog.cpp:832
+msgid "Treat case differences like white space changes. ('a'<=>'A')"
+msgstr ""
+
+#: optiondialog.cpp:836
+msgid "Preprocessor command:"
+msgstr ""
+
+#: optiondialog.cpp:840
+msgid "User defined pre-processing. (See the docs for details.)"
+msgstr ""
+
+#: optiondialog.cpp:843
+msgid "Line-matching preprocessor command:"
+msgstr ""
+
+#: optiondialog.cpp:847
+msgid ""
+"This pre-processor is only used during line matching.\n"
+"(See the docs for details.)"
+msgstr ""
+
+#: optiondialog.cpp:850
+msgid "Try hard (slower)"
+msgstr ""
+
+#: optiondialog.cpp:853
+msgid ""
+"Enables the --minimal option for the external diff.\n"
+"The analysis of big files will be much slower."
+msgstr ""
+
+#: optiondialog.cpp:858
+msgid "Align B and C for 3 input files"
+msgstr ""
+
+#: optiondialog.cpp:861
+msgid ""
+"Try to align B and C when comparing or merging three input files.\n"
+"Not recommended for merging because merge might get more complicated.\n"
+"(Default is off.)"
+msgstr ""
+
+#: optiondialog.cpp:874
+msgid "Merge Settings"
+msgstr ""
+
+#: optiondialog.cpp:889
+msgid "Auto advance delay (ms):"
+msgstr ""
+
+#: optiondialog.cpp:894
+msgid ""
+"When in Auto-Advance mode the result of the current selection is shown \n"
+"for the specified time, before jumping to the next conflict. Range: 0-2000 ms"
+msgstr ""
+
+#: optiondialog.cpp:899
+msgid "Show info dialogs"
+msgstr ""
+
+#: optiondialog.cpp:901
+msgid "Show a dialog with information about the number of conflicts."
+msgstr ""
+
+#: optiondialog.cpp:904
+msgid "White space 2-file merge default:"
+msgstr ""
+
+#: optiondialog.cpp:908 optiondialog.cpp:921
+msgid "Manual Choice"
+msgstr ""
+
+#: optiondialog.cpp:912 optiondialog.cpp:926
+msgid ""
+"Allow the merge algorithm to automatically select an input for white-space-"
+"only changes."
+msgstr ""
+
+#: optiondialog.cpp:917
+msgid "White space 3-file merge default:"
+msgstr ""
+
+#: optiondialog.cpp:931
+msgid "Automatic Merge Regular Expression"
+msgstr ""
+
+#: optiondialog.cpp:944
+msgid ""
+"Regular expression for lines where KDiff3 should automatically choose one "
+"source.\n"
+"When a line with a conflict matches the regular expression then\n"
+"- if available - C, otherwise B will be chosen."
+msgstr ""
+
+#: optiondialog.cpp:950
+msgid "Run regular expression auto merge on merge start"
+msgstr ""
+
+#: optiondialog.cpp:952
+msgid ""
+"Run the merge for auto merge regular expressions\n"
+"immediately when a merge starts.\n"
+msgstr ""
+
+#: optiondialog.cpp:957
+msgid "Version Control History Merging"
+msgstr ""
+
+#: optiondialog.cpp:970
+msgid ""
+"Regular expression for the start of the version control history entry.\n"
+"Usually this line contains the \"$Log$\"-keyword.\n"
+"Default value: \".*\\$Log.*\\$.*\""
+msgstr ""
+
+#: optiondialog.cpp:988
+msgid ""
+"A version control history entry consists of several lines.\n"
+"Specify the regular expression to detect the first line (without the leading "
+"comment).\n"
+"Use parentheses to group the keys you want to use for sorting.\n"
+"If left empty, then KDiff3 assumes that empty lines separate history "
+"entries.\n"
+"See the documentation for details."
+msgstr ""
+
+#: optiondialog.cpp:996
+msgid "History merge sorting"
+msgstr ""
+
+#: optiondialog.cpp:998
+msgid "Sort version control history by a key."
+msgstr ""
+
+#: optiondialog.cpp:1008
+msgid "History entry start sort key order:"
+msgstr ""
+
+#: optiondialog.cpp:1012
+msgid ""
+"Each parentheses used in the regular expression for the history start entry\n"
+"groups a key that can be used for sorting.\n"
+"Specify the list of keys (that are numbered in order of occurrence\n"
+"starting with 1) using ',' as separator (e.g. \"4,5,6,1,2,3,7\").\n"
+"If left empty, then no sorting will be done.\n"
+"See the documentation for details."
+msgstr ""
+
+#: optiondialog.cpp:1023
+msgid "Merge version control history on merge start"
+msgstr ""
+
+#: optiondialog.cpp:1025
+msgid "Run version control history automerge on merge start."
+msgstr ""
+
+#: optiondialog.cpp:1029
+msgid "Max number of history entries:"
+msgstr ""
+
+#: optiondialog.cpp:1032
+msgid "Cut off after specified number. Use -1 for infinite number of entries."
+msgstr ""
+
+#: optiondialog.cpp:1036
+msgid "Test your regular expressions"
+msgstr ""
+
+#: optiondialog.cpp:1041
+msgid "Irrelevant merge command:"
+msgstr ""
+
+#: optiondialog.cpp:1045
+msgid ""
+"If specified this script is run after automerge\n"
+"when no other relevant changes were detected.\n"
+"Called with the parameters: filename1 filename2 filename3"
+msgstr ""
+
+#: optiondialog.cpp:1051
+msgid "Auto save and quit on merge without conflicts"
+msgstr ""
+
+#: optiondialog.cpp:1054
+msgid ""
+"When KDiff3 was started for a file-merge from the commandline and all\n"
+"conflicts are solvable without user interaction then automatically save and "
+"quit.\n"
+"(Similar to command line option \"--auto\"."
+msgstr ""
+
+#: optiondialog.cpp:1065 optiondialog.cpp:1066
+msgid "Directory Merge"
+msgstr ""
+
+#: optiondialog.cpp:1079
+msgid "Recursive directories"
+msgstr ""
+
+#: optiondialog.cpp:1081
+msgid "Whether to analyze subdirectories or not."
+msgstr ""
+
+#: optiondialog.cpp:1083
+msgid "File pattern(s):"
+msgstr ""
+
+#: optiondialog.cpp:1088
+msgid ""
+"Pattern(s) of files to be analyzed. \n"
+"Wildcards: '*' and '?'\n"
+"Several Patterns can be specified by using the separator: ';'"
+msgstr ""
+
+#: optiondialog.cpp:1094
+msgid "File-anti-pattern(s):"
+msgstr ""
+
+#: optiondialog.cpp:1099
+msgid ""
+"Pattern(s) of files to be excluded from analysis. \n"
+"Wildcards: '*' and '?'\n"
+"Several Patterns can be specified by using the separator: ';'"
+msgstr ""
+
+#: optiondialog.cpp:1105
+msgid "Dir-anti-pattern(s):"
+msgstr ""
+
+#: optiondialog.cpp:1110
+msgid ""
+"Pattern(s) of directories to be excluded from analysis. \n"
+"Wildcards: '*' and '?'\n"
+"Several Patterns can be specified by using the separator: ';'"
+msgstr ""
+
+#: optiondialog.cpp:1116
+msgid "Use .cvsignore"
+msgstr ""
+
+#: optiondialog.cpp:1119
+msgid ""
+"Extends the antipattern to anything that would be ignored by CVS.\n"
+"Via local \".cvsignore\"-files this can be directory specific."
+msgstr ""
+
+#: optiondialog.cpp:1124
+msgid "Find hidden files and directories"
+msgstr ""
+
+#: optiondialog.cpp:1127
+msgid "Finds files and directories with the hidden attribute."
+msgstr ""
+
+#: optiondialog.cpp:1129
+msgid "Finds files and directories starting with '.'."
+msgstr ""
+
+#: optiondialog.cpp:1133
+msgid "Follow file links"
+msgstr ""
+
+#: optiondialog.cpp:1136
+msgid ""
+"On: Compare the file the link points to.\n"
+"Off: Compare the links."
+msgstr ""
+
+#: optiondialog.cpp:1141
+msgid "Follow directory links"
+msgstr ""
+
+#: optiondialog.cpp:1144
+msgid ""
+"On: Compare the directory the link points to.\n"
+"Off: Compare the links."
+msgstr ""
+
+#: optiondialog.cpp:1160
+msgid "Case sensitive filename comparison"
+msgstr ""
+
+#: optiondialog.cpp:1163
+msgid ""
+"The directory comparison will compare files or directories when their names "
+"match.\n"
+"Set this option if the case of the names must match. (Default for Windows is "
+"off, otherwise on.)"
+msgstr ""
+
+#: optiondialog.cpp:1167
+msgid "File Comparison Mode"
+msgstr ""
+
+#: optiondialog.cpp:1173
+msgid "Binary comparison"
+msgstr ""
+
+#: optiondialog.cpp:1174
+msgid "Binary comparison of each file. (Default)"
+msgstr ""
+
+#: optiondialog.cpp:1177
+msgid "Full analysis"
+msgstr ""
+
+#: optiondialog.cpp:1178
+msgid ""
+"Do a full analysis and show statistics information in extra columns.\n"
+"(Slower than a binary comparison, much slower for binary files.)"
+msgstr ""
+
+#: optiondialog.cpp:1182
+msgid "Trust the size and modification date (unsafe)"
+msgstr ""
+
+#: optiondialog.cpp:1183
+msgid ""
+"Assume that files are equal if the modification date and file length are "
+"equal.\n"
+"Files with equal contents but different modification dates will appear as "
+"different.\n"
+"Useful for big directories or slow networks."
+msgstr ""
+
+#: optiondialog.cpp:1188
+msgid ""
+"Trust the size and date, but use binary comparison if date doesn't match "
+"(unsafe)"
+msgstr ""
+
+#: optiondialog.cpp:1189
+msgid ""
+"Assume that files are equal if the modification date and file length are "
+"equal.\n"
+"If the date isn't equal but the sizes are, use binary comparison.\n"
+"Useful for big directories or slow networks."
+msgstr ""
+
+#: optiondialog.cpp:1194
+msgid "Trust the size (unsafe)"
+msgstr ""
+
+#: optiondialog.cpp:1195
+msgid ""
+"Assume that files are equal if their file lengths are equal.\n"
+"Useful for big directories or slow networks when the date is modified during "
+"download."
+msgstr ""
+
+#: optiondialog.cpp:1203
+msgid "Synchronize directories"
+msgstr ""
+
+#: optiondialog.cpp:1206
+msgid ""
+"Offers to store files in both directories so that\n"
+"both directories are the same afterwards.\n"
+"Works only when comparing two directories without specifying a destination."
+msgstr ""
+
+#: optiondialog.cpp:1212
+msgid "White space differences considered equal"
+msgstr ""
+
+#: optiondialog.cpp:1215
+msgid ""
+"If files differ only by white space consider them equal.\n"
+"This is only active when full analysis is chosen."
+msgstr ""
+
+#: optiondialog.cpp:1221
+msgid "Copy newer instead of merging (unsafe)"
+msgstr ""
+
+#: optiondialog.cpp:1224
+msgid ""
+"Don't look inside, just take the newer file.\n"
+"(Use this only if you know what you are doing!)\n"
+"Only effective when comparing two directories."
+msgstr ""
+
+#: optiondialog.cpp:1229
+msgid "Backup files (.orig)"
+msgstr ""
+
+#: optiondialog.cpp:1232
+msgid ""
+"When a file would be saved over an old file, then the old file\n"
+"will be renamed with a '.orig'-extension instead of being deleted."
+msgstr ""
+
+#: optiondialog.cpp:1328 optiondialog.cpp:1329
+msgid "Regional Settings"
+msgstr ""
+
+#: optiondialog.cpp:1429
+msgid "Language (restart required)"
+msgstr ""
+
+#: optiondialog.cpp:1461
+msgid ""
+"Choose the language of the GUI-strings or \"Auto\".\n"
+"For a change of language to take place, quit and restart KDiff3."
+msgstr ""
+
+#: optiondialog.cpp:1479
+msgid "Use the same encoding for everything:"
+msgstr ""
+
+#: optiondialog.cpp:1482
+msgid ""
+"Enable this allows to change all encodings by changing the first only.\n"
+"Disable this if different individual settings are needed."
+msgstr ""
+
+#: optiondialog.cpp:1487
+msgid "Note: Local Encoding is "
+msgstr ""
+
+#: optiondialog.cpp:1491
+msgid "File Encoding for A:"
+msgstr ""
+
+#: optiondialog.cpp:1497
+msgid ""
+"If enabled then Unicode (UTF-16 or UTF-8) encoding will be detected.\n"
+"If the file is not Unicode then the selected encoding will be used as "
+"fallback.\n"
+"(Unicode detection depends on the first bytes of a file.)"
+msgstr ""
+
+#: optiondialog.cpp:1501 optiondialog.cpp:1510 optiondialog.cpp:1519
+msgid "Auto Detect Unicode"
+msgstr ""
+
+#: optiondialog.cpp:1506
+msgid "File Encoding for B:"
+msgstr ""
+
+#: optiondialog.cpp:1515
+msgid "File Encoding for C:"
+msgstr ""
+
+#: optiondialog.cpp:1524
+msgid "File Encoding for Merge Output and Saving:"
+msgstr ""
+
+#: optiondialog.cpp:1528
+msgid "Auto Select"
+msgstr ""
+
+#: optiondialog.cpp:1531
+msgid ""
+"If enabled then the encoding from the input files is used.\n"
+"In ambiguous cases a dialog will ask the user to choose the encoding for "
+"saving."
+msgstr ""
+
+#: optiondialog.cpp:1535
+msgid "File Encoding for Preprocessor Files:"
+msgstr ""
+
+#: optiondialog.cpp:1546
+msgid "Right To Left Language"
+msgstr ""
+
+#: optiondialog.cpp:1549
+msgid ""
+"Some languages are read from right to left.\n"
+"This setting will change the viewer and editor accordingly."
+msgstr ""
+
+#: optiondialog.cpp:1564
+msgid "Integration"
+msgstr ""
+
+#: optiondialog.cpp:1565
+msgid "Integration Settings"
+msgstr ""
+
+#: optiondialog.cpp:1579
+msgid "Command line options to ignore:"
+msgstr ""
+
+#: optiondialog.cpp:1584
+msgid ""
+"List of command line options that should be ignored when KDiff3 is used by "
+"other tools.\n"
+"Several values can be specified if separated via ';'\n"
+"This will suppress the \"Unknown option\"-error."
+msgstr ""
+
+#: optiondialog.cpp:1591
+msgid "Quit also via Escape key"
+msgstr ""
+
+#: optiondialog.cpp:1594
+msgid ""
+"Fast method to exit.\n"
+"For those who are used to using the Escape-key."
+msgstr ""
+
+#: optiondialog.cpp:1599
+msgid "Integrate with ClearCase"
+msgstr ""
+
+#: optiondialog.cpp:1602
+msgid ""
+"Integrate with Rational ClearCase from IBM.\n"
+"Modifies the \"map\" file in ClearCase-subdir \"lib/mgrs\"\n"
+"(Only enabled when ClearCase \"bin\" directory is in the path.)"
+msgstr ""
+
+#: optiondialog.cpp:1608
+msgid "Remove ClearCase Integration"
+msgstr ""
+
+#: optiondialog.cpp:1611
+msgid ""
+"Restore the old \"map\" file from before doing the Clearcase integration."
+msgstr ""
+
+#: optiondialog.cpp:1692 kreplacements/kreplacements.cpp:794
+msgid ""
+"You selected a variable width font.\n"
+"\n"
+"Because this program doesn't handle variable width fonts\n"
+"correctly, you might experience problems while editing.\n"
+"\n"
+"Do you want to continue or do you want to select another font."
+msgstr ""
+
+#: optiondialog.cpp:1696
+msgid "Incompatible Font"
+msgstr ""
+
+#: optiondialog.cpp:1697
+msgid "Continue at Own Risk"
+msgstr ""
+
+#: optiondialog.cpp:1698
+msgid "Select Another Font"
+msgstr ""
+
+#: optiondialog.cpp:1733
+msgid "This resets all options. Not only those of the current topic."
+msgstr ""
+
+#: main.cpp:187
+msgid "kdiff3"
+msgstr ""
+
+#: main.cpp:189
+msgid "Tool for Comparison and Merge of Files and Directories"
+msgstr ""
+
+#: main.cpp:190
+msgid "(c) 2002-2008 Joachim Eibl"
+msgstr ""
+
+#: main.cpp:197 kdiff3_part.cpp:303
+msgid "Joachim Eibl"
+msgstr ""
+
+#: main.cpp:198
+msgid "Eike Sauer"
+msgstr ""
+
+#: main.cpp:198
+msgid "Bugfixes, Debian package maintainer"
+msgstr ""
+
+#: main.cpp:199
+msgid "Sebastien Fricker"
+msgstr ""
+
+#: main.cpp:199
+msgid "Windows installer"
+msgstr ""
+
+#: main.cpp:200
+msgid "Stephan Binner"
+msgstr ""
+
+#: main.cpp:200
+msgid "i18n-help"
+msgstr ""
+
+#: main.cpp:201
+msgid "Stefan Partheymueller"
+msgstr ""
+
+#: main.cpp:201
+msgid "Clipboard-patch"
+msgstr ""
+
+#: main.cpp:202
+msgid "David Faure"
+msgstr ""
+
+#: main.cpp:202
+msgid "KIO-Help"
+msgstr ""
+
+#: main.cpp:203
+msgid "Bernd Gehrmann"
+msgstr ""
+
+#: main.cpp:203
+msgid "Class CvsIgnoreList from Cervisia"
+msgstr ""
+
+#: main.cpp:204
+msgid "Andre Woebbeking"
+msgstr ""
+
+#: main.cpp:204
+msgid "Class StringMatcher"
+msgstr ""
+
+#: main.cpp:205
+msgid "Michael Denio"
+msgstr ""
+
+#: main.cpp:205
+msgid "Directory Equality-Coloring patch"
+msgstr ""
+
+#: main.cpp:206
+msgid "Manfred Koehler"
+msgstr ""
+
+#: main.cpp:206
+msgid "Fix for slow startup on Windows"
+msgstr ""
+
+#: main.cpp:207
+msgid "Sergey Zorin"
+msgstr ""
+
+#: main.cpp:207
+msgid "Diff Ext for Windows"
+msgstr ""
+
+#: main.cpp:208
+msgid "Paul Eggert, Mike Haertel, David Hayes, Richard Stallman, Len Tower"
+msgstr ""
+
+#: main.cpp:208
+msgid "GNU-Diffutils"
+msgstr ""
+
+#: main.cpp:209
+msgid "Tino Boellsterling, Timothy Mee"
+msgstr ""
+
+#: main.cpp:209
+msgid "Intensive test, use and feedback"
+msgstr ""
+
+#: main.cpp:210
+msgid "Michael Schmidt"
+msgstr ""
+
+#: main.cpp:210
+msgid "Mac support"
+msgstr ""
+
+#: main.cpp:211
+msgid "Valentin Rusu"
+msgstr ""
+
+#: main.cpp:211 main.cpp:212
+msgid "KDE4 porting"
+msgstr ""
+
+#: main.cpp:212
+msgid "Albert Astals Cid"
+msgstr ""
+
+#: main.cpp:214
+msgid "+ Many thanks to those who reported bugs and contributed ideas!"
+msgstr ""
+
+#: main.cpp:220
+msgid "Merge the input."
+msgstr ""
+
+#: main.cpp:221
+msgid "Explicit base file. For compatibility with certain tools."
+msgstr ""
+
+#: main.cpp:222
+msgid "Output file. Implies -m. E.g.: -o newfile.txt"
+msgstr ""
+
+#: main.cpp:223
+msgid "Output file, again. (For compatibility with certain tools.)"
+msgstr ""
+
+#: main.cpp:224
+msgid "No GUI if all conflicts are auto-solvable. (Needs -o file)"
+msgstr ""
+
+#: main.cpp:225
+msgid "Don't solve conflicts automatically. (For compatibility...)"
+msgstr ""
+
+#: main.cpp:226
+msgid "Visible name replacement for input file 1 (base)."
+msgstr ""
+
+#: main.cpp:227
+msgid "Visible name replacement for input file 2."
+msgstr ""
+
+#: main.cpp:228
+msgid "Visible name replacement for input file 3."
+msgstr ""
+
+#: main.cpp:229
+msgid "Alternative visible name replacement. Supply this once for every input."
+msgstr ""
+
+#: main.cpp:230
+msgid ""
+"Override a config setting. Use once for every setting. E.g.: --cs "
+"\"AutoAdvance=1\""
+msgstr ""
+
+#: main.cpp:231
+msgid "Show list of config settings and current values."
+msgstr ""
+
+#: main.cpp:232
+msgid "Use a different config file."
+msgstr ""
+
+#: main.cpp:235
+msgid "file1 to open (base, if not specified via --base)"
+msgstr ""
+
+#: main.cpp:236
+msgid "file2 to open"
+msgstr ""
+
+#: main.cpp:237
+msgid "file3 to open"
+msgstr ""
+
+#: difftextwindow.cpp:388 directorymergewindow.cpp:2764
+msgid "File"
+msgstr ""
+
+#: difftextwindow.cpp:390
+msgid "Line"
+msgstr ""
+
+#: difftextwindow.cpp:392
+msgid "Line not available"
+msgstr ""
+
+#: difftextwindow.cpp:1721
 msgid "Top line"
 msgstr ""
 
-#: difftextwindow.cpp:1647
+#: difftextwindow.cpp:1731
 msgid "End"
 msgstr ""
 
-#: directorymergewindow.cpp:142
+#: pdiff.cpp:260
+msgid "PreprocessorCmd: "
+msgstr ""
+
+#: pdiff.cpp:265
+msgid "The following option(s) you selected might change data:\n"
+msgstr ""
+
+#: pdiff.cpp:266
+msgid ""
+"\n"
+"Most likely this is not wanted during a merge.\n"
+"Do you want to disable these settings or continue with these settings active?"
+msgstr ""
+
+#: pdiff.cpp:268
+msgid "Option Unsafe for Merging"
+msgstr ""
+
+#: pdiff.cpp:269
+msgid "Use These Options During Merge"
+msgstr ""
+
+#: pdiff.cpp:270
+msgid "Disable Unsafe Options"
+msgstr ""
+
+#: pdiff.cpp:300
+msgid "Loading A"
+msgstr ""
+
+#: pdiff.cpp:304
+msgid "Loading B"
+msgstr ""
+
+#: pdiff.cpp:321 pdiff.cpp:347
+msgid "Diff: A <-> B"
+msgstr ""
+
+#: pdiff.cpp:327 pdiff.cpp:372
+msgid "Linediff: A <-> B"
+msgstr ""
+
+#: pdiff.cpp:338
+msgid "Loading C"
+msgstr ""
+
+#: pdiff.cpp:350
+msgid "Diff: B <-> C"
+msgstr ""
+
+#: pdiff.cpp:353
+msgid "Diff: A <-> C"
+msgstr ""
+
+#: pdiff.cpp:375
+msgid "Linediff: B <-> C"
+msgstr ""
+
+#: pdiff.cpp:378
+msgid "Linediff: A <-> C"
+msgstr ""
+
+#: pdiff.cpp:528 mergeresultwindow.cpp:828
+msgid "All input files are binary equal."
+msgstr ""
+
+#: pdiff.cpp:530
+msgid "All input files contain the same text, but are not binary equal."
+msgstr ""
+
+#: pdiff.cpp:532 pdiff.cpp:534 pdiff.cpp:536 mergeresultwindow.cpp:832
+#: mergeresultwindow.cpp:834 mergeresultwindow.cpp:836
+#, kde-format
+msgid "Files %1 and %2 are binary equal.\n"
+msgstr ""
+
+#: pdiff.cpp:533 pdiff.cpp:535 pdiff.cpp:537
+#, kde-format
+msgid "Files %1 and %2 have equal text, but are not binary equal. \n"
+msgstr ""
+
+#: pdiff.cpp:547
+msgid ""
+"Some inputfiles don't seem to be pure textfiles.\n"
+"Note that the KDiff3-merge was not meant for binary data.\n"
+"Continue at your own risk."
+msgstr ""
+
+#: pdiff.cpp:1017
+msgid "Abort"
+msgstr ""
+
+#: pdiff.cpp:1018 directorymergewindow.cpp:409
+msgid "Continue Merging"
+msgstr ""
+
+#: pdiff.cpp:1024 pdiff.cpp:1112
+msgid "Opening files..."
+msgstr ""
+
+#: pdiff.cpp:1089 pdiff.cpp:1160
+msgid "File open error"
+msgstr ""
+
+#: pdiff.cpp:1192
+msgid "Cutting selection..."
+msgstr ""
+
+#: pdiff.cpp:1213
+msgid "Copying selection to clipboard..."
+msgstr ""
+
+#: pdiff.cpp:1229
+msgid "Inserting clipboard contents..."
+msgstr ""
+
+#: pdiff.cpp:1755
+msgid "Save && Continue"
+msgstr ""
+
+#: pdiff.cpp:1756
+msgid "Continue Without Saving"
+msgstr ""
+
+#: pdiff.cpp:1958
+msgid "Search complete."
+msgstr ""
+
+#: pdiff.cpp:1958
+msgid "Search Complete"
+msgstr ""
+
+#: pdiff.cpp:2192
+msgid "Nothing is selected in either diff input window."
+msgstr ""
+
+#: pdiff.cpp:2192
+msgid "Error while adding manual diff range"
+msgstr ""
+
+#: kdiff3_shell.cpp:76
+msgid ""
+"Could not initialize our part!\n"
+"This usually happens due to an installation problem. Please read the README-"
+"file in the source package for details."
+msgstr ""
+
+#: directorymergewindow.cpp:154
 msgid "Mix of links and normal files."
 msgstr ""
 
-#: directorymergewindow.cpp:149
+#: directorymergewindow.cpp:161
 msgid "Link: "
 msgstr ""
 
-#: directorymergewindow.cpp:157
+#: directorymergewindow.cpp:169
 msgid "Size. "
 msgstr ""
 
-#: directorymergewindow.cpp:170
+#: directorymergewindow.cpp:182 directorymergewindow.cpp:192
 msgid "Date & Size: "
 msgstr ""
 
-#: directorymergewindow.cpp:179 directorymergewindow.cpp:185
+#: directorymergewindow.cpp:202 directorymergewindow.cpp:208
+#, kde-format
 msgid "Creating temp copy of %1 failed."
 msgstr ""
 
-#: directorymergewindow.cpp:196 directorymergewindow.cpp:204
+#: directorymergewindow.cpp:219 directorymergewindow.cpp:227
+#, kde-format
 msgid "Opening %1 failed."
 msgstr ""
 
-#: directorymergewindow.cpp:208
+#: directorymergewindow.cpp:231
 msgid "Comparing file..."
 msgstr ""
 
-#: directorymergewindow.cpp:218 directorymergewindow.cpp:224
+#: directorymergewindow.cpp:241 directorymergewindow.cpp:247
+#, kde-format
 msgid "Error reading from %1"
 msgstr ""
 
-#: directorymergewindow.cpp:282
+#: directorymergewindow.cpp:376
 msgid "Name"
 msgstr ""
 
-#: directorymergewindow.cpp:286
+#: directorymergewindow.cpp:376
 msgid "Operation"
 msgstr ""
 
-#: directorymergewindow.cpp:287
+#: directorymergewindow.cpp:376
 msgid "Status"
 msgstr ""
 
-#: directorymergewindow.cpp:288
+#: directorymergewindow.cpp:377
 msgid "Unsolved"
 msgstr ""
 
-#: directorymergewindow.cpp:289
+#: directorymergewindow.cpp:377
 msgid "Solved"
 msgstr ""
 
-#: directorymergewindow.cpp:290
+#: directorymergewindow.cpp:377
 msgid "Nonwhite"
 msgstr ""
 
-#: directorymergewindow.cpp:291
+#: directorymergewindow.cpp:377
 msgid "White"
 msgstr ""
 
-#: directorymergewindow.cpp:319
+#: directorymergewindow.cpp:406
 msgid ""
 "You are currently doing a directory merge. Are you sure, you want to abort "
 "the merge and rescan the directory?"
 msgstr ""
 
-#: directorymergewindow.cpp:320 directorymergewindow.cpp:2864
+#: directorymergewindow.cpp:408 directorymergewindow.cpp:2984
 msgid "Rescan"
 msgstr ""
 
-#: directorymergewindow.cpp:320 kdiff3.cpp:594 pdiff.cpp:965
-msgid "Continue Merging"
-msgstr ""
-
-#: directorymergewindow.cpp:462
+#: directorymergewindow.cpp:566
 msgid "Opening of directories failed:"
 msgstr ""
 
-#: directorymergewindow.cpp:465
+#: directorymergewindow.cpp:569
+#, kde-format
 msgid "Dir A \"%1\" does not exist or is not a directory.\n"
 msgstr ""
 
-#: directorymergewindow.cpp:468
+#: directorymergewindow.cpp:572
+#, kde-format
 msgid "Dir B \"%1\" does not exist or is not a directory.\n"
 msgstr ""
 
-#: directorymergewindow.cpp:471
+#: directorymergewindow.cpp:575
+#, kde-format
 msgid "Dir C \"%1\" does not exist or is not a directory.\n"
 msgstr ""
 
-#: directorymergewindow.cpp:473
+#: directorymergewindow.cpp:577
 msgid "Directory Open Error"
 msgstr ""
 
-#: directorymergewindow.cpp:481
+#: directorymergewindow.cpp:585
 msgid ""
 "The destination directory must not be the same as A or B when three "
 "directories are merged.\n"
 "Check again before continuing."
 msgstr ""
 
-#: directorymergewindow.cpp:483
+#: directorymergewindow.cpp:587
 msgid "Parameter Warning"
 msgstr ""
 
-#: directorymergewindow.cpp:488
+#: directorymergewindow.cpp:592
 msgid "Scanning directories..."
 msgstr ""
 
-#: directorymergewindow.cpp:537
+#: directorymergewindow.cpp:625
 msgid "Reading Directory A"
 msgstr ""
 
-#: directorymergewindow.cpp:559
+#: directorymergewindow.cpp:647
 msgid "Reading Directory B"
 msgstr ""
 
-#: directorymergewindow.cpp:581
+#: directorymergewindow.cpp:669
 msgid "Reading Directory C"
 msgstr ""
 
-#: directorymergewindow.cpp:607
+#: directorymergewindow.cpp:695
 msgid "Some subdirectories were not readable in"
 msgstr ""
 
-#: directorymergewindow.cpp:612
+#: directorymergewindow.cpp:700
 msgid "Check the permissions of the subdirectories."
 msgstr ""
 
-#: directorymergewindow.cpp:646 kdiff3.cpp:547 kdiff3.cpp:627 kdiff3.cpp:651
-#: kdiff3.cpp:924 kdiff3.cpp:945 pdiff.cpp:1045 pdiff.cpp:1117 pdiff.cpp:1155
-#: pdiff.cpp:1171 pdiff.cpp:1201 pdiff.cpp:1212
-msgid "Ready."
-msgstr ""
-
-#: directorymergewindow.cpp:660
+#: directorymergewindow.cpp:753
 msgid "Directory Comparison Status"
 msgstr ""
 
-#: directorymergewindow.cpp:661
+#: directorymergewindow.cpp:754
 msgid "Number of subdirectories:"
 msgstr ""
 
-#: directorymergewindow.cpp:662
+#: directorymergewindow.cpp:755
 msgid "Number of equal files:"
 msgstr ""
 
-#: directorymergewindow.cpp:663
+#: directorymergewindow.cpp:756
 msgid "Number of different files:"
 msgstr ""
 
-#: directorymergewindow.cpp:666
+#: directorymergewindow.cpp:759
 msgid "Number of manual merges:"
 msgstr ""
 
-#: directorymergewindow.cpp:802
+#: directorymergewindow.cpp:928
 msgid "This affects all merge operations."
 msgstr ""
 
-#: directorymergewindow.cpp:803
+#: directorymergewindow.cpp:929
 msgid "Changing All Merge Operations"
 msgstr ""
 
-#: directorymergewindow.cpp:803 mergeresultwindow.cpp:285
-msgid "C&ontinue"
-msgstr ""
-
-#: directorymergewindow.cpp:1169
+#: directorymergewindow.cpp:1328
 msgid "Processing "
 msgstr ""
 
-#: directorymergewindow.cpp:1644 directorymergewindow.cpp:1650
+#: directorymergewindow.cpp:1807 directorymergewindow.cpp:1813
 msgid "To do."
 msgstr ""
 
-#: directorymergewindow.cpp:1752 directorymergewindow.cpp:2895
+#: directorymergewindow.cpp:1881 directorymergewindow.cpp:3015
 msgid "Copy A to B"
 msgstr ""
 
-#: directorymergewindow.cpp:1753 directorymergewindow.cpp:2896
+#: directorymergewindow.cpp:1882 directorymergewindow.cpp:3016
 msgid "Copy B to A"
 msgstr ""
 
-#: directorymergewindow.cpp:1754 directorymergewindow.cpp:2897
+#: directorymergewindow.cpp:1883 directorymergewindow.cpp:3017
 msgid "Delete A"
 msgstr ""
 
-#: directorymergewindow.cpp:1755 directorymergewindow.cpp:2898
+#: directorymergewindow.cpp:1884 directorymergewindow.cpp:3018
 msgid "Delete B"
 msgstr ""
 
-#: directorymergewindow.cpp:1756
+#: directorymergewindow.cpp:1885
 msgid "Delete A & B"
 msgstr ""
 
-#: directorymergewindow.cpp:1757 directorymergewindow.cpp:2900
+#: directorymergewindow.cpp:1886 directorymergewindow.cpp:3020
 msgid "Merge to A"
 msgstr ""
 
-#: directorymergewindow.cpp:1758 directorymergewindow.cpp:2901
+#: directorymergewindow.cpp:1887 directorymergewindow.cpp:3021
 msgid "Merge to B"
 msgstr ""
 
-#: directorymergewindow.cpp:1759
+#: directorymergewindow.cpp:1888
 msgid "Merge to A & B"
 msgstr ""
 
-#: directorymergewindow.cpp:1763 directorymergewindow.cpp:2892
+#: directorymergewindow.cpp:1892 directorymergewindow.cpp:3012
 msgid "Delete (if exists)"
 msgstr ""
 
-#: directorymergewindow.cpp:1764 directorymergewindow.cpp:1765
-#: directorymergewindow.cpp:2891 smalldialogs.cpp:102
-msgid "Merge"
-msgstr ""
-
-#: directorymergewindow.cpp:1764 directorymergewindow.cpp:1765
+#: directorymergewindow.cpp:1893 directorymergewindow.cpp:1894
 msgid "Merge (manual)"
 msgstr ""
 
-#: directorymergewindow.cpp:1766
+#: directorymergewindow.cpp:1895
 msgid "Error: Conflicting File Types"
 msgstr ""
 
-#: directorymergewindow.cpp:1767
+#: directorymergewindow.cpp:1896
 msgid "Error: Dates are equal but files are not."
 msgstr ""
 
-#: directorymergewindow.cpp:1791 directorymergewindow.cpp:1820
-#: directorymergewindow.cpp:1845
+#: directorymergewindow.cpp:1922 directorymergewindow.cpp:1951
+#: directorymergewindow.cpp:1976
 msgid "This operation is currently not possible."
 msgstr ""
 
-#: directorymergewindow.cpp:1791 directorymergewindow.cpp:1820
-#: directorymergewindow.cpp:1845 directorymergewindow.cpp:2102
+#: directorymergewindow.cpp:1922 directorymergewindow.cpp:1951
+#: directorymergewindow.cpp:1976 directorymergewindow.cpp:2235
 msgid "Operation Not Possible"
 msgstr ""
 
-#: directorymergewindow.cpp:1884
+#: directorymergewindow.cpp:2015
 msgid ""
 "This should never happen: \n"
 "\n"
@@ -318,40 +2096,46 @@
 "If you know how to reproduce this, please contact the program author."
 msgstr ""
 
-#: directorymergewindow.cpp:1884
+#: directorymergewindow.cpp:2015
 msgid "Program Error"
 msgstr ""
 
-#: directorymergewindow.cpp:1895
+#: directorymergewindow.cpp:2026
 msgid "An error occurred while copying.\n"
 msgstr ""
 
-#: directorymergewindow.cpp:1896 directorymergewindow.cpp:2302
+#: directorymergewindow.cpp:2026 directorymergewindow.cpp:2095
+#: directorymergewindow.cpp:2127 directorymergewindow.cpp:2175
+#: directorymergewindow.cpp:2184 directorymergewindow.cpp:2435
+msgid "Error"
+msgstr ""
+
+#: directorymergewindow.cpp:2027 directorymergewindow.cpp:2436
 msgid "Merge Error"
 msgstr ""
 
-#: directorymergewindow.cpp:1901 directorymergewindow.cpp:2307
+#: directorymergewindow.cpp:2032 directorymergewindow.cpp:2441
 msgid "Error."
 msgstr ""
 
-#: directorymergewindow.cpp:1906 directorymergewindow.cpp:2198
-#: directorymergewindow.cpp:2238
+#: directorymergewindow.cpp:2037 directorymergewindow.cpp:2333
+#: directorymergewindow.cpp:2373
 msgid "Done."
 msgstr ""
 
-#: directorymergewindow.cpp:1929
+#: directorymergewindow.cpp:2060
 msgid "Not saved."
 msgstr ""
 
-#: directorymergewindow.cpp:1964
+#: directorymergewindow.cpp:2095
 msgid "Unknown merge operation. (This must never happen!)"
 msgstr ""
 
-#: directorymergewindow.cpp:1996
+#: directorymergewindow.cpp:2127
 msgid "Unknown merge operation."
 msgstr ""
 
-#: directorymergewindow.cpp:2011
+#: directorymergewindow.cpp:2142
 msgid ""
 "The merge is about to begin.\n"
 "\n"
@@ -363,1887 +2147,665 @@
 "whatsoever! Make backups of your vital data!"
 msgstr ""
 
-#: directorymergewindow.cpp:2016
+#: directorymergewindow.cpp:2147
 msgid "Starting Merge"
 msgstr ""
 
-#: directorymergewindow.cpp:2016
+#: directorymergewindow.cpp:2148
 msgid "Do It"
 msgstr ""
 
-#: directorymergewindow.cpp:2016
+#: directorymergewindow.cpp:2149
 msgid "Simulate It"
 msgstr ""
 
-#: directorymergewindow.cpp:2042
+#: directorymergewindow.cpp:2175
 msgid ""
 "The highlighted item has a different type in the different directories. "
 "Select what to do."
 msgstr ""
 
-#: directorymergewindow.cpp:2051
+#: directorymergewindow.cpp:2184
 msgid ""
 "The modification dates of the file are equal but the files are not. Select "
 "what to do."
 msgstr ""
 
-#: directorymergewindow.cpp:2102
+#: directorymergewindow.cpp:2235
 msgid ""
 "This operation is currently not possible because directory merge is "
 "currently running."
 msgstr ""
 
-#: directorymergewindow.cpp:2162
+#: directorymergewindow.cpp:2295
 msgid ""
 "There was an error in the last step.\n"
 "Do you want to continue with the item that caused the error or do you want "
 "to skip this item?"
 msgstr ""
 
-#: directorymergewindow.cpp:2164
+#: directorymergewindow.cpp:2297
 msgid "Continue merge after an error"
 msgstr ""
 
-#: directorymergewindow.cpp:2164
+#: directorymergewindow.cpp:2298
 msgid "Continue With Last Item"
 msgstr ""
 
-#: directorymergewindow.cpp:2164
+#: directorymergewindow.cpp:2299
 msgid "Skip Item"
 msgstr ""
 
-#: directorymergewindow.cpp:2198
+#: directorymergewindow.cpp:2333
 msgid "Skipped."
 msgstr ""
 
-#: directorymergewindow.cpp:2205 directorymergewindow.cpp:2431
+#: directorymergewindow.cpp:2340 directorymergewindow.cpp:2554
 msgid "In progress..."
 msgstr ""
 
-#: directorymergewindow.cpp:2253
+#: directorymergewindow.cpp:2388
 msgid "Merge operation complete."
 msgstr ""
 
-#: directorymergewindow.cpp:2253 directorymergewindow.cpp:2256
+#: directorymergewindow.cpp:2388 directorymergewindow.cpp:2391
 msgid "Merge Complete"
 msgstr ""
 
-#: directorymergewindow.cpp:2265
+#: directorymergewindow.cpp:2401
 msgid ""
 "Simulated merge complete: Check if you agree with the proposed operations."
 msgstr ""
 
-#: directorymergewindow.cpp:2301
+#: directorymergewindow.cpp:2435
 msgid "An error occurred. Press OK to see detailed information.\n"
 msgstr ""
 
-#: directorymergewindow.cpp:2344
+#: directorymergewindow.cpp:2467
+#, kde-format
 msgid "Error: While deleting %1: Creating backup failed."
 msgstr ""
 
-#: directorymergewindow.cpp:2351
+#: directorymergewindow.cpp:2474
+#, kde-format
 msgid "delete directory recursively( %1 )"
 msgstr ""
 
-#: directorymergewindow.cpp:2353
+#: directorymergewindow.cpp:2476
+#, kde-format
 msgid "delete( %1 )"
 msgstr ""
 
-#: directorymergewindow.cpp:2368
+#: directorymergewindow.cpp:2491
 msgid "Error: delete dir operation failed while trying to read the directory."
 msgstr ""
 
-#: directorymergewindow.cpp:2387
+#: directorymergewindow.cpp:2510
+#, kde-format
 msgid "Error: rmdir( %1 ) operation failed."
 msgstr ""
 
-#: directorymergewindow.cpp:2397
+#: directorymergewindow.cpp:2520
 msgid "Error: delete operation failed."
 msgstr ""
 
-#: directorymergewindow.cpp:2423
+#: directorymergewindow.cpp:2546
+#, kde-format
 msgid "manual merge( %1, %2, %3 -> %4)"
 msgstr ""
 
-#: directorymergewindow.cpp:2426
+#: directorymergewindow.cpp:2549
 msgid ""
 "     Note: After a manual merge the user should continue by pressing F7."
 msgstr ""
 
-#: directorymergewindow.cpp:2449
+#: directorymergewindow.cpp:2572
+#, kde-format
 msgid "Error: copy( %1 -> %2 ) failed.Deleting existing destination failed."
 msgstr ""
 
-#: directorymergewindow.cpp:2459
+#: directorymergewindow.cpp:2582
+#, kde-format
 msgid "copyLink( %1 -> %2 )"
 msgstr ""
 
-#: directorymergewindow.cpp:2470
+#: directorymergewindow.cpp:2593
 msgid "Error: copyLink failed: Remote links are not yet supported."
 msgstr ""
 
-#: directorymergewindow.cpp:2476
+#: directorymergewindow.cpp:2599
 msgid "Error: copyLink failed."
 msgstr ""
 
-#: directorymergewindow.cpp:2496
+#: directorymergewindow.cpp:2619
+#, kde-format
 msgid "copy( %1 -> %2 )"
 msgstr ""
 
-#: directorymergewindow.cpp:2522
+#: directorymergewindow.cpp:2645
+#, kde-format
 msgid "Error during rename( %1 -> %2 ): Cannot delete existing destination."
 msgstr ""
 
-#: directorymergewindow.cpp:2528
+#: directorymergewindow.cpp:2651
+#, kde-format
 msgid "rename( %1 -> %2 )"
 msgstr ""
 
-#: directorymergewindow.cpp:2537
+#: directorymergewindow.cpp:2660
 msgid "Error: Rename failed."
 msgstr ""
 
-#: directorymergewindow.cpp:2555
+#: directorymergewindow.cpp:2678
+#, kde-format
 msgid "Error during makeDir of %1. Cannot delete existing file."
 msgstr ""
 
-#: directorymergewindow.cpp:2571
+#: directorymergewindow.cpp:2694
+#, kde-format
 msgid "makeDir( %1 )"
 msgstr ""
 
-#: directorymergewindow.cpp:2581
+#: directorymergewindow.cpp:2704
 msgid "Error while creating directory."
 msgstr ""
 
-#: directorymergewindow.cpp:2604 directorymergewindow.cpp:2721
+#: directorymergewindow.cpp:2729 directorymergewindow.cpp:2839
 msgid "Dest"
 msgstr ""
 
-#: directorymergewindow.cpp:2608 directorymergewindow.cpp:2646
+#: directorymergewindow.cpp:2733 directorymergewindow.cpp:2764
 msgid "Dir"
 msgstr ""
 
-#: directorymergewindow.cpp:2609
+#: directorymergewindow.cpp:2733
 msgid "Type"
 msgstr ""
 
-#: directorymergewindow.cpp:2610
+#: directorymergewindow.cpp:2733
 msgid "Size"
 msgstr ""
 
-#: directorymergewindow.cpp:2611
+#: directorymergewindow.cpp:2734
 msgid "Attr"
 msgstr ""
 
-#: directorymergewindow.cpp:2612
+#: directorymergewindow.cpp:2734
 msgid "Last Modification"
 msgstr ""
 
-#: directorymergewindow.cpp:2613
+#: directorymergewindow.cpp:2734
 msgid "Link-Destination"
 msgstr ""
 
-#: directorymergewindow.cpp:2663
+#: directorymergewindow.cpp:2781
 msgid "not available"
 msgstr ""
 
-#: directorymergewindow.cpp:2683
+#: directorymergewindow.cpp:2801
 msgid "A (Dest): "
 msgstr ""
 
-#: directorymergewindow.cpp:2686
+#: directorymergewindow.cpp:2804
 msgid "A (Base): "
 msgstr ""
 
-#: directorymergewindow.cpp:2692
+#: directorymergewindow.cpp:2810
 msgid "B (Dest): "
 msgstr ""
 
-#: directorymergewindow.cpp:2700
+#: directorymergewindow.cpp:2818
 msgid "C (Dest): "
 msgstr ""
 
-#: directorymergewindow.cpp:2706
+#: directorymergewindow.cpp:2824
 msgid "Dest: "
 msgstr ""
 
-#: directorymergewindow.cpp:2771
+#: directorymergewindow.cpp:2891
 msgid "Save Directory Merge State As..."
 msgstr ""
 
-#: directorymergewindow.cpp:2858
+#: directorymergewindow.cpp:2978
 msgid "Start/Continue Directory Merge"
 msgstr ""
 
-#: directorymergewindow.cpp:2859
+#: directorymergewindow.cpp:2979
 msgid "Run Operation for Current Item"
 msgstr ""
 
-#: directorymergewindow.cpp:2860
+#: directorymergewindow.cpp:2980
 msgid "Compare Selected File"
 msgstr ""
 
-#: directorymergewindow.cpp:2861
+#: directorymergewindow.cpp:2981
 msgid "Merge Current File"
 msgstr ""
 
-#: directorymergewindow.cpp:2862
+#: directorymergewindow.cpp:2981
+msgid ""
+"Merge\n"
+"File"
+msgstr ""
+
+#: directorymergewindow.cpp:2982
 msgid "Fold All Subdirs"
 msgstr ""
 
-#: directorymergewindow.cpp:2863
+#: directorymergewindow.cpp:2983
 msgid "Unfold All Subdirs"
 msgstr ""
 
-#: directorymergewindow.cpp:2867
+#: directorymergewindow.cpp:2987
 msgid "Choose A for All Items"
 msgstr ""
 
-#: directorymergewindow.cpp:2868
+#: directorymergewindow.cpp:2988
 msgid "Choose B for All Items"
 msgstr ""
 
-#: directorymergewindow.cpp:2869
+#: directorymergewindow.cpp:2989
 msgid "Choose C for All Items"
 msgstr ""
 
-#: directorymergewindow.cpp:2870
+#: directorymergewindow.cpp:2990
 msgid "Auto-Choose Operation for All Items"
 msgstr ""
 
-#: directorymergewindow.cpp:2871
+#: directorymergewindow.cpp:2991
 msgid "No Operation for All Items"
 msgstr ""
 
-#: directorymergewindow.cpp:2876
+#: directorymergewindow.cpp:2996
 msgid "Show Identical Files"
 msgstr ""
 
-#: directorymergewindow.cpp:2877
+#: directorymergewindow.cpp:2996
+msgid ""
+"Identical\n"
+"Files"
+msgstr ""
+
+#: directorymergewindow.cpp:2997
 msgid "Show Different Files"
 msgstr ""
 
-#: directorymergewindow.cpp:2878
+#: directorymergewindow.cpp:2998
 msgid "Show Files only in A"
 msgstr ""
 
-#: directorymergewindow.cpp:2879
+#: directorymergewindow.cpp:2998
+msgid ""
+"Files\n"
+"only in A"
+msgstr ""
+
+#: directorymergewindow.cpp:2999
 msgid "Show Files only in B"
 msgstr ""
 
-#: directorymergewindow.cpp:2880
+#: directorymergewindow.cpp:2999
+msgid ""
+"Files\n"
+"only in B"
+msgstr ""
+
+#: directorymergewindow.cpp:3000
 msgid "Show Files only in C"
 msgstr ""
 
-#: directorymergewindow.cpp:2884
+#: directorymergewindow.cpp:3000
+msgid ""
+"Files\n"
+"only in C"
+msgstr ""
+
+#: directorymergewindow.cpp:3004
 msgid "Compare Explicitly Selected Files"
 msgstr ""
 
-#: directorymergewindow.cpp:2885
+#: directorymergewindow.cpp:3005
 msgid "Merge Explicitly Selected Files"
 msgstr ""
 
-#: directorymergewindow.cpp:2887 directorymergewindow.cpp:2894
+#: directorymergewindow.cpp:3007 directorymergewindow.cpp:3014
 msgid "Do Nothing"
 msgstr ""
 
-#: directorymergewindow.cpp:2888
+#: directorymergewindow.cpp:3008
 msgid "A"
 msgstr ""
 
-#: directorymergewindow.cpp:2889
+#: directorymergewindow.cpp:3009
 msgid "B"
 msgstr ""
 
-#: directorymergewindow.cpp:2890
+#: directorymergewindow.cpp:3010
 msgid "C"
 msgstr ""
 
-#: directorymergewindow.cpp:2899
+#: directorymergewindow.cpp:3019
 msgid "Delete A && B"
 msgstr ""
 
-#: directorymergewindow.cpp:2902
+#: directorymergewindow.cpp:3022
 msgid "Merge to A && B"
 msgstr ""
 
-#: fileaccess.cpp:567
-msgid ""
-"While trying to make a backup, deleting an older backup failed. \n"
-"Filename: "
-msgstr ""
-
-#: fileaccess.cpp:574
-msgid ""
-"While trying to make a backup, renaming failed. \n"
-"Filenames: "
-msgstr ""
-
-#: fileaccess.cpp:596
-msgid "Getting file status: %1"
-msgstr ""
-
-#: fileaccess.cpp:639
-msgid "Reading file: %1"
-msgstr ""
-
-#: fileaccess.cpp:675
-msgid "Writing file: %1"
-msgstr ""
-
-#: fileaccess.cpp:703
-msgid "Out of memory"
-msgstr ""
-
-#: fileaccess.cpp:738
-msgid "Making directory: %1"
-msgstr ""
-
-#: fileaccess.cpp:758
-msgid "Removing directory: %1"
-msgstr ""
-
-#: fileaccess.cpp:773
-msgid "Removing file: %1"
-msgstr ""
-
-#: fileaccess.cpp:789
-msgid "Creating symbolic link: %1 -> %2"
-msgstr ""
-
-#: fileaccess.cpp:815
-msgid "Renaming file: %1 -> %2"
-msgstr ""
-
-#: fileaccess.cpp:851
-msgid "Copying file: %1 -> %2"
-msgstr ""
-
-#: fileaccess.cpp:865
-msgid ""
-"Error during file copy operation: Opening file for reading failed. Filename: "
-"%1"
-msgstr ""
-
-#: fileaccess.cpp:871
-msgid ""
-"Error during file copy operation: Opening file for writing failed. Filename: "
-"%1"
-msgstr ""
-
-#: fileaccess.cpp:886
-msgid "Error during file copy operation: Reading failed. Filename: %1"
-msgstr ""
-
-#: fileaccess.cpp:895
-msgid "Error during file copy operation: Writing failed. Filename: %1"
-msgstr ""
-
-#: fileaccess.cpp:1191
-msgid "Reading directory: "
-msgstr ""
-
-#: fileaccess.cpp:1320
-msgid "Listing directory: %1"
-msgstr ""
-
-#: kdiff3.cpp:142
-msgid "Current Configuration:"
-msgstr ""
-
-#: kdiff3.cpp:147
-msgid "Config Option Error:"
-msgstr ""
-
-#: kdiff3.cpp:187
-msgid "Option --auto used, but no output file specified."
-msgstr ""
-
-#: kdiff3.cpp:318
-msgid "Option --auto ignored for directory comparison."
-msgstr ""
-
-#: kdiff3.cpp:354
-msgid "Saving failed."
-msgstr ""
-
-#: kdiff3.cpp:381 pdiff.cpp:1027 pdiff.cpp:1098
-msgid "Opening of these files failed:"
-msgstr ""
-
-#: kdiff3.cpp:390
-msgid "File Open Error"
-msgstr ""
-
-#: kdiff3.cpp:413
-msgid "Opens documents for comparison..."
-msgstr ""
-
-#: kdiff3.cpp:418
-msgid "Saves the merge result. All conflicts must be solved!"
-msgstr ""
-
-#: kdiff3.cpp:420
-msgid "Saves the current document as..."
-msgstr ""
-
-#: kdiff3.cpp:422
-msgid "Print the differences"
-msgstr ""
-
-#: kdiff3.cpp:424
-msgid "Quits the application"
-msgstr ""
-
-#: kdiff3.cpp:426
-msgid "Cuts the selected section and puts it to the clipboard"
-msgstr ""
-
-#: kdiff3.cpp:428
-msgid "Copies the selected section to the clipboard"
-msgstr ""
-
-#: kdiff3.cpp:430
-msgid "Pastes the clipboard contents to actual position"
-msgstr ""
-
-#: kdiff3.cpp:432
-msgid "Select everything in current window"
-msgstr ""
-
-#: kdiff3.cpp:434
-msgid "Search for a string"
-msgstr ""
-
-#: kdiff3.cpp:436
-msgid "Search again for the string"
-msgstr ""
-
-#: kdiff3.cpp:438
-msgid "Enables/disables the toolbar"
-msgstr ""
-
-#: kdiff3.cpp:440
-msgid "Enables/disables the statusbar"
-msgstr ""
-
-#: kdiff3.cpp:444
-msgid "Configure KDiff3..."
-msgstr ""
-
-#: kdiff3.cpp:465
-msgid "Go to Current Delta"
-msgstr ""
-
-#: kdiff3.cpp:466
-msgid "Go to First Delta"
-msgstr ""
-
-#: kdiff3.cpp:467
-msgid "Go to Last Delta"
-msgstr ""
-
-#: kdiff3.cpp:468
-msgid "(Skips white space differences when \"Show White Space\" is disabled.)"
-msgstr ""
-
-#: kdiff3.cpp:469
-msgid ""
-"(Does not skip white space differences even when \"Show White Space\" is "
-"disabled.)"
-msgstr ""
-
-#: kdiff3.cpp:470
-msgid "Go to Previous Delta"
-msgstr ""
-
-#: kdiff3.cpp:472
-msgid "Go to Next Delta"
-msgstr ""
-
-#: kdiff3.cpp:474
-msgid "Go to Previous Conflict"
-msgstr ""
-
-#: kdiff3.cpp:476
-msgid "Go to Next Conflict"
-msgstr ""
-
-#: kdiff3.cpp:478
-msgid "Go to Previous Unsolved Conflict"
-msgstr ""
-
-#: kdiff3.cpp:480
-msgid "Go to Next Unsolved Conflict"
-msgstr ""
-
-#: kdiff3.cpp:482
-msgid "Select Line(s) From A"
-msgstr ""
-
-#: kdiff3.cpp:483
-msgid "Select Line(s) From B"
-msgstr ""
-
-#: kdiff3.cpp:484
-msgid "Select Line(s) From C"
-msgstr ""
-
-#: kdiff3.cpp:485
-msgid "Automatically Go to Next Unsolved Conflict After Source Selection"
-msgstr ""
-
-#: kdiff3.cpp:487
-msgid "Show Space && Tabulator Characters for Differences"
-msgstr ""
-
-#: kdiff3.cpp:488
-msgid "Show White Space"
-msgstr ""
-
-#: kdiff3.cpp:490
-msgid "Show Line Numbers"
-msgstr ""
-
-#: kdiff3.cpp:491
-msgid "Choose A Everywhere"
-msgstr ""
-
-#: kdiff3.cpp:492
-msgid "Choose B Everywhere"
-msgstr ""
-
-#: kdiff3.cpp:493
-msgid "Choose C Everywhere"
-msgstr ""
-
-#: kdiff3.cpp:494
-msgid "Choose A for All Unsolved Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:495
-msgid "Choose B for All Unsolved Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:496
-msgid "Choose C for All Unsolved Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:497
-msgid "Choose A for All Unsolved Whitespace Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:498
-msgid "Choose B for All Unsolved Whitespace Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:499
-msgid "Choose C for All Unsolved Whitespace Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:500
-msgid "Automatically Solve Simple Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:501
-msgid "Set Deltas to Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:502
-msgid "Run Regular Expression Auto Merge"
-msgstr ""
-
-#: kdiff3.cpp:503
-msgid "Automatically Solve History Conflicts"
-msgstr ""
-
-#: kdiff3.cpp:504
-msgid "Split Diff At Selection"
-msgstr ""
-
-#: kdiff3.cpp:505
-msgid "Join Selected Diffs"
-msgstr ""
-
-#: kdiff3.cpp:507
-msgid "Show Window A"
-msgstr ""
-
-#: kdiff3.cpp:508
-msgid "Show Window B"
-msgstr ""
-
-#: kdiff3.cpp:509
-msgid "Show Window C"
-msgstr ""
-
-#: kdiff3.cpp:510 kdiff3.cpp:521
-msgid "Focus Next Window"
-msgstr ""
-
-#: kdiff3.cpp:512
-msgid "Normal Overview"
-msgstr ""
-
-#: kdiff3.cpp:513
-msgid "A vs. B Overview"
-msgstr ""
-
-#: kdiff3.cpp:514
-msgid "A vs. C Overview"
-msgstr ""
-
-#: kdiff3.cpp:515
-msgid "B vs. C Overview"
-msgstr ""
-
-#: kdiff3.cpp:516
-msgid "Word Wrap Diff Windows"
-msgstr ""
-
-#: kdiff3.cpp:517
-msgid "Add Manual Diff Alignment"
-msgstr ""
-
-#: kdiff3.cpp:518
-msgid "Clear All Manual Diff Alignments"
-msgstr ""
-
-#: kdiff3.cpp:523
-msgid "Focus Prev Window"
-msgstr ""
-
-#: kdiff3.cpp:524
-msgid "Toggle Split Orientation"
-msgstr ""
-
-#: kdiff3.cpp:526
-msgid "Dir && Text Split Screen View"
-msgstr ""
-
-#: kdiff3.cpp:528
-msgid "Toggle Between Dir && Text View"
-msgstr ""
-
-#: kdiff3.cpp:573 pdiff.cpp:1698
-msgid "The merge result hasn't been saved."
-msgstr ""
-
-#: kdiff3.cpp:574
-msgid "Save && Quit"
-msgstr ""
-
-#: kdiff3.cpp:574
-msgid "Quit Without Saving"
-msgstr ""
-
-#: kdiff3.cpp:582 pdiff.cpp:1707
-msgid "Saving the merge result failed."
-msgstr ""
-
-#: kdiff3.cpp:593 pdiff.cpp:964
-msgid ""
-"You are currently doing a directory merge. Are you sure, you want to abort?"
-msgstr ""
-
-#: kdiff3.cpp:616
-msgid "Saving file..."
-msgstr ""
-
-#: kdiff3.cpp:633
-msgid "Saving file with a new filename..."
-msgstr ""
-
-#: kdiff3.cpp:722
-msgid "Printing..."
-msgstr ""
-
-#: kdiff3.cpp:728 kdiff3.cpp:890
-msgid "Printing aborted."
-msgstr ""
-
-#: kdiff3.cpp:860
-msgid "Selection"
-msgstr ""
-
-#: kdiff3.cpp:886
-msgid "Printing completed."
-msgstr ""
-
-#: kdiff3.cpp:896
-msgid "Exiting..."
-msgstr ""
-
-#: kdiff3.cpp:908
-msgid "Toggling toolbar..."
-msgstr ""
-
-#: kdiff3.cpp:929
-msgid "Toggle the statusbar..."
-msgstr ""
-
-#: kdiff3_part.cpp:155 kdiff3_part.cpp:224
+#: kdiff3_part.cpp:157 kdiff3_part.cpp:234
 msgid "Couldn't find files for comparison."
 msgstr ""
 
-#: kdiff3_part.cpp:291
+#: kdiff3_part.cpp:302
 msgid "KDiff3Part"
 msgstr ""
 
-#: kdiff3_shell.cpp:78
-msgid ""
-"Could not find our part!\n"
-"This usually happens due to an installation problem. Please read the README-"
-"file in the source package for details."
-msgstr ""
-
-#: main.cpp:35
-msgid "Tool for Comparison and Merge of Files and Directories"
-msgstr ""
-
-#: main.cpp:40
-msgid "Merge the input."
-msgstr ""
-
-#: main.cpp:42
-msgid "Explicit base file. For compatibility with certain tools."
-msgstr ""
-
-#: main.cpp:44
-msgid "Output file. Implies -m. E.g.: -o newfile.txt"
-msgstr ""
-
-#: main.cpp:45
-msgid "Output file, again. (For compatibility with certain tools.)"
-msgstr ""
-
-#: main.cpp:46
-msgid "No GUI if all conflicts are auto-solvable. (Needs -o file)"
-msgstr ""
-
-#: main.cpp:47
-msgid "Don't solve conflicts automatically. (For compatibility...)"
-msgstr ""
-
-#: main.cpp:48
-msgid "Visible name replacement for input file 1 (base)."
-msgstr ""
-
-#: main.cpp:49
-msgid "Visible name replacement for input file 2."
-msgstr ""
-
-#: main.cpp:50
-msgid "Visible name replacement for input file 3."
-msgstr ""
-
-#: main.cpp:52
-msgid "Alternative visible name replacement. Supply this once for every input."
-msgstr ""
-
-#: main.cpp:53
-msgid ""
-"Override a config setting. Use once for every setting. E.g.: --cs "
-"\"AutoAdvance=1\""
-msgstr ""
-
-#: main.cpp:54
-msgid "Show list of config settings and current values."
-msgstr ""
-
-#: main.cpp:55
-msgid "Use a different config file."
-msgstr ""
-
-#: main.cpp:59
-msgid "file1 to open (base, if not specified via --base)"
-msgstr ""
-
-#: main.cpp:60
-msgid "file2 to open"
-msgstr ""
-
-#: main.cpp:61
-msgid "file3 to open"
-msgstr ""
-
-#: main.cpp:93
-msgid "Ignored. (User defined.)"
-msgstr ""
-
-#. i18n: file kdiff3_part.rc line 16
-#: main.cpp:171 rc.cpp:9
-#, no-c-format
-msgid "KDiff3"
-msgstr ""
-
-#: main.cpp:184
-msgid "+ Many thanks to those who reported bugs and contributed ideas!"
-msgstr ""
-
-#: mergeresultwindow.cpp:133 mergeresultwindow.cpp:937
-#: mergeresultwindow.cpp:951 mergeresultwindow.cpp:963
-#: mergeresultwindow.cpp:975
+#: kreplacements/kreplacements.h:102
+msgid "Continue"
+msgstr ""
+
+#: kreplacements/kreplacements.h:104 kreplacements/kreplacements.cpp:637
+msgid "Quit"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:183 kreplacements/kreplacements.cpp:345
+msgid "Ok"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:187 kreplacements/kreplacements.cpp:721
+msgid "Help"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:191
+msgid "Defaults"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:4
+#. i18n: ectx: Menu (file)
+#: kreplacements/kreplacements.cpp:302 rc.cpp:12
+msgid "&File"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:303
+msgid "&Edit"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:7
+#. i18n: ectx: Menu (directory)
+#: kreplacements/kreplacements.cpp:304 rc.cpp:15
+msgid "&Directory"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:50
+#. i18n: ectx: Menu (movement)
+#: kreplacements/kreplacements.cpp:307 rc.cpp:24
+msgid "&Movement"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:61
+#. i18n: ectx: Menu (diff)
+#: kreplacements/kreplacements.cpp:308 rc.cpp:27
+msgid "D&iffview"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:73
+#. i18n: ectx: Menu (merge)
+#: kreplacements/kreplacements.cpp:309 rc.cpp:30
+msgid "&Merge"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:95
+#. i18n: ectx: Menu (window)
+#: kreplacements/kreplacements.cpp:310 rc.cpp:33
+msgid "&Window"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:311
+msgid "&Settings"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:312
+msgid "&Help"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:359
+msgid "&About"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:375
+msgid "A&uthor"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:389
+msgid "&Thanks To"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:30
+#. i18n: ectx: Menu (dir_current_merge_menu)
+#: kreplacements/kreplacements.cpp:494 kreplacements/kreplacements.cpp:503
+#: rc.cpp:18
+msgid "Current Item Merge Operation"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:38
+#. i18n: ectx: Menu (dir_current_sync_menu)
+#: kreplacements/kreplacements.cpp:495 kreplacements/kreplacements.cpp:504
+#: rc.cpp:21
+msgid "Current Item Sync Operation"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:603
+msgid "Open"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:612
+msgid "Save"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:629
+msgid "Print..."
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:645
+msgid "Cut"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:653
+msgid "Copy"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:661
+msgid "Paste"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:669
+msgid "Select All"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:677
+msgid "Show Toolbar"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:685
+msgid "Show &Statusbar"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:693
+#, kde-format
+msgid "&Configure %1..."
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:705 kreplacements/kreplacements.cpp:713
+msgid "About"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:728
+msgid "Find"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:736
+msgid "Find Next"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:756
+msgid "Select Font"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:798
+msgid "Incompatible font."
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:799
+msgid "Continue at my own risk"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:799
+msgid "Select another font"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:1138
+msgid "For more documentation, see the help-menu or the subdirectory doc."
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:1141
+msgid "KDiff3-Usage"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:1141
+msgid "Ignore"
+msgstr ""
+
+#: kreplacements/kreplacements.cpp:1141
+msgid "Exit"
+msgstr ""
+
+#: mergeresultwindow.cpp:152 mergeresultwindow.cpp:970
+#: mergeresultwindow.cpp:984 mergeresultwindow.cpp:996
+#: mergeresultwindow.cpp:1008
+#, kde-format
 msgid "Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)"
 msgstr ""
 
-#: mergeresultwindow.cpp:283
+#: mergeresultwindow.cpp:301
 msgid ""
 "The output has been modified.\n"
 "If you continue your changes will be lost."
 msgstr ""
 
-#: mergeresultwindow.cpp:795 pdiff.cpp:507
-msgid "All input files are binary equal."
-msgstr ""
-
-#: mergeresultwindow.cpp:797
+#: mergeresultwindow.cpp:830
 msgid "All input files contain the same text."
 msgstr ""
 
-#: mergeresultwindow.cpp:799
-msgid "Files A and B are binary equal.\n"
-msgstr ""
-
-#: mergeresultwindow.cpp:800
-msgid "Files A and B have equal text. \n"
-msgstr ""
-
-#: mergeresultwindow.cpp:801
-msgid "Files A and C are binary equal.\n"
-msgstr ""
-
-#: mergeresultwindow.cpp:802
-msgid "Files A and C have equal text. \n"
-msgstr ""
-
-#: mergeresultwindow.cpp:803
-msgid "Files B and C are binary equal.\n"
-msgstr ""
-
-#: mergeresultwindow.cpp:804
-msgid "Files B and C have equal text. \n"
-msgstr ""
-
-#: mergeresultwindow.cpp:810
+#: mergeresultwindow.cpp:833 mergeresultwindow.cpp:835
+#: mergeresultwindow.cpp:837
+#, kde-format
+msgid "Files %1 and %2 have equal text.\n"
+msgstr ""
+
+#: mergeresultwindow.cpp:843
 msgid "Total number of conflicts: "
 msgstr ""
 
-#: mergeresultwindow.cpp:811
+#: mergeresultwindow.cpp:844
 msgid ""
 "\n"
 "Nr of automatically solved conflicts: "
 msgstr ""
 
-#: mergeresultwindow.cpp:812
+#: mergeresultwindow.cpp:845
 msgid ""
 "\n"
 "Nr of unsolved conflicts: "
 msgstr ""
 
-#: mergeresultwindow.cpp:814
+#: mergeresultwindow.cpp:847
 msgid "Conflicts"
 msgstr ""
 
-#: mergeresultwindow.cpp:1650
+#: mergeresultwindow.cpp:1714
 msgid "<No src line>"
 msgstr ""
 
-#: mergeresultwindow.cpp:1658
+#: mergeresultwindow.cpp:1722
 msgid "<Merge Conflict (Whitespace only)>"
 msgstr ""
 
-#: mergeresultwindow.cpp:1660 mergeresultwindow.cpp:2446
+#: mergeresultwindow.cpp:1724 mergeresultwindow.cpp:2498
 msgid "<Merge Conflict>"
 msgstr ""
 
-#: mergeresultwindow.cpp:1730
-msgid "Output"
-msgstr ""
-
-#: mergeresultwindow.cpp:1732
-msgid "[Modified]"
-msgstr ""
-
-#: mergeresultwindow.cpp:2656
+#: mergeresultwindow.cpp:2706
 msgid ""
 "Not all conflicts are solved yet.\n"
 "File not saved.\n"
 msgstr ""
 
-#: mergeresultwindow.cpp:2658
+#: mergeresultwindow.cpp:2708
 msgid "Conflicts Left"
 msgstr ""
 
-#: mergeresultwindow.cpp:2670
+#: mergeresultwindow.cpp:2720
 msgid ""
 "\n"
 "\n"
 "Creating backup failed. File not saved."
 msgstr ""
 
-#: mergeresultwindow.cpp:2670 mergeresultwindow.cpp:2710
+#: mergeresultwindow.cpp:2720 mergeresultwindow.cpp:2761
 msgid "File Save Error"
 msgstr ""
 
-#: mergeresultwindow.cpp:2710
+#: mergeresultwindow.cpp:2761
 msgid "Error while writing."
 msgstr ""
 
-#: optiondialog.cpp:361
-msgid "Unicode, 8 bit"
-msgstr ""
-
-#: optiondialog.cpp:362
-msgid "Unicode"
-msgstr ""
-
-#: optiondialog.cpp:363
-msgid "Latin1"
-msgstr ""
-
-#: optiondialog.cpp:382
-msgid "Change this if non-ASCII characters are not displayed correctly."
-msgstr ""
-
-#: optiondialog.cpp:507
-msgid "Editor & Diff Output Font"
-msgstr ""
-
-#: optiondialog.cpp:528
-msgid "Italic font for deltas"
-msgstr ""
-
-#: optiondialog.cpp:531
-msgid ""
-"Selects the italic version of the font for differences.\n"
-"If the font doesn't support italic characters, then this does nothing."
-msgstr ""
-
-#: optiondialog.cpp:539
-msgid "Color"
-msgstr ""
-
-#: optiondialog.cpp:539
-msgid "Colors Settings"
-msgstr ""
-
-#: optiondialog.cpp:553
-msgid "Editor and Diff Views:"
-msgstr ""
-
-#: optiondialog.cpp:561
-msgid "Foreground color:"
-msgstr ""
-
-#: optiondialog.cpp:567
-msgid "Background color:"
-msgstr ""
-
-#: optiondialog.cpp:575
-msgid "Diff background color:"
-msgstr ""
-
-#: optiondialog.cpp:582
-msgid "Color A:"
-msgstr ""
-
-#: optiondialog.cpp:589
-msgid "Color B:"
-msgstr ""
-
-#: optiondialog.cpp:596
-msgid "Color C:"
-msgstr ""
-
-#: optiondialog.cpp:602
-msgid "Conflict color:"
-msgstr ""
-
-#: optiondialog.cpp:609
-msgid "Current range background color:"
-msgstr ""
-
-#: optiondialog.cpp:616
-msgid "Current range diff background color:"
-msgstr ""
-
-#: optiondialog.cpp:622
-msgid "Color for manually aligned difference ranges:"
-msgstr ""
-
-#: optiondialog.cpp:627
-msgid "Directory Comparison View:"
-msgstr ""
-
-#: optiondialog.cpp:633
-msgid "Newest file color:"
-msgstr ""
-
-#: optiondialog.cpp:636
-msgid ""
-"Changing this color will only be effective when starting the next directory "
-"comparison."
-msgstr ""
-
-#: optiondialog.cpp:641
-msgid "Oldest file color:"
-msgstr ""
-
-#: optiondialog.cpp:648
-msgid "Middle age file color:"
-msgstr ""
-
-#: optiondialog.cpp:655
-msgid "Color for missing files:"
-msgstr ""
-
-#: optiondialog.cpp:667
-msgid "Editor"
-msgstr ""
-
-#: optiondialog.cpp:667
-msgid "Editor Behavior"
-msgstr ""
-
-#: optiondialog.cpp:677
-msgid "Tab inserts spaces"
-msgstr ""
-
-#: optiondialog.cpp:680
-msgid ""
-"On: Pressing tab generates the appropriate number of spaces.\n"
-"Off: A Tab-character will be inserted."
-msgstr ""
-
-#: optiondialog.cpp:686
-msgid "Tab size:"
-msgstr ""
-
-#: optiondialog.cpp:691
-msgid "Auto indentation"
-msgstr ""
-
-#: optiondialog.cpp:694
-msgid "On: The indentation of the previous line is used for a new line.\n"
-msgstr ""
-
-#: optiondialog.cpp:698
-msgid "Auto copy selection"
-msgstr ""
-
-#: optiondialog.cpp:701
-msgid ""
-"On: Any selection is immediately written to the clipboard.\n"
-"Off: You must explicitely copy e.g. via Ctrl-C."
-msgstr ""
-
-#: optiondialog.cpp:706
-msgid "Line end style:"
-msgstr ""
-
-#: optiondialog.cpp:718
-msgid ""
-"Sets the line endings for when an edited file is saved.\n"
-"DOS/Windows: CR+LF; UNIX: LF; with CR=0D, LF=0A"
-msgstr ""
-
-#: optiondialog.cpp:729
-msgid "Diff and Merge"
-msgstr ""
-
-#: optiondialog.cpp:729
-msgid "Diff and Merge Settings"
-msgstr ""
-
-#: optiondialog.cpp:740
-msgid "Preserve carriage return"
-msgstr ""
-
-#: optiondialog.cpp:743
-msgid ""
-"Show carriage return characters '\\r' if they exist.\n"
-"Helps to compare files that were modified under different operating systems."
-msgstr ""
-
-#: optiondialog.cpp:748
-msgid "Ignore numbers"
-msgstr ""
-
-#: optiondialog.cpp:751
-msgid ""
-"Ignore number characters during line matching phase. (Similar to Ignore "
-"white space.)\n"
-"Might help to compare files with numeric data."
-msgstr ""
-
-#: optiondialog.cpp:756
-msgid "Ignore C/C++ comments"
-msgstr ""
-
-#: optiondialog.cpp:758
-msgid "Treat C/C++ comments like white space."
-msgstr ""
-
-#: optiondialog.cpp:762
-msgid "Ignore case"
-msgstr ""
-
-#: optiondialog.cpp:765
-msgid "Treat case differences like white space changes. ('a'<=>'A')"
-msgstr ""
-
-#: optiondialog.cpp:769
-msgid "Preprocessor command:"
-msgstr ""
-
-#: optiondialog.cpp:773
-msgid "User defined pre-processing. (See the docs for details.)"
-msgstr ""
-
-#: optiondialog.cpp:776
-msgid "Line-matching preprocessor command:"
-msgstr ""
-
-#: optiondialog.cpp:780
-msgid ""
-"This pre-processor is only used during line matching.\n"
-"(See the docs for details.)"
-msgstr ""
-
-#: optiondialog.cpp:783
-msgid "Try hard (slower)"
-msgstr ""
-
-#: optiondialog.cpp:786
-msgid ""
-"Enables the --minimal option for the external diff.\n"
-"The analysis of big files will be much slower."
-msgstr ""
-
-#: optiondialog.cpp:791
-msgid "Auto advance delay (ms):"
-msgstr ""
-
-#: optiondialog.cpp:796
-msgid ""
-"When in Auto-Advance mode the result of the current selection is shown \n"
-"for the specified time, before jumping to the next conflict. Range: 0-2000 ms"
-msgstr ""
-
-#: optiondialog.cpp:801
-msgid "White space 2-file merge default:"
-msgstr ""
-
-#: optiondialog.cpp:805 optiondialog.cpp:818
-msgid "Manual Choice"
-msgstr ""
-
-#: optiondialog.cpp:809 optiondialog.cpp:823
-msgid ""
-"Allow the merge algorithm to automatically select an input for white-space-"
-"only changes."
-msgstr ""
-
-#: optiondialog.cpp:814
-msgid "White space 3-file merge default:"
-msgstr ""
-
-#: optiondialog.cpp:828
-msgid "Automatic Merge Regular Expression"
-msgstr ""
-
-#: optiondialog.cpp:837 smalldialogs.cpp:379
-msgid "Auto merge regular expression:"
-msgstr ""
-
-#: optiondialog.cpp:841
-msgid ""
-"Regular expression for lines where KDiff3 should automatically choose one "
-"source.\n"
-"When a line with a conflict matches the regular expression then\n"
-"- if available - C, otherwise B will be chosen."
-msgstr ""
-
-#: optiondialog.cpp:847
-msgid "Run regular expression auto merge on merge start"
-msgstr ""
-
-#: optiondialog.cpp:849
-msgid ""
-"Run the merge for auto merge regular expressions\n"
-"immediately when a merge starts.\n"
-msgstr ""
-
-#: optiondialog.cpp:854
-msgid "Version Control History Merging"
-msgstr ""
-
-#: optiondialog.cpp:863 smalldialogs.cpp:406
-msgid "History start regular expression:"
-msgstr ""
-
-#: optiondialog.cpp:867
-msgid ""
-"Regular expression for the start of the version control history entry.\n"
-"Usually this line contains the \"$Log$\"-keyword.\n"
-"Default value: \".*\\$Log.*\\$.*\""
-msgstr ""
-
-#: optiondialog.cpp:873 smalldialogs.cpp:435
-msgid "History entry start regular expression:"
-msgstr ""
-
-#: optiondialog.cpp:885
-msgid ""
-"A version control history entry consists of several lines.\n"
-"Specify the regular expression to detect the first line (without the leading "
-"comment).\n"
-"Use parentheses to group the keys you want to use for sorting.\n"
-"If left empty, then KDiff3 assumes that empty lines separate history "
-"entries.\n"
-"See the documentation for details."
-msgstr ""
-
-#: optiondialog.cpp:893
-msgid "History merge sorting"
-msgstr ""
-
-#: optiondialog.cpp:895
-msgid "Sort version control history by a key."
-msgstr ""
-
-#: optiondialog.cpp:905
-msgid "History entry start sort key order:"
-msgstr ""
-
-#: optiondialog.cpp:909
-msgid ""
-"Each parentheses used in the regular expression for the history start entry\n"
-"groups a key that can be used for sorting.\n"
-"Specify the list of keys (that are numbered in order of occurrence\n"
-"starting with 1) using ',' as separator (e.g. \"4,5,6,1,2,3,7\").\n"
-"If left empty, then no sorting will be done.\n"
-"See the documentation for details."
-msgstr ""
-
-#: optiondialog.cpp:920
-msgid "Merge version control history on merge start"
-msgstr ""
-
-#: optiondialog.cpp:922
-msgid "Run version control history automerge on merge start."
-msgstr ""
-
-#: optiondialog.cpp:926
-msgid "Test your regular expressions"
-msgstr ""
-
-#: optiondialog.cpp:931
-msgid "Irrelevant merge command:"
-msgstr ""
-
-#: optiondialog.cpp:935
-msgid ""
-"If specified this script is run after automerge\n"
-"when no other relevant changes were detected.\n"
-"Called with the parameters: filename1 filename2 filename3"
-msgstr ""
-
-#: optiondialog.cpp:945
-msgid "Directory Merge"
-msgstr ""
-
-#: optiondialog.cpp:954
-msgid "Recursive directories"
-msgstr ""
-
-#: optiondialog.cpp:956
-msgid "Whether to analyze subdirectories or not."
-msgstr ""
-
-#: optiondialog.cpp:958
-msgid "File pattern(s):"
-msgstr ""
-
-#: optiondialog.cpp:963
-msgid ""
-"Pattern(s) of files to be analyzed. \n"
-"Wildcards: '*' and '?'\n"
-"Several Patterns can be specified by using the separator: ';'"
-msgstr ""
-
-#: optiondialog.cpp:969
-msgid "File-anti-pattern(s):"
-msgstr ""
-
-#: optiondialog.cpp:974
-msgid ""
-"Pattern(s) of files to be excluded from analysis. \n"
-"Wildcards: '*' and '?'\n"
-"Several Patterns can be specified by using the separator: ';'"
-msgstr ""
-
-#: optiondialog.cpp:980
-msgid "Dir-anti-pattern(s):"
-msgstr ""
-
-#: optiondialog.cpp:985
-msgid ""
-"Pattern(s) of directories to be excluded from analysis. \n"
-"Wildcards: '*' and '?'\n"
-"Several Patterns can be specified by using the separator: ';'"
-msgstr ""
-
-#: optiondialog.cpp:991
-msgid "Use .cvsignore"
-msgstr ""
-
-#: optiondialog.cpp:994
-msgid ""
-"Extends the antipattern to anything that would be ignored by CVS.\n"
-"Via local \".cvsignore\"-files this can be directory specific."
-msgstr ""
-
-#: optiondialog.cpp:999
-msgid "Find hidden files and directories"
-msgstr ""
-
-#: optiondialog.cpp:1002
-msgid "Finds files and directories with the hidden attribute."
-msgstr ""
-
-#: optiondialog.cpp:1004
-msgid "Finds files and directories starting with '.'."
-msgstr ""
-
-#: optiondialog.cpp:1008
-msgid "Follow file links"
-msgstr ""
-
-#: optiondialog.cpp:1011
-msgid ""
-"On: Compare the file the link points to.\n"
-"Off: Compare the links."
-msgstr ""
-
-#: optiondialog.cpp:1016
-msgid "Follow directory links"
-msgstr ""
-
-#: optiondialog.cpp:1019
-msgid ""
-"On: Compare the directory the link points to.\n"
-"Off: Compare the links."
-msgstr ""
-
-#: optiondialog.cpp:1035
-msgid "Case sensitive filename comparison"
-msgstr ""
-
-#: optiondialog.cpp:1038
-msgid ""
-"The directory comparison will compare files or directories when their names "
-"match.\n"
-"Set this option if the case of the names must match. (Default for Windows is "
-"off, otherwise on.)"
-msgstr ""
-
-#: optiondialog.cpp:1042
-msgid "File Comparison Mode"
-msgstr ""
-
-#: optiondialog.cpp:1046
-msgid "Binary comparison"
-msgstr ""
-
-#: optiondialog.cpp:1047
-msgid "Binary comparison of each file. (Default)"
-msgstr ""
-
-#: optiondialog.cpp:1049
-msgid "Full analysis"
-msgstr ""
-
-#: optiondialog.cpp:1050
-msgid ""
-"Do a full analysis and show statistics information in extra columns.\n"
-"(Slower than a binary comparison, much slower for binary files.)"
-msgstr ""
-
-#: optiondialog.cpp:1053
-msgid "Trust the modification date (unsafe)"
-msgstr ""
-
-#: optiondialog.cpp:1054
-msgid ""
-"Assume that files are equal if the modification date and file length are "
-"equal.\n"
-"Useful for big directories or slow networks."
-msgstr ""
-
-#: optiondialog.cpp:1057
-msgid "Trust the size (unsafe)"
-msgstr ""
-
-#: optiondialog.cpp:1058
-msgid ""
-"Assume that files are equal if their file lengths are equal.\n"
-"Useful for big directories or slow networks when the date is modified during "
-"download."
-msgstr ""
-
-#: optiondialog.cpp:1062
-msgid "Synchronize directories"
-msgstr ""
-
-#: optiondialog.cpp:1065
-msgid ""
-"Offers to store files in both directories so that\n"
-"both directories are the same afterwards.\n"
-"Works only when comparing two directories without specifying a destination."
-msgstr ""
-
-#: optiondialog.cpp:1071
-msgid "White space differences considered equal"
-msgstr ""
-
-#: optiondialog.cpp:1074
-msgid ""
-"If files differ only by white space consider them equal.\n"
-"This is only active when full analysis is chosen."
-msgstr ""
-
-#: optiondialog.cpp:1080
-msgid "Copy newer instead of merging (unsafe)"
-msgstr ""
-
-#: optiondialog.cpp:1083
-msgid ""
-"Don't look inside, just take the newer file.\n"
-"(Use this only if you know what you are doing!)\n"
-"Only effective when comparing two directories."
-msgstr ""
-
-#: optiondialog.cpp:1088
-msgid "Backup files (.orig)"
-msgstr ""
-
-#: optiondialog.cpp:1091
-msgid ""
-"When a file would be saved over an old file, then the old file\n"
-"will be renamed with a '.orig'-extension instead of being deleted."
-msgstr ""
-
-#: optiondialog.cpp:1118
-msgid "Regional Settings"
-msgstr ""
-
-#: optiondialog.cpp:1214
-msgid "Language (restart required)"
-msgstr ""
-
-#: optiondialog.cpp:1246
-msgid ""
-"Choose the language of the GUI-strings or \"Auto\".\n"
-"For a change of language to take place, quit and restart KDiff3."
-msgstr ""
-
-#: optiondialog.cpp:1264
-msgid "Use the same encoding for everything:"
-msgstr ""
-
-#: optiondialog.cpp:1267
-msgid ""
-"Enable this allows to change all encodings by changing the first only.\n"
-"Disable this if different individual settings are needed."
-msgstr ""
-
-#: optiondialog.cpp:1272
-msgid "Note: Local Encoding is "
-msgstr ""
-
-#: optiondialog.cpp:1276
-msgid "File Encoding for A:"
-msgstr ""
-
-#: optiondialog.cpp:1281
-msgid "File Encoding for B:"
-msgstr ""
-
-#: optiondialog.cpp:1286
-msgid "File Encoding for C:"
-msgstr ""
-
-#: optiondialog.cpp:1291
-msgid "File Encoding for Merge Output and Saving:"
-msgstr ""
-
-#: optiondialog.cpp:1296
-msgid "File Encoding for Preprocessor Files:"
-msgstr ""
-
-#: optiondialog.cpp:1305
-msgid "Right To Left Language"
-msgstr ""
-
-#: optiondialog.cpp:1308
-msgid ""
-"Some languages are read from right to left.\n"
-"This setting will change the viewer and editor accordingly."
-msgstr ""
-
-#: optiondialog.cpp:1318
-msgid "Integration"
-msgstr ""
-
-#: optiondialog.cpp:1318
-msgid "Integration Settings"
-msgstr ""
-
-#: optiondialog.cpp:1328
-msgid "Command line options to ignore:"
-msgstr ""
-
-#: optiondialog.cpp:1333
-msgid ""
-"List of command line options that should be ignored when KDiff3 is used by "
-"other tools.\n"
-"Several values can be specified if separated via ';'\n"
-"This will suppress the \"Unknown option\"-error."
-msgstr ""
-
-#: optiondialog.cpp:1386
-msgid ""
-"You selected a variable width font.\n"
-"\n"
-"Because this program doesn't handle variable width fonts\n"
-"correctly, you might experience problems while editing.\n"
-"\n"
-"Do you want to continue or do you want to select another font."
-msgstr ""
-
-#: optiondialog.cpp:1390
-msgid "Incompatible Font"
-msgstr ""
-
-#: optiondialog.cpp:1391
-msgid "Continue at Own Risk"
-msgstr ""
-
-#: optiondialog.cpp:1391
-msgid "Select Another Font"
-msgstr ""
-
-#: optiondialog.cpp:1416
-msgid "This resets all options. Not only those of the current topic."
-msgstr ""
-
-#: pdiff.cpp:258
-msgid "PreprocessorCmd: "
-msgstr ""
-
-#: pdiff.cpp:263
-msgid "The following option(s) you selected might change data:\n"
-msgstr ""
-
-#: pdiff.cpp:264
-msgid ""
-"\n"
-"Most likely this is not wanted during a merge.\n"
-"Do you want to disable these settings or continue with these settings active?"
-msgstr ""
-
-#: pdiff.cpp:266
-msgid "Option Unsafe for Merging"
-msgstr ""
-
-#: pdiff.cpp:267
-msgid "Use These Options During Merge"
-msgstr ""
-
-#: pdiff.cpp:267
-msgid "Disable Unsafe Options"
-msgstr ""
-
-#: pdiff.cpp:297
-msgid "Loading A"
-msgstr ""
-
-#: pdiff.cpp:301
-msgid "Loading B"
-msgstr ""
-
-#: pdiff.cpp:318 pdiff.cpp:344
-msgid "Diff: A <-> B"
-msgstr ""
-
-#: pdiff.cpp:324 pdiff.cpp:366
-msgid "Linediff: A <-> B"
-msgstr ""
-
-#: pdiff.cpp:335
-msgid "Loading C"
-msgstr ""
-
-#: pdiff.cpp:347
-msgid "Diff: B <-> C"
-msgstr ""
-
-#: pdiff.cpp:350
-msgid "Diff: A <-> C"
-msgstr ""
-
-#: pdiff.cpp:369
-msgid "Linediff: B <-> C"
-msgstr ""
-
-#: pdiff.cpp:372
-msgid "Linediff: A <-> C"
-msgstr ""
-
-#: pdiff.cpp:509
-msgid "All input files contain the same text, but are not binary equal."
-msgstr ""
-
-#: pdiff.cpp:511 pdiff.cpp:513 pdiff.cpp:515
-msgid "Files %1 and %2 are binary equal.\n"
-msgstr ""
-
-#: pdiff.cpp:512 pdiff.cpp:514 pdiff.cpp:516
-msgid "Files %1 and %2 have equal text, but are not binary equal. \n"
-msgstr ""
-
-#: pdiff.cpp:526
-msgid ""
-"Some inputfiles don't seem to be pure textfiles.\n"
-"Note that the KDiff3-merge was not meant for binary data.\n"
-"Continue at your own risk."
-msgstr ""
-
-#: pdiff.cpp:965
-msgid "Abort"
-msgstr ""
-
-#: pdiff.cpp:971 pdiff.cpp:1059
-msgid "Opening files..."
-msgstr ""
-
-#: pdiff.cpp:1036 pdiff.cpp:1107
-msgid "File open error"
-msgstr ""
-
-#: pdiff.cpp:1139
-msgid "Cutting selection..."
-msgstr ""
-
-#: pdiff.cpp:1160
-msgid "Copying selection to clipboard..."
-msgstr ""
-
-#: pdiff.cpp:1176
-msgid "Inserting clipboard contents..."
-msgstr ""
-
-#: pdiff.cpp:1699
-msgid "Save && Continue"
-msgstr ""
-
-#: pdiff.cpp:1699
-msgid "Continue Without Saving"
-msgstr ""
-
-#: pdiff.cpp:1906
-msgid "Search complete."
-msgstr ""
-
-#: pdiff.cpp:1906
-msgid "Search Complete"
-msgstr ""
-
-#: pdiff.cpp:2130
-msgid "Nothing is selected in either diff input window."
-msgstr ""
-
-#: pdiff.cpp:2130
-msgid "Error while adding manual diff range"
-msgstr ""
-
-#. i18n: file kdiff3_part.rc line 4
+#: mergeresultwindow.cpp:3091
+msgid "Output"
+msgstr ""
+
+#: mergeresultwindow.cpp:3103 mergeresultwindow.cpp:3256
+msgid "[Modified]"
+msgstr ""
+
+#: mergeresultwindow.cpp:3110
+msgid "Encoding for saving"
+msgstr ""
+
+#: mergeresultwindow.cpp:3203 mergeresultwindow.cpp:3205
+#: mergeresultwindow.cpp:3207
+msgid "Codec from"
+msgstr ""
+
+#. i18n: file: kdiff3_part.rc:4
+#. i18n: ectx: Menu (movement)
 #: rc.cpp:3
-#, no-c-format
 msgid "&KDiff3"
 msgstr ""
 
-#. i18n: file kdiff3_part.rc line 13
+#. i18n: file: kdiff3_part.rc:13
+#. i18n: ectx: Menu (movement)
 #: rc.cpp:6
-#, no-c-format
 msgid "Configure KDiff3"
 msgstr ""
 
-#. i18n: file kdiff3_shell.rc line 7
-#: rc.cpp:15
-#, no-c-format
-msgid "&Directory"
-msgstr ""
-
-#. i18n: file kdiff3_shell.rc line 30
-#: rc.cpp:18
-#, no-c-format
-msgid "Current Item Merge Operation"
-msgstr ""
-
-#. i18n: file kdiff3_shell.rc line 38
-#: rc.cpp:21
-#, no-c-format
-msgid "Current Item Sync Operation"
-msgstr ""
-
-#. i18n: file kdiff3_shell.rc line 50
-#: rc.cpp:24
-#, no-c-format
-msgid "&Movement"
-msgstr ""
-
-#. i18n: file kdiff3_shell.rc line 61
-#: rc.cpp:27
-#, no-c-format
-msgid "D&iffview"
-msgstr ""
-
-#. i18n: file kdiff3_shell.rc line 73
-#: rc.cpp:30
-#, no-c-format
-msgid "&Merge"
-msgstr ""
-
-#. i18n: file kdiff3_shell.rc line 95
-#: rc.cpp:33
-#, no-c-format
-msgid "&Window"
-msgstr ""
-
-#: smalldialogs.cpp:53
-msgid "A (Base):"
-msgstr ""
-
-#: smalldialogs.cpp:59 smalldialogs.cpp:75 smalldialogs.cpp:91
-#: smalldialogs.cpp:134
-msgid "File..."
-msgstr ""
-
-#: smalldialogs.cpp:61 smalldialogs.cpp:77 smalldialogs.cpp:93
-#: smalldialogs.cpp:136
-msgid "Dir..."
-msgstr ""
-
-#: smalldialogs.cpp:86
-msgid "C (Optional):"
-msgstr ""
-
-#: smalldialogs.cpp:108
-msgid "Swap/Copy Names ..."
-msgstr ""
-
-#: smalldialogs.cpp:114 smalldialogs.cpp:115 smalldialogs.cpp:116
-msgid "Swap %1<->%2"
-msgstr ""
-
-#: smalldialogs.cpp:117 smalldialogs.cpp:118 smalldialogs.cpp:119
-msgid "Copy %1->Output"
-msgstr ""
-
-#: smalldialogs.cpp:120 smalldialogs.cpp:121 smalldialogs.cpp:122
-msgid "Swap %1<->Output"
-msgstr ""
-
-#: smalldialogs.cpp:129
-msgid "Output (optional):"
-msgstr ""
-
-#: smalldialogs.cpp:158
-msgid "Configure..."
-msgstr ""
-
-#: smalldialogs.cpp:329
-msgid "Search text:"
-msgstr ""
-
-#: smalldialogs.cpp:336
-msgid "Case sensitive"
-msgstr ""
-
-#: smalldialogs.cpp:339
-msgid "Search A"
-msgstr ""
-
-#: smalldialogs.cpp:344
-msgid "Search B"
-msgstr ""
-
-#: smalldialogs.cpp:349
-msgid "Search C"
-msgstr ""
-
-#: smalldialogs.cpp:354
-msgid "Search output"
-msgstr ""
-
-#: smalldialogs.cpp:359
-msgid "&Search"
-msgstr ""
-
-#: smalldialogs.cpp:376
-msgid "Regular Expression Tester"
-msgstr ""
-
-#: smalldialogs.cpp:387
-msgid "Example auto merge line:"
-msgstr ""
-
-#: smalldialogs.cpp:389
-msgid "For auto merge test copy a line as used in your files."
-msgstr ""
-
-#: smalldialogs.cpp:395 smalldialogs.cpp:424 smalldialogs.cpp:461
-msgid "Match result:"
-msgstr ""
-
-#: smalldialogs.cpp:414
-msgid "Example history start line (with leading comment):"
-msgstr ""
-
-#: smalldialogs.cpp:417
-msgid ""
-"Copy a history start line as used in your files,\n"
-"including the leading comment."
-msgstr ""
-
-#: smalldialogs.cpp:443
-msgid "History sort key order:"
-msgstr ""
-
-#: smalldialogs.cpp:451
-msgid "Example history entry start line (without leading comment):"
-msgstr ""
-
-#: smalldialogs.cpp:453
-msgid ""
-"Copy a history entry start line as used in your files,\n"
-"but omit the leading comment."
-msgstr ""
-
-#: smalldialogs.cpp:468
-msgid "Sort key result:"
-msgstr ""
-
-#: smalldialogs.cpp:519 smalldialogs.cpp:529 smalldialogs.cpp:550
-msgid "Match success."
-msgstr ""
-
-#: smalldialogs.cpp:523 smalldialogs.cpp:533 smalldialogs.cpp:556
-msgid "Match failed."
-msgstr ""
-
-#: smalldialogs.cpp:541
-msgid "Opening and closing parentheses don't match in regular expression."
-msgstr ""
+#. i18n: file: kdiff3_part.rc:16
+#. i18n: ectx: ToolBar (mainToolBar)
+#: rc.cpp:9
+msgid "KDiff3"
+msgstr ""
+
+#. i18n: file: kdiff3_shell.rc:106
+#. i18n: ectx: ToolBar (mainToolBar)
+#: rc.cpp:36
+msgid "Main Toolbar"
+msgstr ""
+
+#: rc.cpp:37
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+
+#: rc.cpp:38
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
--- a/kdiff3/src-QT4/Makefile.am	Tue Jan 06 17:15:53 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-
-# set the include path for X, qt and KDE
-INCLUDES = $(all_includes)
-
-# these are the headers for your project
-noinst_HEADERS = kdiff3_part.h kdiff3_shell.h kdiff3.h common.h diff.h \
-	directorymergewindow.h merger.h optiondialog.h fileaccess.h version.h \
-	smalldialogs.h difftextwindow.h mergeresultwindow.h
-
-# let automoc handle all of the meta source files (moc)
-METASOURCES = AUTO
-
-messages: rc.cpp
-	$(XGETTEXT) *.cpp -o $(podir)/kdiff3.pot
-
-KDE_ICON = kdiff3
-
-# this Makefile creates both a KPart application and a KPart
-#########################################################################
-# APPLICATION SECTION
-#########################################################################
-# this is the program that gets installed.  it's name is used for all
-# of the other Makefile.am variables
-bin_PROGRAMS = kdiff3
-
-# the application source, library search path, and link libraries
-kdiff3_SOURCES = main.cpp kdiff3_shell.cpp
-kdiff3_LDFLAGS = $(KDE_RPATH) $(all_libraries)
-kdiff3_LDADD   = $(LIB_KPARTS)
-
-# this is where the desktop file will go
-shelldesktopdir   = $(kde_appsdir)/Development
-shelldesktop_DATA = kdiff3.desktop
-
-# this is where the shell's XML-GUI resource file goes
-shellrcdir   = $(kde_datadir)/kdiff3
-shellrc_DATA = kdiff3_shell.rc
-
-#########################################################################
-# KPART SECTION
-#########################################################################
-kde_module_LTLIBRARIES = libkdiff3part.la
-
-# the Part's source, library search path, and link libraries
-libkdiff3part_la_SOURCES = kdiff3_part.cpp kdiff3.cpp directorymergewindow.cpp \
-		merger.cpp pdiff.cpp difftextwindow.cpp diff.cpp optiondialog.cpp \
-		mergeresultwindow.cpp fileaccess.cpp gnudiff_analyze.cpp gnudiff_io.cpp gnudiff_xmalloc.cpp \
-		common.cpp smalldialogs.cpp
-libkdiff3part_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
-libkdiff3part_la_LIBADD = $(LIB_KDEPRINT) $(LIB_KPARTS) $(LIB_KFILE)
-
-# this is where the desktop file will go
-partdesktopdir   = $(kde_servicesdir)
-partdesktop_DATA = kdiff3part.desktop
-
-# this is where the part's XML-GUI resource file goes
-partrcdir   = $(kde_datadir)/kdiff3part
-partrc_DATA = kdiff3_part.rc
--- a/kdiff3/src-QT4/ccInstHelper.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/ccInstHelper.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -1,334 +1,334 @@
-// uninstallHelper.cpp : Defines the entry point for the console application.
-//
-#include <iostream>
-#include <string>
-#include <vector>
-#include <list>
-#include <windows.h>
-#include <string.h>
-#include <io.h>
-
-//#define __stdcall
-
-#ifndef KREPLACEMENTS_H
-// For compilation download the NSIS source package and modify the following
-// line to point to the exdll.h-file
-#include "C:/Programme/NSIS/Contrib/ExDll/exdll.h"
-#endif
-
-struct ReplacementItem
-{ char* fileType; char* operationType; };
-
-ReplacementItem g_replacementTable[] = {
-   "text_file_delta",   "xcompare",
-   "text_file_delta",   "xmerge",
-   "whole_copy",        "xcompare",
-   "whole_copy",        "xmerge",
-   "z_text_file_delta", "xcompare",
-   "z_text_file_delta", "xmerge",
-   "z_whole_copy",      "xcompare",
-   "z_whole_copy",      "xmerge",
-   "_xml",              "xcompare",
-   "_xml",              "xmerge",
-   "_xml2",             "xcompare",
-   "_xml2",             "xmerge",
-   "_rftdef",           "xcompare",
-   "_rftmap",           "xcompare",
-   "_rftvp",            "xcompare",
-   "_xtools",           "xcompare",
-   0,0
-};
-
-struct LineItem
-{
-   std::string fileType;
-   std::string opType;
-   std::string command;
-   std::string fileOpPart;
-};
-
-// Return true if successful, else false
-bool readAndParseMapFile( const std::string& filename, std::list<LineItem>& lineItemList )
-{
-   // Read file
-   FILE* pFile = fopen( filename.c_str(), "r" );
-   if (pFile)
-   {
-      fseek(pFile,0,SEEK_END);
-      int size = ftell(pFile);
-      fseek(pFile,0,SEEK_SET);
-      std::vector<char> buf( size );
-      fread( &buf[0], 1, size, pFile );
-      fclose( pFile );
-
-      // Replace strings
-      int lineStartPos=0;
-      int wordInLine = 0;
-      LineItem lineItem;
-      for( int i=0; i<size; )
-      {
-         if( buf[i] == '\n' || buf[i] == '\r' )
-         {
-            ++i;
-            wordInLine = 0;
-            lineStartPos = i;
-            continue;
-         }
-         if( buf[i] == ' ' || buf[i] == '\t' )
-         {
-            ++i;
-            continue;
-         }
-         else
-         {
-            int wordStartPos = i;
-            if (wordInLine<2)
-            {
-               while ( i<size && !( buf[i] == ' ' || buf[i] == '\t' ) )
-                  ++i;
-
-               std::string word( &buf[wordStartPos], i-wordStartPos );
-               if (wordInLine==0)
-                  lineItem.fileType = word;
-               else
-                  lineItem.opType = word;
-               ++wordInLine;
-            }
-            else
-            {
-               lineItem.fileOpPart = std::string( &buf[lineStartPos], i-lineStartPos );
-               while ( i<size && !( buf[i] == '\n' || buf[i] == '\r' ) )
-                  ++i;
-
-               std::string word( &buf[wordStartPos], i-wordStartPos );
-               lineItem.command = word;
-               lineItemList.push_back( lineItem );
-            }
-         }
-      }
-   }
-   else
-   {
-      return false;
-   }
-   return true;
-}
-
-bool writeMapFile( const std::string& filename, const std::list<LineItem>& lineItemList )
-{
-   FILE* pFile = fopen( filename.c_str(), "w" );
-   if (pFile)
-   {
-      std::list<LineItem>::const_iterator i = lineItemList.begin();
-      for( ; i!=lineItemList.end(); ++i )
-      {
-         const LineItem& li = *i;
-         fprintf( pFile, "%s%s\n", li.fileOpPart.c_str(), li.command.c_str() );
-      }
-      fclose( pFile );
-   }
-   else
-   {
-      return false;
-   }
-   return true;
-}
-
-std::string toUpper( const std::string& s )
-{
-   std::string s2 = s;
-
-   for( unsigned int i=0; i<s.length(); ++i )
-   {
-      s2[i] = toupper( s2[i] );
-   }
-   return s2;
-}
-
-int integrateWithClearCase( const char* subCommand, const char* kdiff3CommandPath )
-{
-   std::string installCommand = subCommand; // "install" or "uninstall" or "existsClearCase"
-   std::string kdiff3Command  = kdiff3CommandPath;
-
-   /*
-   std::wstring installCommand = subCommand; // "install" or "uninstall"
-   std::wstring wKDiff3Command  = kdiff3CommandPath;
-   std::string kdiff3Command;
-   kdiff3Command.reserve( wKDiff3Command.length()+1 );
-   kdiff3Command.resize( wKDiff3Command.length() );
-   BOOL bUsedDefaultChar = FALSE;
-   int successLen = WideCharToMultiByte(  CP_ACP, 0, 
-      wKDiff3Command.c_str(), int(wKDiff3Command.length()),
-      &kdiff3Command[0], int(kdiff3Command.length()), 0, &bUsedDefaultChar );
-
-   if ( successLen != kdiff3Command.length() || bUsedDefaultChar )
-   {
-      std::cerr << "KDiff3 command contains characters that don't map to ansi code page.\n"
-          "Aborting clearcase installation.\n"
-          "Try to install KDiff3 in another path that doesn't require special characters.\n";
-      return -1;
-   }
-   */
-
-   // Try to locate cleartool, the clearcase tool in the path
-   char buffer[1000];
-   char* pLastPart = 0;
-   int len = SearchPathA(0, "cleartool.exe", 0, sizeof(buffer)/sizeof(buffer[0]), 
-                         buffer, &pLastPart );
-   if ( len>0 && len+1<int(sizeof(buffer)/sizeof(buffer[0])) && pLastPart )
-   {
-      pLastPart[-1] = 0;
-      pLastPart = strrchr( buffer, '\\' ); // cd up (because cleartool.exe is in bin subdir)
-      if ( pLastPart )
-         pLastPart[1]=0;
-
-      std::string path( buffer );
-      path += "lib\\mgrs\\map";
-      std::string bakName = path + ".preKDiff3Install";
-      
-      if ( installCommand == "existsClearCase") 
-      {
-         return 1;
-      }
-      else if ( installCommand == "install") 
-      {
-         std::list<LineItem> lineItemList;
-         bool bSuccess = readAndParseMapFile( path, lineItemList );
-         if ( !bSuccess )
-         {
-            std::cerr << "Error reading original map file.\n";
-            return -1;
-         }
-
-         // Create backup
-         if ( access( bakName.c_str(), 0 )!=0 ) // Create backup only if not exists yet
-         {
-            if ( rename( path.c_str(), bakName.c_str() ) )
-            {
-               std::cerr << "Error renaming original map file.\n";
-               return -1;
-            }
-         }
-
-         std::list<LineItem>::iterator i = lineItemList.begin();
-         for( ; i!=lineItemList.end(); ++i )
-         {
-            LineItem& li = *i;
-            for (int j=0;;++j)
-            {
-               ReplacementItem& ri = g_replacementTable[j];
-               if ( ri.fileType==0 || ri.operationType==0 )
-                  break;
-               if ( li.fileType == ri.fileType && li.opType == ri.operationType )
-               {
-                  li.command = kdiff3Command.c_str();
-                  break;
-               }
-            }
-         }
-
-         bSuccess = writeMapFile( path, lineItemList );
-         if ( !bSuccess )
-         {
-            if ( rename( bakName.c_str(), path.c_str() ) )
-               std::cerr << "Error writing new map file, restoring old file also failed.\n";
-            else
-               std::cerr << "Error writing new map file, old file restored.\n";
-
-            return -1;
-         }
-      }
-      else if ( installCommand == "uninstall" )
-      {
-         std::list<LineItem> lineItemList;
-         bool bSuccess = readAndParseMapFile( path, lineItemList );
-         if ( !bSuccess )
-         {
-            std::cerr << "Error reading original map file\n.";
-            return -1;
-         }
-
-         std::list<LineItem> lineItemListBak;
-         bSuccess = readAndParseMapFile( bakName, lineItemListBak );
-         if ( !bSuccess )
-         {
-            std::cerr << "Error reading backup map file.\n";
-            return -1;
-         }
-
-         std::list<LineItem>::iterator i = lineItemList.begin();
-         for( ; i!=lineItemList.end(); ++i )
-         {
-            LineItem& li = *i;
-            if ((int)toUpper(li.command).find("KDIFF3")>=0)
-            {
-               std::list<LineItem>::const_iterator j = lineItemListBak.begin();
-               for (;j!=lineItemListBak.end();++j)
-               {
-                  const LineItem& bi = *j;  // backup iterator
-                  if ( li.fileType == bi.fileType && li.opType == bi.opType )
-                  {
-                     li.command = bi.command;
-                     break;
-                  }
-               }
-            }
-         }
-
-         bSuccess = writeMapFile( path, lineItemList );
-         if ( !bSuccess )
-         {
-            std::cerr << "Error writing map file.";
-
-            return -1;
-         }
-      }
-   }
-   return 0;
-}
-
-#ifndef KREPLACEMENTS_H
-
-extern "C"
-void __declspec(dllexport) nsisPlugin(HWND hwndParent, int string_size, 
-                                      char *variables, stack_t **stacktop,
-                                      extra_parameters *extra)
-{
-   //g_hwndParent=hwndParent;
-
-   EXDLL_INIT();
-   {
-      std::string param1( g_stringsize, ' ' );
-      int retVal = popstring( &param1[0] );
-      if ( retVal == 0 )
-      {
-         std::string param2( g_stringsize, ' ' );
-         retVal = popstring( &param2[0] );
-         if ( retVal == 0 )
-            install( param1.c_str(), param2.c_str() );
-         return;
-      }
-      std::cerr << "Not enough parameters." << std::endl;
-   }
-}
-
-#endif
-/*
-int _tmain(int argc, _TCHAR* argv[])
-{
-   if ( argc<3 ) 
-   {
-      std::cout << "This program is needed to install/uninstall KDiff3 for clearcase.\n"
-                   "It tries to patch the map file (clearcase-subdir\\lib\\mgrs\\map)\n"
-                   "Usage 1: ccInstHelper install pathToKdiff3.exe\n"
-                   "Usage 2: ccInstHelper uninstall pathToKdiff3.exe\n"
-                   "Backups of the original map files are created in the dir of the map file.\n";
-   }
-   else
-   {
-      return install( argv[1], argv[2] );
-   }
-   
-   return 0;
-}
-*/
+// uninstallHelper.cpp : Defines the entry point for the console application.
+//
+#include <iostream>
+#include <string>
+#include <vector>
+#include <list>
+#include <windows.h>
+#include <string.h>
+#include <io.h>
+
+//#define __stdcall
+
+#ifndef KREPLACEMENTS_H
+// For compilation download the NSIS source package and modify the following
+// line to point to the exdll.h-file
+#include "C:/Programme/NSIS/Contrib/ExDll/exdll.h"
+#endif
+
+struct ReplacementItem
+{ char* fileType; char* operationType; };
+
+ReplacementItem g_replacementTable[] = {
+   {"text_file_delta",   "xcompare"},
+   {"text_file_delta",   "xmerge"},
+   {"whole_copy",        "xcompare"},
+   {"whole_copy",        "xmerge"},
+   {"z_text_file_delta", "xcompare"},
+   {"z_text_file_delta", "xmerge"},
+   {"z_whole_copy",      "xcompare"},
+   {"z_whole_copy",      "xmerge"},
+   {"_xml",              "xcompare"},
+   {"_xml",              "xmerge"},
+   {"_xml2",             "xcompare"},
+   {"_xml2",             "xmerge"},
+   {"_rftdef",           "xcompare"},
+   {"_rftmap",           "xcompare"},
+   {"_rftvp",            "xcompare"},
+   {"_xtools",           "xcompare"},
+   {0,0}
+};
+
+struct LineItem
+{
+   std::string fileType;
+   std::string opType;
+   std::string command;
+   std::string fileOpPart;
+};
+
+// Return true if successful, else false
+bool readAndParseMapFile( const std::string& filename, std::list<LineItem>& lineItemList )
+{
+   // Read file
+   FILE* pFile = fopen( filename.c_str(), "r" );
+   if (pFile)
+   {
+      fseek(pFile,0,SEEK_END);
+      int size = ftell(pFile);
+      fseek(pFile,0,SEEK_SET);
+      std::vector<char> buf( size );
+      fread( &buf[0], 1, size, pFile );
+      fclose( pFile );
+
+      // Replace strings
+      int lineStartPos=0;
+      int wordInLine = 0;
+      LineItem lineItem;
+      for( int i=0; i<size; )
+      {
+         if( buf[i] == '\n' || buf[i] == '\r' )
+         {
+            ++i;
+            wordInLine = 0;
+            lineStartPos = i;
+            continue;
+         }
+         if( buf[i] == ' ' || buf[i] == '\t' )
+         {
+            ++i;
+            continue;
+         }
+         else
+         {
+            int wordStartPos = i;
+            if (wordInLine<2)
+            {
+               while ( i<size && !( buf[i] == ' ' || buf[i] == '\t' ) )
+                  ++i;
+
+               std::string word( &buf[wordStartPos], i-wordStartPos );
+               if (wordInLine==0)
+                  lineItem.fileType = word;
+               else
+                  lineItem.opType = word;
+               ++wordInLine;
+            }
+            else
+            {
+               lineItem.fileOpPart = std::string( &buf[lineStartPos], i-lineStartPos );
+               while ( i<size && !( buf[i] == '\n' || buf[i] == '\r' ) )
+                  ++i;
+
+               std::string word( &buf[wordStartPos], i-wordStartPos );
+               lineItem.command = word;
+               lineItemList.push_back( lineItem );
+            }
+         }
+      }
+   }
+   else
+   {
+      return false;
+   }
+   return true;
+}
+
+bool writeMapFile( const std::string& filename, const std::list<LineItem>& lineItemList )
+{
+   FILE* pFile = fopen( filename.c_str(), "w" );
+   if (pFile)
+   {
+      std::list<LineItem>::const_iterator i = lineItemList.begin();
+      for( ; i!=lineItemList.end(); ++i )
+      {
+         const LineItem& li = *i;
+         fprintf( pFile, "%s%s\n", li.fileOpPart.c_str(), li.command.c_str() );
+      }
+      fclose( pFile );
+   }
+   else
+   {
+      return false;
+   }
+   return true;
+}
+
+std::string toUpper( const std::string& s )
+{
+   std::string s2 = s;
+
+   for( unsigned int i=0; i<s.length(); ++i )
+   {
+      s2[i] = toupper( s2[i] );
+   }
+   return s2;
+}
+
+int integrateWithClearCase( const char* subCommand, const char* kdiff3CommandPath )
+{
+   std::string installCommand = subCommand; // "install" or "uninstall" or "existsClearCase"
+   std::string kdiff3Command  = kdiff3CommandPath;
+
+   /*
+   std::wstring installCommand = subCommand; // "install" or "uninstall"
+   std::wstring wKDiff3Command  = kdiff3CommandPath;
+   std::string kdiff3Command;
+   kdiff3Command.reserve( wKDiff3Command.length()+1 );
+   kdiff3Command.resize( wKDiff3Command.length() );
+   BOOL bUsedDefaultChar = FALSE;
+   int successLen = WideCharToMultiByte(  CP_ACP, 0, 
+      wKDiff3Command.c_str(), int(wKDiff3Command.length()),
+      &kdiff3Command[0], int(kdiff3Command.length()), 0, &bUsedDefaultChar );
+
+   if ( successLen != kdiff3Command.length() || bUsedDefaultChar )
+   {
+      std::cerr << "KDiff3 command contains characters that don't map to ansi code page.\n"
+          "Aborting clearcase installation.\n"
+          "Try to install KDiff3 in another path that doesn't require special characters.\n";
+      return -1;
+   }
+   */
+
+   // Try to locate cleartool, the clearcase tool in the path
+   char buffer[1000];
+   char* pLastPart = 0;
+   int len = SearchPathA(0, "cleartool.exe", 0, sizeof(buffer)/sizeof(buffer[0]), 
+                         buffer, &pLastPart );
+   if ( len>0 && len+1<int(sizeof(buffer)/sizeof(buffer[0])) && pLastPart )
+   {
+      pLastPart[-1] = 0;
+      pLastPart = strrchr( buffer, '\\' ); // cd up (because cleartool.exe is in bin subdir)
+      if ( pLastPart )
+         pLastPart[1]=0;
+
+      std::string path( buffer );
+      path += "lib\\mgrs\\map";
+      std::string bakName = path + ".preKDiff3Install";
+      
+      if ( installCommand == "existsClearCase") 
+      {
+         return 1;
+      }
+      else if ( installCommand == "install") 
+      {
+         std::list<LineItem> lineItemList;
+         bool bSuccess = readAndParseMapFile( path, lineItemList );
+         if ( !bSuccess )
+         {
+            std::cerr << "Error reading original map file.\n";
+            return -1;
+         }
+
+         // Create backup
+         if ( access( bakName.c_str(), 0 )!=0 ) // Create backup only if not exists yet
+         {
+            if ( rename( path.c_str(), bakName.c_str() ) )
+            {
+               std::cerr << "Error renaming original map file.\n";
+               return -1;
+            }
+         }
+
+         std::list<LineItem>::iterator i = lineItemList.begin();
+         for( ; i!=lineItemList.end(); ++i )
+         {
+            LineItem& li = *i;
+            for (int j=0;;++j)
+            {
+               ReplacementItem& ri = g_replacementTable[j];
+               if ( ri.fileType==0 || ri.operationType==0 )
+                  break;
+               if ( li.fileType == ri.fileType && li.opType == ri.operationType )
+               {
+                  li.command = kdiff3Command.c_str();
+                  break;
+               }
+            }
+         }
+
+         bSuccess = writeMapFile( path, lineItemList );
+         if ( !bSuccess )
+         {
+            if ( rename( bakName.c_str(), path.c_str() ) )
+               std::cerr << "Error writing new map file, restoring old file also failed.\n";
+            else
+               std::cerr << "Error writing new map file, old file restored.\n";
+
+            return -1;
+         }
+      }
+      else if ( installCommand == "uninstall" )
+      {
+         std::list<LineItem> lineItemList;
+         bool bSuccess = readAndParseMapFile( path, lineItemList );
+         if ( !bSuccess )
+         {
+            std::cerr << "Error reading original map file\n.";
+            return -1;
+         }
+
+         std::list<LineItem> lineItemListBak;
+         bSuccess = readAndParseMapFile( bakName, lineItemListBak );
+         if ( !bSuccess )
+         {
+            std::cerr << "Error reading backup map file.\n";
+            return -1;
+         }
+
+         std::list<LineItem>::iterator i = lineItemList.begin();
+         for( ; i!=lineItemList.end(); ++i )
+         {
+            LineItem& li = *i;
+            if ((int)toUpper(li.command).find("KDIFF3")>=0)
+            {
+               std::list<LineItem>::const_iterator j = lineItemListBak.begin();
+               for (;j!=lineItemListBak.end();++j)
+               {
+                  const LineItem& bi = *j;  // backup iterator
+                  if ( li.fileType == bi.fileType && li.opType == bi.opType )
+                  {
+                     li.command = bi.command;
+                     break;
+                  }
+               }
+            }
+         }
+
+         bSuccess = writeMapFile( path, lineItemList );
+         if ( !bSuccess )
+         {
+            std::cerr << "Error writing map file.";
+
+            return -1;
+         }
+      }
+   }
+   return 0;
+}
+
+#ifndef KREPLACEMENTS_H
+
+extern "C"
+void __declspec(dllexport) nsisPlugin(HWND hwndParent, int string_size, 
+                                      char *variables, stack_t **stacktop,
+                                      extra_parameters *extra)
+{
+   //g_hwndParent=hwndParent;
+
+   EXDLL_INIT();
+   {
+      std::string param1( g_stringsize, ' ' );
+      int retVal = popstring( &param1[0] );
+      if ( retVal == 0 )
+      {
+         std::string param2( g_stringsize, ' ' );
+         retVal = popstring( &param2[0] );
+         if ( retVal == 0 )
+            install( param1.c_str(), param2.c_str() );
+         return;
+      }
+      std::cerr << "Not enough parameters." << std::endl;
+   }
+}
+
+#endif
+/*
+int _tmain(int argc, _TCHAR* argv[])
+{
+   if ( argc<3 ) 
+   {
+      std::cout << "This program is needed to install/uninstall KDiff3 for clearcase.\n"
+                   "It tries to patch the map file (clearcase-subdir\\lib\\mgrs\\map)\n"
+                   "Usage 1: ccInstHelper install pathToKdiff3.exe\n"
+                   "Usage 2: ccInstHelper uninstall pathToKdiff3.exe\n"
+                   "Backups of the original map files are created in the dir of the map file.\n";
+   }
+   else
+   {
+      return install( argv[1], argv[2] );
+   }
+   
+   return 0;
+}
+*/
--- a/kdiff3/src-QT4/common.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/common.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -233,7 +233,7 @@
 }
 
 
-QFont ValueMap::readFontEntry(const QString& k, QFont* defaultVal )
+QFont ValueMap::readFontEntry(const QString& k, const QFont* defaultVal )
 {
    QFont f = *defaultVal;
    std::map<QString,QString>::iterator i = m_map.find( k );
@@ -248,7 +248,7 @@
    return f;
 }
 
-QColor ValueMap::readColorEntry(const QString& k, QColor* defaultVal )
+QColor ValueMap::readColorEntry(const QString& k, const QColor* defaultVal )
 {
    QColor c= *defaultVal;
    std::map<QString,QString>::iterator i = m_map.find( k );
@@ -261,7 +261,7 @@
    return c;
 }
 
-QSize ValueMap::readSizeEntry(const QString& k, QSize* defaultVal )
+QSize ValueMap::readSizeEntry(const QString& k, const QSize* defaultVal )
 {
    QSize size = defaultVal ? *defaultVal : QSize(600,400);
    std::map<QString,QString>::iterator i = m_map.find( k );
@@ -275,7 +275,7 @@
    return size;
 }
 
-QPoint ValueMap::readPointEntry(const QString& k, QPoint* defaultVal)
+QPoint ValueMap::readPointEntry(const QString& k, const QPoint* defaultVal)
 {
    QPoint point = defaultVal ? *defaultVal : QPoint(0,0);
    std::map<QString,QString>::iterator i = m_map.find( k );
@@ -314,7 +314,7 @@
    return ival;
 }
 
-QString ValueMap::readEntry(const QString& k, const QString& sDefault )
+QString ValueMap::readStringEntry(const QString& k, const QString& sDefault )
 {
    QString sval = sDefault;
    std::map<QString,QString>::iterator i = m_map.find( k );
@@ -339,3 +339,13 @@
    else
       return defaultVal;
 }
+
+QString     ValueMap::readEntry (const QString& s, const QString& defaultVal ) { return readStringEntry(s, defaultVal); }
+QString     ValueMap::readEntry (const QString& s, const char* defaultVal ) { return readStringEntry(s, QString::fromLatin1(defaultVal) ); }
+QFont       ValueMap::readEntry (const QString& s, const QFont& defaultVal ){ return readFontEntry(s,&defaultVal); }
+QColor      ValueMap::readEntry(const QString& s, const QColor defaultVal ){ return readColorEntry(s,&defaultVal); }
+QSize       ValueMap::readEntry (const QString& s, const QSize defaultVal ){ return readSizeEntry(s,&defaultVal); }
+QPoint      ValueMap::readEntry(const QString& s, const QPoint defaultVal ){ return readPointEntry(s,&defaultVal); }
+bool        ValueMap::readEntry (const QString& s, bool bDefault ){ return readBoolEntry(s,bDefault); }
+int         ValueMap::readEntry  (const QString& s, int iDefault ){ return readNumEntry(s,iDefault); }
+QStringList ValueMap::readEntry (const QString& s, const QStringList& defaultVal, char separator ){ return readListEntry(s,defaultVal,separator); }
--- a/kdiff3/src-QT4/common.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/common.h	Tue Jan 06 17:51:29 2009 +0000
@@ -20,6 +20,7 @@
 
 #include <assert.h>
 
+
 template< class T >
 T min2( T x, T y )
 {
@@ -93,18 +94,28 @@
    virtual void writeEntry(const QString&, const QPoint& );
    virtual void writeEntry(const QString&, int );
    virtual void writeEntry(const QString&, bool );
-   virtual void writeEntry(const QString&, const QStringList&, char separator );
+   virtual void writeEntry(const QString&, const QStringList&, char separator='|' );
    virtual void writeEntry(const QString&, const QString& );
    virtual void writeEntry(const QString&, const char* );
 
-   virtual QFont       readFontEntry (const QString&, QFont* defaultVal );
-   virtual QColor      readColorEntry(const QString&, QColor* defaultVal );
-   virtual QSize       readSizeEntry (const QString&, QSize* defaultVal );
-   virtual QPoint      readPointEntry(const QString&, QPoint* defaultVal );
+   virtual QFont       readFontEntry (const QString&, const QFont* defaultVal );
+   virtual QColor      readColorEntry(const QString&, const QColor* defaultVal );
+   virtual QSize       readSizeEntry (const QString&, const QSize* defaultVal );
+   virtual QPoint      readPointEntry(const QString&, const QPoint* defaultVal );
    virtual bool        readBoolEntry (const QString&, bool bDefault );
    virtual int         readNumEntry  (const QString&, int iDefault );
-   virtual QStringList readListEntry (const QString&, const QStringList& defaultVal, char separator );
-   virtual QString     readEntry     (const QString&, const QString& );
+   virtual QStringList readListEntry (const QString&, const QStringList& defaultVal, char separator='|' );
+   virtual QString     readStringEntry(const QString&, const QString& );
+
+   QString     readEntry (const QString& s, const QString& defaultVal );
+   QString     readEntry (const QString& s, const char* defaultVal );
+   QFont       readEntry (const QString& s, const QFont& defaultVal );
+   QColor      readEntry(const QString& s, const QColor defaultVal );
+   QSize       readEntry (const QString& s, const QSize defaultVal );
+   QPoint      readEntry(const QString& s, const QPoint defaultVal );
+   bool        readEntry (const QString& s, bool bDefault );
+   int         readEntry  (const QString& s, int iDefault );
+   QStringList readEntry (const QString& s, const QStringList& defaultVal, char separator='|' );
 };
 
 QStringList safeStringSplit(const QString& s, char sepChar=',', char metaChar='\\' );
--- a/kdiff3/src-QT4/diff.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/diff.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -165,7 +165,7 @@
 
 void SourceData::reset()
 {
-   m_pEncoding = 0;
+   m_pEncoding = 0;   
    m_fileAccess = FileAccess();
    m_normalData.reset();
    m_lmppData.reset();
@@ -211,7 +211,7 @@
 
 QString SourceData::getFilename()
 {
-   return m_fileAccess.absFilePath();
+   return m_fileAccess.absoluteFilePath();
 }
 
 QString SourceData::getAliasName()
@@ -309,6 +309,7 @@
    m_size = 0;
    m_vSize = 0;
    m_bIsText = true;
+   m_eLineEndStyle = eLineEndStyleUndefined;
 }
 
 bool SourceData::FileData::readFile( const QString& filename )
@@ -429,7 +430,7 @@
    {
       if ( m_fileAccess.isLocal() )
       {
-         fileNameIn1 = m_fileAccess.absFilePath();
+         fileNameIn1 = m_fileAccess.absoluteFilePath();
       }
       else    // File is not local: create a temporary local copy:
       {
@@ -620,6 +621,21 @@
 {
    //m_unicodeBuf = decodeString( m_pBuf, m_size, eEncoding );
 
+   qint64 i;
+   // detect line end style
+   m_eLineEndStyle = eLineEndStyleUndefined;
+   for( i=0; i<m_size; ++i )
+   {
+      if ( m_pBuf[i]=='\n' )
+      {
+         if ( i>0 && m_pBuf[i-1]=='\r' ||  // normal file
+              i>3 && m_pBuf[i-1]=='\0' && m_pBuf[i-2]=='\r' && m_pBuf[i-3]=='\0') // 16-bit unicode
+            m_eLineEndStyle = eLineEndStyleDos;
+         else
+            m_eLineEndStyle = eLineEndStyleUnix;
+         break;   // Only analyze first line
+      }
+   }
    qint64 skipBytes = 0;
    QTextCodec* pCodec = ::detectEncoding( m_pBuf, m_size, skipBytes );
    if ( pCodec != pEncoding )
@@ -637,7 +653,6 @@
 
    m_bIsText = true;
    int lines = 1;
-   int i;
    for( i=0; i<ucSize; ++i )
    {
       if ( isLineOrBufEnd(p,i,ucSize) )
--- a/kdiff3/src-QT4/diff.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/diff.h	Tue Jan 06 17:51:29 2009 +0000
@@ -24,6 +24,8 @@
 #include <assert.h>
 #include "common.h"
 #include "fileaccess.h"
+#include "optiondialog.h"
+
 
 class OptionDialog;
 
@@ -273,6 +275,7 @@
    void reset();
 
    QTextCodec* getEncoding() const { return m_pEncoding; }
+   e_LineEndStyle getLineEndStyle() const { return m_normalData.m_eLineEndStyle; }
 
 private:
    QTextCodec* detectEncoding( const QString& fileName, QTextCodec* pFallbackCodec );
@@ -283,7 +286,7 @@
 
    struct FileData
    {
-      FileData(){ m_pBuf=0; m_size=0; m_vSize=0; m_bIsText=false; }
+      FileData(){ m_pBuf=0; m_size=0; m_vSize=0; m_bIsText=false; m_eLineEndStyle=eLineEndStyleUndefined; }
       ~FileData(){ reset(); }
       const char* m_pBuf;
       int m_size;
@@ -291,6 +294,7 @@
       QString m_unicodeBuf;
       std::vector<LineData> m_v;
       bool m_bIsText;
+      e_LineEndStyle m_eLineEndStyle;
       bool readFile( const QString& filename );
       bool writeFile( const QString& filename );
       void preprocess(bool bPreserveCR, QTextCodec* pEncoding );
@@ -310,7 +314,6 @@
 
 void debugLineCheck( Diff3LineList& d3ll, int size, int idx );
 
-class QStatusBar;
 
 
 class Selection
@@ -396,7 +399,17 @@
    void drawText( int x, int y, const QString& s, bool bAdapt=false )
    {
       Qt::LayoutDirection ld = (m_factor==1 || bAdapt == false) ? Qt::LeftToRight : Qt::RightToLeft;
-      QPainter::setLayoutDirection( ld );
+      //QPainter::setLayoutDirection( ld );
+      if ( ld==Qt::RightToLeft ) // Reverse the text
+      {
+         QString s2;
+         for( int i=s.length()-1; i>=0; --i )
+         {
+            s2 += s[i];
+         }
+         QPainter::drawText( m_xOffset-m_fontWidth*s.length() + m_factor*x, y, s2 );
+         return;
+      }
       QPainter::drawText( m_xOffset-m_fontWidth*s.length() + m_factor*x, y, s );
    }
 
--- a/kdiff3/src-QT4/difftextwindow.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/difftextwindow.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -145,7 +145,7 @@
 {
    setObjectName(QString("DiffTextWindow%1").arg(winIdx));
    setAttribute( Qt::WA_OpaquePaintEvent );
-   setAttribute( Qt::WA_PaintOnScreen );
+   //setAttribute( Qt::WA_PaintOnScreen );
 
    d = new DiffTextWindowData(this);
    d->m_pDiffTextWindowFrame = pParent;
@@ -552,12 +552,13 @@
       }
       if ( e->y() < 0 )          deltaY = -1 - sqr( e->y() ) / sqr(fm.height());
       if ( e->y() > height() )   deltaY = +1 + sqr( e->y() - height() ) / sqr(fm.height());
-      if ( deltaX != 0 && d->m_scrollDeltaX!=deltaX || deltaY!= 0 && d->m_scrollDeltaY!=deltaY )
+      if ( (deltaX != 0 && d->m_scrollDeltaX!=deltaX) || (deltaY!= 0 && d->m_scrollDeltaY!=deltaY) )
       {
          d->m_scrollDeltaX = deltaX;
          d->m_scrollDeltaY = deltaY;
          emit scroll( deltaX, deltaY );
-         killTimer( d->m_delayedDrawTimer );
+         if (d->m_delayedDrawTimer)
+            killTimer( d->m_delayedDrawTimer );
          d->m_delayedDrawTimer = startTimer(50);
       }
       else
@@ -711,6 +712,66 @@
    return ( l1 <= l && l <= l2 );
 }
 
+class DrawTextOptimizer
+// Drawing continuous text is much faster than drawing one char after another.
+{
+private:
+   QFont m_font;
+   QPen m_pen;
+   QString m_text;
+   QPoint m_pos;
+   MyPainter* m_pPainter;
+   QFontMetrics m_fm;
+   void draw()
+   {
+      if ( m_pPainter && !m_text.isEmpty() )
+      {
+         m_pPainter->setFont( m_font );
+         m_pPainter->setPen( m_pen );
+         m_pPainter->drawText( m_pos.x(), m_pos.y(), m_text, true );
+         m_text = QString();
+      }
+   }
+public:
+   DrawTextOptimizer( MyPainter* pPainter ) 
+      : m_fm(pPainter->fontMetrics())
+   { 
+      m_pPainter = pPainter;
+      m_font = m_pPainter->font();
+      m_pen = m_pPainter->pen();
+   }
+   ~DrawTextOptimizer() { end(); }
+   void setFont( const QFont& f )
+   {
+      if ( f!=m_font )
+      {
+         draw();
+         m_font = f;
+         m_fm = m_pPainter->fontMetrics();
+      }
+   }
+   void setPen( const QPen& pen )
+   {
+      if ( pen!=m_pen )
+      {
+         draw();
+         m_pen = pen;
+      }
+   }
+   void drawText( int x, int y, const QString& s )
+   {
+      if ( y!=m_pos.y() || x != m_pos.x()+m_text.length()*m_fm.width("W") )
+      {
+         draw();
+         m_pos = QPoint(x,y);
+      }
+      m_text += s;
+   }
+   void end()
+   {
+      draw();
+   }
+};
 
 void DiffTextWindowData::writeLine(
    MyPainter& p,
@@ -767,6 +828,7 @@
    if ( pLineDiff2 != 0 ) changed |= 2;
 
    QColor c = m_pOptionDialog->m_fgColor;
+   p.setPen(c);
    if ( changed == 2 ) {
       c = m_cDiff2;
    } else if ( changed == 1 ) {
@@ -781,28 +843,27 @@
    {
       // First calculate the "changed" information for each character.
       int i=0;
+      QString lineString( pld->pLine, pld->size );
       std::vector<UINT8> charChanged( pld->size );
-      if ( pLineDiff1!=0 || pLineDiff2 != 0 )
+      Merger merger( pLineDiff1, pLineDiff2 );
+      while( ! merger.isEndReached() &&  i<pld->size )
       {
-         Merger merger( pLineDiff1, pLineDiff2 );
-         while( ! merger.isEndReached() &&  i<pld->size )
+         if ( i < pld->size )
          {
-            if ( i < pld->size )
-            {
-               charChanged[i] = merger.whatChanged();
-               ++i;
-            }
-            merger.next();
+            charChanged[i] = merger.whatChanged();
+            ++i;
          }
+         merger.next();
       }
 
       QString s=" ";
       // Convert tabs
       int outPos = 0;
 
-      QString lineString( pld->pLine, pld->size );
       int lineLength = m_bWordWrap ? wrapLineOffset+wrapLineLength : lineString.length();
 
+      DrawTextOptimizer dto( &p );
+
       for( i=wrapLineOffset; i<lineLength; ++i )
       {
          int spaces = 1;
@@ -847,40 +908,39 @@
                   QColor lightc = diffBgColor;
                   p.fillRect( xOffset + fontWidth*outPos, yOffset,
                            fontWidth*spaces, fontHeight, lightc );
-                  p.setFont(diffFont);
+                  dto.setFont(diffFont);
                }
 
-               p.setPen( c );
+               dto.setPen( c );
                if ( s[0]==' '  &&  c!=m_pOptionDialog->m_fgColor  &&  charChanged[i]!=0 )
                {
                   if ( m_pOptionDialog->m_bShowWhiteSpaceCharacters && m_pOptionDialog->m_bShowWhiteSpace)
                   {
                      p.fillRect( xOffset + fontWidth*outPos, yOffset+fontAscent,
-                                 fontWidth*spaces-1, fontDescent, c );  // QT3
-                                 //fontWidth*spaces-1, fontDescent, c );  // QT4
+                                 fontWidth*spaces-1, fontDescent, c );
                   }
                }
                else
                {
-                  p.drawText( xOffset + fontWidth*outPos, yOffset + fontAscent, s );
+                  dto.drawText( xOffset + fontWidth*outPos, yOffset + fontAscent, s );
                }
-               p.setFont(normalFont);
+               dto.setFont(normalFont);
             }
             else
             {
                p.fillRect( xOffset + fontWidth*outPos, yOffset,
                            fontWidth*(spaces), fontHeight, m_pDiffTextWindow->palette().highlight() );
 
-               p.setPen( m_pDiffTextWindow->palette().highlightedText().color() );
-               p.drawText( xOffset + fontWidth*outPos, yOffset + fontAscent, s );
+               dto.setPen( m_pDiffTextWindow->palette().highlightedText().color() );
+               dto.drawText( xOffset + fontWidth*outPos, yOffset + fontAscent, s );
 
                m_selection.bSelectionContainsData = true;
             }
          }
 
          outPos += spaces;
-      }
-
+      } // end for
+      dto.end();
       if( m_selection.lineWithin( line ) && m_selection.lineWithin( line+1 ) )
       {
          p.fillRect( xOffset + fontWidth*outPos, yOffset,
@@ -1185,6 +1245,9 @@
 
 QString DiffTextWindow::getSelection()
 {
+   if ( d->m_pLineData==0 )
+      return QString();
+
    QString selectionString;
 
    int line=0;
@@ -1576,12 +1639,14 @@
    QLabel*       m_pLabel;
    QLabel*       m_pTopLine;
    QWidget*      m_pTopLineWidget;
+   int           m_winIdx;
 };
 
 DiffTextWindowFrame::DiffTextWindowFrame( QWidget* pParent, QStatusBar* pStatusBar, OptionDialog* pOptionDialog, int winIdx )
    : QWidget( pParent )
 {
    d = new DiffTextWindowFrameData;
+   d->m_winIdx = winIdx;
    setAutoFillBackground(true);
    d->m_pOptionDialog = pOptionDialog;
    d->m_pTopLineWidget = new QWidget(this);
@@ -1683,7 +1748,11 @@
    if ( e->type()==QEvent::FocusIn || e->type()==QEvent::FocusOut )
    {
       QColor c1 = d->m_pOptionDialog->m_bgColor;
-      QColor c2 = pDTW->d->m_cThis;
+      QColor c2;
+      if      ( d->m_winIdx==1 ) c2 = d->m_pOptionDialog->m_colorA;
+      else if ( d->m_winIdx==2 ) c2 = d->m_pOptionDialog->m_colorB;
+      else if ( d->m_winIdx==3 ) c2 = d->m_pOptionDialog->m_colorC;
+
       QPalette p = d->m_pTopLineWidget->palette();
       if ( e->type()==QEvent::FocusOut )
          std::swap(c1,c2);
@@ -1728,7 +1797,7 @@
 {
    QString current = d->m_pFileSelection->text();
 
-   KURL newURL = KFileDialog::getOpenURL( current, 0, this);
+   KUrl newURL = KFileDialog::getOpenUrl( current, 0, this);
    if ( !newURL.isEmpty() )
    {
       DiffTextWindow* pDTW = d->m_pDiffTextWindow;
--- a/kdiff3/src-QT4/directorymergewindow.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/directorymergewindow.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -36,42 +36,22 @@
 #include <QItemDelegate>
 
 
-#include <kpopupmenu.h>
+#include <kmenu.h>
 #include <kaction.h>
 #include <kmessagebox.h>
 #include <kfiledialog.h>
 #include <kiconloader.h>
 #include <klocale.h>
+#include <ktoggleaction.h>
 
 #include <iostream>
 #include <assert.h>
 //#include <konq_popupmenu.h>
 
+#include "guiutils.h"
+
 static bool conflictingFileTypes(MergeFileInfos& mfi);
-/*
-class StatusInfo : public QListView
-{
-public:
-   StatusInfo(QWidget* pParent) : QListView( pParent, "StatusInfo", Qt::WShowModal )
-   {
-      addColumn("");
-      setSorting(-1); //disable sorting
-   }
-
-   QListViewItem* m_pLast;
-   QListViewItem* last()
-   {
-      if (firstChild()==0) return 0;
-      else                 return m_pLast;
-   }
-
-   void addText(const QString& s )
-   {
-      if (firstChild()==0) m_pLast = new QListViewItem( this, s );
-      else                 m_pLast = new QListViewItem( this, last(), s );
-   }
-};
-*/
+
 class StatusInfo : public QTextEdit
 {
 public:
@@ -81,6 +61,7 @@
       setWindowFlags(Qt::Dialog);
       setWordWrapMode(QTextOption::NoWrap);
       setReadOnly(true);
+      setWindowModality( Qt::ApplicationModal );
       //showMaximized();
    }
 
@@ -92,12 +73,16 @@
       append(s);
    }
 
-   void show()
+   void setVisible(bool bVisible)
    {
-      moveCursor ( QTextCursor::End );
-      ensureCursorVisible();
-
-      QTextEdit::show();
+      if (bVisible)
+      {
+         moveCursor ( QTextCursor::End );
+         moveCursor ( QTextCursor::StartOfLine );
+         ensureCursorVisible();
+      }
+
+      QTextEdit::setVisible(bVisible);
    }
 };
 
@@ -191,18 +176,18 @@
       }
    }
 
-   QString fileName1 = fi1.absFilePath();
-   QString fileName2 = fi2.absFilePath();
+   QString fileName1 = fi1.absoluteFilePath();
+   QString fileName2 = fi2.absoluteFilePath();
    TempRemover tr1( fileName1, fi1 );
    if ( !tr1.success() )
    {
-      status = i18n("Creating temp copy of %1 failed.").arg(fileName1);
+      status = i18n("Creating temp copy of %1 failed.",fileName1);
       return;
    }
    TempRemover tr2( fileName2, fi2 );
    if ( !tr2.success() )
    {
-      status = i18n("Creating temp copy of %1 failed.").arg(fileName2);
+      status = i18n("Creating temp copy of %1 failed.",fileName2);
       return;
    }
 
@@ -213,7 +198,7 @@
 
    if ( ! file1.open(QIODevice::ReadOnly) )
    {
-      status = i18n("Opening %1 failed.").arg(fileName1);
+      status = i18n("Opening %1 failed.",fileName1);
       return;
    }
 
@@ -221,7 +206,7 @@
 
    if ( ! file2.open(QIODevice::ReadOnly) )
    {
-      status = i18n("Opening %1 failed.").arg(fileName2);
+      status = i18n("Opening %1 failed.",fileName2);
       return;
    }
 
@@ -235,13 +220,13 @@
       int len = min2( sizeLeft, (t_FileSize)buf1.size() );
       if( len != file1.read( &buf1[0], len ) )
       {
-         status = i18n("Error reading from %1").arg(fileName1);
+         status = i18n("Error reading from %1",fileName1);
          return;
       }
 
       if( len != file2.read( &buf2[0], len ) )
       {
-         status = i18n("Error reading from %1").arg(fileName2);
+         status = i18n("Error reading from %1",fileName2);
          return;
       }
 
@@ -357,7 +342,6 @@
    m_pOptions = pOptions;
    m_pIconLoader = pIconLoader;
    m_pDirectoryMergeInfo = 0;
-   m_bAllowResizeEvents = true;
    m_bSimulatedMergeStarted=false;
    m_bRealMergeStarted=false;
    m_bError = false;
@@ -402,7 +386,9 @@
    {
       int result = KMessageBox::warningYesNo(this,
          i18n("You are currently doing a directory merge. Are you sure, you want to abort the merge and rescan the directory?"),
-         i18n("Warning"), i18n("Rescan"), i18n("Continue Merging") );
+         i18n("Warning"), 
+         KGuiItem( i18n("Rescan") ), 
+         KGuiItem( i18n("Continue Merging") ) );
       if ( result!=KMessageBox::Yes )
          return;
    }
@@ -503,6 +489,7 @@
    }
 
    show();
+   setUpdatesEnabled(true);
 
    std::map<QString,t_ItemInfo> expandedDirsMap;
 
@@ -561,13 +548,13 @@
        QString text( i18n("Opening of directories failed:") );
        text += "\n\n";
        if ( !dirA.isDir() )
-       {  text += i18n("Dir A \"%1\" does not exist or is not a directory.\n").arg(m_dirA.prettyAbsPath()); }
+       {  text += i18n("Dir A \"%1\" does not exist or is not a directory.\n",m_dirA.prettyAbsPath()); }
 
        if ( !dirB.isDir() )
-       {  text += i18n("Dir B \"%1\" does not exist or is not a directory.\n").arg(m_dirB.prettyAbsPath()); }
+       {  text += i18n("Dir B \"%1\" does not exist or is not a directory.\n",m_dirB.prettyAbsPath()); }
 
        if ( m_dirC.isValid() && !m_dirC.isDir() )
-       {  text += i18n("Dir C \"%1\" does not exist or is not a directory.\n").arg(m_dirC.prettyAbsPath()); }
+       {  text += i18n("Dir C \"%1\" does not exist or is not a directory.\n",m_dirC.prettyAbsPath()); }
 
        KMessageBox::sorry( this, text, i18n("Directory Open Error") );
        return false;
@@ -921,7 +908,9 @@
 {
    if ( KMessageBox::Yes == KMessageBox::warningYesNo(this,
         i18n("This affects all merge operations."),
-        i18n("Changing All Merge Operations"),i18n("C&ontinue"), i18n("&Cancel") ) )
+        i18n("Changing All Merge Operations"),
+        KStandardGuiItem::cont(), 
+        KStandardGuiItem::cancel() ) )
    {
       for( int i=0; i<topLevelItemCount(); ++i )
       {
@@ -957,7 +946,7 @@
 
    if ( m_pOptions->m_bDmFullAnalysis )
    {
-      if( mfi.m_bExistsInA && mfi.m_bDirA || mfi.m_bExistsInB && mfi.m_bDirB || mfi.m_bExistsInC && mfi.m_bDirC )
+      if( (mfi.m_bExistsInA && mfi.m_bDirA) || (mfi.m_bExistsInB && mfi.m_bDirB) || (mfi.m_bExistsInC && mfi.m_bDirC) )
       {
          // If any input is a directory, don't start any comparison.
          mfi.m_bEqualAB=mfi.m_bExistsInA && mfi.m_bExistsInB;
@@ -967,9 +956,9 @@
       else
       {
          emit startDiffMerge(
-            mfi.m_bExistsInA ? mfi.m_fileInfoA.absFilePath() : QString(""),
-            mfi.m_bExistsInB ? mfi.m_fileInfoB.absFilePath() : QString(""),
-            mfi.m_bExistsInC ? mfi.m_fileInfoC.absFilePath() : QString(""),
+            mfi.m_bExistsInA ? mfi.m_fileInfoA.absoluteFilePath() : QString(""),
+            mfi.m_bExistsInB ? mfi.m_fileInfoB.absoluteFilePath() : QString(""),
+            mfi.m_bExistsInC ? mfi.m_fileInfoC.absoluteFilePath() : QString(""),
             "",
             "","","",&mfi.m_totalDiffStatus
             );
@@ -1281,7 +1270,8 @@
    {
       #include "xpm/file.xpm"
       #include "xpm/folder.xpm"
-      s_pm_dir = new QPixmap( m_pIconLoader->loadIcon("folder", KIcon::Small ) );
+      // FIXME specify correct icon loader group
+      s_pm_dir = new QPixmap( m_pIconLoader->loadIcon("folder", KIconLoader::NoGroup, KIconLoader::Small ) );
       if (s_pm_dir->size()!=QSize(16,16))
       {
          delete s_pm_dir;
@@ -1419,9 +1409,9 @@
    // Now check if file/dir-types fit.
    if ( mfi.m_bLinkA || mfi.m_bLinkB || mfi.m_bLinkC )
    {
-      if ( mfi.m_bExistsInA && ! mfi.m_bLinkA  ||
-           mfi.m_bExistsInB && ! mfi.m_bLinkB  ||
-           mfi.m_bExistsInC && ! mfi.m_bLinkC )
+      if ( (mfi.m_bExistsInA && ! mfi.m_bLinkA)  ||
+           (mfi.m_bExistsInB && ! mfi.m_bLinkB)  ||
+           (mfi.m_bExistsInC && ! mfi.m_bLinkC) )
       {
          return true;
       }
@@ -1429,9 +1419,9 @@
 
    if ( mfi.m_bDirA || mfi.m_bDirB || mfi.m_bDirC )
    {
-      if ( mfi.m_bExistsInA && ! mfi.m_bDirA  ||
-           mfi.m_bExistsInB && ! mfi.m_bDirB  ||
-           mfi.m_bExistsInC && ! mfi.m_bDirC )
+      if ( (mfi.m_bExistsInA && ! mfi.m_bDirA)  ||
+           (mfi.m_bExistsInB && ! mfi.m_bDirB)  ||
+           (mfi.m_bExistsInC && ! mfi.m_bDirC) )
       {
          return true;
       }
@@ -1443,9 +1433,9 @@
 {
    bool bCheckC = m_dirC.isValid();
    bool bCopyNewer = m_pOptions->m_bDmCopyNewer;
-   bool bOtherDest = !( m_dirDestInternal.absFilePath() == m_dirA.absFilePath() || 
-                        m_dirDestInternal.absFilePath() == m_dirB.absFilePath() ||
-                        bCheckC && m_dirDestInternal.absFilePath() == m_dirC.absFilePath() );
+   bool bOtherDest = !( (m_dirDestInternal.absoluteFilePath() == m_dirA.absoluteFilePath()) || 
+                        (m_dirDestInternal.absoluteFilePath() == m_dirB.absoluteFilePath()) ||
+                        (bCheckC && m_dirDestInternal.absoluteFilePath() == m_dirC.absoluteFilePath()) );
                      
 
    if ( eDefaultMergeOp == eMergeABCToDest && !bCheckC ) { eDefaultMergeOp = eMergeABToDest; }
@@ -1624,42 +1614,42 @@
    {
       bool bThreeDirs = m_dirC.isValid();
 
-      KPopupMenu m(this);
+      KMenu m(this);
       if ( bThreeDirs )
       {
-         m_pDirCurrentDoNothing->plug(&m);
+         m.addAction( m_pDirCurrentDoNothing );
          int count=0;
-         if ( mfi.m_bExistsInA ) { m_pDirCurrentChooseA->plug(&m); ++count;  }
-         if ( mfi.m_bExistsInB ) { m_pDirCurrentChooseB->plug(&m); ++count;  }
-         if ( mfi.m_bExistsInC ) { m_pDirCurrentChooseC->plug(&m); ++count;  }
-         if ( !conflictingFileTypes(mfi) && count>1 ) m_pDirCurrentMerge->plug(&m);
-         m_pDirCurrentDelete->plug(&m);
+         if ( mfi.m_bExistsInA ) { m.addAction( m_pDirCurrentChooseA ); ++count;  }
+         if ( mfi.m_bExistsInB ) { m.addAction( m_pDirCurrentChooseB ); ++count;  }
+         if ( mfi.m_bExistsInC ) { m.addAction( m_pDirCurrentChooseC ); ++count;  }
+         if ( !conflictingFileTypes(mfi) && count>1 ) m.addAction( m_pDirCurrentMerge );
+         m.addAction( m_pDirCurrentDelete );
       }
       else if ( m_bSyncMode )
       {
-         m_pDirCurrentSyncDoNothing->plug(&m);
-         if ( mfi.m_bExistsInA ) m_pDirCurrentSyncCopyAToB->plug(&m);
-         if ( mfi.m_bExistsInB ) m_pDirCurrentSyncCopyBToA->plug(&m);
-         if ( mfi.m_bExistsInA ) m_pDirCurrentSyncDeleteA->plug(&m);
-         if ( mfi.m_bExistsInB ) m_pDirCurrentSyncDeleteB->plug(&m);
+         m.addAction( m_pDirCurrentSyncDoNothing );
+         if ( mfi.m_bExistsInA ) m.addAction( m_pDirCurrentSyncCopyAToB );
+         if ( mfi.m_bExistsInB ) m.addAction( m_pDirCurrentSyncCopyBToA );
+         if ( mfi.m_bExistsInA ) m.addAction( m_pDirCurrentSyncDeleteA );
+         if ( mfi.m_bExistsInB ) m.addAction( m_pDirCurrentSyncDeleteB );
          if ( mfi.m_bExistsInA && mfi.m_bExistsInB )
          {
-            m_pDirCurrentSyncDeleteAAndB->plug(&m);
+            m.addAction( m_pDirCurrentSyncDeleteAAndB );
             if ( !conflictingFileTypes(mfi))
             {
-               m_pDirCurrentSyncMergeToA->plug(&m);
-               m_pDirCurrentSyncMergeToB->plug(&m);
-               m_pDirCurrentSyncMergeToAAndB->plug(&m);
+               m.addAction( m_pDirCurrentSyncMergeToA );
+               m.addAction( m_pDirCurrentSyncMergeToB );
+               m.addAction( m_pDirCurrentSyncMergeToAAndB );
             }
          }
       }
       else
       {
-         m_pDirCurrentDoNothing->plug(&m);
-         if ( mfi.m_bExistsInA ) { m_pDirCurrentChooseA->plug(&m); }
-         if ( mfi.m_bExistsInB ) { m_pDirCurrentChooseB->plug(&m); }
-         if ( !conflictingFileTypes(mfi) && mfi.m_bExistsInA  &&  mfi.m_bExistsInB ) m_pDirCurrentMerge->plug(&m);
-         m_pDirCurrentDelete->plug(&m);
+         m.addAction( m_pDirCurrentDoNothing );
+         if ( mfi.m_bExistsInA ) { m.addAction( m_pDirCurrentChooseA ); }
+         if ( mfi.m_bExistsInB ) { m.addAction( m_pDirCurrentChooseB ); }
+         if ( !conflictingFileTypes(mfi) && mfi.m_bExistsInA  &&  mfi.m_bExistsInB ) m.addAction( m_pDirCurrentMerge );
+         m.addAction( m_pDirCurrentDelete );
       }
 
       m.exec( p );
@@ -1699,9 +1689,9 @@
       if (!itemPath.isEmpty())
       {
          selectItemAndColumn(pDMI, c, true);
-         KPopupMenu m(this);
-         m_pDirCompareExplicit->plug(&m);
-         m_pDirMergeExplicit->plug(&m);
+         KMenu m(this);
+         m.addAction( m_pDirCompareExplicit );
+         m.addAction( m_pDirMergeExplicit );
 
 #ifndef _WIN32
          m.exec( p );
@@ -1718,9 +1708,9 @@
    if ( pDMI != 0 )
    {
       MergeFileInfos& mfi = *pDMI->m_pMFI;
-      return column == s_ACol ? mfi.m_fileInfoA.absFilePath() :
-             column == s_BCol ? mfi.m_fileInfoB.absFilePath() :
-             column == s_CCol ? mfi.m_fileInfoC.absFilePath() :
+      return column == s_ACol ? mfi.m_fileInfoA.absoluteFilePath() :
+             column == s_BCol ? mfi.m_fileInfoB.absoluteFilePath() :
+             column == s_CCol ? mfi.m_fileInfoC.absoluteFilePath() :
              QString("");
    }
    return "";
@@ -1742,9 +1732,9 @@
 void DirectoryMergeWindow::selectItemAndColumn(DirMergeItem* pDMI, int c, bool bContextMenu)
 {
    if ( bContextMenu && (
-        pDMI==m_pSelection1Item && c==m_selection1Column  ||
-        pDMI==m_pSelection2Item && c==m_selection2Column  ||
-        pDMI==m_pSelection3Item && c==m_selection3Column ) )
+        (pDMI==m_pSelection1Item && c==m_selection1Column)  ||
+        (pDMI==m_pSelection2Item && c==m_selection2Column)  ||
+        (pDMI==m_pSelection3Item && c==m_selection3Column) ) )
       return;
 
    DirMergeItem* pOld1=m_pSelection1Item;
@@ -1760,9 +1750,9 @@
    }
 
    if ( bReset || m_pSelection3Item!=0 ||
-        pDMI==m_pSelection1Item && c==m_selection1Column ||
-        pDMI==m_pSelection2Item && c==m_selection2Column ||
-        pDMI==m_pSelection3Item && c==m_selection3Column)
+        (pDMI==m_pSelection1Item && c==m_selection1Column) ||
+        (pDMI==m_pSelection2Item && c==m_selection2Column) ||
+        (pDMI==m_pSelection3Item && c==m_selection3Column))
    {
       m_pSelection1Item = 0;
       m_pSelection2Item = 0;
@@ -1823,6 +1813,9 @@
       setText( s_NonWhiteCol, QString::number( tds.nofUnsolvedConflicts + tds.nofSolvedConflicts - tds.nofWhitespaceConflicts ) );
       setText( s_WhiteCol,    QString::number( tds.nofWhitespaceConflicts ) );
    }
+   setSizeHint( s_ACol, QSize(17,17) ); // Iconsize
+   setSizeHint( s_BCol, QSize(17,17) ); // Iconsize
+   setSizeHint( s_CCol, QSize(17,17) ); // Iconsize
 }
 
 bool DirMergeItem::operator<(const QTreeWidgetItem& i) const
@@ -1835,8 +1828,11 @@
    {
       if(col==s_UnsolvedCol || col==s_SolvedCol || col==s_NonWhiteCol || col==s_WhiteCol)
          return text(col).toInt() > i.text(col).toInt();
+      else if ( col == s_NameCol )
+         return text(col).compare( i.text(col), Qt::CaseInsensitive )<0;
       else
          return QTreeWidgetItem::operator<(i);
+      
    }
    else
       return bDir1;
@@ -1916,9 +1912,9 @@
       if ( !(mfi.m_bDirA || mfi.m_bDirB || mfi.m_bDirC) )
       {
          emit startDiffMerge(
-            mfi.m_bExistsInA ? mfi.m_fileInfoA.absFilePath() : QString(""),
-            mfi.m_bExistsInB ? mfi.m_fileInfoB.absFilePath() : QString(""),
-            mfi.m_bExistsInC ? mfi.m_fileInfoC.absFilePath() : QString(""),
+            mfi.m_bExistsInA ? mfi.m_fileInfoA.absoluteFilePath() : QString(""),
+            mfi.m_bExistsInB ? mfi.m_fileInfoB.absoluteFilePath() : QString(""),
+            mfi.m_bExistsInC ? mfi.m_fileInfoC.absoluteFilePath() : QString(""),
             "",
             "","","",0
             );
@@ -2011,7 +2007,7 @@
          {
             KMessageBox::error(this, i18n("An error occurred while copying.\n"), i18n("Error") );
             m_pStatusInfo->setWindowTitle(i18n("Merge Error"));
-            m_pStatusInfo->show();
+            m_pStatusInfo->showMaximized();
             //if ( m_pStatusInfo->firstChild()!=0 )
             //   m_pStatusInfo->ensureItemVisible( m_pStatusInfo->last() );
             m_bError = true;
@@ -2130,7 +2126,9 @@
          "Choosing \"Simulate it\" will tell you what would happen.\n\n"
          "Be aware that this program still has beta status "
          "and there is NO WARRANTY whatsoever! Make backups of your vital data!"),
-         i18n("Starting Merge"), i18n("Do It"), i18n("Simulate It") );
+         i18n("Starting Merge"), 
+         KGuiItem( i18n("Do It") ), 
+         KGuiItem( i18n("Simulate It") ) );
       if (status==KMessageBox::Yes)      m_bRealMergeStarted = true;
       else if (status==KMessageBox::No ) m_bSimulatedMergeStarted = true;
       else return;
@@ -2231,9 +2229,9 @@
          m_currentItemForOperation=m_mergeItemList.begin();
          bool bDummy=false;
          mergeFLD(
-            mfi.m_bExistsInA ? mfi.m_fileInfoA.absFilePath() : QString(""),
-            mfi.m_bExistsInB ? mfi.m_fileInfoB.absFilePath() : QString(""),
-            mfi.m_bExistsInC ? mfi.m_fileInfoC.absFilePath() : QString(""),
+            mfi.m_bExistsInA ? mfi.m_fileInfoA.absoluteFilePath() : QString(""),
+            mfi.m_bExistsInB ? mfi.m_fileInfoB.absoluteFilePath() : QString(""),
+            mfi.m_bExistsInC ? mfi.m_fileInfoC.absoluteFilePath() : QString(""),
             fullNameDest(mfi),
             bDummy
             );
@@ -2278,7 +2276,9 @@
       int status = KMessageBox::warningYesNoCancel(this,
          i18n("There was an error in the last step.\n"
          "Do you want to continue with the item that caused the error or do you want to skip this item?"),
-         i18n("Continue merge after an error"), i18n("Continue With Last Item"), i18n("Skip Item") );
+         i18n("Continue merge after an error"), 
+         KGuiItem( i18n("Continue With Last Item") ), 
+         KGuiItem( i18n("Skip Item") ) );
       if      (status==KMessageBox::Yes) bContinueWithCurrentItem = true;
       else if (status==KMessageBox::No ) bSkipItem = true;
       else return;
@@ -2340,7 +2340,7 @@
                for( int childIdx = 0; childIdx<pParent->childCount(); ++childIdx )
                {
                   DirMergeItem* pDMI = static_cast<DirMergeItem*>(pParent->child(childIdx));
-                  if ( !bSim && ! pDMI->m_pMFI->m_bOperationComplete   ||  bSim && pDMI->m_pMFI->m_bSimOpComplete )
+                  if ( (!bSim && ! pDMI->m_pMFI->m_bOperationComplete)   ||  (bSim && pDMI->m_pMFI->m_bSimOpComplete) )
                   {
                      bDone=false;
                      break;
@@ -2381,7 +2381,7 @@
                static_cast<DirMergeItem*>(p)->m_pMFI->m_bSimOpComplete = false;
             }
             m_pStatusInfo->setWindowTitle(i18n("Simulated merge complete: Check if you agree with the proposed operations."));
-            m_pStatusInfo->show();
+            m_pStatusInfo->showMaximized();
          }
          m_mergeItemList.clear();
          m_bRealMergeStarted=false;
@@ -2416,7 +2416,7 @@
    {
       KMessageBox::error(this, i18n("An error occurred. Press OK to see detailed information.\n"), i18n("Error") );
       m_pStatusInfo->setWindowTitle(i18n("Merge Error"));
-      m_pStatusInfo->show();
+      m_pStatusInfo->showMaximized();
       //if ( m_pStatusInfo->firstChild()!=0 )
       //   m_pStatusInfo->ensureItemVisible( m_pStatusInfo->last() );
       m_bError = true;
@@ -2435,17 +2435,6 @@
    }
 }
 
-void DirectoryMergeWindow::allowResizeEvents(bool bAllowResizeEvents )
-{
-   m_bAllowResizeEvents = bAllowResizeEvents;
-}
-
-void DirectoryMergeWindow::resizeEvent( QResizeEvent* e )
-{
-   if (m_bAllowResizeEvents)
-      QTreeWidget::resizeEvent(e);
-}
-
 bool DirectoryMergeWindow::deleteFLD( const QString& name, bool bCreateBackup )
 {
    FileAccess fi(name, true);
@@ -2457,16 +2446,16 @@
       bool bSuccess = renameFLD( name, name+".orig" );
       if (!bSuccess)
       {
-         m_pStatusInfo->addText( i18n("Error: While deleting %1: Creating backup failed.").arg(name) );
+         m_pStatusInfo->addText( i18n("Error: While deleting %1: Creating backup failed.",name) );
          return false;
       }
    }
    else
    {
       if ( fi.isDir() && !fi.isSymLink() )
-         m_pStatusInfo->addText(i18n("delete directory recursively( %1 )").arg(name));
+         m_pStatusInfo->addText(i18n("delete directory recursively( %1 )",name));
       else
-         m_pStatusInfo->addText(i18n("delete( %1 )").arg(name));
+         m_pStatusInfo->addText(i18n("delete( %1 )",name));
 
       if ( m_bSimulatedMergeStarted )
       {
@@ -2492,7 +2481,7 @@
             FileAccess& fi2 = *it;
             if ( fi2.fileName() == "." ||  fi2.fileName()==".." )
                continue;
-            bSuccess = deleteFLD( fi2.absFilePath(), false );
+            bSuccess = deleteFLD( fi2.absoluteFilePath(), false );
             if (!bSuccess) break;
          }
          if (bSuccess)
@@ -2500,7 +2489,7 @@
             bSuccess = FileAccess::removeDir( name );
             if ( !bSuccess )
             {
-               m_pStatusInfo->addText( i18n("Error: rmdir( %1 ) operation failed.").arg(name));
+               m_pStatusInfo->addText( i18n("Error: rmdir( %1 ) operation failed.",name));
                return false;
             }
          }
@@ -2536,7 +2525,7 @@
          return false;
    }
 
-   m_pStatusInfo->addText(i18n("manual merge( %1, %2, %3 -> %4)").arg(nameA).arg(nameB).arg(nameC).arg(nameDest));
+   m_pStatusInfo->addText(i18n("manual merge( %1, %2, %3 -> %4)",nameA,nameB,nameC,nameDest));
    if ( m_bSimulatedMergeStarted )
    {
       m_pStatusInfo->addText(i18n("     Note: After a manual merge the user should continue by pressing F7.") );
@@ -2563,16 +2552,16 @@
       if ( !bSuccess )
       {
          m_pStatusInfo->addText(i18n("Error: copy( %1 -> %2 ) failed."
-            "Deleting existing destination failed.").arg(srcName).arg(destName));
+            "Deleting existing destination failed.",srcName,destName));
          return false;
       }
    }
 
    FileAccess fi( srcName );
 
-   if ( fi.isSymLink() && (fi.isDir() && !m_bFollowDirLinks  ||  !fi.isDir() && !m_bFollowFileLinks) )
+   if ( fi.isSymLink() && ((fi.isDir() && !m_bFollowDirLinks)  ||  (!fi.isDir() && !m_bFollowFileLinks)) )
    {
-      m_pStatusInfo->addText(i18n("copyLink( %1 -> %2 )").arg(srcName).arg(destName));
+      m_pStatusInfo->addText(i18n("copyLink( %1 -> %2 )",srcName,destName));
 #ifdef _WIN32
       // What are links?
 #else
@@ -2609,7 +2598,7 @@
          return false;
    }
 
-   m_pStatusInfo->addText(i18n("copy( %1 -> %2 )").arg(srcName).arg(destName));
+   m_pStatusInfo->addText(i18n("copy( %1 -> %2 )",srcName,destName));
 
    if ( m_bSimulatedMergeStarted )
    {
@@ -2636,12 +2625,12 @@
       if (!bSuccess)
       {
          m_pStatusInfo->addText( i18n("Error during rename( %1 -> %2 ): "
-                             "Cannot delete existing destination." ).arg(srcName).arg(destName));
+                             "Cannot delete existing destination." ,srcName,destName));
          return false;
       }
    }
 
-   m_pStatusInfo->addText(i18n("rename( %1 -> %2 )").arg(srcName).arg(destName));
+   m_pStatusInfo->addText(i18n("rename( %1 -> %2 )",srcName,destName));
    if ( m_bSimulatedMergeStarted )
    {
       return true;
@@ -2669,7 +2658,7 @@
       if (!bSuccess)
       {
          m_pStatusInfo->addText( i18n("Error during makeDir of %1. "
-                             "Cannot delete existing file." ).arg(name));
+                             "Cannot delete existing file." ,name));
          return false;
       }
    }
@@ -2684,7 +2673,7 @@
    }
 
    if ( ! bQuiet )
-      m_pStatusInfo->addText(i18n("makeDir( %1 )").arg(name));
+      m_pStatusInfo->addText(i18n("makeDir( %1 )",name));
 
    if ( m_bSimulatedMergeStarted )
    {
@@ -2789,7 +2778,7 @@
    MergeFileInfos& mfi )
 {
    bool bHideDest = false;
-   if ( dirA.absFilePath()==dirDest.absFilePath() )
+   if ( dirA.absoluteFilePath()==dirDest.absoluteFilePath() )
    {
       m_pA->setText( i18n("A (Dest): ") );  bHideDest=true;
    }
@@ -2798,7 +2787,7 @@
 
    m_pInfoA->setText( dirA.prettyAbsPath() );
 
-   if ( dirB.absFilePath()==dirDest.absFilePath() )
+   if ( dirB.absoluteFilePath()==dirDest.absoluteFilePath() )
    {
       m_pB->setText( i18n("B (Dest): ") );  bHideDest=true;
    }
@@ -2806,7 +2795,7 @@
       m_pB->setText( "B:    " );
    m_pInfoB->setText( dirB.prettyAbsPath() );
 
-   if ( dirC.absFilePath()==dirDest.absFilePath() )
+   if ( dirC.absoluteFilePath()==dirDest.absoluteFilePath() )
    {
       m_pC->setText( i18n("C (Dest): ") );  bHideDest=true;
    }
@@ -2880,7 +2869,7 @@
 {
    //slotStatusMsg(i18n("Saving Directory Merge State ..."));
 
-   //QString s = KFileDialog::getSaveURL( QDir::currentDirPath(), 0, this, i18n("Save As...") ).url();
+   //QString s = KFileDialog::getSaveUrl( QDir::currentPath(), 0, this, i18n("Save As...") ).url();
    QString s = KFileDialog::getSaveFileName( QDir::currentPath(), 0, this, i18n("Save Directory Merge State As...") );
    if(!s.isEmpty())
    {
@@ -2940,9 +2929,9 @@
 
       QString fileName = pMFI->m_subPath.section( '/', -1 );
       bVisible = bVisible && (
-            bDir && ! wildcardMultiMatch( m_pOptions->m_DmDirAntiPattern, fileName, m_bCaseSensitive )
-            || wildcardMultiMatch( m_pOptions->m_DmFilePattern, fileName, m_bCaseSensitive )
-               && !wildcardMultiMatch( m_pOptions->m_DmFileAntiPattern, fileName, m_bCaseSensitive ) );
+            (bDir && ! wildcardMultiMatch( m_pOptions->m_DmDirAntiPattern, fileName, m_bCaseSensitive ))
+            || (wildcardMultiMatch( m_pOptions->m_DmFilePattern, fileName, m_bCaseSensitive )
+               && !wildcardMultiMatch( m_pOptions->m_DmFileAntiPattern, fileName, m_bCaseSensitive )) );
 
       p->setHidden(!bVisible);
       p = treeIterator( p, true, true );
@@ -2968,53 +2957,51 @@
 #include "xpm/showfilesonlyinc.xpm"
    DirectoryMergeWindow* p = this;
 
-   m_pDirStartOperation = new KAction(i18n("Start/Continue Directory Merge"), Qt::Key_F7, p, SLOT(slotRunOperationForAllItems()), ac, "dir_start_operation");
-   m_pDirRunOperationForCurrentItem = new KAction(i18n("Run Operation for Current Item"), Qt::Key_F6, p, SLOT(slotRunOperationForCurrentItem()), ac, "dir_run_operation_for_current_item");
-   m_pDirCompareCurrent = new KAction(i18n("Compare Selected File"), 0, p, SLOT(compareCurrentFile()), ac, "dir_compare_current");
-   m_pDirMergeCurrent = new KAction(i18n("Merge Current File"), QIcon(QPixmap(startmerge)), 0, pKDiff3App, SLOT(slotMergeCurrentFile()), ac, "merge_current");
-   m_pDirFoldAll = new KAction(i18n("Fold All Subdirs"), 0, p, SLOT(slotFoldAllSubdirs()), ac, "dir_fold_all");
-   m_pDirUnfoldAll = new KAction(i18n("Unfold All Subdirs"), 0, p, SLOT(slotUnfoldAllSubdirs()), ac, "dir_unfold_all");
-   m_pDirRescan = new KAction(i18n("Rescan"), Qt::SHIFT+Qt::Key_F5, p, SLOT(reload()), ac, "dir_rescan");
-   m_pDirSaveMergeState = 0; //new KAction(i18n("Save Directory Merge State ..."), 0, p, SLOT(slotSaveMergeState()), ac, "dir_save_merge_state");
-   m_pDirLoadMergeState = 0; //new KAction(i18n("Load Directory Merge State ..."), 0, p, SLOT(slotLoadMergeState()), ac, "dir_load_merge_state");
-   m_pDirChooseAEverywhere = new KAction(i18n("Choose A for All Items"), 0, p, SLOT(slotChooseAEverywhere()), ac, "dir_choose_a_everywhere");
-   m_pDirChooseBEverywhere = new KAction(i18n("Choose B for All Items"), 0, p, SLOT(slotChooseBEverywhere()), ac, "dir_choose_b_everywhere");
-   m_pDirChooseCEverywhere = new KAction(i18n("Choose C for All Items"), 0, p, SLOT(slotChooseCEverywhere()), ac, "dir_choose_c_everywhere");
-   m_pDirAutoChoiceEverywhere = new KAction(i18n("Auto-Choose Operation for All Items"), 0, p, SLOT(slotAutoChooseEverywhere()), ac, "dir_autochoose_everywhere");
-   m_pDirDoNothingEverywhere = new KAction(i18n("No Operation for All Items"), 0, p, SLOT(slotNoOpEverywhere()), ac, "dir_nothing_everywhere");
-
-//   m_pDirSynchronizeDirectories = new KToggleAction(i18n("Synchronize Directories"), 0, this, SLOT(slotSynchronizeDirectories()), ac, "dir_synchronize_directories");
-//   m_pDirChooseNewerFiles = new KToggleAction(i18n("Copy Newer Files Instead of Merging"), 0, this, SLOT(slotChooseNewerFiles()), ac, "dir_choose_newer_files");
-
-   m_pDirShowIdenticalFiles = new KToggleAction(i18n("Show Identical Files"), QIcon(QPixmap(showequalfiles)), 0, this, SLOT(slotShowIdenticalFiles()), ac, "dir_show_identical_files");
-   m_pDirShowDifferentFiles = new KToggleAction(i18n("Show Different Files"), 0, this, SLOT(slotShowDifferentFiles()), ac, "dir_show_different_files");
-   m_pDirShowFilesOnlyInA   = new KToggleAction(i18n("Show Files only in A"), QIcon(QPixmap(showfilesonlyina)), 0, this, SLOT(slotShowFilesOnlyInA()), ac, "dir_show_files_only_in_a");
-   m_pDirShowFilesOnlyInB   = new KToggleAction(i18n("Show Files only in B"), QIcon(QPixmap(showfilesonlyinb)), 0, this, SLOT(slotShowFilesOnlyInB()), ac, "dir_show_files_only_in_b");
-   m_pDirShowFilesOnlyInC   = new KToggleAction(i18n("Show Files only in C"), QIcon(QPixmap(showfilesonlyinc)), 0, this, SLOT(slotShowFilesOnlyInC()), ac, "dir_show_files_only_in_c");
+   m_pDirStartOperation = KDiff3::createAction< KAction >(i18n("Start/Continue Directory Merge"), KShortcut( Qt::Key_F7 ), p, SLOT(slotRunOperationForAllItems()), ac, "dir_start_operation");
+   m_pDirRunOperationForCurrentItem = KDiff3::createAction< KAction >(i18n("Run Operation for Current Item"), KShortcut( Qt::Key_F6 ), p, SLOT(slotRunOperationForCurrentItem()), ac, "dir_run_operation_for_current_item");
+   m_pDirCompareCurrent = KDiff3::createAction< KAction >(i18n("Compare Selected File"), p, SLOT(compareCurrentFile()), ac, "dir_compare_current");
+   m_pDirMergeCurrent = KDiff3::createAction< KAction >(i18n("Merge Current File"), QIcon(QPixmap(startmerge)), i18n("Merge\nFile"), pKDiff3App, SLOT(slotMergeCurrentFile()), ac, "merge_current");
+   m_pDirFoldAll = KDiff3::createAction< KAction >(i18n("Fold All Subdirs"), p, SLOT(slotFoldAllSubdirs()), ac, "dir_fold_all");
+   m_pDirUnfoldAll = KDiff3::createAction< KAction >(i18n("Unfold All Subdirs"), p, SLOT(slotUnfoldAllSubdirs()), ac, "dir_unfold_all");
+   m_pDirRescan = KDiff3::createAction< KAction >(i18n("Rescan"), KShortcut( Qt::SHIFT+Qt::Key_F5 ), p, SLOT(reload()), ac, "dir_rescan");
+   m_pDirSaveMergeState = 0; //KDiff3::createAction< KAction >(i18n("Save Directory Merge State ..."), 0, p, SLOT(slotSaveMergeState()), ac, "dir_save_merge_state");
+   m_pDirLoadMergeState = 0; //KDiff3::createAction< KAction >(i18n("Load Directory Merge State ..."), 0, p, SLOT(slotLoadMergeState()), ac, "dir_load_merge_state");
+   m_pDirChooseAEverywhere = KDiff3::createAction< KAction >(i18n("Choose A for All Items"), p, SLOT(slotChooseAEverywhere()), ac, "dir_choose_a_everywhere");
+   m_pDirChooseBEverywhere = KDiff3::createAction< KAction >(i18n("Choose B for All Items"), p, SLOT(slotChooseBEverywhere()), ac, "dir_choose_b_everywhere");
+   m_pDirChooseCEverywhere = KDiff3::createAction< KAction >(i18n("Choose C for All Items"), p, SLOT(slotChooseCEverywhere()), ac, "dir_choose_c_everywhere");
+   m_pDirAutoChoiceEverywhere = KDiff3::createAction< KAction >(i18n("Auto-Choose Operation for All Items"), p, SLOT(slotAutoChooseEverywhere()), ac, "dir_autochoose_everywhere");
+   m_pDirDoNothingEverywhere = KDiff3::createAction< KAction >(i18n("No Operation for All Items"), p, SLOT(slotNoOpEverywhere()), ac, "dir_nothing_everywhere");
+
+//   m_pDirSynchronizeDirectories = KDiff3::createAction< KToggleAction >(i18n("Synchronize Directories"), 0, this, SLOT(slotSynchronizeDirectories()), ac, "dir_synchronize_directories");
+//   m_pDirChooseNewerFiles = KDiff3::createAction< KToggleAction >(i18n("Copy Newer Files Instead of Merging"), 0, this, SLOT(slotChooseNewerFiles()), ac, "dir_choose_newer_files");
+
+   m_pDirShowIdenticalFiles = KDiff3::createAction< KToggleAction >(i18n("Show Identical Files"), QIcon(QPixmap(showequalfiles)), i18n("Identical\nFiles"), this, SLOT(slotShowIdenticalFiles()), ac, "dir_show_identical_files");
+   m_pDirShowDifferentFiles = KDiff3::createAction< KToggleAction >(i18n("Show Different Files"), this, SLOT(slotShowDifferentFiles()), ac, "dir_show_different_files");
+   m_pDirShowFilesOnlyInA   = KDiff3::createAction< KToggleAction >(i18n("Show Files only in A"), QIcon(QPixmap(showfilesonlyina)), i18n("Files\nonly in A"), this, SLOT(slotShowFilesOnlyInA()), ac, "dir_show_files_only_in_a");
+   m_pDirShowFilesOnlyInB   = KDiff3::createAction< KToggleAction >(i18n("Show Files only in B"), QIcon(QPixmap(showfilesonlyinb)), i18n("Files\nonly in B"), this, SLOT(slotShowFilesOnlyInB()), ac, "dir_show_files_only_in_b");
+   m_pDirShowFilesOnlyInC   = KDiff3::createAction< KToggleAction >(i18n("Show Files only in C"), QIcon(QPixmap(showfilesonlyinc)), i18n("Files\nonly in C"), this, SLOT(slotShowFilesOnlyInC()), ac, "dir_show_files_only_in_c");
 
    m_pDirShowIdenticalFiles->setChecked( m_pOptions->m_bDmShowIdenticalFiles );
 
-   m_pDirCompareExplicit = new KAction(i18n("Compare Explicitly Selected Files"), 0, p, SLOT(slotCompareExplicitlySelectedFiles()), ac, "dir_compare_explicitly_selected_files");
-   m_pDirMergeExplicit = new KAction(i18n("Merge Explicitly Selected Files"), 0, p, SLOT(slotMergeExplicitlySelectedFiles()), ac, "dir_merge_explicitly_selected_files");
-
-   m_pDirCurrentDoNothing = new KAction(i18n("Do Nothing"), 0, p, SLOT(slotCurrentDoNothing()), ac, "dir_current_do_nothing");
-   m_pDirCurrentChooseA = new KAction(i18n("A"), 0, p, SLOT(slotCurrentChooseA()), ac, "dir_current_choose_a");
-   m_pDirCurrentChooseB = new KAction(i18n("B"), 0, p, SLOT(slotCurrentChooseB()), ac, "dir_current_choose_b");
-   m_pDirCurrentChooseC = new KAction(i18n("C"), 0, p, SLOT(slotCurrentChooseC()), ac, "dir_current_choose_c");
-   m_pDirCurrentMerge   = new KAction(i18n("Merge"), 0, p, SLOT(slotCurrentMerge()), ac, "dir_current_merge");
-   m_pDirCurrentDelete  = new KAction(i18n("Delete (if exists)"), 0, p, SLOT(slotCurrentDelete()), ac, "dir_current_delete");
-
-   m_pDirCurrentSyncDoNothing = new KAction(i18n("Do Nothing"), 0, p, SLOT(slotCurrentDoNothing()), ac, "dir_current_sync_do_nothing");
-   m_pDirCurrentSyncCopyAToB = new KAction(i18n("Copy A to B"), 0, p, SLOT(slotCurrentCopyAToB()), ac, "dir_current_sync_copy_a_to_b" );
-   m_pDirCurrentSyncCopyBToA = new KAction(i18n("Copy B to A"), 0, p, SLOT(slotCurrentCopyBToA()), ac, "dir_current_sync_copy_b_to_a" );
-   m_pDirCurrentSyncDeleteA  = new KAction(i18n("Delete A"), 0, p, SLOT(slotCurrentDeleteA()), ac,"dir_current_sync_delete_a");
-   m_pDirCurrentSyncDeleteB  = new KAction(i18n("Delete B"), 0, p, SLOT(slotCurrentDeleteB()), ac,"dir_current_sync_delete_b");
-   m_pDirCurrentSyncDeleteAAndB  = new KAction(i18n("Delete A && B"), 0, p, SLOT(slotCurrentDeleteAAndB()), ac,"dir_current_sync_delete_a_and_b");
-   m_pDirCurrentSyncMergeToA   = new KAction(i18n("Merge to A"), 0, p, SLOT(slotCurrentMergeToA()), ac,"dir_current_sync_merge_to_a");
-   m_pDirCurrentSyncMergeToB   = new KAction(i18n("Merge to B"), 0, p, SLOT(slotCurrentMergeToB()), ac,"dir_current_sync_merge_to_b");
-   m_pDirCurrentSyncMergeToAAndB   = new KAction(i18n("Merge to A && B"), 0, p, SLOT(slotCurrentMergeToAAndB()), ac,"dir_current_sync_merge_to_a_and_b");
-   
-   
+   m_pDirCompareExplicit = KDiff3::createAction< KAction >(i18n("Compare Explicitly Selected Files"), p, SLOT(slotCompareExplicitlySelectedFiles()), ac, "dir_compare_explicitly_selected_files");
+   m_pDirMergeExplicit = KDiff3::createAction< KAction >(i18n("Merge Explicitly Selected Files"), p, SLOT(slotMergeExplicitlySelectedFiles()), ac, "dir_merge_explicitly_selected_files");
+
+   m_pDirCurrentDoNothing = KDiff3::createAction< KAction >(i18n("Do Nothing"), p, SLOT(slotCurrentDoNothing()), ac, "dir_current_do_nothing");
+   m_pDirCurrentChooseA = KDiff3::createAction< KAction >(i18n("A"), p, SLOT(slotCurrentChooseA()), ac, "dir_current_choose_a");
+   m_pDirCurrentChooseB = KDiff3::createAction< KAction >(i18n("B"), p, SLOT(slotCurrentChooseB()), ac, "dir_current_choose_b");
+   m_pDirCurrentChooseC = KDiff3::createAction< KAction >(i18n("C"), p, SLOT(slotCurrentChooseC()), ac, "dir_current_choose_c");
+   m_pDirCurrentMerge   = KDiff3::createAction< KAction >(i18n("Merge"), p, SLOT(slotCurrentMerge()), ac, "dir_current_merge");
+   m_pDirCurrentDelete  = KDiff3::createAction< KAction >(i18n("Delete (if exists)"), p, SLOT(slotCurrentDelete()), ac, "dir_current_delete");
+
+   m_pDirCurrentSyncDoNothing = KDiff3::createAction< KAction >(i18n("Do Nothing"), p, SLOT(slotCurrentDoNothing()), ac, "dir_current_sync_do_nothing");
+   m_pDirCurrentSyncCopyAToB = KDiff3::createAction< KAction >(i18n("Copy A to B"), p, SLOT(slotCurrentCopyAToB()), ac, "dir_current_sync_copy_a_to_b" );
+   m_pDirCurrentSyncCopyBToA = KDiff3::createAction< KAction >(i18n("Copy B to A"), p, SLOT(slotCurrentCopyBToA()), ac, "dir_current_sync_copy_b_to_a" );
+   m_pDirCurrentSyncDeleteA  = KDiff3::createAction< KAction >(i18n("Delete A"), p, SLOT(slotCurrentDeleteA()), ac,"dir_current_sync_delete_a");
+   m_pDirCurrentSyncDeleteB  = KDiff3::createAction< KAction >(i18n("Delete B"), p, SLOT(slotCurrentDeleteB()), ac,"dir_current_sync_delete_b");
+   m_pDirCurrentSyncDeleteAAndB  = KDiff3::createAction< KAction >(i18n("Delete A && B"), p, SLOT(slotCurrentDeleteAAndB()), ac,"dir_current_sync_delete_a_and_b");
+   m_pDirCurrentSyncMergeToA   = KDiff3::createAction< KAction >(i18n("Merge to A"), p, SLOT(slotCurrentMergeToA()), ac,"dir_current_sync_merge_to_a");
+   m_pDirCurrentSyncMergeToB   = KDiff3::createAction< KAction >(i18n("Merge to B"), p, SLOT(slotCurrentMergeToB()), ac,"dir_current_sync_merge_to_b");
+   m_pDirCurrentSyncMergeToAAndB   = KDiff3::createAction< KAction >(i18n("Merge to A && B"), p, SLOT(slotCurrentMergeToAAndB()), ac,"dir_current_sync_merge_to_a_and_b");
 }
 
 
@@ -3028,7 +3015,7 @@
 
    m_pDirCompareCurrent->setEnabled( bDirCompare  &&  isVisible()  &&  isFileSelected() );
 
-   m_pDirMergeCurrent->setEnabled( bDirCompare  &&  isVisible()  &&  isFileSelected()
+   m_pDirMergeCurrent->setEnabled( (bDirCompare  &&  isVisible()  &&  isFileSelected())
                                 || bDiffWindowVisible );
 
    m_pDirRescan->setEnabled( bDirCompare );
--- a/kdiff3/src-QT4/directorymergewindow.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/directorymergewindow.h	Tue Jan 06 17:51:29 2009 +0000
@@ -19,6 +19,7 @@
 #define DIRECTORY_MERGE_WINDOW_H
 
 #include <QTreeWidget>
+#include <QEvent>
 #include <list>
 #include <map>
 #include "common.h"
@@ -127,7 +128,6 @@
       bool bReload = false
    );
    bool isFileSelected();
-   void allowResizeEvents(bool bAllowResizeEvents);
    bool isDirectoryMergeInProgress() { return m_bRealMergeStarted; }
    int totalColumnWidth();
    bool isSyncMode() { return m_bSyncMode; }
@@ -196,8 +196,6 @@
 protected:
    class DirMergeItemDelegate;
    void mergeContinue( bool bStart, bool bVerbose );
-   void resizeEvent(QResizeEvent* e);
-   bool m_bAllowResizeEvents;
 
    void prepareListView(ProgressProxy& pp);
    void calcSuggestedOperation( MergeFileInfos& mfi, e_MergeOperation eDefaultOperation );
@@ -215,15 +213,15 @@
    void compareFilesAndCalcAges( MergeFileInfos& mfi );
 
    QString fullNameA( const MergeFileInfos& mfi )
-   { return mfi.m_bExistsInA ? mfi.m_fileInfoA.absFilePath() : m_dirA.absFilePath() + "/" + mfi.m_subPath; }
+   { return mfi.m_bExistsInA ? mfi.m_fileInfoA.absoluteFilePath() : m_dirA.absoluteFilePath() + "/" + mfi.m_subPath; }
    QString fullNameB( const MergeFileInfos& mfi )
-   { return mfi.m_bExistsInB ? mfi.m_fileInfoB.absFilePath() : m_dirB.absFilePath() + "/" + mfi.m_subPath; }
+   { return mfi.m_bExistsInB ? mfi.m_fileInfoB.absoluteFilePath() : m_dirB.absoluteFilePath() + "/" + mfi.m_subPath; }
    QString fullNameC( const MergeFileInfos& mfi )
-   { return mfi.m_bExistsInC ? mfi.m_fileInfoC.absFilePath() : m_dirC.absFilePath() + "/" + mfi.m_subPath; }
+   { return mfi.m_bExistsInC ? mfi.m_fileInfoC.absoluteFilePath() : m_dirC.absoluteFilePath() + "/" + mfi.m_subPath; }
    QString fullNameDest( const MergeFileInfos& mfi )
    { if       ( m_dirDestInternal.prettyAbsPath() == m_dirC.prettyAbsPath() ) return fullNameC(mfi);
      else if ( m_dirDestInternal.prettyAbsPath() == m_dirB.prettyAbsPath() ) return fullNameB(mfi);
-     else return m_dirDestInternal.absFilePath() + "/" + mfi.m_subPath; 
+     else return m_dirDestInternal.absoluteFilePath() + "/" + mfi.m_subPath; 
    }
 
    bool copyFLD( const QString& srcName, const QString& destName );
--- a/kdiff3/src-QT4/fileaccess.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/fileaccess.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -21,14 +21,17 @@
 #include <qtextstream.h>
 #include <qeventloop.h>
 #include <QProcess>
+#include <QProgressBar>
 
 #include <vector>
 #include <cstdlib>
 #include <iostream>
 #include <klocale.h>
-#include <ktempfile.h>
+#include <ktemporaryfile.h>
 #include <kio/global.h>
 #include <kmessagebox.h>
+#include <kio/jobuidelegate.h>
+#include <kio/copyjob.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -80,7 +83,7 @@
 
 void FileAccess::setFile( const QString& name, bool bWantToWrite )
 {
-   m_url = KURL::fromPathOrURL( name );
+   m_url = KUrl( name );
    m_bValidData = false;
 
    m_size = 0;
@@ -113,7 +116,7 @@
       //   2. When the local file doesn't exist and should be written to.
 
       bool bExistsLocal = QDir().exists(name);
-      if ( m_url.isLocalFile() || !m_url.isValid() || bExistsLocal ) // assuming that invalid means relative
+      if ( m_url.isLocalFile() || m_url.isRelative() || !m_url.isValid() || bExistsLocal ) // assuming that invalid means relative
       {
          QString localName = name;
          if ( !bExistsLocal && m_url.isLocalFile() && name.left(5).toLower()=="file:" )
@@ -143,20 +146,20 @@
          m_bExists    = fi.exists();
          m_name       = fi.fileName();
          m_path       = fi.filePath();
-         m_absFilePath= fi.absoluteFilePath();
+         m_absoluteFilePath= fi.absoluteFilePath();
          if ( m_bSymLink ) m_linkTarget = fi.readLink();
          m_bLocal = true;
          m_bValidData = true;
          if ( ! m_url.isValid() )
          {
-            m_url.setPath( m_absFilePath );
+            m_url.setPath( m_absoluteFilePath );
          }
 
-         if ( !m_bExists  && m_absFilePath.contains("@@") )
+         if ( !m_bExists  && m_absoluteFilePath.contains("@@") )
          {
             // Try reading a clearcase file
             m_localCopy = FileAccess::tempFileName();
-            QString cmd = "cleartool get -to \"" + m_localCopy + "\"  \"" + m_absFilePath + "\"";
+            QString cmd = "cleartool get -to \"" + m_localCopy + "\"  \"" + m_absoluteFilePath + "\"";
             QProcess process;
             process.start( cmd );
             process.waitForFinished(-1);
@@ -185,7 +188,7 @@
       }
       else
       {
-         m_absFilePath = name;
+         m_absoluteFilePath = name;
          m_name   = m_url.fileName();
          m_bLocal = false;
 
@@ -210,7 +213,7 @@
    else
    {
       QString slash = (txt.isEmpty() || txt[0]=='/') ? "" : "/";
-      setFile( absFilePath() + slash + txt );
+      setFile( absoluteFilePath() + slash + txt );
    }
 }
 
@@ -247,33 +250,33 @@
 #else
 void FileAccess::setUdsEntry( const KIO::UDSEntry& e )
 {
-   KIO::UDSEntry::const_iterator ei;
    long acc = 0;
    long fileType = 0;
-   for( ei=e.begin(); ei!=e.end(); ++ei )
+   QList< uint > fields = e.listFields();
+   for( QList< uint >::ConstIterator ei=fields.constBegin(); ei!=fields.constEnd(); ++ei )
    {
-      const KIO::UDSAtom& a = *ei;
-      switch( a.m_uds )
+      uint f = *ei;
+      switch( f )
       {
-         case KIO::UDS_SIZE :              m_size   = a.m_long;   break;
-         case KIO::UDS_USER :              m_user   = a.m_str;    break;
-         case KIO::UDS_GROUP :             m_group  = a.m_str;    break;
-         case KIO::UDS_NAME :              m_path   = a.m_str;    break;  // During listDir the relative path is given here.
-         case KIO::UDS_MODIFICATION_TIME : m_modificationTime.setTime_t( a.m_long ); break;
-         case KIO::UDS_ACCESS_TIME :       m_accessTime.setTime_t( a.m_long ); break;
-         case KIO::UDS_CREATION_TIME :     m_creationTime.setTime_t( a.m_long ); break;
-         case KIO::UDS_LINK_DEST :         m_linkTarget       = a.m_str; break;
-         case KIO::UDS_ACCESS :
+         case KIO::UDSEntry::UDS_SIZE :              m_size   = e.numberValue(f);   break;
+         case KIO::UDSEntry::UDS_USER :              m_user   = e.stringValue(f);    break;
+         case KIO::UDSEntry::UDS_GROUP :             m_group  = e.stringValue(f);    break;
+         case KIO::UDSEntry::UDS_NAME :              m_path   = e.stringValue(f);    break;  // During listDir the relative path is given here.
+         case KIO::UDSEntry::UDS_MODIFICATION_TIME : m_modificationTime.setTime_t( e.numberValue(f) ); break;
+         case KIO::UDSEntry::UDS_ACCESS_TIME :       m_accessTime.setTime_t( e.numberValue(f) ); break;
+         case KIO::UDSEntry::UDS_CREATION_TIME :     m_creationTime.setTime_t( e.numberValue(f) ); break;
+         case KIO::UDSEntry::UDS_LINK_DEST :         m_linkTarget       = e.stringValue(f); break;
+         case KIO::UDSEntry::UDS_ACCESS :
          {
-            acc = a.m_long;
+            acc = e.numberValue(f);
             m_bReadable   = (acc & S_IRUSR)!=0;
             m_bWritable   = (acc & S_IWUSR)!=0;
             m_bExecutable = (acc & S_IXUSR)!=0;
             break;
          }
-         case KIO::UDS_FILE_TYPE :
+         case KIO::UDSEntry::UDS_FILE_TYPE :
          {
-            fileType = a.m_long;
+            fileType = e.numberValue(f);
             m_bDir     = ( fileType & S_IFMT ) == S_IFDIR;
             m_bFile    = ( fileType & S_IFMT ) == S_IFREG;
             m_bSymLink = ( fileType & S_IFMT ) == S_IFLNK;
@@ -282,11 +285,11 @@
             break;
          }
 
-         case KIO::UDS_URL :               // m_url = KURL( a.str );
+         case KIO::UDSEntry::UDS_URL :               // m_url = KUrl( e.stringValue(f) );
                                            break;
-         case KIO::UDS_MIME_TYPE :         break;
-         case KIO::UDS_GUESSED_MIME_TYPE : break;
-         case KIO::UDS_XML_PROPERTIES :    break;
+         case KIO::UDSEntry::UDS_MIME_TYPE :         break;
+         case KIO::UDSEntry::UDS_GUESSED_MIME_TYPE : break;
+         case KIO::UDSEntry::UDS_XML_PROPERTIES :    break;
          default: break;
       }
    }
@@ -298,7 +301,7 @@
    m_bSymLink = !m_linkTarget.isEmpty();
    if ( m_name.isEmpty() )
    {
-      int pos = m_path.findRev('/') + 1;
+      int pos = m_path.lastIndexOf('/') + 1;
       m_name = m_path.mid( pos );
    }
    m_bHidden = m_name[0]=='.';
@@ -312,17 +315,17 @@
 bool FileAccess::isSymLink() const     {   return m_bSymLink;    }
 bool FileAccess::exists() const        {   return m_bExists;     }
 long FileAccess::size() const          {   return m_size;        }
-KURL FileAccess::url() const           {   return m_url;         }
+KUrl FileAccess::url() const           {   return m_url;         }
 bool FileAccess::isLocal() const       {   return m_bLocal;      }
 bool FileAccess::isReadable() const    {   return m_bReadable;   }
 bool FileAccess::isWritable() const    {   return m_bWritable;   }
 bool FileAccess::isExecutable() const  {   return m_bExecutable; }
 bool FileAccess::isHidden() const      {   return m_bHidden;     }
 QString FileAccess::readLink() const   {   return m_linkTarget;  }
-QString FileAccess::absFilePath() const{   return m_absFilePath; }  // Full abs path
+QString FileAccess::absoluteFilePath() const{   return m_absoluteFilePath; }  // Full abs path
 QString FileAccess::fileName() const   {   return m_name;        }  // Just the name-part of the path, without parent directories
 QString FileAccess::filePath() const   {   return m_path;        }  // The path-string that was used during construction
-QString FileAccess::prettyAbsPath() const { return isLocal() ? m_absFilePath : m_url.prettyURL(); }
+QString FileAccess::prettyAbsPath() const { return isLocal() ? m_absoluteFilePath : m_url.prettyUrl(); }
 
 QDateTime FileAccess::created() const
 {
@@ -366,14 +369,14 @@
    {
       QFile f( m_localCopy );
       if ( f.open( QIODevice::ReadOnly ) )
-         return interruptableReadFile(f, pDestBuffer, maxLength);// maxLength == f.readBlock( (char*)pDestBuffer, maxLength );
+         return interruptableReadFile(f, pDestBuffer, maxLength);// maxLength == f.read( (char*)pDestBuffer, maxLength );
    }
    else if (m_bLocal)
    {
       QFile f( filePath() );
 
       if ( f.open( QIODevice::ReadOnly ) )
-         return interruptableReadFile(f, pDestBuffer, maxLength); //maxLength == f.readBlock( (char*)pDestBuffer, maxLength );
+         return interruptableReadFile(f, pDestBuffer, maxLength); //maxLength == f.read( (char*)pDestBuffer, maxLength );
    }
    else
    {
@@ -448,12 +451,12 @@
 {
    if ( isLocal() )
    {
-      return QDir().remove( absFilePath() );
+      return QDir().remove( absoluteFilePath() );
    }
    else
    {
       FileAccessJobHandler jh( this );
-      return jh.removeFile( absFilePath() );
+      return jh.removeFile( absoluteFilePath() );
    }
 }
 
@@ -502,10 +505,12 @@
 
    #else  // using KDE
 
-      KTempFile tmpFile;
+      KTemporaryFile tmpFile;
+      tmpFile.open();
       //tmpFile.setAutoDelete( true );  // We only want the name. Delete the precreated file immediately.
+      QString name = tmpFile.fileName()+".2";
       tmpFile.close();
-      return tmpFile.name()+".2";
+      return name;
 
    #endif
 }
@@ -579,9 +584,9 @@
    return m_statusText;
 }
 
-QString FileAccess::cleanDirPath( const QString& path ) // static
+QString FileAccess::cleanPath( const QString& path ) // static
 {
-   KURL url(path);
+   KUrl url(path);
    if ( url.isLocalFile() || ! url.isValid() )
    {
       return QDir().cleanPath( path );
@@ -597,7 +602,7 @@
    if ( exists() )
    {
       // First rename the existing file to the bak-file. If a bak-file file exists, delete that.
-      QString bakName = absFilePath() + bakExtension;
+      QString bakName = absoluteFilePath() + bakExtension;
       FileAccess bakFile( bakName, true /*bWantToWrite*/ );
       if ( bakFile.exists() )
       {
@@ -612,7 +617,7 @@
       if (!bSuccess)
       {
          m_statusText = i18n("While trying to make a backup, renaming failed. \nFilenames: ") +
-               absFilePath() + " -> " + bakName;
+               absoluteFilePath() + " -> " + bakName;
          return false;
       }
    }
@@ -629,20 +634,22 @@
 {
    m_bSuccess = false;
    m_pFileAccess->m_statusText = QString();
-   KIO::StatJob* pStatJob = KIO::stat( m_pFileAccess->m_url, ! bWantToWrite, detail, false );
+   KIO::StatJob* pStatJob = KIO::stat( m_pFileAccess->m_url, 
+         bWantToWrite ? KIO::StatJob::DestinationSide : KIO::StatJob::SourceSide, 
+         detail, KIO::HideProgressInfo );
 
-   connect( pStatJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotStatResult(KIO::Job*)));
+   connect( pStatJob, SIGNAL(result(KJob*)), this, SLOT(slotStatResult(KJob*)));
 
-   g_pProgressDialog->enterEventLoop( pStatJob, i18n("Getting file status: %1").arg(m_pFileAccess->prettyAbsPath()) );
+   g_pProgressDialog->enterEventLoop( pStatJob, i18n("Getting file status: %1",m_pFileAccess->prettyAbsPath()) );
 
    return m_bSuccess;
 }
 
-void FileAccessJobHandler::slotStatResult(KIO::Job* pJob)
+void FileAccessJobHandler::slotStatResult(KJob* pJob)
 {
    if ( pJob->error() )
    {
-      //pJob->showErrorDialog(g_pProgressDialog);
+      //pJob->uiDelegate()->showErrorMessage();
       m_pFileAccess->m_bExists = false;
       m_bSuccess = true;
    }
@@ -665,29 +672,29 @@
    ProgressProxy pp; // Implicitly used in slotPercent()
    if ( maxLength>0 && !pp.wasCancelled() )
    {
-      KIO::TransferJob* pJob = KIO::get( m_pFileAccess->m_url, false /*reload*/, false );
+      KIO::TransferJob* pJob = KIO::get( m_pFileAccess->m_url, KIO::NoReload );
       m_transferredBytes = 0;
       m_pTransferBuffer = (char*)pDestBuffer;
       m_maxLength = maxLength;
       m_bSuccess = false;
       m_pFileAccess->m_statusText = QString();
 
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
-      connect( pJob, SIGNAL(data(KIO::Job*,const QByteArray &)), this, SLOT(slotGetData(KIO::Job*, const QByteArray&)));
-      connect( pJob, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
+      connect( pJob, SIGNAL(data(KJob*,const QByteArray &)), this, SLOT(slotGetData(KJob*, const QByteArray&)));
+      connect( pJob, SIGNAL(percent(KJob*,unsigned long)), this, SLOT(slotPercent(KJob*, unsigned long)));
 
-      g_pProgressDialog->enterEventLoop( pJob, i18n("Reading file: %1").arg(m_pFileAccess->prettyAbsPath()) );
+      g_pProgressDialog->enterEventLoop( pJob, i18n("Reading file: %1",m_pFileAccess->prettyAbsPath()) );
       return m_bSuccess;
    }
    else
       return true;
 }
 
-void FileAccessJobHandler::slotGetData( KIO::Job* pJob, const QByteArray& newData )
+void FileAccessJobHandler::slotGetData( KJob* pJob, const QByteArray& newData )
 {
    if ( pJob->error() )
    {
-      pJob->showErrorDialog(g_pProgressDialog);
+      pJob->uiDelegate()->showErrorMessage();
    }
    else
    {
@@ -701,29 +708,30 @@
 {
    if ( maxLength>0 )
    {
-      KIO::TransferJob* pJob = KIO::put( m_pFileAccess->m_url, permissions, bOverwrite, bResume, false );
+      KIO::TransferJob* pJob = KIO::put( m_pFileAccess->m_url, permissions, 
+            (bOverwrite ? KIO::Overwrite : KIO::DefaultFlags) | (bResume ? KIO::Resume : KIO::DefaultFlags) );
       m_transferredBytes = 0;
       m_pTransferBuffer = (char*)pSrcBuffer;
       m_maxLength = maxLength;
       m_bSuccess = false;
       m_pFileAccess->m_statusText = QString();
 
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotPutJobResult(KIO::Job*)));
-      connect( pJob, SIGNAL(dataReq(KIO::Job*, QByteArray&)), this, SLOT(slotPutData(KIO::Job*, QByteArray&)));
-      connect( pJob, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotPutJobResult(KJob*)));
+      connect( pJob, SIGNAL(dataReq(KJob*, QByteArray&)), this, SLOT(slotPutData(KJob*, QByteArray&)));
+      connect( pJob, SIGNAL(percent(KJob*,unsigned long)), this, SLOT(slotPercent(KJob*, unsigned long)));
 
-      g_pProgressDialog->enterEventLoop( pJob, i18n("Writing file: %1").arg(m_pFileAccess->prettyAbsPath()) );
+      g_pProgressDialog->enterEventLoop( pJob, i18n("Writing file: %1",m_pFileAccess->prettyAbsPath()) );
       return m_bSuccess;
    }
    else
       return true;
 }
 
-void FileAccessJobHandler::slotPutData( KIO::Job* pJob, QByteArray& data )
+void FileAccessJobHandler::slotPutData( KJob* pJob, QByteArray& data )
 {
    if ( pJob->error() )
    {
-      pJob->showErrorDialog(g_pProgressDialog);
+      pJob->uiDelegate()->showErrorMessage();
    }
    else
    {
@@ -747,11 +755,11 @@
    }
 }
 
-void FileAccessJobHandler::slotPutJobResult(KIO::Job* pJob)
+void FileAccessJobHandler::slotPutJobResult(KJob* pJob)
 {
    if ( pJob->error() )
    {
-      pJob->showErrorDialog(g_pProgressDialog);
+      pJob->uiDelegate()->showErrorMessage();
    }
    else
    {
@@ -762,10 +770,10 @@
 
 bool FileAccessJobHandler::mkDir( const QString& dirName )
 {
-   KURL dirURL = KURL::fromPathOrURL( dirName );
+   KUrl dirURL = KUrl( dirName );
    if ( dirName.isEmpty() )
       return false;
-   else if ( dirURL.isLocalFile() )
+   else if ( dirURL.isLocalFile() || dirURL.isRelative() )
    {
       return QDir().mkdir( dirURL.path() );
    }
@@ -773,16 +781,16 @@
    {
       m_bSuccess = false;
       KIO::SimpleJob* pJob = KIO::mkdir( dirURL );
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
 
-      g_pProgressDialog->enterEventLoop( pJob, i18n("Making directory: %1").arg(dirName) );
+      g_pProgressDialog->enterEventLoop( pJob, i18n("Making directory: %1", dirName) );
       return m_bSuccess;
    }
 }
 
 bool FileAccessJobHandler::rmDir( const QString& dirName )
 {
-   KURL dirURL = KURL::fromPathOrURL( dirName );
+   KUrl dirURL = KUrl( dirName );
    if ( dirName.isEmpty() )
       return false;
    else if ( dirURL.isLocalFile() )
@@ -793,9 +801,9 @@
    {
       m_bSuccess = false;
       KIO::SimpleJob* pJob = KIO::rmdir( dirURL );
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
 
-      g_pProgressDialog->enterEventLoop(pJob, i18n("Removing directory: %1").arg(dirName));
+      g_pProgressDialog->enterEventLoop(pJob, i18n("Removing directory: %1",dirName));
       return m_bSuccess;
    }
 }
@@ -807,10 +815,10 @@
    else
    {
       m_bSuccess = false;
-      KIO::SimpleJob* pJob = KIO::file_delete( KURL::fromPathOrURL(fileName), false );
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
+      KIO::SimpleJob* pJob = KIO::file_delete( fileName, KIO::HideProgressInfo );
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
 
-      g_pProgressDialog->enterEventLoop( pJob, i18n("Removing file: %1").arg(fileName) );
+      g_pProgressDialog->enterEventLoop( pJob, i18n("Removing file: %1",fileName) );
       return m_bSuccess;
    }
 }
@@ -822,11 +830,11 @@
    else
    {
       m_bSuccess = false;
-      KIO::CopyJob* pJob = KIO::link( KURL::fromPathOrURL(linkTarget), KURL::fromPathOrURL(linkLocation), false );
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
+      KIO::CopyJob* pJob = KIO::link( linkTarget, linkLocation, false );
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
 
       g_pProgressDialog->enterEventLoop( pJob,
-         i18n("Creating symbolic link: %1 -> %2").arg(linkLocation).arg(linkTarget) );
+         i18n("Creating symbolic link: %1 -> %2",linkLocation,linkTarget) );
       return m_bSuccess;
    }
 }
@@ -836,36 +844,33 @@
    if ( dest.isEmpty() )
       return false;
 
-   KURL kurl = KURL::fromPathOrURL( dest );
+   KUrl kurl( dest );
    if ( !kurl.isValid() )
-      kurl = KURL::fromPathOrURL( QDir().absoluteFilePath(dest) ); // assuming that invalid means relative
+      kurl = KUrl( QDir().absoluteFilePath(dest) ); // assuming that invalid means relative
 
    if ( m_pFileAccess->isLocal() && kurl.isLocalFile() )
    {
-      return QDir().rename( m_pFileAccess->absFilePath(), kurl.path() );
+      return QDir().rename( m_pFileAccess->absoluteFilePath(), kurl.path() );
    }
    else
    {
-      bool bOverwrite = false;
-      bool bResume = false;
-      bool bShowProgress = false;
       int permissions=-1;
       m_bSuccess = false;
-      KIO::FileCopyJob* pJob = KIO::file_move( m_pFileAccess->m_url, kurl, permissions, bOverwrite, bResume, bShowProgress );
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
-      connect( pJob, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+      KIO::FileCopyJob* pJob = KIO::file_move( m_pFileAccess->m_url, kurl, permissions, KIO::DefaultFlags );
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
+      connect( pJob, SIGNAL(percent(KJob*,unsigned long)), this, SLOT(slotPercent(KJob*, unsigned long)));
 
       g_pProgressDialog->enterEventLoop( pJob,
-         i18n("Renaming file: %1 -> %2").arg(m_pFileAccess->prettyAbsPath()).arg(dest) );
+         i18n("Renaming file: %1 -> %2",m_pFileAccess->prettyAbsPath(),dest) );
       return m_bSuccess;
    }
 }
 
-void FileAccessJobHandler::slotSimpleJobResult(KIO::Job* pJob)
+void FileAccessJobHandler::slotSimpleJobResult(KJob* pJob)
 {
    if ( pJob->error() )
    {
-      pJob->showErrorDialog(g_pProgressDialog);
+      pJob->uiDelegate()->showErrorMessage();
    }
    else
    {
@@ -879,40 +884,37 @@
 bool FileAccessJobHandler::copyFile( const QString& dest )
 {
    ProgressProxy pp;
-   KURL destUrl = KURL::fromPathOrURL( dest );
+   KUrl destUrl( dest );
    m_pFileAccess->m_statusText = QString();
    if ( ! m_pFileAccess->isLocal() || ! destUrl.isLocalFile() ) // if either url is nonlocal
    {
-      bool bOverwrite = false;
-      bool bResume = false;
-      bool bShowProgress = false;
       int permissions = (m_pFileAccess->isExecutable()?0111:0)+(m_pFileAccess->isWritable()?0222:0)+(m_pFileAccess->isReadable()?0444:0);
       m_bSuccess = false;
-      KIO::FileCopyJob* pJob = KIO::file_copy ( m_pFileAccess->m_url, destUrl, permissions, bOverwrite, bResume, bShowProgress );
-      connect( pJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotSimpleJobResult(KIO::Job*)));
-      connect( pJob, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+      KIO::FileCopyJob* pJob = KIO::file_copy ( m_pFileAccess->m_url, destUrl, permissions, KIO::DefaultFlags );
+      connect( pJob, SIGNAL(result(KJob*)), this, SLOT(slotSimpleJobResult(KJob*)));
+      connect( pJob, SIGNAL(percent(KJob*,unsigned long)), this, SLOT(slotPercent(KJob*, unsigned long)));
       g_pProgressDialog->enterEventLoop( pJob,
-         i18n("Copying file: %1 -> %2").arg(m_pFileAccess->prettyAbsPath()).arg(dest) );
+         i18n("Copying file: %1 -> %2",m_pFileAccess->prettyAbsPath(),dest) );
 
       return m_bSuccess;
       // Note that the KIO-slave preserves the original date, if this is supported.
    }
 
    // Both files are local:
-   QString srcName = m_pFileAccess->absFilePath();
+   QString srcName = m_pFileAccess->absoluteFilePath();
    QString destName = dest;
    QFile srcFile( srcName );
    QFile destFile( destName );
    bool bReadSuccess = srcFile.open( QIODevice::ReadOnly );
    if ( bReadSuccess == false )
    {
-      m_pFileAccess->m_statusText = i18n("Error during file copy operation: Opening file for reading failed. Filename: %1").arg(srcName);
+      m_pFileAccess->m_statusText = i18n("Error during file copy operation: Opening file for reading failed. Filename: %1",srcName);
       return false;
    }
    bool bWriteSuccess = destFile.open( QIODevice::WriteOnly );
    if ( bWriteSuccess == false )
    {
-      m_pFileAccess->m_statusText = i18n("Error during file copy operation: Opening file for writing failed. Filename: %1").arg(destName);
+      m_pFileAccess->m_statusText = i18n("Error during file copy operation: Opening file for writing failed. Filename: %1",destName);
       return false;
    }
 
@@ -927,7 +929,7 @@
       qint64 readSize = srcFile.read( &buffer[0], min2( srcSize, bufSize ) );
       if ( readSize==-1 || readSize==0 )
       {
-         m_pFileAccess->m_statusText = i18n("Error during file copy operation: Reading failed. Filename: %1").arg(srcName);
+         m_pFileAccess->m_statusText = i18n("Error during file copy operation: Reading failed. Filename: %1",srcName);
          return false;
       }
       srcSize -= readSize;
@@ -936,7 +938,7 @@
          qint64 writeSize = destFile.write( &buffer[0], readSize );
          if ( writeSize==-1 || writeSize==0 )
          {
-            m_pFileAccess->m_statusText = i18n("Error during file copy operation: Writing failed. Filename: %1").arg(destName);
+            m_pFileAccess->m_statusText = i18n("Error during file copy operation: Writing failed. Filename: %1",destName);
             return false;
          }
          readSize -= writeSize;
@@ -1182,14 +1184,8 @@
    for ( it = m_generalPatterns.begin(); it != m_generalPatterns.end(); ++it )
    {
       QRegExp pattern( *it, bCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive, QRegExp::Wildcard );
-#if QT_VERSION==230
-      int len=0;
-      if ( pattern.match( text, 0, &len )!=-1 && len==text.length())
-         return true;
-#else
       if ( pattern.exactMatch( text ) )
          return true;
-#endif
    }
 
    return false;
@@ -1232,12 +1228,12 @@
    if ( pp.wasCancelled() )
       return true; // Cancelled is not an error.
 
-   pp.setInformation( i18n("Reading directory: ") + m_pFileAccess->absFilePath(), 0, false );
+   pp.setInformation( i18n("Reading directory: ") + m_pFileAccess->absoluteFilePath(), 0, false );
 
    if( m_pFileAccess->isLocal() )
    {
       QString currentPath = QDir::currentPath();
-      m_bSuccess = QDir::setCurrent( m_pFileAccess->absFilePath() );
+      m_bSuccess = QDir::setCurrent( m_pFileAccess->absoluteFilePath() );
       if ( m_bSuccess )
       {
 #ifndef _WIN32
@@ -1245,7 +1241,7 @@
          QDir dir( "." );
 
          dir.setSorting( QDir::Name | QDir::DirsFirst );
-         dir.setFilter( QDir::Files | QDir::Dirs | QDir::AllDirs | QDir::Hidden );
+         dir.setFilter( QDir::Files | QDir::Dirs | /* from KDE3 QDir::TypeMaskDirs | */ QDir::Hidden );
 
          QFileInfoList fiList = dir.entryInfoList();
          if ( fiList.isEmpty() )
@@ -1275,7 +1271,7 @@
 
          if ( searchHandle != INVALID_HANDLE_VALUE )
          {
-            QString absPath = m_pFileAccess->absFilePath();
+            QString absPath = m_pFileAccess->absoluteFilePath();
             QString relPath = m_pFileAccess->filePath();
             bool bFirst=true;
             while( ! pp.wasCancelled() )
@@ -1320,8 +1316,8 @@
                   );
 
                fa.m_path = fa.m_name;
-               fa.m_absFilePath = absPath + "/" + fa.m_name;
-               fa.m_url.setPath( fa.m_absFilePath );
+               fa.m_absoluteFilePath = absPath + "/" + fa.m_name;
+               fa.m_url.setPath( fa.m_absoluteFilePath );
                if ( fa.m_name!="." && fa.m_name!=".." )
                   pDirList->push_back( fa );
             }
@@ -1338,27 +1334,25 @@
    }
    else
    {
-      bool bShowProgress = false;
-
       KIO::ListJob* pListJob=0;
-      pListJob = KIO::listDir( m_pFileAccess->m_url, bShowProgress, true /*bFindHidden*/ );
+      pListJob = KIO::listDir( m_pFileAccess->m_url, KIO::DefaultFlags, true /*bFindHidden*/ );
 
       m_bSuccess = false;
       if ( pListJob!=0 )
       {
-         connect( pListJob, SIGNAL( entries( KIO::Job *, const KIO::UDSEntryList& ) ),
-                  this,     SLOT( slotListDirProcessNewEntries( KIO::Job *, const KIO::UDSEntryList& )) );
-         connect( pListJob, SIGNAL( result( KIO::Job* )),
-                  this,     SLOT( slotSimpleJobResult(KIO::Job*) ) );
+         connect( pListJob, SIGNAL( entries( KIO::Job*, const KIO::UDSEntryList& ) ),
+                  this,     SLOT( slotListDirProcessNewEntries( KIO::Job*, const KIO::UDSEntryList& )) );
+         connect( pListJob, SIGNAL( result( KJob* )),
+                  this,     SLOT( slotSimpleJobResult(KJob*) ) );
 
-         connect( pListJob, SIGNAL( infoMessage(KIO::Job*, const QString&)),
-                  this,     SLOT( slotListDirInfoMessage(KIO::Job*, const QString&) ));
+         connect( pListJob, SIGNAL( infoMessage(KJob*, const QString&)),
+                  this,     SLOT( slotListDirInfoMessage(KJob*, const QString&) ));
 
          // This line makes the transfer via fish unreliable.:-(
-         //connect( pListJob, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+         //connect( pListJob, SIGNAL(percent(KJob*,unsigned long)), this, SLOT(slotPercent(KJob*, unsigned long)));
 
          g_pProgressDialog->enterEventLoop( pListJob,
-            i18n("Listing directory: %1").arg(m_pFileAccess->prettyAbsPath()) );
+            i18n("Listing directory: %1",m_pFileAccess->prettyAbsPath()) );
       }
    }
 
@@ -1432,9 +1426,9 @@
 }
 
 
-void FileAccessJobHandler::slotListDirProcessNewEntries( KIO::Job *, const KIO::UDSEntryList& l )
+void FileAccessJobHandler::slotListDirProcessNewEntries( KIO::Job*, const KIO::UDSEntryList& l )
 {
-   KURL parentUrl( m_pFileAccess->m_absFilePath );
+   KUrl parentUrl( m_pFileAccess->m_absoluteFilePath );
 
    KIO::UDSEntryList::ConstIterator i;
    for ( i=l.begin(); i!=l.end(); ++i )
@@ -1447,18 +1441,18 @@
       {
          fa.m_url = parentUrl;
          fa.m_url.addPath( fa.filePath() );
-         fa.m_absFilePath = fa.m_url.url();
+         fa.m_absoluteFilePath = fa.m_url.url();
          m_pDirList->push_back( fa );
       }
    }
 }
 
-void FileAccessJobHandler::slotListDirInfoMessage( KIO::Job*, const QString& msg )
+void FileAccessJobHandler::slotListDirInfoMessage( KJob*, const QString& msg )
 {
    g_pProgressDialog->setInformation( msg, 0.0 );
 }
 
-void FileAccessJobHandler::slotPercent( KIO::Job*, unsigned long percent )
+void FileAccessJobHandler::slotPercent( KJob*, unsigned long percent )
 {
    g_pProgressDialog->setCurrent( percent/100.0 );
 }
@@ -1475,14 +1469,14 @@
    m_pInformation = new QLabel( " ", this );
    layout->addWidget( m_pInformation );
 
-   m_pProgressBar = new KProgress();
+   m_pProgressBar = new QProgressBar();
    m_pProgressBar->setRange(0,1000);
    layout->addWidget( m_pProgressBar );
 
    m_pSubInformation = new QLabel( " ", this);
    layout->addWidget( m_pSubInformation );
 
-   m_pSubProgressBar = new KProgress();
+   m_pSubProgressBar = new QProgressBar();
    m_pSubProgressBar->setRange(0,1000);
    layout->addWidget( m_pSubProgressBar );
 
@@ -1631,7 +1625,7 @@
 void qt_enter_modal(QWidget*);
 void qt_leave_modal(QWidget*);
 
-void ProgressDialog::enterEventLoop( KIO::Job* pJob, const QString& jobInfo )
+void ProgressDialog::enterEventLoop( KJob* pJob, const QString& jobInfo )
 {
    m_pJob = pJob;
    m_pSlowJobInfo->setText("");
@@ -1718,7 +1712,7 @@
 {
    if (m_pJob!=0)
    {
-      m_pJob->kill(false);
+      m_pJob->kill( KJob::Quietly );
       m_pJob = 0;
    }
    QDialog::hide();
--- a/kdiff3/src-QT4/fileaccess.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/fileaccess.h	Tue Jan 06 17:51:29 2009 +0000
@@ -13,11 +13,13 @@
 
 #include <QDialog>
 #include <QDateTime>
+#include <QEventLoop>
+#include <QLabel>
+#include <QProgressBar>
 
-#include <kprogress.h>
+#include <kprogressdialog.h>
 #include <kio/job.h>
 #include <kio/jobclasses.h>
-#include <kurldrag.h>
 
 #include <list>
 
@@ -53,8 +55,8 @@
    QString fileName() const; // Just the name-part of the path, without parent directories
    QString filePath() const; // The path-string that was used during construction
    QString prettyAbsPath() const;
-   KURL url() const;
-   QString absFilePath() const;
+   KUrl url() const;
+   QString absoluteFilePath() const;
 
    bool isLocal() const;
 
@@ -73,7 +75,7 @@
    static bool makeDir( const QString& );
    static bool removeDir( const QString& );
    static bool exists( const QString& );
-   static QString cleanDirPath( const QString& );
+   static QString cleanPath( const QString& );
 
    //bool chmod( const QString& );
    bool rename( const QString& );
@@ -83,7 +85,7 @@
    QString getStatusText();
 private:
    void setUdsEntry( const KIO::UDSEntry& e );
-   KURL m_url;
+   KUrl m_url;
    bool m_bLocal;
    bool m_bValidData;
 
@@ -106,7 +108,7 @@
    QString m_group;
    QString m_name;
    QString m_path;
-   QString m_absFilePath;
+   QString m_absoluteFilePath;
    QString m_localCopy;
    QString m_statusText;  // Might contain an error string, when the last operation didn't succeed.
 
@@ -156,17 +158,17 @@
    bool scanLocalDirectory( const QString& dirName, t_DirectoryList* dirList );
 
 private slots:
-   void slotStatResult( KIO::Job* );
-   void slotSimpleJobResult( KIO::Job* pJob );
-   void slotPutJobResult( KIO::Job* pJob );
+   void slotStatResult( KJob* );
+   void slotSimpleJobResult( KJob* pJob );
+   void slotPutJobResult( KJob* pJob );
 
-   void slotGetData(KIO::Job*,const QByteArray&);
-   void slotPutData(KIO::Job*, QByteArray&);
+   void slotGetData(KJob*,const QByteArray&);
+   void slotPutData(KJob*, QByteArray&);
 
-   void slotListDirInfoMessage( KIO::Job*, const QString& msg );
+   void slotListDirInfoMessage( KJob*, const QString& msg );
    void slotListDirProcessNewEntries( KIO::Job *, const KIO::UDSEntryList& l );
 
-   void slotPercent( KIO::Job* pJob, unsigned long percent );
+   void slotPercent( KJob* pJob, unsigned long percent );
 };
 
 class ProgressDialog : public QDialog
@@ -192,7 +194,7 @@
    void setSubRangeTransformation( double dMin, double dMax );
 
    void exitEventLoop();
-   void enterEventLoop( KIO::Job* pJob, const QString& jobInfo );
+   void enterEventLoop( KJob* pJob, const QString& jobInfo );
 
    bool wasCancelled();
    void show();
@@ -220,8 +222,8 @@
    int m_progressDelayTimer;
    std::list<QEventLoop*> m_eventLoopStack;
 
-   KProgress* m_pProgressBar;
-   KProgress* m_pSubProgressBar;
+   QProgressBar* m_pProgressBar;
+   QProgressBar* m_pSubProgressBar;
    QLabel* m_pInformation;
    QLabel* m_pSubInformation;
    QLabel* m_pSlowJobInfo;
@@ -230,7 +232,7 @@
    QTime m_t1;
    QTime m_t2;
    bool m_bWasCancelled;
-   KIO::Job* m_pJob;
+   KJob* m_pJob;
    QString m_currentJobInfo;  // Needed if the job doesn't stop after a reasonable time.
    bool m_bStayHidden;
 protected:
--- a/kdiff3/src-QT4/gnudiff_system.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/gnudiff_system.h	Tue Jan 06 17:51:29 2009 +0000
@@ -24,8 +24,6 @@
 #ifndef GNUDIFF_SYSTEM_H
 #define GNUDIFF_SYSTEM_H
 
-//#include <config.h>
-
 
 
 /* Don't bother to support K&R C compilers any more; it's not worth
--- a/kdiff3/src-QT4/gnudiff_xmalloc.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/gnudiff_xmalloc.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -19,9 +19,7 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
+# include <config-kdiff3.h>
 
 #include <sys/types.h>
 
Binary file kdiff3/src-QT4/hi16-app-kdiff3.png has changed
Binary file kdiff3/src-QT4/hi32-app-kdiff3.png has changed
--- a/kdiff3/src-QT4/kdiff3.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -19,6 +19,7 @@
 #include "mergeresultwindow.h"
 
 #include <iostream>
+#include <assert.h>
 
 // include files for QT
 #include <qdir.h>
@@ -35,6 +36,7 @@
 #include <QPaintDevice>
 #include <QStatusBar>
 #include <QDesktopWidget>
+#include <QPrinter>
 #include <QPrintDialog>
 
 // include files for KDE
@@ -45,10 +47,14 @@
 #include <kstatusbar.h>
 #include <klocale.h>
 #include <kconfig.h>
-#include <kstdaction.h>
+#include <kstandardaction.h>
 #include <kcmdlineargs.h>
-#include <kprinter.h>
 //#include <kkeydialog.h>
+#include <kglobal.h>
+#include <ktoggleaction.h>
+#include <ktoolbar.h>
+#include <kiconloader.h>
+#include <kactioncollection.h>
 
 // application specific includes
 #include "kdiff3.h"
@@ -57,8 +63,10 @@
 #include "kdiff3_part.h"
 #include "directorymergewindow.h"
 #include "smalldialogs.h"
+#include "guiutils.h" // namespace KDiff3
 
 #define ID_STATUS_MSG 1
+#define MAIN_TOOLBAR_NAME "mainToolBar"
 
 KActionCollection* KDiff3App::actionCollection()
 {
@@ -82,6 +90,7 @@
       return 0;
    else
       return m_pKDiff3Shell->toolBar( toolBarId );
+//return m_pKDiff3Shell->toolBar();
 }
 
 bool KDiff3App::isPart()
@@ -94,6 +103,11 @@
    return m_bFileSaved;
 }
 
+bool KDiff3App::isDirComparison()
+{
+   return m_bDirCompare;
+}
+
 KDiff3App::KDiff3App(QWidget* pParent, const char* name, KDiff3Part* pKDiff3Part )
    : QSplitter(pParent)  //previously KMainWindow
 {
@@ -103,8 +117,10 @@
 
    setWindowTitle( "KDiff3" );
    setOpaqueResize(false); // faster resizing
+   setUpdatesEnabled(false);
 
    m_pMainSplitter = 0;
+   m_pDirectoryMergeSplitter = 0;
    m_pDirectoryMergeWindow = 0;
    m_pCornerWidget = 0;
    m_pMainWidget = 0;
@@ -123,6 +139,7 @@
    m_bFileSaved = false;
    m_bTimerBlock = false;
    m_pHScrollBar = 0;
+   viewToolBar = 0;
 
    // Needed before any file operations via FileAccess happen.
    if (!g_pProgressDialog)
@@ -133,9 +150,9 @@
 
    // All default values must be set before calling readOptions().
    m_pOptionDialog = new OptionDialog( m_pKDiff3Shell!=0, this );
-   connect( m_pOptionDialog, SIGNAL(applyClicked()), this, SLOT(slotRefresh()) );
+   connect( m_pOptionDialog, SIGNAL(applyDone()), this, SLOT(slotRefresh()) );
 
-   m_pOptionDialog->readOptions( isPart() ? m_pKDiff3Part->instance()->config() : kapp->config() );
+   m_pOptionDialog->readOptions( isPart() ? m_pKDiff3Part->componentData().config() : KGlobal::config() );
 
    // Option handling: Only when pParent==0 (no parent)
    KCmdLineArgs *args = isPart() ? 0 : KCmdLineArgs::parsedArgs();
@@ -229,8 +246,8 @@
       }
 
 
-      QCStringList aliasList = args->getOptionList("fname");
-      QCStringList::Iterator ali = aliasList.begin();
+      QStringList aliasList = args->getOptionList("fname");
+      QStringList::Iterator ali = aliasList.begin();
 
       QString an1 = args->getOption("L1");
       if ( !an1.isEmpty() )              { m_sd1.setAliasName(an1);         }
@@ -244,6 +261,7 @@
       if ( !an3.isEmpty() )              { m_sd3.setAliasName(an3);         }
       else if ( ali != aliasList.end() ) { m_sd3.setAliasName(*ali); ++ali; }
    }
+
    ///////////////////////////////////////////////////////////////////
    // call inits to invoke all other construction parts
    initActions(actionCollection());
@@ -260,12 +278,17 @@
    wordWrap->setChecked( m_pOptionDialog->m_bWordWrap );
    if ( ! isPart() )
    {
-      viewToolBar->setChecked( m_pOptionDialog->m_bShowToolBar );
+//  TODO 
+//       viewToolBar->setChecked( m_pOptionDialog->m_bShowToolBar );
+//       slotViewToolBar();
+
       viewStatusBar->setChecked( m_pOptionDialog->m_bShowStatusBar );
-      slotViewToolBar();
       slotViewStatusBar();
-      if( toolBar("mainToolBar")!=0 )
-         toolBar("mainToolBar")->setBarPos( (KToolBar::BarPosition) m_pOptionDialog->m_toolBarPos );
+/*
+   vrusu - commented out as new KToolBar does not hase setParPos
+   TODO figure out how to restore bar position
+      if( toolBar(MAIN_TOOLBAR_NAME)!=0 )
+         toolBar(MAIN_TOOLBAR_NAME)->setBarPos( (KToolBar::BarPosition) m_pOptionDialog->m_toolBarPos );*/
 /*      QSize size = m_pOptionDialog->m_geometry;
       QPoint pos = m_pOptionDialog->m_position;
       if(!size.isEmpty())
@@ -282,11 +305,15 @@
    m_pMainSplitter->setOrientation( Qt::Vertical );
 //   setCentralWidget( m_pMainSplitter );
    m_pDirectoryMergeSplitter = new QSplitter( m_pMainSplitter );
+   m_pMainSplitter->addWidget( m_pDirectoryMergeSplitter );
    m_pDirectoryMergeSplitter->setOrientation( Qt::Horizontal );
    m_pDirectoryMergeWindow = new DirectoryMergeWindow( m_pDirectoryMergeSplitter, m_pOptionDialog,
-      KApplication::kApplication()->iconLoader() );
+      KIconLoader::global() );
+   m_pDirectoryMergeSplitter->addWidget(m_pDirectoryMergeWindow);
    m_pDirectoryMergeInfo = new DirectoryMergeInfo( m_pDirectoryMergeSplitter );
    m_pDirectoryMergeWindow->setDirectoryMergeInfo( m_pDirectoryMergeInfo );
+   m_pDirectoryMergeSplitter->addWidget(m_pDirectoryMergeInfo);
+
    connect( m_pDirectoryMergeWindow, SIGNAL(startDiffMerge(QString,QString,QString,QString,QString,QString,QString,TotalDiffStatus*)),
             this, SLOT( slotFileOpen2(QString,QString,QString,QString,QString,QString,QString,TotalDiffStatus*)));
    connect( m_pDirectoryMergeWindow, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateAvailabilities()));
@@ -376,7 +403,7 @@
          }
          else if ( m_pMergeResultWindow->getNrOfUnsolvedConflicts() == 0 )
          {
-            bool bSuccess = m_pMergeResultWindow->saveDocument( m_pMergeResultWindowTitle->getFileName(), m_pMergeResultWindowTitle->getEncoding() );
+            bool bSuccess = m_pMergeResultWindow->saveDocument( m_pMergeResultWindowTitle->getFileName(), m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() );
             if ( bSuccess ) ::exit(0);
          }
       }
@@ -403,9 +430,9 @@
    if ( ! m_bDirCompare  &&  m_pKDiff3Shell!=0 )
    {
       bool bFileOpenError = false;
-      if ( ! m_sd1.isEmpty() && !m_sd1.hasData()  ||
-           ! m_sd2.isEmpty() && !m_sd2.hasData()  ||
-           ! m_sd3.isEmpty() && !m_sd3.hasData() )
+      if ( (! m_sd1.isEmpty() && !m_sd1.hasData())  ||
+           (! m_sd2.isEmpty() && !m_sd2.hasData())  ||
+           (! m_sd3.isEmpty() && !m_sd3.hasData()) )
       {
          QString text( i18n("Opening of these files failed:") );
          text += "\n\n";
@@ -434,41 +461,47 @@
 
 }
 
+/**
+ * Helper function used to create actions into the ac collection
+ */
+
 void KDiff3App::initActions( KActionCollection* ac )
 {
-   if (ac==0)   KMessageBox::error(0, "actionCollection==0");
+   if (ac==0)
+      KMessageBox::error(0, "actionCollection==0");
 
-   fileOpen = KStdAction::open(this, SLOT(slotFileOpen()), ac);
-   fileOpen->setStatusText(i18n("Opens documents for comparison..."));
+   fileOpen = KStandardAction::open(this, SLOT(slotFileOpen()), ac);
+   fileOpen->setStatusTip(i18n("Opens documents for comparison..."));
 
-   fileReload  = new KAction(i18n("Reload"), /*QIconSet(QPixmap(reloadIcon)),*/ Qt::Key_F5, this, SLOT(slotReload()), ac, "file_reload");
-   
-   fileSave = KStdAction::save(this, SLOT(slotFileSave()), ac);
-   fileSave->setStatusText(i18n("Saves the merge result. All conflicts must be solved!"));
-   fileSaveAs = KStdAction::saveAs(this, SLOT(slotFileSaveAs()), ac);
-   fileSaveAs->setStatusText(i18n("Saves the current document as..."));
-   filePrint = KStdAction::print(this, SLOT(slotFilePrint()), ac);
-   filePrint->setStatusText(i18n("Print the differences"));
-   fileQuit = KStdAction::quit(this, SLOT(slotFileQuit()), ac);
-   fileQuit->setStatusText(i18n("Quits the application"));
-   editCut = KStdAction::cut(this, SLOT(slotEditCut()), ac);
-   editCut->setStatusText(i18n("Cuts the selected section and puts it to the clipboard"));
-   editCopy = KStdAction::copy(this, SLOT(slotEditCopy()), ac);
-   editCopy->setStatusText(i18n("Copies the selected section to the clipboard"));
-   editPaste = KStdAction::paste(this, SLOT(slotEditPaste()), ac);
-   editPaste->setStatusText(i18n("Pastes the clipboard contents to actual position"));
-   editSelectAll = KStdAction::selectAll(this, SLOT(slotEditSelectAll()), ac);
-   editSelectAll->setStatusText(i18n("Select everything in current window"));
-   editFind = KStdAction::find(this, SLOT(slotEditFind()), ac);
-   editFind->setStatusText(i18n("Search for a string"));
-   editFindNext = KStdAction::findNext(this, SLOT(slotEditFindNext()), ac);
-   editFindNext->setStatusText(i18n("Search again for the string"));
-   viewToolBar = KStdAction::showToolbar(this, SLOT(slotViewToolBar()), ac);
-   viewToolBar->setStatusText(i18n("Enables/disables the toolbar"));
-   viewStatusBar = KStdAction::showStatusbar(this, SLOT(slotViewStatusBar()), ac);
-   viewStatusBar->setStatusText(i18n("Enables/disables the statusbar"));
-   KStdAction::keyBindings(this, SLOT(slotConfigureKeys()), ac);
-   KAction* pAction = KStdAction::preferences(this, SLOT(slotConfigure()), ac );
+   fileReload = KDiff3::createAction< KAction >( i18n("Reload"), KShortcut( Qt::Key_F5 ), this, SLOT(slotReload()), ac, "file_reload" );
+
+   fileSave = KStandardAction::save(this, SLOT(slotFileSave()), ac);
+   fileSave->setStatusTip(i18n("Saves the merge result. All conflicts must be solved!"));
+   fileSaveAs = KStandardAction::saveAs(this, SLOT(slotFileSaveAs()), ac);
+   fileSaveAs->setStatusTip(i18n("Saves the current document as..."));
+   filePrint = KStandardAction::print(this, SLOT(slotFilePrint()), ac);
+   filePrint->setStatusTip(i18n("Print the differences"));
+   fileQuit = KStandardAction::quit(this, SLOT(slotFileQuit()), ac);
+   fileQuit->setStatusTip(i18n("Quits the application"));
+   editCut = KStandardAction::cut(this, SLOT(slotEditCut()), ac);
+   editCut->setStatusTip(i18n("Cuts the selected section and puts it to the clipboard"));
+   editCopy = KStandardAction::copy(this, SLOT(slotEditCopy()), ac);
+   editCopy->setStatusTip(i18n("Copies the selected section to the clipboard"));
+   editPaste = KStandardAction::paste(this, SLOT(slotEditPaste()), ac);
+   editPaste->setStatusTip(i18n("Pastes the clipboard contents to actual position"));
+   editSelectAll = KStandardAction::selectAll(this, SLOT(slotEditSelectAll()), ac);
+   editSelectAll->setStatusTip(i18n("Select everything in current window"));
+   editFind = KStandardAction::find(this, SLOT(slotEditFind()), ac);
+   editFind->setStatusTip(i18n("Search for a string"));
+   editFindNext = KStandardAction::findNext(this, SLOT(slotEditFindNext()), ac);
+   editFindNext->setStatusTip(i18n("Search again for the string"));
+/*   FIXME figure out how to implement this action
+   viewToolBar = KStandardAction::showToolbar(this, SLOT(slotViewToolBar()), ac);
+   viewToolBar->setStatusTip(i18n("Enables/disables the toolbar")); */
+   viewStatusBar = KStandardAction::showStatusbar(this, SLOT(slotViewStatusBar()), ac);
+   viewStatusBar->setStatusTip(i18n("Enables/disables the statusbar"));
+   KStandardAction::keyBindings(this, SLOT(slotConfigureKeys()), ac);
+   KAction* pAction = KStandardAction::preferences(this, SLOT(slotConfigure()), ac );
    if ( isPart() )
       pAction->setText(i18n("Configure KDiff3..."));
 
@@ -491,75 +524,81 @@
 #include "xpm/showlinenumbers.xpm"
 //#include "reload.xpm"
 
-   goCurrent = new KAction(i18n("Go to Current Delta"), QIcon(QPixmap(currentpos)), Qt::CTRL+Qt::Key_Space, this, SLOT(slotGoCurrent()), ac, "go_current");
-   goTop = new KAction(i18n("Go to First Delta"), QIcon(QPixmap(upend)), 0, this, SLOT(slotGoTop()), ac, "go_top");
-   goBottom = new KAction(i18n("Go to Last Delta"), QIcon(QPixmap(downend)), 0, this, SLOT(slotGoBottom()), ac, "go_bottom");
+   goCurrent = KDiff3::createAction< KAction >( i18n("Go to Current Delta"), QIcon(QPixmap(currentpos)), i18n("Current\nDelta"), KShortcut( Qt::CTRL+Qt::Key_Space ), this, SLOT(slotGoCurrent()), ac, "go_current");
+
+   goTop = KDiff3::createAction< KAction >(i18n("Go to First Delta"), QIcon(QPixmap(upend)), i18n("First\nDelta"), this, SLOT(slotGoTop()), ac, "go_top");
+
+   goBottom = KDiff3::createAction< KAction >(i18n("Go to Last Delta"), QIcon(QPixmap(downend)), i18n("Last\nDelta"), this, SLOT(slotGoBottom()), ac, "go_bottom");
+
    QString omitsWhitespace = ".\n" + i18n("(Skips white space differences when \"Show White Space\" is disabled.)");
    QString includeWhitespace = ".\n" + i18n("(Does not skip white space differences even when \"Show White Space\" is disabled.)");
-   goPrevDelta = new KAction(i18n("Go to Previous Delta"), QIcon(QPixmap(up1arrow)), Qt::CTRL+Qt::Key_Up, this, SLOT(slotGoPrevDelta()), ac, "go_prev_delta");
+   goPrevDelta = KDiff3::createAction< KAction >(i18n("Go to Previous Delta"), QIcon(QPixmap(up1arrow)), i18n("Prev\nDelta"), KShortcut( Qt::CTRL+Qt::Key_Up), this, SLOT(slotGoPrevDelta()), ac, "go_prev_delta");
    goPrevDelta->setToolTip( goPrevDelta->text() + omitsWhitespace );
-   goNextDelta = new KAction(i18n("Go to Next Delta"), QIcon(QPixmap(down1arrow)), Qt::CTRL+Qt::Key_Down, this, SLOT(slotGoNextDelta()), ac, "go_next_delta");
+   goNextDelta = KDiff3::createAction< KAction >(i18n("Go to Next Delta"), QIcon(QPixmap(down1arrow)), i18n("Next\nDelta"), KShortcut( Qt::CTRL+Qt::Key_Down ), this, SLOT(slotGoNextDelta()), ac, "go_next_delta");
    goNextDelta->setToolTip( goNextDelta->text() + omitsWhitespace );
-   goPrevConflict = new KAction(i18n("Go to Previous Conflict"), QIcon(QPixmap(up2arrow)), Qt::CTRL+Qt::Key_PageUp, this, SLOT(slotGoPrevConflict()), ac, "go_prev_conflict");
+   goPrevConflict = KDiff3::createAction< KAction >(i18n("Go to Previous Conflict"), QIcon(QPixmap(up2arrow)), i18n("Prev\nConflict"), KShortcut( Qt::CTRL+Qt::Key_PageUp ), this, SLOT(slotGoPrevConflict()), ac, "go_prev_conflict");
    goPrevConflict->setToolTip( goPrevConflict->text() + omitsWhitespace );
-   goNextConflict = new KAction(i18n("Go to Next Conflict"), QIcon(QPixmap(down2arrow)), Qt::CTRL+Qt::Key_PageDown, this, SLOT(slotGoNextConflict()), ac, "go_next_conflict");
+   goNextConflict = KDiff3::createAction< KAction >(i18n("Go to Next Conflict"), QIcon(QPixmap(down2arrow)), i18n("Next\nConflict"), KShortcut( Qt::CTRL+Qt::Key_PageDown ), this, SLOT(slotGoNextConflict()), ac, "go_next_conflict");
    goNextConflict->setToolTip( goNextConflict->text() + omitsWhitespace );
-   goPrevUnsolvedConflict = new KAction(i18n("Go to Previous Unsolved Conflict"), QIcon(QPixmap(prevunsolved)), 0, this, SLOT(slotGoPrevUnsolvedConflict()), ac, "go_prev_unsolved_conflict");
+   goPrevUnsolvedConflict = KDiff3::createAction< KAction >(i18n("Go to Previous Unsolved Conflict"), QIcon(QPixmap(prevunsolved)), i18n("Prev\nUnsolved"), this, SLOT(slotGoPrevUnsolvedConflict()), ac, "go_prev_unsolved_conflict");
    goPrevUnsolvedConflict->setToolTip( goPrevUnsolvedConflict->text() + includeWhitespace );
-   goNextUnsolvedConflict = new KAction(i18n("Go to Next Unsolved Conflict"), QIcon(QPixmap(nextunsolved)), 0, this, SLOT(slotGoNextUnsolvedConflict()), ac, "go_next_unsolved_conflict");
+   goNextUnsolvedConflict = KDiff3::createAction< KAction >(i18n("Go to Next Unsolved Conflict"), QIcon(QPixmap(nextunsolved)), i18n("Next\nUnsolved"), this, SLOT(slotGoNextUnsolvedConflict()), ac, "go_next_unsolved_conflict");
    goNextUnsolvedConflict->setToolTip( goNextUnsolvedConflict->text() + includeWhitespace );
-   chooseA = new KToggleAction(i18n("Select Line(s) From A"), QIcon(QPixmap(iconA)), Qt::CTRL+Qt::Key_1, this, SLOT(slotChooseA()), ac, "merge_choose_a");
-   chooseB = new KToggleAction(i18n("Select Line(s) From B"), QIcon(QPixmap(iconB)), Qt::CTRL+Qt::Key_2, this, SLOT(slotChooseB()), ac, "merge_choose_b");
-   chooseC = new KToggleAction(i18n("Select Line(s) From C"), QIcon(QPixmap(iconC)), Qt::CTRL+Qt::Key_3, this, SLOT(slotChooseC()), ac, "merge_choose_c");
-   autoAdvance = new KToggleAction(i18n("Automatically Go to Next Unsolved Conflict After Source Selection"), QIcon(QPixmap(autoadvance)), 0, this, SLOT(slotAutoAdvanceToggled()), ac, "merge_autoadvance");
+   chooseA = KDiff3::createAction< KToggleAction >(i18n("Select Line(s) From A"), QIcon(QPixmap(iconA)), i18n("Choose\nA"), KShortcut( Qt::CTRL+Qt::Key_1 ), this, SLOT(slotChooseA()), ac, "merge_choose_a");
+   chooseB = KDiff3::createAction< KToggleAction >(i18n("Select Line(s) From B"), QIcon(QPixmap(iconB)), i18n("Choose\nB"), KShortcut( Qt::CTRL+Qt::Key_2 ), this, SLOT(slotChooseB()), ac, "merge_choose_b");
+   chooseC = KDiff3::createAction< KToggleAction >(i18n("Select Line(s) From C"), QIcon(QPixmap(iconC)), i18n("Choose\nC"), KShortcut( Qt::CTRL+Qt::Key_3 ), this, SLOT(slotChooseC()), ac, "merge_choose_c");
+   autoAdvance = KDiff3::createAction< KToggleAction >(i18n("Automatically Go to Next Unsolved Conflict After Source Selection"), QIcon(QPixmap(autoadvance)), i18n("Auto\nNext"), this, SLOT(slotAutoAdvanceToggled()), ac, "merge_autoadvance");
 
-   showWhiteSpaceCharacters = new KToggleAction(i18n("Show Space && Tabulator Characters for Differences"), QIcon(QPixmap(showwhitespacechars)), 0, this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace_characters");
-   showWhiteSpace = new KToggleAction(i18n("Show White Space"), QIcon(QPixmap(showwhitespace)), 0, this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace");
+   showWhiteSpaceCharacters = KDiff3::createAction< KToggleAction >(i18n("Show Space && Tabulator Characters for Differences"), QIcon(QPixmap(showwhitespacechars)), i18n("White\nCharacters"), this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace_characters");
+   showWhiteSpace = KDiff3::createAction< KToggleAction >(i18n("Show White Space"), QIcon(QPixmap(showwhitespace)), i18n("White\nDeltas"), this, SLOT(slotShowWhiteSpaceToggled()), ac, "diff_show_whitespace");
 
-   showLineNumbers = new KToggleAction(i18n("Show Line Numbers"), QIcon(QPixmap(showlinenumbers)), 0, this, SLOT(slotShowLineNumbersToggled()), ac, "diff_showlinenumbers");
-   chooseAEverywhere = new KAction(i18n("Choose A Everywhere"), Qt::CTRL+Qt::SHIFT+Qt::Key_1, this, SLOT(slotChooseAEverywhere()), ac, "merge_choose_a_everywhere");
-   chooseBEverywhere = new KAction(i18n("Choose B Everywhere"), Qt::CTRL+Qt::SHIFT+Qt::Key_2, this, SLOT(slotChooseBEverywhere()), ac, "merge_choose_b_everywhere");
-   chooseCEverywhere = new KAction(i18n("Choose C Everywhere"), Qt::CTRL+Qt::SHIFT+Qt::Key_3, this, SLOT(slotChooseCEverywhere()), ac, "merge_choose_c_everywhere");
-   chooseAForUnsolvedConflicts = new KAction(i18n("Choose A for All Unsolved Conflicts"), 0, this, SLOT(slotChooseAForUnsolvedConflicts()), ac, "merge_choose_a_for_unsolved_conflicts");
-   chooseBForUnsolvedConflicts = new KAction(i18n("Choose B for All Unsolved Conflicts"), 0, this, SLOT(slotChooseBForUnsolvedConflicts()), ac, "merge_choose_b_for_unsolved_conflicts");
-   chooseCForUnsolvedConflicts = new KAction(i18n("Choose C for All Unsolved Conflicts"), 0, this, SLOT(slotChooseCForUnsolvedConflicts()), ac, "merge_choose_c_for_unsolved_conflicts");
-   chooseAForUnsolvedWhiteSpaceConflicts = new KAction(i18n("Choose A for All Unsolved Whitespace Conflicts"), 0, this, SLOT(slotChooseAForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_a_for_unsolved_whitespace_conflicts");
-   chooseBForUnsolvedWhiteSpaceConflicts = new KAction(i18n("Choose B for All Unsolved Whitespace Conflicts"), 0, this, SLOT(slotChooseBForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_b_for_unsolved_whitespace_conflicts");
-   chooseCForUnsolvedWhiteSpaceConflicts = new KAction(i18n("Choose C for All Unsolved Whitespace Conflicts"), 0, this, SLOT(slotChooseCForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_c_for_unsolved_whitespace_conflicts");
-   autoSolve    = new KAction(i18n("Automatically Solve Simple Conflicts"),  0, this, SLOT(slotAutoSolve()),    ac, "merge_autosolve");
-   unsolve      = new KAction(i18n("Set Deltas to Conflicts"),               0, this, SLOT(slotUnsolve()),      ac, "merge_autounsolve");
-   mergeRegExp  = new KAction(i18n("Run Regular Expression Auto Merge"),     0, this, SLOT(slotRegExpAutoMerge()),ac, "merge_regexp_automerge" );
-   mergeHistory = new KAction(i18n("Automatically Solve History Conflicts"), 0, this, SLOT(slotMergeHistory()), ac, "merge_versioncontrol_history" );
-   splitDiff    = new KAction(i18n("Split Diff At Selection"),               0, this, SLOT(slotSplitDiff()),    ac, "merge_splitdiff");
-   joinDiffs    = new KAction(i18n("Join Selected Diffs"),                   0, this, SLOT(slotJoinDiffs()),    ac, "merge_joindiffs");
+   showLineNumbers = KDiff3::createAction< KToggleAction >(i18n("Show Line Numbers"), QIcon(QPixmap(showlinenumbers)), i18n("Line\nNumbers"), this, SLOT(slotShowLineNumbersToggled()), ac, "diff_showlinenumbers");
+   chooseAEverywhere = KDiff3::createAction< KAction >(i18n("Choose A Everywhere"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_1 ), this, SLOT(slotChooseAEverywhere()), ac, "merge_choose_a_everywhere");
+   chooseBEverywhere = KDiff3::createAction< KAction >(i18n("Choose B Everywhere"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_2 ), this, SLOT(slotChooseBEverywhere()), ac, "merge_choose_b_everywhere");
+   chooseCEverywhere = KDiff3::createAction< KAction >(i18n("Choose C Everywhere"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_3 ), this, SLOT(slotChooseCEverywhere()), ac, "merge_choose_c_everywhere");
+   chooseAForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose A for All Unsolved Conflicts"), this, SLOT(slotChooseAForUnsolvedConflicts()), ac, "merge_choose_a_for_unsolved_conflicts");
+   chooseBForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose B for All Unsolved Conflicts"), this, SLOT(slotChooseBForUnsolvedConflicts()), ac, "merge_choose_b_for_unsolved_conflicts");
+   chooseCForUnsolvedConflicts = KDiff3::createAction< KAction >(i18n("Choose C for All Unsolved Conflicts"), this, SLOT(slotChooseCForUnsolvedConflicts()), ac, "merge_choose_c_for_unsolved_conflicts");
+   chooseAForUnsolvedWhiteSpaceConflicts = KDiff3::createAction< KAction >(i18n("Choose A for All Unsolved Whitespace Conflicts"), this, SLOT(slotChooseAForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_a_for_unsolved_whitespace_conflicts");
+   chooseBForUnsolvedWhiteSpaceConflicts = KDiff3::createAction< KAction >(i18n("Choose B for All Unsolved Whitespace Conflicts"), this, SLOT(slotChooseBForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_b_for_unsolved_whitespace_conflicts");
+   chooseCForUnsolvedWhiteSpaceConflicts = KDiff3::createAction< KAction >(i18n("Choose C for All Unsolved Whitespace Conflicts"), this, SLOT(slotChooseCForUnsolvedWhiteSpaceConflicts()), ac, "merge_choose_c_for_unsolved_whitespace_conflicts");
+   autoSolve    = KDiff3::createAction< KAction >(i18n("Automatically Solve Simple Conflicts"),  this, SLOT(slotAutoSolve()),    ac, "merge_autosolve");
+   unsolve      = KDiff3::createAction< KAction >(i18n("Set Deltas to Conflicts"),               this, SLOT(slotUnsolve()),      ac, "merge_autounsolve");
+   mergeRegExp  = KDiff3::createAction< KAction >(i18n("Run Regular Expression Auto Merge"),     this, SLOT(slotRegExpAutoMerge()),ac, "merge_regexp_automerge" );
+   mergeHistory = KDiff3::createAction< KAction >(i18n("Automatically Solve History Conflicts"), this, SLOT(slotMergeHistory()), ac, "merge_versioncontrol_history" );
+   splitDiff    = KDiff3::createAction< KAction >(i18n("Split Diff At Selection"),               this, SLOT(slotSplitDiff()),    ac, "merge_splitdiff");
+   joinDiffs    = KDiff3::createAction< KAction >(i18n("Join Selected Diffs"),                   this, SLOT(slotJoinDiffs()),    ac, "merge_joindiffs");
 
-   showWindowA = new KToggleAction(i18n("Show Window A"), 0, this, SLOT(slotShowWindowAToggled()), ac, "win_show_a");
-   showWindowB = new KToggleAction(i18n("Show Window B"), 0, this, SLOT(slotShowWindowBToggled()), ac, "win_show_b");
-   showWindowC = new KToggleAction(i18n("Show Window C"), 0, this, SLOT(slotShowWindowCToggled()), ac, "win_show_c");
-   winFocusNext = new KAction(i18n("Focus Next Window"), Qt::ALT+Qt::Key_Right, this, SLOT(slotWinFocusNext()), ac, "win_focus_next");
+   showWindowA = KDiff3::createAction< KToggleAction >(i18n("Show Window A"), this, SLOT(slotShowWindowAToggled()), ac, "win_show_a");
+   showWindowB = KDiff3::createAction< KToggleAction >(i18n("Show Window B"), this, SLOT(slotShowWindowBToggled()), ac, "win_show_b");
+   showWindowC = KDiff3::createAction< KToggleAction >(i18n("Show Window C"), this, SLOT(slotShowWindowCToggled()), ac, "win_show_c");
+   winFocusNext = KDiff3::createAction< KAction >(i18n("Focus Next Window"), KShortcut( Qt::ALT+Qt::Key_Right ), this, SLOT(slotWinFocusNext()), ac, "win_focus_next");
 
-   overviewModeNormal = new KToggleAction(i18n("Normal Overview"), 0, this, SLOT(slotOverviewNormal()), ac, "diff_overview_normal");
-   overviewModeAB     = new KToggleAction(i18n("A vs. B Overview"), 0, this, SLOT(slotOverviewAB()), ac, "diff_overview_ab");
-   overviewModeAC     = new KToggleAction(i18n("A vs. C Overview"), 0, this, SLOT(slotOverviewAC()), ac, "diff_overview_ac");
-   overviewModeBC     = new KToggleAction(i18n("B vs. C Overview"), 0, this, SLOT(slotOverviewBC()), ac, "diff_overview_bc");
-   wordWrap     = new KToggleAction(i18n("Word Wrap Diff Windows"), 0, this, SLOT(slotWordWrapToggled()), ac, "diff_wordwrap");
-   addManualDiffHelp  = new KAction(i18n("Add Manual Diff Alignment"), Qt::CTRL+Qt::Key_Y, this, SLOT(slotAddManualDiffHelp()), ac, "diff_add_manual_diff_help");
-   clearManualDiffHelpList  = new KAction(i18n("Clear All Manual Diff Alignments"), Qt::CTRL+Qt::SHIFT+Qt::Key_Y, this, SLOT(slotClearManualDiffHelpList()), ac, "diff_clear_manual_diff_help_list");
+   overviewModeNormal = KDiff3::createAction< KToggleAction >(i18n("Normal Overview"), this, SLOT(slotOverviewNormal()), ac, "diff_overview_normal");
+   overviewModeAB     = KDiff3::createAction< KToggleAction >(i18n("A vs. B Overview"), this, SLOT(slotOverviewAB()), ac, "diff_overview_ab");
+   overviewModeAC     = KDiff3::createAction< KToggleAction >(i18n("A vs. C Overview"), this, SLOT(slotOverviewAC()), ac, "diff_overview_ac");
+   overviewModeBC     = KDiff3::createAction< KToggleAction >(i18n("B vs. C Overview"), this, SLOT(slotOverviewBC()), ac, "diff_overview_bc");
+   wordWrap     = KDiff3::createAction< KToggleAction >(i18n("Word Wrap Diff Windows"), this, SLOT(slotWordWrapToggled()), ac, "diff_wordwrap");
+   addManualDiffHelp  = KDiff3::createAction< KAction >(i18n("Add Manual Diff Alignment"), KShortcut( Qt::CTRL+Qt::Key_Y ), this, SLOT(slotAddManualDiffHelp()), ac, "diff_add_manual_diff_help");
+   clearManualDiffHelpList  = KDiff3::createAction< KAction >(i18n("Clear All Manual Diff Alignments"), KShortcut( Qt::CTRL+Qt::SHIFT+Qt::Key_Y ), this, SLOT(slotClearManualDiffHelpList()), ac, "diff_clear_manual_diff_help_list");
 
 #ifdef _WIN32
-   new KAction(i18n("Focus Next Window"), Qt::CTRL+Qt::Key_Tab, this, SLOT(slotWinFocusNext()), ac, "win_focus_next", false, false);
+   KDiff3::createAction< KAction >(i18n("Focus Next Window"), KShortcut(Qt::CTRL+Qt::Key_Tab), this, SLOT(slotWinFocusNext()), ac, "win_focus_next");
 #endif
-   winFocusPrev = new KAction(i18n("Focus Prev Window"), Qt::ALT+Qt::Key_Left, this, SLOT(slotWinFocusPrev()), ac, "win_focus_prev");
-   winToggleSplitOrientation = new KAction(i18n("Toggle Split Orientation"), 0, this, SLOT(slotWinToggleSplitterOrientation()), ac, "win_toggle_split_orientation");
+   winFocusPrev = KDiff3::createAction< KAction >(i18n("Focus Prev Window"), KShortcut( Qt::ALT+Qt::Key_Left ), this, SLOT(slotWinFocusPrev()), ac, "win_focus_prev");
+   winToggleSplitOrientation = KDiff3::createAction< KAction >(i18n("Toggle Split Orientation"), this, SLOT(slotWinToggleSplitterOrientation()), ac, "win_toggle_split_orientation");
 
-   dirShowBoth = new KToggleAction(i18n("Dir && Text Split Screen View"), 0, this, SLOT(slotDirShowBoth()), ac, "win_dir_show_both");
+   dirShowBoth = KDiff3::createAction< KToggleAction >(i18n("Dir && Text Split Screen View"), this, SLOT(slotDirShowBoth()), ac, "win_dir_show_both");
    dirShowBoth->setChecked( true );
-   dirViewToggle = new KAction(i18n("Toggle Between Dir && Text View"), 0, this, SLOT(slotDirViewToggle()), actionCollection(), "win_dir_view_toggle");
+   dirViewToggle = KDiff3::createAction< KAction >(i18n("Toggle Between Dir && Text View"), this, SLOT(slotDirViewToggle()), ac, "win_dir_view_toggle");
 
    m_pMergeEditorPopupMenu = new QMenu( this );
-   chooseA->plug( m_pMergeEditorPopupMenu );
+/*   chooseA->plug( m_pMergeEditorPopupMenu );
    chooseB->plug( m_pMergeEditorPopupMenu );
-   chooseC->plug( m_pMergeEditorPopupMenu );
+   chooseC->plug( m_pMergeEditorPopupMenu );*/
+   m_pMergeEditorPopupMenu->addAction( chooseA );
+   m_pMergeEditorPopupMenu->addAction( chooseB );
+   m_pMergeEditorPopupMenu->addAction( chooseC );
 }
 
 
@@ -576,7 +615,7 @@
      statusBar()->showMessage( i18n("Ready.") );
 }
 
-void KDiff3App::saveOptions( KConfig* config )
+void KDiff3App::saveOptions( KSharedConfigPtr config )
 {
    if ( !m_bAutoMode )
    {
@@ -588,8 +627,9 @@
             m_pOptionDialog->m_geometry = m_pKDiff3Shell->size();
             m_pOptionDialog->m_position = m_pKDiff3Shell->pos();
          }
-         if ( toolBar("mainToolBar")!=0 )
-            m_pOptionDialog->m_toolBarPos = (int) toolBar("mainToolBar")->barPos();
+/*  TODO change this option as now KToolbar uses QToolbar positioning style
+         if ( toolBar(MAIN_TOOLBAR_NAME)!=0 )
+            m_pOptionDialog->m_toolBarPos = (int) toolBar(MAIN_TOOLBAR_NAME)->allowedAreas();*/
       }
 
       m_pOptionDialog->saveOptions( config );
@@ -601,13 +641,15 @@
 
 bool KDiff3App::queryClose()
 {
-   saveOptions( isPart() ? m_pKDiff3Part->instance()->config() : kapp->config() );
+   saveOptions( isPart() ? m_pKDiff3Part->componentData().config() : KGlobal::config() );
 
    if(m_bOutputModified)
    {
       int result = KMessageBox::warningYesNoCancel(this,
          i18n("The merge result hasn't been saved."),
-         i18n("Warning"), i18n("Save && Quit"), i18n("Quit Without Saving") );
+         i18n("Warning"), 
+         KGuiItem( i18n("Save && Quit") ), 
+         KGuiItem( i18n("Quit Without Saving") ) );
       if ( result==KMessageBox::Cancel )
          return false;
       else if ( result==KMessageBox::Yes )
@@ -627,7 +669,9 @@
    {
       int result = KMessageBox::warningYesNo(this,
          i18n("You are currently doing a directory merge. Are you sure, you want to abort?"),
-         i18n("Warning"), i18n("Quit"), i18n("Continue Merging") );
+         i18n("Warning"), 
+         KStandardGuiItem::quit(), 
+         KStandardGuiItem::cont() /* i18n("Continue Merging") */ );
       if ( result!=KMessageBox::Yes )
          return false;
    }
@@ -651,7 +695,7 @@
    {
       slotStatusMsg(i18n("Saving file..."));
 
-      bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding() );
+      bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() );
       if ( bSuccess )
       {
          m_bFileSaved = true;
@@ -668,12 +712,12 @@
 {
   slotStatusMsg(i18n("Saving file with a new filename..."));
 
-  QString s = KFileDialog::getSaveURL( QDir::currentPath(), 0, this, i18n("Save As...") ).url();
+  QString s = KFileDialog::getSaveUrl( QDir::currentPath(), 0, this, i18n("Save As...") ).url();
   if(!s.isEmpty())
   {
      m_outputFilename = s;
      m_pMergeResultWindowTitle->setFileName( m_outputFilename );
-     bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding() );
+     bool bSuccess = m_pMergeResultWindow->saveDocument( m_outputFilename, m_pMergeResultWindowTitle->getEncoding(), m_pMergeResultWindowTitle->getLineEndStyle() );
      if ( bSuccess )
      {
         m_bOutputModified = false;
@@ -729,7 +773,7 @@
    if ( !m_pDiffTextWindow1 )
       return;
 
-   KPrinter printer;
+   QPrinter printer;
    QPrintDialog printDialog(&printer, this);
 
    int firstSelectionD3LIdx = -1;
@@ -741,13 +785,15 @@
    if ( firstSelectionD3LIdx>=0 )
    {
       printDialog.addEnabledOption(QPrintDialog::PrintSelection);
-      //printer.setOptionEnabled(KPrinter::PrintSelection,true);
+      //printer.setOptionEnabled(QPrinter::PrintSelection,true);
+      printDialog.setPrintRange(QAbstractPrintDialog::Selection);
    }
 #endif
 
-   printer.setPageSelection(KPrinter::ApplicationSide);
-   printDialog.setMinMax(1,10000);
-   printer.setCurrentPage(10000);
+   if ( firstSelectionD3LIdx == -1 )
+      printDialog.setPrintRange(QAbstractPrintDialog::AllPages);
+   //printDialog.setMinMax(0,0);
+   printDialog.setFromTo(0,0);
 
    int currentFirstLine = m_pDiffTextWindow1->getFirstLine();
    int currentFirstD3LIdx = m_pDiffTextWindow1->convertLineToDiff3LineIdx( currentFirstLine );
@@ -799,7 +845,7 @@
       if ( m_bTripleDiff && m_pDiffTextWindow3)
          totalNofLines = max2(totalNofLines, m_pDiffTextWindow3->getNofLines());
 
-      QList<int> pageList = printer.pageList();
+      QList<int> pageList;// = printer.pageList();
 
       bool bPrintCurrentPage=false;
       bool bFirstPrintedPage = false;
@@ -810,7 +856,7 @@
       int selectionEndLine = -1;
 
 #ifdef KREPLACEMENTS_H
-      if ( printer.printRange()==KPrinter::AllPages )
+      if ( printer.printRange()==QPrinter::AllPages )
       {
          pageList.clear();
          for(int i=0; i<totalNofPages; ++i)
@@ -818,8 +864,16 @@
             pageList.push_back(i+1);
          }
       }
+      else if ( printer.printRange()==QPrinter::PageRange )
+      {
+         pageList.clear();
+         for(int i=printer.fromPage(); i<=printer.toPage(); ++i)
+         {
+            pageList.push_back(i);
+         }
+      }
 
-      if ( printer.printRange()==KPrinter::Selection )
+      if ( printer.printRange()==QPrinter::Selection )
 #else
       if ( !pageList.empty() && pageList.front()==9999 )
 #endif
@@ -932,26 +986,27 @@
    if( !queryClose() )
        return;      // Don't quit
 
-   KApplication::exit( isFileSaved() ? 0 : 1 );
+   KApplication::exit( isFileSaved() || isDirComparison() ? 0 : 1 );
 }
 
 
 
 void KDiff3App::slotViewToolBar()
 {
+   assert( viewToolBar != 0 );
    slotStatusMsg(i18n("Toggling toolbar..."));
    m_pOptionDialog->m_bShowToolBar = viewToolBar->isChecked();
    ///////////////////////////////////////////////////////////////////
    // turn Toolbar on or off
-   if ( toolBar("mainToolBar") !=0 )
+   if ( toolBar(MAIN_TOOLBAR_NAME) !=0 )
    {
       if(!m_pOptionDialog->m_bShowToolBar)
       {
-         toolBar("mainToolBar")->hide();
+         toolBar(MAIN_TOOLBAR_NAME)->hide();
       }
       else
       {
-         toolBar("mainToolBar")->show();
+         toolBar(MAIN_TOOLBAR_NAME)->show();
       }
    }
 
--- a/kdiff3/src-QT4/kdiff3.desktop	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3.desktop	Tue Jan 06 17:51:29 2009 +0000
@@ -1,90 +1,59 @@
-
 [Desktop Entry]
 Encoding=UTF-8
 Name=KDiff3
 Name[hi]=के-डिफ3
 Name[sv]=Kdiff3
-Name[ta]=கேடிஃப்3
-Name[xx]=xxKDiff3xx
+Name[x-test]=xxKDiff3xx
 GenericName=Diff/Patch Frontend
-GenericName[ar]=واجهة أمامية لبرامج Diff/Patch
 GenericName[bg]=Интерфейс на Diff/Patch
-GenericName[bs]=Interfejs za Diff/Patch
-GenericName[ca]=Interfície per a diff/patch
-GenericName[cs]=Rozhraní pro Diff/Patch
-GenericName[cy]=Blaen Gwahaniaethau/Clytiau
-GenericName[da]=Forende for diff/patch
-GenericName[de]=Graphische Oberfläche zu Diff/Patch
 GenericName[el]=Σύστημα υποστήριξης χρήστη για τα Diff/Patch
-GenericName[es]=Interfaz Diff/Patch
+GenericName[es]=Interfaz para diff/patch
 GenericName[et]=Võrdlemise ja liitmise rakendus
-GenericName[fr]=Interface graphique à diff / patch
+GenericName[fr]=Interface utilisateur pour Diff / Patch
 GenericName[ga]=Comhéadan Diff/Patch
-GenericName[gl]=Interface para Diff/Patch
+GenericName[gl]=Interface para Diff e Patch
 GenericName[hi]=डिफ/पैच फ्रन्टएण्ड
-GenericName[hu]=Grafikus diff/patch
-GenericName[is]=Diff/Patch viðmót
-GenericName[it]=Interfaccia per diff/patch
 GenericName[ja]=Diff/Patch フロントエンド
-GenericName[lt]=Diff/Patch naudotojo sąsaja
-GenericName[ms]=Bahagian Depan Beza/Tampal
-GenericName[nb]=Endrings-/lappeprogram
-GenericName[nl]=Een schil voor Diff/Patch
-GenericName[pa]=Diff/Patch ਮੁੱਖ
-GenericName[pl]=Interfejs do programów Diff/Patch
+GenericName[km]=Diff/Patch ខាង​មុខ
+GenericName[ko]=Diff/Patch 프론트엔드
+GenericName[nds]=Böversiet för "diff" un "patch"
+GenericName[nl]=Diff/Patch-hulpprogramma
+GenericName[nn]=Motor for diff- og patch-filer
 GenericName[pt]=Interface do Diff/Patch
 GenericName[pt_BR]=Interface do Diff/Patch
-GenericName[ru]=Графический интерфейс к Diff и Patch
-GenericName[sk]=Rozhranie pre diff/patch
-GenericName[sr]=Интерфејс за diff и patch
-GenericName[sr@Latn]=Interfejs za diff i patch
+GenericName[ro]=Interfață Diferențiere/Cîrpire
 GenericName[sv]=Jämförelse- och programfixgränssnitt
-GenericName[ta]= Diff/Patch Frontend
-GenericName[tg]=Интерфейси графикӣ ба Diff ва Patch
 GenericName[tr]=Diff/Patch Arayüzü
-GenericName[uk]=Інтерфейс до diff/patch
-GenericName[xx]=xxDiff/Patch Frontendxx
+GenericName[uk]=Графічна оболонка Diff/Patch
+GenericName[x-test]=xxDiff/Patch Frontendxx
 GenericName[zh_CN]=Diff/Patch 前端
-GenericName[zu]=Diff/PatchIsiqalo sokugcina
+GenericName[zh_TW]=比較/修補程式前端介面
 Exec=kdiff3 %i %m -caption "%c"
 Icon=kdiff3
 Type=Application
 DocPath=kdiff3/index.html
 Comment=A File And Directory Comparison And Merge Tool
-Comment[ar]=أداة مقارنة  و دمج ملفات و دلائل (مجلًدات )
 Comment[bg]=Инструмент за сравняване и сливане на файлове и директории
-Comment[bs]=Alat za upoređivanje i spajanje datoteka i direktorija
-Comment[ca]=Una eina per a comparar i fusionar fitxers o directoris
-Comment[cs]=Nástroj pro porovnávání a slučování souborů a adresářů
-Comment[da]=Et indfletningsværktøj for filer og mapper
-Comment[de]=Programm zum Vergleichen und Zusammenführen von Dateien und Ordnern
 Comment[el]=Ένα εργαλείο σύγκρισης και συγχώνευσης αρχείων και καταλόγων
-Comment[es]=Una herramienta para mezclar y comparar archivos y directorios
+Comment[es]=Una herramienta para comparar y mezclar archivos y carpetas
 Comment[et]=Failide ja kataloogide võrdlemise ja liitmise tööriist
-Comment[fr]=Un outil de comparaison et de fusion de fichiers et dossiers
+Comment[fr]=Un outil de comparaison et de fusion de fichiers et de dossiers
 Comment[ga]=Uirlis a chuireann comhaid agus comhadlanna i gcomparáid agus a chumascann iad más gá
-Comment[gl]=Comparazón e Unificazón de Ficheiros e Cartafoles
-Comment[hi]=एक फाइल तथा डिरेक्ट्री तुलना तथा विलीन उपकरण
-Comment[hu]=Segédprogram fájlok, könyvtárak összehasonlításához
-Comment[is]=Skráa og möppu samanburðar og sameiningartól
-Comment[it]=Uno strumento di confronto e unione di file e directory
-Comment[ja]=ファイル/ディレクトリの比較/統合ツール
-Comment[ka]=ფაილთა და საქაღალდეთა შედარების და შერწყმის ხელსაწყო
-Comment[ms]=Perbandingan Fail Dan Direktori Dan Alatan Gabungan
-Comment[nb]=Et verktøy for å sammenlikne og slå sammen filer og mapper
+Comment[gl]=Unha ferramenta de comparación e fusión de ficheiros e cartafoles
+Comment[hi]=फ़ाइल तथा डिरेक्ट्री तुलना करने व मिलाने का औजार
+Comment[ja]=ファイルやディレクトリの比較/マージを行うツール
+Comment[km]=ការ​ប្រៀបធៀប​ថត និង​ឯកសារ និង​ឧបករណ៌​បញ្ចូល​គ្នា
+Comment[ko]=파일과 디렉터리 비교 및 병합 도구
+Comment[nds]=En Warktüüch för't Verglieken un Tosamenföhren vun Dateien un Ornern
 Comment[nl]=Hulpmiddel voor het vergelijken en samenvoegen van bestanden en mappen
-Comment[pa]=ਇੱਕ ਫਾਇਲ ਅਤੇ ਡਾਇਰੈਕਟਰੀ ਤੁਲਨਾ ਅਤੇ ਮਿਲਾਨ ਸੰਦ ਹੈ
-Comment[pl]=Narzędzie do porównywania oraz łączenia plików i katalogów
+Comment[nn]=Eit program for samanlikning og fletting av filer og mapper
 Comment[pt]=Uma Ferramenta de Comparação e Junção de Ficheiros e Pastas
-Comment[pt_BR]=Uma Ferramenta de Comparação e Junção de Arquivos e Diretórios
-Comment[ru]=Утилита сравнения и объединения файлов и каталогов
-Comment[sk]=Nástroj pre porovnanie a spájanie súborov a priečinkov
-Comment[sr]=Алат за поређење и стапање фајлова и директоријума
-Comment[sr@Latn]=Alat za poređenje i stapanje fajlova i direktorijuma
+Comment[pt_BR]=Uma ferramenta de comparação e junção de arquivos e diretórios
+Comment[ro]=Un instrument de comparare și unire a fișierelor și directoarelor
 Comment[sv]=Ett jämförelseverktyg för fil- och katalogjämförelser
-Comment[tg]=Асбоби баробаркунӣ ва пайванди файлҳо ва каталогҳо
 Comment[tr]=Bir Dosya Ve Klasör Karşılaştırma Ve Birleştirme Aracı
-Comment[uk]=Засіб-утиліта для порівняння і поєднання файлів та каталогів
-Comment[xx]=xxA File And Directory Comparison And Merge Toolxx
-Comment[zh_CN]=一个文件和目录的比较及合并工具
+Comment[uk]=Інструмент для порівняння та з’єднання файлів та тек
+Comment[x-test]=xxA File And Directory Comparison And Merge Toolxx
+Comment[zh_CN]=一个文件和目录的比较和合并的工具
+Comment[zh_TW]=一個檔案與目錄比較與合併的工具
 Terminal=false
--- a/kdiff3/src-QT4/kdiff3.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3.h	Tue Jan 06 17:51:29 2009 +0000
@@ -20,9 +20,7 @@
 
 #include "diff.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include <config-kdiff3.h>
 
 // include files for Qt
 #include <QSplitter>
@@ -31,10 +29,10 @@
 // include files for KDE
 #include <kapplication.h>
 #include <kmainwindow.h>
-#include <kaccel.h>
 #include <kaction.h>
 #include <kurl.h>
 #include <kparts/mainwindow.h>
+#include <ktoggleaction.h>
 
 
 // forward declaration of the KDiff3 classes
@@ -48,9 +46,6 @@
 class Overview;
 
 class QScrollBar;
-class QComboBox;
-class QLineEdit;
-class QCheckBox;
 class QSplitter;
 
 
@@ -109,10 +104,10 @@
 
     /** save general Options like all bar positions and status as well as the geometry
         and the recent file list to the configuration file */
-    void saveOptions( KConfig* );
+    void saveOptions( KSharedConfigPtr );
 
     /** read general Options again and initialize all variables like the recent file list */
-    void readOptions( KConfig* );
+    void readOptions( KSharedConfigPtr );
 
     // Finish initialisation (virtual, so that it can be called from the shell too.)
     virtual void completeInit(const QString& fn1="", const QString& fn2="", const QString& fn3="");
@@ -125,6 +120,7 @@
      */
     virtual bool queryClose();
     virtual bool isFileSaved();
+    virtual bool isDirComparison();
 
   signals:
      void createNewInstance( const QString& fn1, const QString& fn2, const QString& fn3 );
@@ -309,6 +305,7 @@
 
    void init( bool bAuto=false, TotalDiffStatus* pTotalDiffStatus=0, bool bLoadFiles=true );
 
+
    virtual bool eventFilter( QObject* o, QEvent* e );
    virtual void resizeEvent(QResizeEvent*);
 
--- a/kdiff3/src-QT4/kdiff3.pro	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3.pro	Tue Jan 06 17:51:29 2009 +0000
@@ -1,6 +1,7 @@
 TEMPLATE = app
 # When unresolved items remain during linking: Try adding "shared" in the CONFIG.
-CONFIG  += qt warn_on thread debug 
+CONFIG  += qt warn_on thread precompile_header
+PRECOMPILED_HEADER = stable.h
 HEADERS  = version.h                     \
            diff.h                        \
            difftextwindow.h              \
@@ -31,6 +32,7 @@
            gnudiff_io.cpp                \
            gnudiff_xmalloc.cpp           \
            common.cpp                    \
+           stable.cpp                    \
            kreplacements/kreplacements.cpp \
            kreplacements/ShellContextMenu.cpp
 TARGET   = kdiff3
@@ -44,9 +46,15 @@
 
    QMAKE_CXXFLAGS_DEBUG  += -DQT_NO_ASCII_CAST
    QMAKE_CXXFLAGS_RELEASE  += -DNDEBUG -DQT_NO_ASCII_CAST
-   QMAKE_LFLAGS += user32.lib shell32.lib
    RC_FILE = kdiff3win.rc
+   win32-g++ {
+           QMAKE_LFLAGS += -luser32 -lshell32
+   } else {
+           QMAKE_LFLAGS += user32.lib shell32.lib
+   }
 }
+
+
 unix {
   documentation.path = /usr/local/share/doc/kdiff3
   documentation.files = ../doc/*
--- a/kdiff3/src-QT4/kdiff3_part.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3_part.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -19,9 +19,9 @@
 
 #include "kdiff3_part.h"
 
-#include <kinstance.h>
+#include <kcomponentdata.h>
 #include <kaction.h>
-#include <kstdaction.h>
+#include <kstandardaction.h>
 #include <kfiledialog.h>
 
 #include <qfile.h>
@@ -38,11 +38,11 @@
 #include "version.h"
 
 KDiff3Part::KDiff3Part( QWidget *parentWidget, const char *widgetName,
-                                  QObject *parent, const char *name )
-    : KParts::ReadOnlyPart(parent, name)
+                                  QObject *parent )
+    : KParts::ReadWritePart(parent)
 {
     // we need an instance
-    setInstance( KDiff3PartFactory::instance() );
+    setComponentData( *KDiff3PartFactory::instance() );
 
     // this should be your custom internal widget
     m_widget = new KDiff3App( parentWidget, widgetName, this );
@@ -54,9 +54,9 @@
     setWidget(m_widget);
 
     // create our actions
-    //KStdAction::open(this, SLOT(fileOpen()), actionCollection());
-    //KStdAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
-    //KStdAction::save(this, SLOT(save()), actionCollection());
+    //KStandardAction::open(this, SLOT(fileOpen()), actionCollection());
+    //KStandardAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
+    //KStandardAction::save(this, SLOT(save()), actionCollection());
 
     setXMLFile("kdiff3_part.rc");
 
@@ -71,7 +71,7 @@
 {
    if ( m_widget!=0  && ! m_bIsShell )
    {
-      m_widget->saveOptions( m_widget->isPart() ? instance()->config() : kapp->config() );
+      m_widget->saveOptions( m_widget->isPart() ? componentData().config() : KGlobal::config() );
    }
 }
 
@@ -84,7 +84,7 @@
 {
 /*
     // get a handle on our Save action and make sure it is valid
-    KAction *save = actionCollection()->action(KStdAction::stdName(KStdAction::Save));
+    KAction *save = actionCollection()->action(KStandardAction::stdName(KStandardAction::Save));
     if (!save)
         return;
 
@@ -130,8 +130,8 @@
 bool KDiff3Part::openFile()
 {
    // m_file is always local so we can use QFile on it
-   std::cerr << "KDiff3: " << m_file.toLatin1().constData() << std::endl;
-   QFile file(m_file);
+   std::cerr << "KDiff3: " << localFilePath().toLatin1().constData() << std::endl;
+   QFile file(localFilePath());
    if (file.open(QIODevice::ReadOnly) == false)
       return false;
 
@@ -171,7 +171,7 @@
       // Normal patch
       // patch -f -u --ignore-whitespace -i [inputfile] -o [outfile] [patchfile]
       QString tempFileName = FileAccess::tempFileName();
-      QString cmd = "patch -f -u --ignore-whitespace -i \"" + m_file +
+      QString cmd = "patch -f -u --ignore-whitespace -i \"" + localFilePath() +
                   "\" -o \""+tempFileName + "\" \"" + fileName1+ "\"";
 
       QProcess process;
@@ -180,7 +180,7 @@
 
       m_widget->slotFileOpen2( fileName1, tempFileName, "", "",
                                "", version2.isEmpty() ? fileName2 : "REV:"+version2+":"+fileName2, "", 0 ); // alias names
-//    std::cerr << "KDiff3: f1:" << fileName1.latin1() <<"<->"<<tempFileName.latin1()<< std::endl;
+//    std::cerr << "KDiff3: f1:" << fileName1.toLatin1() <<"<->"<<tempFileName.toLatin1()<< std::endl;
       FileAccess::removeTempFile( tempFileName );
    }
    else if ( version2.isEmpty() && f2.exists() )
@@ -188,7 +188,7 @@
       // Reverse patch
       // patch -f -u -R --ignore-whitespace -i [inputfile] -o [outfile] [patchfile]
       QString tempFileName = FileAccess::tempFileName();
-      QString cmd = "patch -f -u -R --ignore-whitespace -i \"" + m_file +
+      QString cmd = "patch -f -u -R --ignore-whitespace -i \"" + localFilePath() +
                   "\" -o \""+tempFileName + "\" \"" + fileName2+"\"";
 
       QProcess process;
@@ -197,7 +197,7 @@
 
       m_widget->slotFileOpen2( tempFileName, fileName2, "", "",
                                version1.isEmpty() ? fileName1 : "REV:"+version1+":"+fileName1, "", "", 0 ); // alias name
-//    std::cerr << "KDiff3: f2:" << fileName2.latin1() <<"<->"<<tempFileName.latin1()<< std::endl;
+//    std::cerr << "KDiff3: f2:" << fileName2.toLatin1() <<"<->"<<tempFileName.toLatin1()<< std::endl;
       FileAccess::removeTempFile( tempFileName );
    }
    else if ( !version1.isEmpty() && !version2.isEmpty() )
@@ -224,7 +224,7 @@
          "", 0
       );
 
-//    std::cerr << "KDiff3: f1/2:" << tempFileName1.latin1() <<"<->"<<tempFileName2.latin1()<< std::endl;
+//    std::cerr << "KDiff3: f1/2:" << tempFileName1.toLatin1() <<"<->"<<tempFileName2.toLatin1()<< std::endl;
       FileAccess::removeTempFile( tempFileName1 );
       FileAccess::removeTempFile( tempFileName2 );
       return true;
@@ -243,8 +243,8 @@
     if (isReadWrite() == false)
         return false;
 
-    // m_file is always local, so we use QFile
-    QFile file(m_file);
+    // localFilePath() is always local, so we use QFile
+    QFile file(localFilePath());
     if (file.open(IO_WriteOnly) == false)
         return false;
 
@@ -263,8 +263,9 @@
 // notable exception of the KAboutData data
 #include <kaboutdata.h>
 #include <klocale.h>
+#include <kglobal.h>
 
-KInstance*  KDiff3PartFactory::s_instance = 0L;
+KComponentData*  KDiff3PartFactory::s_instance = 0L;
 KAboutData* KDiff3PartFactory::s_about = 0L;
 
 KDiff3PartFactory::KDiff3PartFactory()
@@ -280,12 +281,12 @@
     s_instance = 0L;
 }
 
-KParts::Part* KDiff3PartFactory::createPartObject( QWidget *parentWidget, const char *widgetName,
-                                                        QObject *parent, const char *name,
+KParts::Part* KDiff3PartFactory::createPartObject( QWidget *parentWidget,
+                                                        QObject *parent,
                                                         const char *classname, const QStringList&/*args*/ )
 {
     // Create an instance of our Part
-    KDiff3Part* obj = new KDiff3Part( parentWidget, widgetName, parent, name );
+    KDiff3Part* obj = new KDiff3Part( parentWidget, 0, parent );
 
     // See if we are to be read-write or not
     if (QString(classname) == "KParts::ReadOnlyPart")
@@ -294,13 +295,13 @@
     return obj;
 }
 
-KInstance* KDiff3PartFactory::instance()
+KComponentData* KDiff3PartFactory::instance()
 {
     if( !s_instance )
     {
-        s_about = new KAboutData("kdiff3part", I18N_NOOP("KDiff3Part"), VERSION);
-        s_about->addAuthor("Joachim Eibl", 0, "joachim.eibl at gmx.de");
-        s_instance = new KInstance(s_about);
+        s_about = new KAboutData(QByteArray("kdiff3part"), QByteArray("kdiff3part"), ki18n("KDiff3Part"), QByteArray(VERSION));
+        s_about->addAuthor(ki18n("Joachim Eibl"), KLocalizedString(), QByteArray("joachim.eibl at gmx.de"));
+        s_instance = new KComponentData(s_about);
     }
     return s_instance;
 }
--- a/kdiff3/src-QT4/kdiff3_part.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3_part.h	Tue Jan 06 17:51:29 2009 +0000
@@ -24,8 +24,6 @@
 #include <kparts/factory.h>
 
 class QWidget;
-class QPainter;
-class KURL;
 class KDiff3App;
 
 /**
@@ -35,7 +33,7 @@
  * @short Main Part
  * @author Joachim Eibl <joachim.eibl at gmx.de>
  */
-class KDiff3Part : public KParts::ReadOnlyPart
+class KDiff3Part : public KParts::ReadWritePart
 {
     Q_OBJECT
 public:
@@ -43,7 +41,7 @@
      * Default constructor
      */
     KDiff3Part(QWidget *parentWidget, const char *widgetName,
-                    QObject *parent, const char *name);
+                    QObject *parent );
 
     /**
      * Destructor
@@ -78,7 +76,7 @@
     bool m_bIsShell;
 };
 
-class KInstance;
+class KComponentData;
 class KAboutData;
 
 class KDiff3PartFactory : public KParts::Factory
@@ -87,13 +85,14 @@
 public:
     KDiff3PartFactory();
     virtual ~KDiff3PartFactory();
-    virtual KParts::Part* createPartObject( QWidget *parentWidget, const char *widgetName,
-                                            QObject *parent, const char *name,
-                                            const char *classname, const QStringList &args );
-    static KInstance* instance();
+    virtual KParts::Part* createPartObject( QWidget *parentWidget,
+                                            QObject *parent,
+                                            const char *classname, 
+                                            const QStringList &args );
+    static KComponentData* instance();
 
 private:
-    static KInstance* s_instance;
+    static KComponentData* s_instance;
     static KAboutData* s_about;
 };
 
--- a/kdiff3/src-QT4/kdiff3_shell.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3_shell.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -19,8 +19,9 @@
 
 #include "kdiff3_shell.h"
 #include "kdiff3.h"
+#include "kdiff3_part.h"
 
-#include <kkeydialog.h>
+#include <kshortcutsdialog.h>
 #include <kfiledialog.h>
 #include <kconfig.h>
 #include <kurl.h>
@@ -28,7 +29,7 @@
 #include <kedittoolbar.h>
 
 #include <kaction.h>
-#include <kstdaction.h>
+#include <kstandardaction.h>
 
 #include <klibloader.h>
 #include <kmessagebox.h>
@@ -39,10 +40,11 @@
 
 #include <QStatusBar>
 #include <QCloseEvent>
+#include <ktoolbar.h>
 
 
-KDiff3Shell::KDiff3Shell(bool bCompleteInit)
-    : KParts::MainWindow( 0L, "kdiff3" )
+KDiff3Shell::KDiff3Shell( bool bCompleteInit )
+    : KParts::MainWindow( )
 {
     m_bUnderConstruction = true;
     // set the shell's ui resource file
@@ -51,45 +53,37 @@
     // and a status bar
     statusBar()->show();
 
-    // this routine will find and load our Part.  it finds the Part by
-    // name which is a bad idea usually.. but it's alright in this
-    // case since our Part is made for this Shell
-    KLibFactory *factory = KLibLoader::self()->factory("libkdiff3part");
-    if (factory)
-    {
-        // now that the Part is loaded, we cast it to a Part to get
-        // our hands on it
-        m_part = static_cast<KParts::ReadWritePart *>(factory->create(this,
-                                "kdiff3_part", "KParts::ReadWritePart" ));
+//       m_part = static_cast<KParts::ReadWritePart*>(factory->create(this, "KDiff3Part", QStringList("KParts::ReadWritePart")));
+   m_part = new KDiff3Part( this, "KDiff3Part", this );
 
-        if (m_part)
-        {
-            // and integrate the part's GUI with the shell's
-            createGUI(m_part);
+   if (m_part)
+   {
+      // and integrate the part's GUI with the shell's
+      createGUI(m_part);
+      //toolBar()->setToolButtonStyle( Qt::ToolButtonIconOnly );
 
-            // tell the KParts::MainWindow that this is indeed the main widget
-            setCentralWidget(m_part->widget());
+      // tell the KParts::MainWindow that this is indeed the main widget
+      setCentralWidget(m_part->widget());
 
-            if (bCompleteInit)
-               ((KDiff3App*)m_part->widget())->completeInit();
-            connect(((KDiff3App*)m_part->widget()), SIGNAL(createNewInstance(const QString&, const QString&, const QString&)), this, SLOT(slotNewInstance(const QString&, const QString&, const QString&)));
-        }
-    }
+      if (bCompleteInit)
+	 ((KDiff3App*)m_part->widget())->completeInit();
+      connect(((KDiff3App*)m_part->widget()), SIGNAL(createNewInstance(const QString&, const QString&, const QString&)), this, SLOT(slotNewInstance(const QString&, const QString&, const QString&)));
+   }
     else
     {
         // if we couldn't find our Part, we exit since the Shell by
         // itself can't do anything useful
-        KMessageBox::error(this, i18n("Could not find our part!\n"
+        KMessageBox::error(this, i18n("Could not initialize our part!\n"
            "This usually happens due to an installation problem. "
            "Please read the README-file in the source package for details.")
            );
         //kapp->quit();
-        
+
         ::exit(-1); //kapp->quit() doesn't work here yet.
 
         // we return here, cause kapp->quit() only means "exit the
         // next time we enter the event loop...
-        
+
         return;
     }
 
@@ -123,7 +117,8 @@
    {
       e->accept();
       bool bFileSaved = ((KDiff3App*)m_part->widget())->isFileSaved();
-      KApplication::exit( bFileSaved ? 0 : 1 );
+      bool bDirCompare = ((KDiff3App*)m_part->widget())->isDirComparison();
+      KApplication::exit( bFileSaved || bDirCompare ? 0 : 1 );
    }
    else
       e->ignore();
@@ -151,23 +146,16 @@
 
 void KDiff3Shell::optionsConfigureKeys()
 {
-    KKeyDialog::configure(actionCollection(), "kdiff3_shell.rc");
+    KShortcutsDialog::configure(actionCollection() /*, "kdiff3_shell.rc" */ );
 }
 
 void KDiff3Shell::optionsConfigureToolbars()
 {
-#if defined(KDE_MAKE_VERSION)
-# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
-    saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
-# else
-    saveMainWindowSettings(KGlobal::config() );
-# endif
-#else
-    saveMainWindowSettings(KGlobal::config() );
-#endif
+   KConfigGroup mainWindowGroup(  KGlobal::config(), "MainWindow" );
+   saveMainWindowSettings( mainWindowGroup );
 
     // use the standard toolbar editor
-    KEditToolbar dlg(factory());
+    KEditToolBar dlg(factory());
     connect(&dlg, SIGNAL(newToolbarConfig()),
             this, SLOT(applyNewToolbarConfig()));
     dlg.exec();
@@ -175,15 +163,8 @@
 
 void KDiff3Shell::applyNewToolbarConfig()
 {
-#if defined(KDE_MAKE_VERSION)
-# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
-    applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
-# else
-    applyMainWindowSettings(KGlobal::config());
-# endif
-#else
-    applyMainWindowSettings(KGlobal::config());
-#endif
+   KConfigGroup mainWindowGroup(  KGlobal::config(), "MainWindow" );
+   applyMainWindowSettings( mainWindowGroup );
 }
 
 void KDiff3Shell::slotNewInstance( const QString& fn1, const QString& fn2, const QString& fn3 )
--- a/kdiff3/src-QT4/kdiff3_shell.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3_shell.h	Tue Jan 06 17:51:29 2009 +0000
@@ -20,9 +20,7 @@
 #ifndef _KDIFF3SHELL_H_
 #define _KDIFF3SHELL_H_
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include <config-kdiff3.h>
 
 #include <kapplication.h>
 #include <kparts/mainwindow.h>
--- a/kdiff3/src-QT4/kdiff3_shell.rc	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3_shell.rc	Tue Jan 06 17:51:29 2009 +0000
@@ -103,7 +103,7 @@
     <Action name="win_toggle_split_orientation"/>
   </Menu>
 </MenuBar>
-<ToolBar name="mainToolBar"><text>Main Toolbar</text>
+<ToolBar name="mainToolBar" iconText="icononly" fullWidth="true"><text>Main Toolbar</text>
   <Action name="merge_current"/>
   <Action name="go_current"/>
   <Action name="go_top"/>
--- a/kdiff3/src-QT4/kdiff3part.desktop	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kdiff3part.desktop	Tue Jan 06 17:51:29 2009 +0000
@@ -1,18 +1,11 @@
-[Desktop Entry]
+[Desktop Entry]
 Encoding=UTF-8
 Name=KDiff3Part
-Name[cs]=Komponenta KDiff3
-Name[fr]=Composant KDiff3
+Name[et]=KDiff3 komponent
 Name[hi]=के-डिफ3पार्ट
-Name[nb]=KDiff3-del
-Name[pt_BR]=Componente KDiff3
 Name[sv]=Kdiff3-del
-Name[ta]=கேடிஃப்3 பகுதி
-Name[tg]=ҚисмиKDiff3
-Name[uk]=Комопнент KDiff3
-Name[xx]=xxKDiff3Partxx
-Name[zh_CN]=KDiff3 组件
-MimeType=text/x-diff
+Name[x-test]=xxKDiff3Partxx
+MimeType=text/x-diff;
 ServiceTypes=KParts/ReadOnlyPart,KParts/ReadWritePart
 X-KDE-Library=libkdiff3part
 Type=Service
--- a/kdiff3/src-QT4/kreplacements/kreplacements.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kreplacements/kreplacements.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -98,8 +98,7 @@
       else
       {
          QFileInfo prog( buf );
-         //_spawnlp( _P_NOWAIT , prog.filePath().toAscii(), prog.fileName().toAscii(), (""+.absFilePath()).toAscii(), NULL );
-         QProcess::startDetached ( prog.filePath() + " \"file:///" + helpFile.absolutePath() + "\"" );
+         QProcess::startDetached ( prog.filePath(), QStringList( "file:///"+helpFile.absoluteFilePath() ) );
       }
 
    #else
@@ -117,11 +116,12 @@
 QString getTranslationDir()
 {
    #ifdef _WIN32
-      char buf[200];
-      int r= SearchPathA( 0, ".",  0, sizeof(buf), buf, 0 );
+      wchar_t buf[200];
+      int r= SearchPathW( 0, L".",  0, sizeof(buf)/sizeof(wchar_t), buf, 0 );
 
+      buf[ sizeof(buf)/sizeof(wchar_t) -1 ] = 0;
       QString exePath;
-      if (r!=0)  {  exePath = buf; }
+      if (r!=0)  {  exePath = QString::fromUtf16( (ushort*)&buf[0] ); }
       else       {  exePath = "."; }
       return exePath+"/translations";
    #else
@@ -168,11 +168,9 @@
 }
 
 
-KDialogBase::KDialogBase( int, const QString& caption, int, int, QWidget* parent, const char* name,
-  bool /*modal*/, bool )
+KPageDialog::KPageDialog(  QWidget* parent )
 : QDialog( parent )
 {
-   setObjectName(name);
    setModal(true);
    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
    m_pTabWidget = new QTabWidget();
@@ -183,44 +181,46 @@
 
    pButtonLayout->addStretch(1);
    QPushButton* pOk = new QPushButton( i18n("Ok") );
-   connect( pOk, SIGNAL( clicked() ), this, SLOT(accept()) );
+   connect( pOk, SIGNAL( clicked() ), this, SIGNAL(okClicked()) );
    pButtonLayout->addWidget( pOk );
 
    QPushButton* pHelp = new QPushButton( i18n("Help") );
-   connect( pHelp, SIGNAL( clicked() ), this, SLOT(slotHelp()));
+   connect( pHelp, SIGNAL( clicked() ), this, SLOT(slotHelpClicked()));
    pButtonLayout->addWidget( pHelp );
 
    QPushButton* pDefaults = new QPushButton( i18n("Defaults") );
-   connect( pDefaults, SIGNAL( clicked() ), this, SLOT(slotDefault()) );
+   connect( pDefaults, SIGNAL( clicked() ), this, SIGNAL(defaultClicked()) );
    pButtonLayout->addWidget( pDefaults );
 
    QPushButton* pCancel = new QPushButton( i18n("Cancel") );
    connect( pCancel, SIGNAL( clicked() ), this, SLOT(reject()));
    pButtonLayout->addWidget( pCancel );
-
-   setWindowTitle( caption );
 }
 
-KDialogBase::~KDialogBase()
+KPageDialog::~KPageDialog()
 {
 }
 
-void KDialogBase::incInitialSize ( const QSize& )
+void KPageDialog::incrementInitialSize ( const QSize& )
 {
 }
 
-void KDialogBase::setHelp(const QString&, const QString& )
+void KPageDialog::setHelp(const QString&, const QString& )
 {
 }
 
+void KPageDialog::slotHelpClicked()
+{
+   showHelp();
+}
 
-int KDialogBase::BarIcon(const QString& /*iconName*/, int )
+int KPageDialog::BarIcon(const QString& /*iconName*/, int )
 {
    return 0; // Not used for replacement.
 }
 
 
-QFrame* KDialogBase::addPage(  const QString& name, const QString& /*info*/, int )
+QFrame* KPageDialog::addPage(  const QString& name, const QString& /*info*/, int )
 {
    QFrame* p = new QFrame();
    p->setObjectName( name );
@@ -228,71 +228,39 @@
    return p;
 }
 
-int KDialogBase::spacingHint()
+void KPageDialog::addPage( KPageWidgetItem * p )
+{
+   m_pTabWidget->addTab( p->m_pWidget, p->m_title );
+}
+
+int KPageDialog::spacingHint()
 {
    return 3;
 }
 
-static bool s_inAccept = false;
-static bool s_bAccepted = false;
-void KDialogBase::accept()
-{
-   if( ! s_inAccept )
-   {
-      s_bAccepted = false;
-      s_inAccept = true;
-      slotOk();
-      s_inAccept = false;
-      if ( s_bAccepted )
-         QDialog::accept();
-   }
-   else
-   {
-      s_bAccepted = true;   
-   }   
-}
-
-void KDialogBase::slotDefault( )
-{
-}
-void KDialogBase::slotOk()
-{
-}
-void KDialogBase::slotCancel( )
-{
-}
-void KDialogBase::slotApply( )
-{
-   emit applyClicked();
-}
-void KDialogBase::slotHelp( )
-{
-   showHelp();
-}
-
-KURL KFileDialog::getSaveURL( const QString &startDir,
+KUrl KFileDialog::getSaveUrl( const QString &startDir,
                               const QString &filter,
                               QWidget *parent, const QString &caption)
 {
    QString s = QFileDialog::getSaveFileName(parent, caption, startDir, filter, 0/*, QFileDialog::DontUseNativeDialog*/);
-   return KURL(s);
+   return KUrl(s);
 }
 
-KURL KFileDialog::getOpenURL( const QString &  startDir,
+KUrl KFileDialog::getOpenUrl( const QString &  startDir,
                            const QString &  filter,
                            QWidget *  parent,
                            const QString &  caption )
 {
    QString s = QFileDialog::getOpenFileName(parent, caption, startDir, filter );
-   return KURL(s);
+   return KUrl(s);
 }
 
-KURL KFileDialog::getExistingURL( const QString &  startDir,
+KUrl KFileDialog::getExistingDirectoryUrl( const QString &  startDir,
                                QWidget *  parent,
                                const QString &  caption)
 {
    QString s = QFileDialog::getExistingDirectory(parent, caption, startDir);
-   return KURL(s);
+   return KUrl(s);
 }
 
 QString KFileDialog::getSaveFileName (const QString &startDir, 
@@ -328,10 +296,9 @@
 }
 
 
-KMainWindow::KMainWindow( QWidget* parent, const char* name )
+KMainWindow::KMainWindow( QWidget* parent )
 : QMainWindow( parent ), m_actionCollection(this)
 {
-   setObjectName(name);
    fileMenu =      menuBar()->addMenu( i18n("&File") );
    editMenu =      menuBar()->addMenu(i18n("&Edit") );
    directoryMenu = menuBar()->addMenu(i18n("&Directory") );
@@ -345,6 +312,7 @@
    helpMenu =     menuBar()->addMenu(i18n("&Help") );
 
    m_pToolBar = new KToolBar(this);
+   addToolBar( m_pToolBar );
       
    memberList = new QList<KMainWindow*>;
    memberList->append(this);
@@ -362,9 +330,9 @@
 
 void KMainWindow::createGUI()
 {
-   KStdAction::help(this, SLOT(slotHelp()), actionCollection());
-   KStdAction::about(this, SLOT(slotAbout()), actionCollection());
-   KStdAction::aboutQt(actionCollection());
+   KStandardAction::help(this, SLOT(appHelpActivated()), actionCollection());
+   KStandardAction::about(this, SLOT(slotAbout()), actionCollection());
+   KStandardAction::aboutQt(actionCollection());
 }
 
 void KMainWindow::slotAbout()
@@ -435,7 +403,7 @@
 */
 }
 
-void KMainWindow::slotHelp()
+void KMainWindow::appHelpActivated()
 {
    showHelp();
 }
@@ -451,63 +419,74 @@
    return QString();
 }
 
-KConfig::KConfig()
+KConfigGroupData::~KConfigGroupData()
 {
-}
-
-void KConfig::readConfigFile( const QString& configFileName )
-{
-   if ( !configFileName.isEmpty() )
-   {
-      m_fileName = configFileName;
-   }
-   else
-   {
-      m_fileName = KStandardDirs().findResource("config","kdiff3rc");
-   }
-
-   QFile f( m_fileName );
-   if ( f.open(QIODevice::ReadOnly) )
+   QFile f(m_fileName);
+   if ( f.open( QIODevice::WriteOnly | QIODevice::Text ) )
    {                               // file opened successfully
-      QTextStream t( &f );         // use a text stream
-      load(t);
+      QTextStream t( &f );        // use a text stream
+      save(t);
       f.close();
    }
 }
 
-KConfig::~KConfig()
+KConfigGroup::KConfigGroup()
 {
-   QFile f(m_fileName);
-   if ( f.open( QIODevice::WriteOnly | QIODevice::Text ) )
+   d = new KConfigGroupData;
+}
+
+void KConfigGroup::readConfigFile( const QString& configFileName )
+{
+   if ( !configFileName.isEmpty() )
+   {
+      d->m_fileName = configFileName;
+   }
+   else
+   {
+      d->m_fileName = KStandardDirs().findResource("config","kdiff3rc");
+   }
+
+   QFile f( d->m_fileName );
+   if ( f.open(QIODevice::ReadOnly) )
    {                               // file opened successfully
-       QTextStream t( &f );        // use a text stream
-       save(t);
-       f.close();
+      QTextStream t( &f );         // use a text stream
+      d->load(t);
+      f.close();
    }
 }
 
-void KConfig::setGroup(const QString&)
+KConfigGroup::~KConfigGroup()
 {
 }
 
-void KAction::init(QObject* receiver, const char* slot, KActionCollection* actionCollection, 
-                   const char* name, bool bToggle, bool bMenu)
+void KConfigGroup::setGroup(const QString&)
+{
+}
+
+KConfigGroup& KConfigGroup::group( const QString& )
+{
+   KApplication* pKApp = static_cast<KApplication*>(QApplication::instance());
+   return *pKApp->config();
+}
+
+static void initAction( QAction* pAction, QObject* receiver, const char* slot, KActionCollection* actionCollection, 
+                   const QString& name, bool bToggle, bool bMenu)
 {
    QString n(name);
    KMainWindow* p = actionCollection->m_pMainWindow;
    if( slot!=0 )
    {
       if (!bToggle)
-         connect(this, SIGNAL(triggered()), receiver, slot);
+         QObject::connect(pAction, SIGNAL(triggered()), receiver, slot);
       else
       {
-         connect(this, SIGNAL(toggled(bool)), receiver, slot);
+         QObject::connect(pAction, SIGNAL(toggled(bool)), receiver, slot);
       }
    }
 
    if (bMenu)
    {
-      if( n[0]=='g')       p->movementMenu->addAction( this );
+      if( n[0]=='g')       p->movementMenu->addAction( pAction );
       else if( n.left(16)=="dir_current_sync")
       {
          if ( p->dirCurrentItemMenu==0 )
@@ -515,7 +494,7 @@
             p->dirCurrentItemMenu = p->directoryMenu->addMenu( i18n("Current Item Merge Operation") );
             p->dirCurrentSyncItemMenu = p->directoryMenu->addMenu( i18n("Current Item Sync Operation") );
          }
-         p->dirCurrentItemMenu->addAction( this );
+         p->dirCurrentItemMenu->addAction( pAction );
       }
       else if( n.left(11)=="dir_current")
       {
@@ -524,16 +503,26 @@
             p->dirCurrentItemMenu = p->directoryMenu->addMenu( i18n("Current Item Merge Operation") );
             p->dirCurrentSyncItemMenu = p->directoryMenu->addMenu( i18n("Current Item Sync Operation") );
          }
-         p->dirCurrentSyncItemMenu->addAction( this );
+         p->dirCurrentSyncItemMenu->addAction( pAction );
       }
-      else if( n.left(4)=="diff")  p->diffMenu->addAction( this );
-      else if( name[0]=='d')  p->directoryMenu->addAction( this );
-      else if( name[0]=='f')  p->fileMenu->addAction( this );
-      else if( name[0]=='w')  p->windowsMenu->addAction( this );
-      else                    p->mergeMenu->addAction( this );
+      else if( n.left(4)=="diff")  p->diffMenu->addAction( pAction );
+      else if( name[0]=='d')  p->directoryMenu->addAction( pAction );
+      else if( name[0]=='f')  p->fileMenu->addAction( pAction );
+      else if( name[0]=='w')  p->windowsMenu->addAction( pAction );
+      else                    p->mergeMenu->addAction( pAction );
    }
 }
 
+KAction::KAction(const QString& name, KActionCollection* actionCollection )
+: QAction ( actionCollection->m_pMainWindow )
+{
+   initAction( this, 0,0, actionCollection, name, false, true );
+}
+
+KAction::KAction(  KActionCollection* actionCollection )
+: QAction ( actionCollection->m_pMainWindow )
+{
+}
 
 KAction::KAction(const QString& text, const QIcon& icon, int accel,
  QObject* receiver, const char* slot, KActionCollection* actionCollection,
@@ -547,7 +536,7 @@
    KMainWindow* p = actionCollection->m_pMainWindow;
    if ( !icon.isNull() && p ) p->m_pToolBar->addAction( this );
 
-   init(receiver,slot,actionCollection,name,bToggle,bMenu);
+   initAction(this, receiver,slot,actionCollection,name,bToggle,bMenu);
 }
 
 KAction::KAction(const QString& text, int accel,
@@ -559,7 +548,7 @@
    setObjectName(name);
    setShortcut( accel );
    setCheckable( bToggle );
-   init(receiver,slot,actionCollection,name,bToggle,bMenu);
+   initAction(this,receiver,slot,actionCollection,name,bToggle,bMenu);
 }
 
 void KAction::setStatusText(const QString&)
@@ -571,10 +560,21 @@
    menu->addAction( this );
 }
 
+void KAction::setIcon( const QIcon& icon )
+{
+   QAction::setIcon(icon);
+   if ( !icon.isNull() )
+   {
+      KMainWindow* pMW = static_cast<KMainWindow*>( parent() );
+      pMW->toolBar()->addAction(this);
+   }
+}
 
-KToggleAction::KToggleAction(const QString& text, const QIcon& icon, int accel, QObject* receiver, const char* slot, KActionCollection* actionCollection, const char* name, bool bMenu)
-: KAction( text, icon, accel, receiver, slot, actionCollection, name, true, bMenu)
+
+KToggleAction::KToggleAction( KActionCollection* actionCollection )
+: KAction( actionCollection )
 {
+   setCheckable(true);
 }
 
 KToggleAction::KToggleAction(const QString& text, int accel, QObject* receiver, const char* slot, KActionCollection* actionCollection, const char* name, bool bMenu)
@@ -596,7 +596,7 @@
 
 
 //static
-KAction* KStdAction::open( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::open( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    #include "../xpm/fileopen.xpm"
    KMainWindow* p = actionCollection->m_pMainWindow;
@@ -605,7 +605,7 @@
    return a;
 }
 
-KAction* KStdAction::save( QWidget* parent, const char* slot, KActionCollection* actionCollection )
+KAction* KStandardAction::save( QWidget* parent, const char* slot, KActionCollection* actionCollection )
 {
    #include "../xpm/filesave.xpm"
    KMainWindow* p = actionCollection->m_pMainWindow;
@@ -614,7 +614,7 @@
    return a;
 }
 
-KAction* KStdAction::saveAs( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::saveAs( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Save As..."), 0, parent, slot, actionCollection, "saveas", false, false);
@@ -622,7 +622,7 @@
    return a;
 }
 
-KAction* KStdAction::print( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::print( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    #include "../xpm/fileprint.xpm"
    KMainWindow* p = actionCollection->m_pMainWindow;
@@ -631,7 +631,7 @@
    return a;
 }
 
-KAction* KStdAction::quit( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::quit( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Quit"), Qt::CTRL+Qt::Key_Q, parent, slot, actionCollection, "quit", false, false);
@@ -639,7 +639,7 @@
    return a;
 }
 
-KAction* KStdAction::cut( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::cut( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Cut"), Qt::CTRL+Qt::Key_X, parent, slot, actionCollection, "cut", false, false );
@@ -647,7 +647,7 @@
    return a;
 }
 
-KAction* KStdAction::copy( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::copy( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Copy"), Qt::CTRL+Qt::Key_C, parent, slot, actionCollection, "copy", false, false );
@@ -655,7 +655,7 @@
    return a;
 }
 
-KAction* KStdAction::paste( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::paste( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Paste"), Qt::CTRL+Qt::Key_V, parent, slot, actionCollection, "paste", false, false );
@@ -663,7 +663,7 @@
    return a;
 }
 
-KAction* KStdAction::selectAll( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::selectAll( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Select All"), Qt::CTRL+Qt::Key_A, parent, slot, actionCollection, "selectall", false, false );
@@ -671,7 +671,7 @@
    return a;
 }
 
-KToggleAction* KStdAction::showToolbar( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KToggleAction* KStandardAction::showToolbar( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KToggleAction* a = new KToggleAction( i18n("Show Toolbar"), 0, parent, slot, actionCollection, "showtoolbar", false );
@@ -679,7 +679,7 @@
    return a;
 }
 
-KToggleAction* KStdAction::showStatusbar( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KToggleAction* KStandardAction::showStatusbar( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KToggleAction* a = new KToggleAction( i18n("Show &Statusbar"), 0, parent, slot, actionCollection, "showstatusbar", false );
@@ -687,19 +687,19 @@
    return a;
 }
 
-KAction* KStdAction::preferences( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::preferences( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
-   KAction* a = new KAction( i18n("&Configure %1...").arg("KDiff3"), 0, parent, slot, actionCollection, "settings", false, false );
+   KAction* a = new KAction( i18n("&Configure %1...",QString("KDiff3")), 0, parent, slot, actionCollection, "settings", false, false );
    if(p) p->settingsMenu->addAction( a );
    return a;
 }
-KAction* KStdAction::keyBindings( QWidget*, const char*, KActionCollection*)
+KAction* KStandardAction::keyBindings( QWidget*, const char*, KActionCollection*)
 {
    return 0;
 }
 
-KAction* KStdAction::about( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::about( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("About")+" KDiff3", 0, parent, slot, actionCollection, "about_kdiff3", false, false );
@@ -707,7 +707,7 @@
    return a;
 }
 
-KAction* KStdAction::aboutQt( KActionCollection* actionCollection )
+KAction* KStandardAction::aboutQt( KActionCollection* actionCollection )
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("About")+" Qt", 0, qApp, SLOT(aboutQt()), actionCollection, "about_qt", false, false );
@@ -715,22 +715,22 @@
    return a;
 }
 
-KAction* KStdAction::help( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::help( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
-   KAction* a = new KAction( i18n("Help"), Qt::Key_F1, parent, slot, actionCollection, "help", false, false );
+   KAction* a = new KAction( i18n("Help"), Qt::Key_F1, parent, slot, actionCollection, "help-contents", false, false );
    if(p) p->helpMenu->addAction( a );
    return a;
 }
-KAction* KStdAction::find( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::find( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
-   KAction* a = new KAction( i18n("Find"), Qt::CTRL+Qt::Key_F, parent, slot, actionCollection, "find", false, false );
+   KAction* a = new KAction( i18n("Find"), Qt::CTRL+Qt::Key_F, parent, slot, actionCollection, "edit-find", false, false );
    if(p) p->editMenu->addAction( a );
    return a;
 }
 
-KAction* KStdAction::findNext( QWidget* parent, const char* slot, KActionCollection* actionCollection)
+KAction* KStandardAction::findNext( QWidget* parent, const char* slot, KActionCollection* actionCollection)
 {
    KMainWindow* p = actionCollection->m_pMainWindow;
    KAction* a = new KAction( i18n("Find Next"), Qt::Key_F3, parent, slot, actionCollection, "findNext", false, false );
@@ -738,10 +738,17 @@
    return a;
 }
 
+KAction* KActionCollection::addAction(const QString& name )
+{
+   return new KAction( name, this );
+}
 
+void KActionCollection::addAction( const QString& name, QAction* pAction )
+{
+   initAction( pAction, 0,0,this,name,false,true);
+}
 
-
-KFontChooser::KFontChooser( QWidget* pParent, const QString& /*name*/, bool, const QStringList&, bool, int )
+KFontChooser::KFontChooser( QWidget* pParent )
 : QWidget(pParent)
 {
    m_pParent = pParent;
@@ -856,33 +863,34 @@
 }
 
 
-QPixmap KIconLoader::loadIcon( const QString&, int )
+QPixmap KIconLoader::loadIcon( const QString&, int, int )
 {
    return QPixmap();
 }
 
-KAboutData::KAboutData( const QString& /*name*/, const QString& appName, const QString& version,
-      const QString& description, int,
-      const QString& copyright, int, const QString& homepage, const QString& email)
+KAboutData::KAboutData(const QByteArray &appName, const QByteArray & /*catalogName*/, const KLocalizedString & /*programName*/, 
+      const QByteArray &version, const KLocalizedString &shortDescription, LicenseKey /*licenseType*/, 
+      const KLocalizedString &copyrightStatement, const KLocalizedString & /*text*/, 
+      const QByteArray &homePageAddress, const QByteArray &bugsEmailAddress)
 {
-   s_copyright = copyright;
-   s_email = email;
+   s_copyright = copyrightStatement;
+   s_email = bugsEmailAddress;
    s_appName = appName;
-   s_description = description;
+   s_description = shortDescription;
    s_version = version;
-   s_homepage = homepage;
+   s_homepage = homePageAddress;
 }
 
-KAboutData::KAboutData( const QString& /*name*/, const QString& /*appName*/, const QString& /*version*/ )
+KAboutData::KAboutData( const QString& /*name*/, const QString& /*appName*/, const QString& /*appName2*/, const QString& /*version*/ )
 {
 }
 
-void KAboutData::addAuthor(const char* name, const char* task, const char* email, const char* weblink)
+void KAboutData::addAuthor(const QString&  name, const QString& task, const QString& email, const QString& weblink)
 {
    m_authorList.push_back( AboutDataEntry( name, task, email, weblink) );
 }
 
-void KAboutData::addCredit(const char* name, const char* task, const char* email, const char* weblink)
+void KAboutData::addCredit(const QString& name, const QString& task, const QString& email, const QString& weblink)
 {
    m_creditList.push_back( AboutDataEntry( name, task, email, weblink) );
 }
@@ -900,10 +908,27 @@
 static KCmdLineArgs s_cmdLineArgs;
 static int s_argc;
 static char** s_argv;
-static KCmdLineOptions* s_pOptions;
+
+struct KCmdLineOptionsItem
+{
+   QString name;
+   QString description;
+   int def;
+};
+static QList<KCmdLineOptionsItem> s_options;
 
 static std::vector<QCStringList> s_vOption;
-static std::vector<const char*> s_vArg;
+static std::vector<QString> s_vArg;
+
+KCmdLineOptions& KCmdLineOptions::add( const QString& name, const QString& description )
+{
+   KCmdLineOptionsItem i;
+   i.name = name;
+   i.description = description;
+   i.def = 0;
+   s_options.push_back(i);
+   return *this;
+}
 
 KCmdLineArgs* KCmdLineArgs::parsedArgs()  // static
 {
@@ -917,9 +942,9 @@
    s_pAboutData = pAboutData;
 }
 
-void KCmdLineArgs::addCmdLineOptions( KCmdLineOptions* options ) // static
+void KCmdLineArgs::addCmdLineOptions( const KCmdLineOptions& /*options*/ ) // static
 {
-   s_pOptions = options;
+   //s_pOptions = &options;
 }
 
 int KCmdLineArgs::count()
@@ -929,7 +954,7 @@
 
 QString KCmdLineArgs::arg(int idx)
 {
-   return QString::fromLocal8Bit( s_vArg[idx] );
+   return s_vArg[idx];
 }
 
 void KCmdLineArgs::clear()
@@ -942,11 +967,11 @@
    int j=0;
    for( j=0; j<(int)s_vOption.size(); ++j )
    {
-      const char* optName = s_pOptions[j].name;
-      const char* pos = strchr( optName,' ' );
-      int len = pos==0 ? strlen( optName ) : pos - optName;
+      QString optName = s_options[j].name;
+      int pos = optName.indexOf( ' ' );
+      int len = pos==-1 ? optName.length() : pos;
 
-      if( s == QString::fromLatin1( optName, len ) )
+      if( s == optName.left( len ) )
       {
          return s_vOption[j].isEmpty() ? QString() : s_vOption[j].last();
       }
@@ -955,24 +980,24 @@
    return QString();
 }
 
-QCStringList KCmdLineArgs::getOptionList( const QString& s )
+QStringList KCmdLineArgs::getOptionList( const QString& s )
 {   
    // Find the option
    int j=0;
    for( j=0; j<(int)s_vOption.size(); ++j )
    {
-      const char* optName = s_pOptions[j].name;
-      const char* pos = strchr( optName,' ' );
-      int len = pos==0 ? strlen( optName ) : pos - optName;
+      QString optName = s_options[j].name;
+      int pos = optName.indexOf( ' ' );
+      int len = pos==-1 ? optName.length() : pos;
 
-      if( s == QString::fromLatin1( optName, len) )
+      if( s == optName.left( len ) )
       {
          return s_vOption[j];
       }
    }
 
    assert(false);
-   return QCStringList();
+   return QStringList();
 }
 
 bool KCmdLineArgs::isSet(const QString& s)
@@ -981,8 +1006,8 @@
    int j=0;
    for( j=0; j<(int)s_vOption.size(); ++j )
    {
-      const char* optName = s_pOptions[j].name;
-      if( s == QString( optName ) )
+      QString optName = s_options[j].name;
+      if( s == optName )
       {
          return ! s_vOption[j].isEmpty();
       }
@@ -991,6 +1016,7 @@
    return false;
 }
 
+
 ///////////////////
 KApplication* kapp;
 
@@ -999,12 +1025,14 @@
 {
    kapp = this;
 
+   //setStyle( new QWindowsStyle ); // doesn't show checkmarks on checkable icons in menu
+
    int nofOptions=0;
    int nofArgs=0;
    int i=0;
-   while( s_pOptions[i].name != 0 )
+   while( i < s_options.size() )
    {
-      if ( s_pOptions[i].name[0]=='[' )
+      if ( s_options[i].name[0]=='[' )
          nofArgs++;
       else
          nofOptions++;
@@ -1024,7 +1052,7 @@
    }
    m_config.readConfigFile(configFileName);
 
-   QStringList ignorableCmdLineOptionsList = m_config.readListEntry("IgnorableCmdLineOptions", QStringList("-u;-query;-html;-abort"), '|');
+   QStringList ignorableCmdLineOptionsList = m_config.readEntry("IgnorableCmdLineOptions", QStringList("-u;-query;-html;-abort"), '|');
    QString ignorableCmdLineOptions;
    if ( !ignorableCmdLineOptionsList.isEmpty() ) 
       ignorableCmdLineOptions = ignorableCmdLineOptionsList.front() + ";";
@@ -1033,37 +1061,38 @@
 
    for( i=1; i<s_argc; ++i )
    {
-      if ( s_argv[i][0]=='-' )  // An option
+      QString arg = s_argv[i];
+      if ( arg[0]=='-' )  // An option
       {
-         if ( ignorableCmdLineOptions.contains(QString(s_argv[i])+";") )
+         if ( ignorableCmdLineOptions.contains( arg +";") )
             continue;
          // Find the option
          int j=0;
          for( j=0; j<nofOptions; ++j )
          {
-            const char* optName = s_pOptions[j].name;
-            const char* pos = strchr( optName,' ' );
-            int len = pos==0 ? strlen( optName ) : pos - optName;
-            int len2 = strlen(s_argv[i]);
+            QString optName = s_options[j].name;
+            int pos = optName.indexOf( ' ' );
+            int len = pos==-1 ? optName.length() : pos;
+            int len2 = arg.length();
 
-            if( len>0 && ( s_argv[i][1]=='-' && len2-2==len && memcmp( &s_argv[i][2], optName, len )==0  ||
-                                                len2-1==len && memcmp( &s_argv[i][1], optName, len )==0  ))
+            if( len>0 && ( arg[1]=='-' && len2-2==len && optName.left(len) ==  arg.mid(2,len) ||
+                                          len2-1==len && optName.left(len) ==  arg.mid(1,len) ))
             {
-               if (s_pOptions[j].description == 0)  // alias, because without description.
+               if (s_options[j].description == 0)  // alias, because without description.
                {
                   ++j;
-                  optName = s_pOptions[j].name;
-                  pos = strchr( optName,' ' );
+                  optName = s_options[j].name;
+                  pos = optName.indexOf( ' ' );
                }
-               if (pos!=0){ ++i; s_vOption[j].append(s_argv[i]); } //use param
-               else       { s_vOption[j].append("1"); }           //set state
+               if (pos!=-1){ ++i; s_vOption[j].append( s_argv[i] ); } //use param
+               else        { s_vOption[j].append("1"); }           //set state
                break;
             }
          }
          if (j==nofOptions)
          {
             QString s;
-            s = QString("Unknown option: ") +  QString(s_argv[i]) + "\n";
+            s = QString("Unknown option: ") + arg + "\n";
             s += "If KDiff3 should ignore this option, run KDiff3 normally and edit\n"
                  "the \"Command line options to ignore\" in the \"Integration Settings\".\n\n";
 
@@ -1084,24 +1113,24 @@
             int pos=s.length();
             for( j=0; j<nofOptions; ++j )
             {
-               if ( s_pOptions[j].description!=0 )
+               if ( s_options[j].description!=0 )
                {
-                  if (s_pOptions[j].name[0]!='+')
+                  if (s_options[j].name[0]!='+')
                   {
                      s += "-";
-                     if ( strlen(s_pOptions[j].name)>1 ) s += "-";
+                     if ( s_options[j].name.length()>1 ) s += "-";
                   }
-                  s += s_pOptions[j].name;
+                  s += s_options[j].name;
                   s += QString().fill(' ', minMaxLimiter( 20 - ((int)s.length()-pos), 3, 20 ) );
-                  s += s_pOptions[j].description;
+                  s += s_options[j].description;
                   s +="\n";
                   pos=s.length();
                }
                else
                {
                   s += "-";
-                  if ( strlen(s_pOptions[j].name)>1 ) s += "-";
-                  s += s_pOptions[j].name;
+                  if ( s_options[j].name.length()>1 ) s += "-";
+                  s += s_options[j].name;
                   s += ", ";
                }
             }
@@ -1119,11 +1148,11 @@
          }
       }
       else
-         s_vArg.push_back( s_argv[i] );
+         s_vArg.push_back( arg );
    }
 }
 
-KConfig* KApplication::config()
+KConfigGroup* KApplication::config()
 {
    return &m_config;
 }
@@ -1146,17 +1175,17 @@
 
 namespace KIO
 {
-   SimpleJob* mkdir( KURL ){return 0;}
-   SimpleJob* rmdir( KURL ){return 0;}
-   SimpleJob* file_delete( KURL, bool ){return 0;}
-   FileCopyJob* file_move(  KURL, KURL, int, bool, bool, bool ) {return 0;}
-   FileCopyJob* file_copy(  KURL, KURL, int, bool, bool, bool ) {return 0;}
-   CopyJob* link(  KURL, KURL, bool ) {return 0;}
-   ListJob* listRecursive( KURL, bool, bool ){return 0;}
-   ListJob* listDir( KURL, bool, bool ){return 0;}
-   StatJob* stat( KURL, bool, int, bool ){return 0;}
-   TransferJob* get( KURL, bool, bool ){return (TransferJob*)0;}
-   TransferJob* put( KURL, int, bool, bool, bool ){return (TransferJob*)0;}
+   SimpleJob* mkdir( KUrl ){return 0;}
+   SimpleJob* rmdir( KUrl ){return 0;}
+   SimpleJob* file_delete( KUrl, int ){return 0;}
+   FileCopyJob* file_move(  KUrl, KUrl, int, int ) {return 0;}
+   FileCopyJob* file_copy(  KUrl, KUrl, int, int ) {return 0;}
+   CopyJob* link(  KUrl, KUrl, bool ) {return 0;}
+   ListJob* listRecursive( KUrl, bool, bool ){return 0;}
+   ListJob* listDir( KUrl, bool, bool ){return 0;}
+   StatJob* stat( KUrl, bool, int, int ){return 0;}
+   TransferJob* get( KUrl, int ){return (TransferJob*)0;}
+   TransferJob* put( KUrl, int, int ){return (TransferJob*)0;}
 };
 
 KActionCollection* KParts::Part::actionCollection()
@@ -1196,4 +1225,4 @@
 
 
 
-#include "kreplacements.moc"
+//#include "kreplacements.moc"
--- a/kdiff3/src-QT4/kreplacements/kreplacements.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/kreplacements/kreplacements.h	Tue Jan 06 17:51:29 2009 +0000
@@ -17,6 +17,7 @@
 
 #ifndef KREPLACEMENTS_H
 #define KREPLACEMENTS_H
+#pragma once
 
 #include "common.h"
 
@@ -28,8 +29,12 @@
 #include <QToolBar>
 #include <QProgressBar>
 #include <QPrinter>
+//Added by qt3to4:
+#include <QLabel>
+#include <QPixmap>
+#include <QFrame>
+#include <QPaintEvent>
 
-class Q3CString;
 class QTabWidget;
 class QLabel;
 
@@ -39,17 +44,47 @@
 QString getTranslationDir();
 
 class KMainWindow;
+class KAction;
+class KIcon;
 
-class KURL
+typedef QString KGuiItem;
+
+inline QString i18n( const char* x ){ return QObject::tr(x); }
+
+template <typename A1>
+inline QString i18n (const char *text, const A1 &a1)
+{ return QObject::tr(text).arg(a1); }
+
+template <typename A1, typename A2>
+inline QString i18n (const char *text, const A1 &a1, const A2 &a2)
+{ return QObject::tr(text).arg(a1).arg(a2); }
+
+template <typename A1, typename A2, typename A3>
+inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
+{ return QObject::tr(text).arg(a1).arg(a2).arg(a3); }
+
+template <typename A1, typename A2, typename A3, typename A4>
+inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
+{ return QObject::tr(text).arg(a1).arg(a2).arg(a3).arg(a4); }
+
+
+typedef QString KLocalizedString;
+#define ki18n(x) QObject::tr(x)
+#define I18N_NOOP(x) x
+#define RESTORE(x)
+#define _UNLOAD(x)
+
+class KUrl
 {
 public:
-   KURL(){}
-   KURL(const QString& s){ m_s = s; }
-   static KURL fromPathOrURL( const QString& s ){ return KURL(s); }
+   KUrl(){}
+   KUrl(const QString& s){ m_s = s; }
+   static KUrl fromPathOrUrl( const QString& s ){ return KUrl(s); }
    QString url() const { return m_s; }
    bool isEmpty() const { return m_s.isEmpty(); }
-   QString prettyURL() const { return m_s; }
+   QString prettyUrl() const { return m_s; }
    bool isLocalFile() const { return true; }
+   bool isRelative() const { return true; }
    bool isValid() const { return true; }
    QString path() const { return m_s; }
    void setPath( const QString& s ){ m_s=s; }
@@ -59,6 +94,16 @@
    QString m_s;
 };
 
+typedef QString KGuiItem;
+
+class KStandardGuiItem
+{
+public:
+   static QString cont() { return i18n("Continue"); }
+   static QString cancel() { return i18n("Cancel"); }
+   static QString quit() { return i18n("Quit"); }
+};
+
 class KMessageBox
 {
 public:
@@ -76,54 +121,69 @@
    enum {Cancel=-1, No=0, Yes=1, Continue=1};
 };
 
-#define i18n(x) QObject::tr(x)
-#define I18N_NOOP(x) x
-#define RESTORE(x)
-#define _UNLOAD(x)
 
-typedef QMenu KPopupMenu;
 
-class KDialogBase : public QDialog
+typedef QMenu KMenu;
+
+class KPageWidgetItem : public QObject
+{
+public:
+   QWidget* m_pWidget;
+   QString m_title;
+
+   KPageWidgetItem( QWidget* pPage, const QString& title )
+   {
+      m_pWidget = pPage;
+      m_title = title;
+   }
+   void setHeader( const QString& ) {}
+   void setIcon( const KIcon& ) {}
+};
+
+
+class KPageDialog : public QDialog
 {
    Q_OBJECT
    QTabWidget* m_pTabWidget;
 public:
-   KDialogBase( int, const QString& caption, int, int, QWidget* parent, const char* name,
-     bool /*modal*/, bool );
-   ~KDialogBase();
+   KPageDialog( QWidget* parent );
+   ~KPageDialog();
 
-   void incInitialSize ( const QSize& );
+   void incrementInitialSize ( const QSize& );
    void setHelp(const QString& helpfilename, const QString& );
    enum {IconList, Help, Default, Apply, Ok, Cancel };
 
    int BarIcon(const QString& iconName, int );
 
+   void addPage( KPageWidgetItem* );
    QFrame* addPage(  const QString& name, const QString& info, int );
    int spacingHint();
 
-   virtual void accept();
+   enum FaceType { List };
+   void setFaceType(FaceType){}
+   void setButtons(int){}
+   void setDefaultButton(int){}
+   void showButtonSeparator(bool){}
+private slots:
+   void slotHelpClicked();
 signals:
    void applyClicked();
-
-protected slots:
-    virtual void slotOk( void );
-    virtual void slotApply( void );
-    virtual void slotHelp( void );
-    virtual void slotCancel( void );
-    virtual void slotDefault( void );
+   void okClicked();
+   void helpClicked();
+   void defaultClicked();
 };
 
 class KFileDialog //: public QFileDialog
 {
 public:
-   static KURL getSaveURL( const QString &startDir=QString::null,
+   static KUrl getSaveUrl( const QString &startDir=QString::null,
                            const QString &filter=QString::null,
                            QWidget *parent=0, const QString &caption=QString::null);
-   static KURL getOpenURL( const QString &  startDir = QString::null,
+   static KUrl getOpenUrl( const QString &  startDir = QString::null,
                            const QString &  filter = QString::null,
                            QWidget *  parent = 0,
                            const QString &  caption = QString::null );
-   static KURL getExistingURL( const QString &  startDir = QString::null,
+   static KUrl getExistingDirectoryUrl( const QString &  startDir = QString::null,
                                QWidget *  parent = 0,
                                const QString &  caption = QString::null );
    static QString getSaveFileName (const QString &startDir=QString::null, 
@@ -151,14 +211,24 @@
 public:
    KMainWindow* m_pMainWindow;
    KActionCollection( KMainWindow* p){ m_pMainWindow=p; }
+   void addAction(const QString& name, QAction* );
+   KAction* addAction(const QString& name );
 };
 
-class KKeyDialog
+typedef QKeySequence KShortcut;
+
+class KShortcutsEditor
 {
 public:
-   static void configure(void*, QWidget*){}
+   enum { LetterShortcutsAllowed };
+};
+
+class KShortcutsDialog
+{
+public:
+   static void configure(KActionCollection*){}
    static void configureKeys(KActionCollection*, const QString&){}
-   static void configure(KActionCollection*, const QString&){}
+   static void configure(KActionCollection*, int, QWidget*){}
 };
 
 namespace KParts
@@ -189,7 +259,7 @@
 
    KToolBar*  m_pToolBar;
 
-   KMainWindow( QWidget* parent, const char* name );
+   KMainWindow( QWidget* parent );
    KToolBar* toolBar(const QString& s = QString::null);
    KActionCollection* actionCollection();
    void createGUI();
@@ -197,36 +267,58 @@
 
    QList<KMainWindow*>* memberList;
 public slots:
-   void slotHelp();
+   void appHelpActivated();
    void slotAbout();
 };
 
-class KConfig : public ValueMap
+class KConfigGroupData : public ValueMap, public QSharedData
 {
+public:
    QString m_fileName;
+   ~KConfigGroupData();
+};
+
+class KConfigGroup
+{
+private:
+   QExplicitlySharedDataPointer<KConfigGroupData> d;
 public:
-   KConfig();
-   ~KConfig();
+   KConfigGroup(const KConfigGroup*, const QString& ){}
+   KConfigGroup();
+   ~KConfigGroup();
    void readConfigFile(const QString& configFileName);
 
    void setGroup(const QString&);
+   KConfigGroup& group( const QString& groupName );
+
+   template <class T>  void writeEntry(const QString& s, const T& v){ d->writeEntry(s,v); }
+   void writeEntry(const QString& s, const QStringList& v, char separator ){ d->writeEntry(s,v,separator); }
+   void writeEntry(const QString& s, const char* v){ d->writeEntry(s,v); }
+
+   template <class T>  T readEntry (const QString& s, const T& defaultVal ){ return d->readEntry(s,defaultVal); }
+   QString     readEntry (const QString& s, const char* defaultVal ){ return d->readEntry(s,defaultVal); }
+   QStringList readEntry (const QString& s, const QStringList& defaultVal, char separator='|' ){ return d->readEntry(s,defaultVal,separator); }
 };
 
+typedef KConfigGroup* KSharedConfigPtr;
+
 class KAction : public QAction
 {
    Q_OBJECT
 public:
+   KAction( KActionCollection* actionCollection );
+   KAction(const QString& text, KActionCollection* actionCollection );
    KAction(const QString& text, const QIcon& icon, int accel, QObject* receiver, const char* slot, KActionCollection* actionCollection, const char* name, bool bToggle=false, bool bMenu=true);
    KAction(const QString& text, int accel, QObject* receiver, const char* slot, KActionCollection* actionCollection, const char* name, bool bToggle=false, bool bMenu=true);
-   void init(QObject* receiver, const char* slot, KActionCollection* actionCollection, 
-        const char* name, bool bToggle, bool bMenu);
    void setStatusText(const QString&);
    void plug(QMenu*);
+   void setIcon( const QIcon& icon );
 };
 
 class KToggleAction : public KAction
 {
 public:
+   KToggleAction(KActionCollection* actionCollection);
    KToggleAction(const QString& text, const QIcon& icon, int accel, QObject* receiver, const char* slot, KActionCollection* actionCollection, const char* name, bool bMenu=true);
    KToggleAction(const QString& text, int accel, QObject* receiver, const char* slot, KActionCollection* actionCollection, const char* name, bool bMenu=true);
    KToggleAction(const QString& text, const QIcon& icon, int accel, KActionCollection* actionCollection, const char* name, bool bMenu=true);
@@ -234,7 +326,7 @@
 };
 
 
-class KStdAction
+class KStandardAction
 {
 public:
    static KAction* open( QWidget* parent, const char* slot, KActionCollection* );
@@ -261,6 +353,7 @@
 {
 public:
    enum {SizeMedium,Small};
+   KIcon( const QString& ) {}
 };
 
 class KFontChooser : public QWidget
@@ -271,7 +364,7 @@
    QLabel* m_pLabel;
    QWidget* m_pParent;
 public:
-   KFontChooser( QWidget* pParent, const QString& name, bool, const QStringList&, bool, int );
+   KFontChooser( QWidget* pParent );
    QFont font();
    void setFont( const QFont&, bool );
 private slots:
@@ -307,11 +400,10 @@
    QString findResource(const QString& resource, const QString& appName);
 };   
 
-struct KCmdLineOptions
+class KCmdLineOptions
 {
-   const char* name;
-   const char* description;
-   int def;
+public:
+   KCmdLineOptions& add( const QString& name, const QString& description = 0 );
 };
 
 #define KCmdLineLastOption {0,0,0}
@@ -319,13 +411,19 @@
 class KAboutData
 {
 public:
-   KAboutData( const QString& name, const QString& appName, const QString& version,
-      const QString& description, int licence,
-      const QString& copyright, int w, const QString& homepage, const QString& email);
-   KAboutData( const QString& name, const QString& appName, const QString& version );
-   void addAuthor(const char* name=0, const char* task=0, const char* email=0, const char* weblink=0);
-   void addCredit(const char* name=0, const char* task=0, const char* email=0, const char* weblink=0);
-   enum { License_GPL };
+   enum LicenseKey { License_GPL, License_GPL_V2, License_Unknown };
+
+   //KAboutData( const QString& name, const QString& appName, const QString& version,
+   //   const QString& description, int licence,
+   //   const QString& copyright, int w, const QString& homepage, const QString& email);
+
+   KAboutData (const QByteArray &appName, const QByteArray &catalogName, const KLocalizedString &programName, 
+      const QByteArray &version, const KLocalizedString &shortDescription, LicenseKey licenseType, 
+      const KLocalizedString &copyrightStatement, const KLocalizedString &text, 
+      const QByteArray &homePageAddress, const QByteArray &bugsEmailAddress);
+   KAboutData( const QString& name, const QString& appName, const QString& appName2, const QString& version );
+   void addAuthor(const QString& name, const QString& task=0, const QString& email=0, const QString& weblink=0);
+   void addCredit(const QString& name, const QString& task=0, const QString& email=0, const QString& weblink=0);
    
    struct AboutDataEntry
    {
@@ -349,32 +447,34 @@
 public:
    static KCmdLineArgs* parsedArgs();
    static void init( int argc, char**argv, KAboutData* );
-   static void addCmdLineOptions( KCmdLineOptions* options ); // Add our own options.
+   static void addCmdLineOptions( const KCmdLineOptions& options ); // Add our own options.
 
    int count();
    QString arg(int);
-   KURL url(int i){ return KURL(arg(i)); }
+   KUrl url(int i){ return KUrl(arg(i)); }
    void clear();
    QString getOption(const QString&);
-   QCStringList getOptionList( const QString& );
+   QStringList getOptionList( const QString& );
    bool isSet(const QString&);
 };
 
 class KIconLoader
 {
 public:
-   QPixmap loadIcon(const QString& name, int);
+   enum { Small, NoGroup };
+   QPixmap loadIcon(const QString& name, int, int =0);
+   static KIconLoader* global() { return 0; }
 };
 
 class KApplication : public QApplication
 {
-   KConfig m_config;
+   KConfigGroup m_config;
    KIconLoader m_iconLoader;
 public:
    KApplication();
    static KApplication* kApplication();
    KIconLoader* iconLoader();
-   KConfig* config();
+   KConfigGroup* config();
    bool isRestored();
 };
 
@@ -394,48 +494,62 @@
    KLibFactory* factory(const QString&);
 };
 
-class KEditToolbar : public QDialog
+class KEditToolBar : public QDialog
 {
 public:
-   KEditToolbar( int ){}
+   KEditToolBar( int ){}
 };
 
 class KGlobal
 {
 public:
-   static KConfig* config() { return 0; }
+   static KConfigGroup* config() { return 0; }
+};
+
+class KJobUiDelegate
+{
+public:
+   void showErrorMessage() {}
+};
+
+class KJob : public QObject
+{
+public:
+   bool error() {return false;}
+   enum KillVerbosity { Quietly };
+   bool kill( KillVerbosity ){return false;}
+   KJobUiDelegate* uiDelegate() {return 0;}
 };
 
 namespace KIO
 {
+   enum { Overwrite, DefaultFlags, Resume, HideProgressInfo, NoReload };
    enum UDSEntry {};
    typedef QList<UDSEntry> UDSEntryList;
-   class Job : public QObject
-   {
-   public:
-      void kill(bool){}
-      bool error() {return false;}
-      void showErrorDialog( QWidget* ) {}
+   class Job : public KJob
+   {   
    };
-   class SimpleJob : public Job {};
-   SimpleJob* mkdir( KURL );
-   SimpleJob* rmdir( KURL );
-   SimpleJob* file_delete( KURL, bool );
-   class FileCopyJob : public Job {};
-   FileCopyJob* file_move(  KURL, KURL, int, bool, bool, bool );
-   FileCopyJob* file_copy(  KURL, KURL, int, bool, bool, bool );
-   class CopyJob : public Job {};
-   CopyJob* link( KURL, KURL, bool );
-   class ListJob : public Job {};
-   ListJob* listRecursive( KURL, bool, bool );
-   ListJob* listDir( KURL, bool, bool );
-   class StatJob : public Job {
-      public: UDSEntry statResult(){ return (UDSEntry)0; }
+   class SimpleJob : public KJob {};
+   SimpleJob* mkdir( KUrl );
+   SimpleJob* rmdir( KUrl );
+   SimpleJob* file_delete( KUrl, int );
+   class FileCopyJob : public KJob {};
+   FileCopyJob* file_move(  KUrl, KUrl, int, int );
+   FileCopyJob* file_copy(  KUrl, KUrl, int, int );
+   class CopyJob : public KJob {};
+   CopyJob* link( KUrl, KUrl, bool );
+   class ListJob : public KJob {};
+   ListJob* listRecursive( KUrl, bool, bool );
+   ListJob* listDir( KUrl, bool, bool );
+   class StatJob : public KJob {
+      public: 
+         enum {SourceSide,DestinationSide};
+         UDSEntry statResult(){ return (UDSEntry)0; }
    };
-   StatJob* stat( KURL, bool, int, bool );
-   class TransferJob : public Job {};
-   TransferJob* get( KURL, bool, bool );
-   TransferJob* put( KURL, int, bool, bool, bool );
+   StatJob* stat( KUrl, bool, int, int );
+   class TransferJob : public KJob {};
+   TransferJob* get( KUrl, int );
+   TransferJob* put( KUrl, int, int );
 };
 
 typedef QProgressBar KProgress;
@@ -446,16 +560,23 @@
    KInstance(KAboutData*){}
 };
 
+class KComponentData : public QObject
+{
+public:
+   KComponentData(KAboutData*){}
+   KConfigGroup* config() {return 0;}
+};
+
 namespace KParts
 {
    class MainWindow : public KMainWindow
    {
    public:
-      MainWindow( QWidget* parent, const char* name ) : KMainWindow(parent,name) {}
+      MainWindow( QWidget* parent=0 ) : KMainWindow(parent) {}
       void setXMLFile(const QString&){}
       void setAutoSaveSettings(){}
-      void saveMainWindowSettings(KConfig*){}
-      void applyMainWindowSettings(KConfig*){}
+      void saveMainWindowSettings(KConfigGroup&){}
+      void applyMainWindowSettings(KConfigGroup&){}
       int factory(){return 0;}
    };
 
@@ -476,14 +597,16 @@
    public:
    ReadOnlyPart(){}
    ReadOnlyPart(QObject*,const QString&){}
-   void setInstance( KInstance* ){}
+   QString localFilePath() {return QString(); }
+   void setComponentData(const KComponentData&){} // actually member of PartBase
+   KComponentData& componentData() { return *(KComponentData*)0;}
    QString m_file;
    };
 
    class ReadWritePart : public ReadOnlyPart
    {
    public:
-   ReadWritePart(QObject*,const Q3CString&){}
+   ReadWritePart(QObject*){}
    void setReadWrite(bool){}
    };
 
@@ -491,9 +614,9 @@
    {
       Q_OBJECT
    public:
-   virtual KParts::Part* createPartObject( QWidget *parentWidget, const char *widgetName,
-                                            QObject *parent, const char *name,
-                                            const char *classname, const QStringList &args )=0;
+   virtual KParts::Part* createPartObject( QWidget* /*parentWidget*/, const char * /*widgetName*/,
+                                            QObject* /*parent*/, const char * /*name*/,
+                                            const char* /*classname*/, const QStringList& /*args*/ ){return 0;}
    };
 };
 #endif
Binary file kdiff3/src-QT4/lo16-app-kdiff3.png has changed
Binary file kdiff3/src-QT4/lo32-app-kdiff3.png has changed
--- a/kdiff3/src-QT4/main.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/main.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -26,6 +26,7 @@
 #include <qtextstream.h>
 #include <QTranslator>
 #include <QLocale>
+#include <QFont>
 #include <vector>
 
 #ifdef KREPLACEMENTS_H
@@ -33,83 +34,80 @@
 #endif
 #include "common.h"
 
-static const char *description =
-   I18N_NOOP("Tool for Comparison and Merge of Files and Directories");
 
-static KCmdLineOptions options[] =
-{
-  { "m", 0, 0 },
-  { "merge", I18N_NOOP("Merge the input."), 0 },
-  { "b", 0, 0 },
-  { "base file", I18N_NOOP("Explicit base file. For compatibility with certain tools."), 0 },
-  { "o", 0, 0 },
-  { "output file", I18N_NOOP("Output file. Implies -m. E.g.: -o newfile.txt"), 0 },
-  { "out file",    I18N_NOOP("Output file, again. (For compatibility with certain tools.)"), 0 },
-  { "auto",        I18N_NOOP("No GUI if all conflicts are auto-solvable. (Needs -o file)"), 0 },
-  { "qall",        I18N_NOOP("Don't solve conflicts automatically. (For compatibility...)"), 0 },
-  { "L1 alias1",   I18N_NOOP("Visible name replacement for input file 1 (base)."), 0 },
-  { "L2 alias2",   I18N_NOOP("Visible name replacement for input file 2."), 0 },
-  { "L3 alias3",   I18N_NOOP("Visible name replacement for input file 3."), 0 },
-  { "L", 0, 0 },
-  { "fname alias", I18N_NOOP("Alternative visible name replacement. Supply this once for every input."), 0 },
-  { "cs string",   I18N_NOOP("Override a config setting. Use once for every setting. E.g.: --cs \"AutoAdvance=1\""), 0 },
-  { "confighelp",  I18N_NOOP("Show list of config settings and current values."), 0 },
-  { "config file", I18N_NOOP("Use a different config file."), 0 }
-};
-static KCmdLineOptions options2[] =
-{
-  { "+[File1]", I18N_NOOP("file1 to open (base, if not specified via --base)"), 0 },
-  { "+[File2]", I18N_NOOP("file2 to open"), 0 },
-  { "+[File3]", I18N_NOOP("file3 to open"), 0 }
-};
+// static KCmdLineOptions options[] =
+// {
+//   { "m", 0, 0 },
+//   { "merge", I18N_NOOP("Merge the input."), 0 },
+//   { "b", 0, 0 },
+//   { "base file", I18N_NOOP("Explicit base file. For compatibility with certain tools."), 0 },
+//   { "o", 0, 0 },
+//   { "output file", I18N_NOOP("Output file. Implies -m. E.g.: -o newfile.txt"), 0 },
+//   { "out file",    I18N_NOOP("Output file, again. (For compatibility with certain tools.)"), 0 },
+//   { "auto",        I18N_NOOP("No GUI if all conflicts are auto-solvable. (Needs -o file)"), 0 },
+//   { "qall",        I18N_NOOP("Don't solve conflicts automatically. (For compatibility...)"), 0 },
+//   { "L1 alias1",   I18N_NOOP("Visible name replacement for input file 1 (base)."), 0 },
+//   { "L2 alias2",   I18N_NOOP("Visible name replacement for input file 2."), 0 },
+//   { "L3 alias3",   I18N_NOOP("Visible name replacement for input file 3."), 0 },
+//   { "L", 0, 0 },
+//   { "fname alias", I18N_NOOP("Alternative visible name replacement. Supply this once for every input."), 0 },
+//   { "cs string",   I18N_NOOP("Override a config setting. Use once for every setting. E.g.: --cs \"AutoAdvance=1\""), 0 },
+//   { "confighelp",  I18N_NOOP("Show list of config settings and current values."), 0 },
+//   { "config file", I18N_NOOP("Use a different config file."), 0 }
+// };
+// static KCmdLineOptions options2[] =
+// {
+//   { "+[File1]", I18N_NOOP("file1 to open (base, if not specified via --base)"), 0 },
+//   { "+[File2]", I18N_NOOP("file2 to open"), 0 },
+//   { "+[File3]", I18N_NOOP("file3 to open"), 0 }
+// };
+// 
 
-
-void initialiseCmdLineArgs(std::vector<KCmdLineOptions>& vOptions, QStringList& ignorableOptions)
-{
-   vOptions.insert( vOptions.end(), options, (KCmdLineOptions*)((char*)options+sizeof(options)));
-   QString configFileName = KStandardDirs().findResource("config","kdiff3rc");
-   QFile configFile( configFileName );
-   if ( configFile.open( QIODevice::ReadOnly ) )
-   {
-      QTextStream ts( &configFile );
-      while(!ts.atEnd())
-      {
-         QString line = ts.readLine();
-         if ( line.startsWith("IgnorableCmdLineOptions=") )
-         {
-            int pos = line.indexOf('=');
-            if (pos>=0)
-            {
-               QString s = line.mid(pos+1);
-               QStringList sl = s.split( '|' );
-               if (!sl.isEmpty())
-               {
-                  ignorableOptions = sl.front().split( ';' );
-                  for (QStringList::iterator i=ignorableOptions.begin(); i!=ignorableOptions.end(); ++i)
-                  {
-                     KCmdLineOptions ignoreOption;
-                     (*i).remove('-');
-                     if (!(*i).isEmpty())
-                     {
-                        ignoreOption.name = (new QByteArray( (*i).toLatin1() ))->constData();
-                        ignoreOption.description = I18N_NOOP("Ignored. (User defined.)");
-                        ignoreOption.def = 0;
-                        vOptions.push_back(ignoreOption);
-                     }
-                  }
-               }
-            }
-            break;
-         }
-      }
-   }
-   vOptions.insert(vOptions.end(),options2,(KCmdLineOptions*)((char*)options2+sizeof(options2)));
-
-   KCmdLineOptions last = KCmdLineLastOption;
-   vOptions.push_back(last);
-   KCmdLineArgs::addCmdLineOptions( &vOptions[0] ); // Add our own options.
-}
-
+// void initialiseCmdLineArgs(std::vector<KCmdLineOptions>& vOptions, QStringList& ignorableOptions)
+// {
+//    vOptions.insert( vOptions.end(), options, (KCmdLineOptions*)((char*)options+sizeof(options)));
+//    QString configFileName = KStandardDirs().findResource("config","kdiff3rc");
+//    QFile configFile( configFileName );
+//    if ( configFile.open( QIODevice::ReadOnly ) )
+//    {
+//       QTextStream ts( &configFile );
+//       while(!ts.atEnd())
+//       {
+//          QString line = ts.readLine();
+//          if ( line.startsWith("IgnorableCmdLineOptions=") )
+//          {
+//             int pos = line.indexOf('=');
+//             if (pos>=0)
+//             {
+//                QString s = line.mid(pos+1);
+//                QStringList sl = s.split( '|' );
+//                if (!sl.isEmpty())
+//                {
+//                   ignorableOptions = sl.front().split( ';' );
+//                   for (QStringList::iterator i=ignorableOptions.begin(); i!=ignorableOptions.end(); ++i)
+//                   {
+//                      KCmdLineOptions ignoreOption;
+//                      (*i).remove('-');
+//                      if (!(*i).isEmpty())
+//                      {
+//                         ignoreOption.name = (new QByteArray( (*i).toLatin1() ))->constData();
+//                         ignoreOption.description = I18N_NOOP("Ignored. (User defined.)");
+//                         ignoreOption.def = 0;
+//                         vOptions.push_back(ignoreOption);
+//                      }
+//                   }
+//                }
+//             }
+//             break;
+//          }
+//       }
+//    }
+//    vOptions.insert(vOptions.end(),options2,(KCmdLineOptions*)((char*)options2+sizeof(options2)));
+// 
+//    KCmdLineOptions last = KCmdLineLastOption;
+//    vOptions.push_back(last);
+//    KCmdLineArgs::addCmdLineOptions( &vOptions[0] ); // Add our own options.
+// }
 
 #ifdef _WIN32
 #include <process.h>
@@ -127,6 +125,19 @@
 }
 #endif
 
+class ContextFreeTranslator : public QTranslator
+{
+public:
+   ContextFreeTranslator( QObject* pParent ) : QTranslator(pParent) {}
+   QString translate(const char* context, const char* sourceText, const char* comment ) const
+   {
+      if ( context != 0 )
+         return QTranslator::translate(0,sourceText,comment);
+      else
+         return QString();
+   }
+};
+
 int main(int argc, char *argv[])
 {
 #ifdef _WIN32
@@ -149,10 +160,11 @@
 
    // Write all args into a temporary file. Uncomment this for debugging purposes.
    /*
-   FILE* f = fopen("c:\\t.txt","w");
+   FILE* f = fopen(QDir::toNativeSeparators(QDir::homePath()+"//kdiff3_call_args.txt").toLatin1().data(),"w");
    for(int i=0; i< argc; ++i)
       fprintf(f,"Arg %d: %s\n", i, argv[i]);
-
+   fclose(f);
+   
    // Call orig cleardiffmrg.exe to see what result it returns.
    int result=0;
    result = ::_spawnvp(_P_WAIT , "C:\\Programme\\Rational\\ClearCase\\bin\\cleardiffmrg.exe", argv );
@@ -170,30 +182,65 @@
 #endif
    //QApplication::setColorSpec( QApplication::ManyColor ); // Grab all 216 colors
 
-   KAboutData aboutData( "kdiff3", I18N_NOOP("KDiff3"),
-      VERSION, description, KAboutData::License_GPL,
-      "(c) 2002-2007 Joachim Eibl", 0, "http://kdiff3.sourceforge.net/", "joachim.eibl" "@" "gmx.de");
-   aboutData.addAuthor("Joachim Eibl",0, "joachim.eibl" "@" "gmx.de");
-   aboutData.addCredit("Eike Sauer", "Bugfixes, Debian package maintainer" );
-   aboutData.addCredit("Sebastien Fricker", "Windows installer" );
-   aboutData.addCredit("Stephan Binner", "i18n-help", "binner" "@" "kde.org" );
-   aboutData.addCredit("Stefan Partheymueller", "Clipboard-patch" );
-   aboutData.addCredit("David Faure", "KIO-Help", "faure" "@" "kde.org" );
-   aboutData.addCredit("Bernd Gehrmann", "Class CvsIgnoreList from Cervisia" );
-   aboutData.addCredit("Andre Woebbeking", "Class StringMatcher" );
-   aboutData.addCredit("Michael Denio", "Directory Equality-Coloring patch");
-   aboutData.addCredit("Manfred Koehler", "Fix for slow startup on Windows");
-   aboutData.addCredit("Sergey Zorin", "Diff Ext for Windows");
-   aboutData.addCredit("Paul Eggert, Mike Haertel, David Hayes, Richard Stallman, Len Tower", "GNU-Diffutils");
-   aboutData.addCredit("Tino Boellsterling, Timothy Mee", "Intensive test, use and feedback");
-   aboutData.addCredit("Michael Schmidt", "Mac support");
+   const QByteArray& appName = QByteArray("kdiff3");
+   const QByteArray& appCatalog = appName;
+   const KLocalizedString i18nName = ki18n("kdiff3");
+   const QByteArray& appVersion = QByteArray( VERSION );
+   const KLocalizedString description = ki18n("Tool for Comparison and Merge of Files and Directories");
+   const KLocalizedString copyright = ki18n("(c) 2002-2008 Joachim Eibl");
+   const QByteArray& homePage = "http://kdiff3.sourceforge.net/";
+   const QByteArray& bugsAddress = "joachim.eibl" "@" "gmx.de";
+   KAboutData aboutData( appName, appCatalog, i18nName, 
+         appVersion, description, KAboutData::License_GPL_V2, copyright, description, 
+         homePage, bugsAddress );
 
-   aboutData.addCredit(I18N_NOOP("+ Many thanks to those who reported bugs and contributed ideas!"));
+   aboutData.addAuthor(ki18n("Joachim Eibl"), KLocalizedString(), QByteArray("joachim.eibl" "@" "gmx.de"));
+   aboutData.addCredit(ki18n("Eike Sauer"), ki18n("Bugfixes, Debian package maintainer") );
+   aboutData.addCredit(ki18n("Sebastien Fricker"), ki18n("Windows installer") );
+   aboutData.addCredit(ki18n("Stephan Binner"), ki18n("i18n-help"), QByteArray("binner" "@" "kde.org") );
+   aboutData.addCredit(ki18n("Stefan Partheymueller"), ki18n("Clipboard-patch" ));
+   aboutData.addCredit(ki18n("David Faure"), ki18n("KIO-Help"), QByteArray("faure" "@" "kde.org" ));
+   aboutData.addCredit(ki18n("Bernd Gehrmann"), ki18n("Class CvsIgnoreList from Cervisia" ));
+   aboutData.addCredit(ki18n("Andre Woebbeking"), ki18n("Class StringMatcher" ));
+   aboutData.addCredit(ki18n("Michael Denio"), ki18n("Directory Equality-Coloring patch"));
+   aboutData.addCredit(ki18n("Manfred Koehler"), ki18n("Fix for slow startup on Windows"));
+   aboutData.addCredit(ki18n("Sergey Zorin"), ki18n("Diff Ext for Windows"));
+   aboutData.addCredit(ki18n("Paul Eggert, Mike Haertel, David Hayes, Richard Stallman, Len Tower"), ki18n("GNU-Diffutils"));
+   aboutData.addCredit(ki18n("Tino Boellsterling, Timothy Mee"), ki18n("Intensive test, use and feedback"));
+   aboutData.addCredit(ki18n("Michael Schmidt"), ki18n("Mac support"));
+   aboutData.addCredit(ki18n("Valentin Rusu"), ki18n("KDE4 porting"), QByteArray("kde" "@" "rusu.info"));
+   aboutData.addCredit(ki18n("Albert Astals Cid"), ki18n("KDE4 porting"), QByteArray("aacid" "@" "kde.org"));
+
+   aboutData.addCredit(ki18n("+ Many thanks to those who reported bugs and contributed ideas!"));
 
    KCmdLineArgs::init( argc, argv, &aboutData );
-   std::vector<KCmdLineOptions> vOptions;
-   QStringList ignorableOptions;
-   initialiseCmdLineArgs(vOptions, ignorableOptions);
+
+   KCmdLineOptions options;
+   // ignorable command options
+   options.add( "m" ).add( "merge", ki18n("Merge the input."));
+   options.add( "b" ).add( "base file", ki18n("Explicit base file. For compatibility with certain tools.") );
+   options.add( "o" ).add( "output file", ki18n("Output file. Implies -m. E.g.: -o newfile.txt"));
+   options.add( "out file",    ki18n("Output file, again. (For compatibility with certain tools.)") );
+   options.add( "auto",        ki18n("No GUI if all conflicts are auto-solvable. (Needs -o file)") );
+   options.add( "qall",        ki18n("Don't solve conflicts automatically. (For compatibility...)") );
+   options.add( "L1 alias1",   ki18n("Visible name replacement for input file 1 (base).") );
+   options.add( "L2 alias2",   ki18n("Visible name replacement for input file 2.") );
+   options.add( "L3 alias3",   ki18n("Visible name replacement for input file 3.") );
+   options.add( "L" ).add( "fname alias", ki18n("Alternative visible name replacement. Supply this once for every input.") );
+   options.add( "cs string",   ki18n("Override a config setting. Use once for every setting. E.g.: --cs \"AutoAdvance=1\"") );
+   options.add( "confighelp",  ki18n("Show list of config settings and current values.") );
+   options.add( "config file", ki18n("Use a different config file.") );
+
+   // other command options
+   options.add( "+[File1]", ki18n("file1 to open (base, if not specified via --base)") );
+   options.add( "+[File2]", ki18n("file2 to open") );
+   options.add( "+[File3]", ki18n("file3 to open") );
+
+   KCmdLineArgs::addCmdLineOptions( options );
+
+//    std::vector<KCmdLineOptions> vOptions;
+//    QStringList ignorableOptions;
+//    initialiseCmdLineArgs(vOptions, ignorableOptions);
 
    KApplication app;
 
@@ -203,7 +250,7 @@
    locale = app.config()->readEntry("Language", "Auto");
    int spacePos = locale.indexOf(' ');
    if (spacePos>0) locale = locale.left(spacePos);
-   QTranslator kdiff3Translator( 0 );
+   ContextFreeTranslator kdiff3Translator( 0 );
    QTranslator qtTranslator( 0 );
    if (locale != "en_orig")
    {
@@ -219,15 +266,16 @@
    }
 #endif
 
-  if (app.isRestored())
+  if (app.isSessionRestored())
   {
      RESTORE(KDiff3Shell);
   }
   else
   {
-     new KDiff3Shell();
+     KDiff3Shell* p = new KDiff3Shell();
+     p->show();
   }
-
+//app.installEventFilter( new CFilter );
   int retVal = app.exec();
   return retVal;
 }
--- a/kdiff3/src-QT4/mergeresultwindow.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/mergeresultwindow.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -36,6 +36,17 @@
 #include <QHBoxLayout>
 #include <QLabel>
 #include <QUrl>
+//Added by qt3to4:
+#include <QTimerEvent>
+#include <QResizeEvent>
+#include <QWheelEvent>
+#include <QPixmap>
+#include <QFocusEvent>
+#include <QEvent>
+#include <QInputEvent>
+#include <QDropEvent>
+#include <QPaintEvent>
+#include <QTextStream>
 
 #include <klocale.h>
 #include <kmessagebox.h>
@@ -138,8 +149,8 @@
    int wsc;
    int nofUnsolved = getNrOfUnsolvedConflicts(&wsc);
    if (m_pStatusBar)
-      m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
-         .arg(nofUnsolved).arg(wsc) );
+      m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)"
+         ,nofUnsolved,wsc) );
 }
 
 void MergeResultWindow::reset()
@@ -289,7 +300,9 @@
          int result = KMessageBox::warningYesNo(this,
             i18n("The output has been modified.\n"
                "If you continue your changes will be lost."),
-            i18n("Warning"), i18n("C&ontinue"), i18n("&Cancel"));
+            i18n("Warning"), 
+            KStandardGuiItem::cont(),
+            KStandardGuiItem::cancel());
          if ( result==KMessageBox::No )
             return;
       }
@@ -801,6 +814,8 @@
 
 void MergeResultWindow::showNrOfConflicts()
 {
+   if (!m_pOptionDialog->m_bShowInfoDialogs)
+      return;
    int nrOfConflicts = 0;
    MergeLineList::iterator i;
    for ( i = m_mergeLineList.begin();  i!=m_mergeLineList.end(); ++i )
@@ -814,12 +829,12 @@
    else  if ( m_pTotalDiffStatus->bTextAEqB && m_pTotalDiffStatus->bTextAEqC )
       totalInfo += i18n("All input files contain the same text.");
    else {
-      if    ( m_pTotalDiffStatus->bBinaryAEqB ) totalInfo += i18n("Files %1 and %2 are binary equal.\n").arg("A").arg("B");
-      else if ( m_pTotalDiffStatus->bTextAEqB ) totalInfo += i18n("Files %1 and %2 have equal text.\n").arg("A").arg("B");
-      if    ( m_pTotalDiffStatus->bBinaryAEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n").arg("A").arg("C");
-      else if ( m_pTotalDiffStatus->bTextAEqC ) totalInfo += i18n("Files %1 and %2 have equal text.\n").arg("A").arg("C");
-      if    ( m_pTotalDiffStatus->bBinaryBEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n").arg("B").arg("C");
-      else if ( m_pTotalDiffStatus->bTextBEqC ) totalInfo += i18n("Files %1 and %2 have equal text.\n").arg("B").arg("C");
+      if    ( m_pTotalDiffStatus->bBinaryAEqB ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("A"),QString("B"));
+      else if ( m_pTotalDiffStatus->bTextAEqB ) totalInfo += i18n("Files %1 and %2 have equal text.\n",QString("A"),QString("B"));
+      if    ( m_pTotalDiffStatus->bBinaryAEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("A"),QString("C"));
+      else if ( m_pTotalDiffStatus->bTextAEqC ) totalInfo += i18n("Files %1 and %2 have equal text.\n",QString("A"),QString("C"));
+      if    ( m_pTotalDiffStatus->bBinaryBEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("B"),QString("C"));
+      else if ( m_pTotalDiffStatus->bTextBEqC ) totalInfo += i18n("Files %1 and %2 have equal text.\n",QString("B"),QString("C"));
    }
 
    int nrOfUnsolvedConflicts = getNrOfUnsolvedConflicts();
@@ -952,8 +967,8 @@
    emit updateAvailabilities();
    int wsc;
    int nofUnsolved = getNrOfUnsolvedConflicts(&wsc);
-   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
-         .arg(nofUnsolved).arg(wsc) );
+   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)"
+         ,nofUnsolved,wsc) );
 }
 
 // bConflictsOnly: automatically choose for conflicts only (true) or for everywhere (false)
@@ -966,8 +981,8 @@
    update();
    int wsc;
    int nofUnsolved = getNrOfUnsolvedConflicts(&wsc);
-   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
-         .arg(nofUnsolved).arg(wsc) );
+   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)"
+         ,nofUnsolved,wsc) );
 }
 
 void MergeResultWindow::slotAutoSolve()
@@ -978,8 +993,8 @@
    update();
    int wsc;
    int nofUnsolved = getNrOfUnsolvedConflicts(&wsc);
-   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
-         .arg(nofUnsolved).arg(wsc) );
+   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)"
+         ,nofUnsolved,wsc) );
 }
 
 void MergeResultWindow::slotUnsolve()
@@ -990,8 +1005,8 @@
    update();
    int wsc;
    int nofUnsolved = getNrOfUnsolvedConflicts(&wsc);
-   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)")
-         .arg(nofUnsolved).arg(wsc) );
+   m_pStatusBar->showMessage( i18n("Number of remaining unsolved conflicts: %1 (of which %2 are whitespace)"
+         ,nofUnsolved,wsc) );
 }
 
 static QString calcHistoryLead(const QString& s )
@@ -1140,6 +1155,8 @@
       historyLead = calcHistoryLead(s);
    }
    QRegExp historyStart( m_pOptionDialog->m_historyStartRegExp );
+   if ( id3l == iHistoryEnd )
+      return;
    ++id3l; // Skip line with "$Log ... $"
    QRegExp newHistoryEntry( m_pOptionDialog->m_historyEntryStartRegExp );
    QStringList parenthesesGroups;
@@ -1749,11 +1766,13 @@
       m_currentMergeLineIt = m_mergeLineList.end();
       reset();
    }
+   update();
 }
 
-void MergeResultWindow::paintEvent( QPaintEvent*  )
+void MergeResultWindow::paintEvent( QPaintEvent* )
 {
-   if (m_pDiff3LineList==0 || !m_bPaintingAllowed) return;
+   if (m_pDiff3LineList==0 || !m_bPaintingAllowed) 
+      return;
 
    bool bOldSelectionContainsData = m_selection.bSelectionContainsData;
    const QFontMetrics& fm = fontMetrics();
@@ -1837,12 +1856,13 @@
       painter.drawPixmap(0,0, m_pixmap);
    else
    {
-      if (!m_pOptionDialog->m_bRightToLeftLanguage)
-         painter.drawPixmap(xCursor-2, yOffset, m_pixmap,
-                            xCursor-2, yOffset, 5, fontAscent+2 );
-      else
-         painter.drawPixmap(width()-1-4-(xCursor-2), yOffset, m_pixmap,
-                            width()-1-4-(xCursor-2), yOffset, 5, fontAscent+2 );
+      painter.drawPixmap(0,0, m_pixmap ); // Draw everything. (Internally cursor rect is clipped anyway.)
+      //if (!m_pOptionDialog->m_bRightToLeftLanguage)
+      //   painter.drawPixmap(xCursor-2, yOffset, m_pixmap,
+      //                      xCursor-2, yOffset, 5, fontAscent+2 );
+      //else
+      //   painter.drawPixmap(width()-1-4-(xCursor-2), yOffset, m_pixmap,
+      //                      width()-1-4-(xCursor-2), yOffset, 5, fontAscent+2 );
       m_bCursorUpdate = false;
    }
    painter.end();
@@ -2677,7 +2697,7 @@
 }
 
 /// Saves and returns true when successful.
-bool MergeResultWindow::saveDocument( const QString& fileName, QTextCodec* pEncoding )
+bool MergeResultWindow::saveDocument( const QString& fileName, QTextCodec* pEncoding, e_LineEndStyle eLineEndStyle )
 {
    // Are still conflicts somewhere?
    if ( getNrOfUnsolvedConflicts()>0 )
@@ -2689,6 +2709,15 @@
       return false;
    }
 
+   if ( eLineEndStyle==eLineEndStyleConflict || eLineEndStyle==eLineEndStyleUndefined )
+   {
+      KMessageBox::error( this,
+         i18n("There is a line end style conflict. Please choose the line end style manually.\n"
+              "File not saved.\n"),
+         i18n("Conflicts Left"));
+      return false;
+   }
+
    update();
 
    FileAccess file( fileName, true /*bWantToWrite*/ );
@@ -2723,7 +2752,7 @@
 
             if (line>0) // Prepend line feed, but not for first line
             {
-               if ( m_pOptionDialog->m_lineEndStyle == eLineEndDos )
+               if ( eLineEndStyle == eLineEndStyleDos )
                {   str.prepend("\r\n"); }
                else
                {   str.prepend("\n");   }
@@ -3091,8 +3120,16 @@
    pHLayout->addWidget( m_pEncodingLabel );
 
    m_pEncodingSelector = new QComboBox();
+   m_pEncodingSelector->setSizeAdjustPolicy( QComboBox::AdjustToContents );
    pHLayout->addWidget( m_pEncodingSelector, 2 );
    setEncodings(0,0,0);
+
+   m_pLineEndStyleLabel = new QLabel( i18n("Line end style:") );
+   pHLayout->addWidget( m_pLineEndStyleLabel );
+   m_pLineEndStyleSelector = new QComboBox();
+   m_pLineEndStyleSelector->setSizeAdjustPolicy( QComboBox::AdjustToContents );
+   pHLayout->addWidget( m_pLineEndStyleSelector );
+   setLineEndStyles(eLineEndStyleUndefined,eLineEndStyleUndefined,eLineEndStyleUndefined);
 }
 
 void WindowTitleWidget::setFileName( const QString& fileName )
@@ -3105,6 +3142,85 @@
    return m_pFileNameLineEdit->text();
 }
 
+static QString getLineEndStyleName( e_LineEndStyle eLineEndStyle )
+{
+   if ( eLineEndStyle == eLineEndStyleDos )
+      return "DOS";
+   else if ( eLineEndStyle == eLineEndStyleUnix )
+      return "Unix";
+   return QString();
+}
+
+void WindowTitleWidget::setLineEndStyles( e_LineEndStyle eLineEndStyleA, e_LineEndStyle eLineEndStyleB, e_LineEndStyle eLineEndStyleC)
+{
+   m_pLineEndStyleSelector->clear();
+   QString dosUsers;
+   if ( eLineEndStyleA == eLineEndStyleDos )
+      dosUsers += "A";
+   if ( eLineEndStyleB == eLineEndStyleDos )
+      dosUsers += (dosUsers.isEmpty() ? "" : ", ") + QString("B");
+   if ( eLineEndStyleC == eLineEndStyleDos )
+      dosUsers += (dosUsers.isEmpty() ? "" : ", ") + QString("C");
+   QString unxUsers;
+   if ( eLineEndStyleA == eLineEndStyleUnix )
+      unxUsers += "A";
+   if ( eLineEndStyleB == eLineEndStyleUnix )
+      unxUsers += (unxUsers.isEmpty() ? "" : ", ") + QString("B");
+   if ( eLineEndStyleC == eLineEndStyleUnix )
+      unxUsers += (unxUsers.isEmpty() ? "" : ", ") + QString("C");
+
+   m_pLineEndStyleSelector->addItem( i18n("Unix") + (unxUsers.isEmpty() ? "" : " (" + unxUsers + ")" )  );
+   m_pLineEndStyleSelector->addItem( i18n("DOS")  + (dosUsers.isEmpty() ? "" : " (" + dosUsers + ")" )  );
+
+   e_LineEndStyle autoChoice = (e_LineEndStyle)m_pOptionDialog->m_lineEndStyle;
+
+   if ( m_pOptionDialog->m_lineEndStyle == eLineEndStyleAutoDetect )
+   {
+      if ( eLineEndStyleA != eLineEndStyleUndefined && eLineEndStyleB != eLineEndStyleUndefined && eLineEndStyleC != eLineEndStyleUndefined )
+      {
+         if ( eLineEndStyleA == eLineEndStyleB )
+            autoChoice = eLineEndStyleC;
+         else if ( eLineEndStyleA == eLineEndStyleC )
+            autoChoice = eLineEndStyleB;
+         else
+            autoChoice = eLineEndStyleConflict;          //conflict (not likely while only two values exist)
+      }
+      else 
+      {
+         e_LineEndStyle c1, c2;
+         if     ( eLineEndStyleA == eLineEndStyleUndefined ) { c1 = eLineEndStyleB; c2 = eLineEndStyleC; }
+         else if( eLineEndStyleB == eLineEndStyleUndefined ) { c1 = eLineEndStyleA; c2 = eLineEndStyleC; }
+         else /*if( eLineEndStyleC == eLineEndStyleUndefined )*/ { c1 = eLineEndStyleA; c2 = eLineEndStyleB; }
+         if ( c1 == c2 && c1!=eLineEndStyleUndefined )
+            autoChoice = c1;
+         else
+            autoChoice = eLineEndStyleConflict;
+      }
+   }
+
+   if ( autoChoice == eLineEndStyleUnix )
+      m_pLineEndStyleSelector->setCurrentIndex(0);
+   else if ( autoChoice == eLineEndStyleDos )
+      m_pLineEndStyleSelector->setCurrentIndex(1);
+   else if ( autoChoice == eLineEndStyleConflict )
+   {
+      m_pLineEndStyleSelector->addItem( i18n("Conflict") );
+      m_pLineEndStyleSelector->setCurrentIndex(2);
+   }
+}
+
+e_LineEndStyle WindowTitleWidget::getLineEndStyle( )
+{
+   
+   int current = m_pLineEndStyleSelector->currentIndex();
+   if (current == 0)
+      return eLineEndStyleUnix;
+   else if (current == 1)
+      return eLineEndStyleDos;
+   else
+      return eLineEndStyleConflict;
+}
+
 void WindowTitleWidget::setEncodings( QTextCodec* pCodecForA, QTextCodec* pCodecForB, QTextCodec* pCodecForC )
 {
    m_pEncodingSelector->clear();
@@ -3164,7 +3280,7 @@
 //{
 //   QString current = m_pFileNameLineEdit->text();
 //
-//   KURL newURL = KFileDialog::getSaveURL( current, 0, this, i18n("Select file (not saving yet)"));
+//   KUrl newURL = KFileDialog::getSaveUrl( current, 0, this, i18n("Select file (not saving yet)"));
 //   if ( !newURL.isEmpty() )
 //   {
 //      m_pFileNameLineEdit->setText( newURL.url() ); 
--- a/kdiff3/src-QT4/mergeresultwindow.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/mergeresultwindow.h	Tue Jan 06 17:51:29 2009 +0000
@@ -23,6 +23,7 @@
 #include <QWidget>
 #include <QPixmap>
 #include <QTimer>
+#include <QStatusBar>
 
 class QPainter;
 
@@ -113,7 +114,7 @@
 
    void reset();
 
-   bool saveDocument( const QString& fileName, QTextCodec* pEncoding );
+   bool saveDocument( const QString& fileName, QTextCodec* pEncoding, e_LineEndStyle eLineEndStyle );
    int getNrOfUnsolvedConflicts(int* pNrOfWhiteSpaceConflicts=0);
    void choose(int selector);
    void chooseGlobal(int selector, bool bConflictsOnly, bool bWhiteSpaceOnly );
@@ -429,6 +430,8 @@
    QLineEdit*   m_pFileNameLineEdit;
    //QPushButton* m_pBrowseButton;
    QLabel*      m_pModifiedLabel;
+   QLabel*      m_pLineEndStyleLabel;
+   QComboBox*   m_pLineEndStyleSelector;
    QLabel*      m_pEncodingLabel;
    QComboBox*   m_pEncodingSelector;
    OptionDialog* m_pOptionDialog;
@@ -439,6 +442,8 @@
    QString     getFileName();
    void setEncodings( QTextCodec* pCodecForA, QTextCodec* pCodecForB, QTextCodec* pCodecForC );
    void setEncoding( QTextCodec* pCodec );
+   void setLineEndStyles( e_LineEndStyle eLineEndStyleA, e_LineEndStyle eLineEndStyleB, e_LineEndStyle eLineEndStyleC);
+   e_LineEndStyle getLineEndStyle();
 
    bool eventFilter( QObject* o, QEvent* e );
 public slots:
--- a/kdiff3/src-QT4/optiondialog.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/optiondialog.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -30,15 +30,20 @@
 
 #include <QSettings>
 #include <QLocale>
+#include <QGridLayout>
+#include <QPixmap>
+#include <QFrame>
+#include <QVBoxLayout>
 
 #include <kapplication.h>
-#include <kcolorbtn.h>
+#include <kcolorbutton.h>
 #include <kfontdialog.h> // For KFontChooser
 #include <kiconloader.h>
 #include <klocale.h>
 #include <kconfig.h>
 #include <kmessagebox.h>
 #include <kmainwindow.h> //For ktoolbar.h
+#include <ktoolbar.h>
 
 //#include <kkeydialog.h>
 #include <map>
@@ -53,6 +58,8 @@
 #include <kglobalsettings.h>
 #endif
 
+#define KDIFF3_CONFIG_GROUP "KDiff3 Options"
+
 static QString s_historyEntryStartRegExpToolTip;
 static QString s_historyEntryStartSortKeyOrderToolTip;
 static QString s_autoMergeRegExpToolTip;
@@ -145,7 +152,7 @@
    void setToCurrent(){}
    void apply()       {}
    void write(ValueMap* vm){ writeEntry( vm, m_saveName, *m_pVar ); }
-   void read (ValueMap* vm){ readEntry ( vm, m_saveName, *m_pVar ); }
+   void read (ValueMap* vm){ *m_pVar = vm->readEntry ( m_saveName, *m_pVar ); }
 private:
    OptionT( const OptionT& ); // private copy constructor without implementation
    T* m_pVar;
@@ -154,11 +161,11 @@
 template <class T> void writeEntry(ValueMap* vm, const QString& saveName, const T& v ) {   vm->writeEntry( saveName, v ); }
 static void writeEntry(ValueMap* vm, const QString& saveName, const QStringList& v )   {   vm->writeEntry( saveName, v, '|' ); }
 
-static void readEntry(ValueMap* vm, const QString& saveName, bool& v )       {   v = vm->readBoolEntry( saveName, v ); }
-static void readEntry(ValueMap* vm, const QString& saveName, int&  v )       {   v = vm->readNumEntry( saveName, v ); }
-static void readEntry(ValueMap* vm, const QString& saveName, QSize& v )      {   v = vm->readSizeEntry( saveName, &v ); }
-static void readEntry(ValueMap* vm, const QString& saveName, QPoint& v )     {   v = vm->readPointEntry( saveName, &v ); }
-static void readEntry(ValueMap* vm, const QString& saveName, QStringList& v ){   v = vm->readListEntry( saveName, QStringList(), '|' ); }
+//static void readEntry(ValueMap* vm, const QString& saveName, bool& v )       {   v = vm->readBoolEntry( saveName, v ); }
+//static void readEntry(ValueMap* vm, const QString& saveName, int&  v )       {   v = vm->readNumEntry( saveName, v ); }
+//static void readEntry(ValueMap* vm, const QString& saveName, QSize& v )      {   v = vm->readSizeEntry( saveName, &v ); }
+//static void readEntry(ValueMap* vm, const QString& saveName, QPoint& v )     {   v = vm->readPointEntry( saveName, &v ); }
+//static void readEntry(ValueMap* vm, const QString& saveName, QStringList& v ){   v = vm->readListEntry( saveName, QStringList(), '|' ); }
 
 typedef OptionT<bool> OptionToggleAction;
 typedef OptionT<int>  OptionNum;
@@ -169,9 +176,9 @@
 class OptionFontChooser : public KFontChooser, public OptionItem
 {
 public:
-   OptionFontChooser( const QFont& defaultVal, const QString& saveName, QFont* pbVar, QWidget* pParent, OptionDialog* pOD )
-   :KFontChooser( pParent,"font",true/*onlyFixed*/,QStringList(),false,6 ),
-    OptionItem( pOD, saveName )
+   OptionFontChooser( const QFont& defaultVal, const QString& saveName, QFont* pbVar, QWidget* pParent, OptionDialog* pOD ) :
+       KFontChooser( pParent ),
+       OptionItem( pOD, saveName )
    {
       m_pbVar = pbVar;
       *m_pbVar = defaultVal;
@@ -435,7 +442,7 @@
    }
    void read (ValueMap* config)
    {
-      QString codecName = config->readEntry( m_saveName, m_codecVec[ currentIndex() ]->name() );
+      QString codecName = config->readEntry( m_saveName, QString(m_codecVec[ currentIndex() ]->name()) );
       for(unsigned int i=0; i<m_codecVec.size(); ++i)
       {
          if ( codecName == m_codecVec[i]->name() )
@@ -449,10 +456,18 @@
 };
 
 
-OptionDialog::OptionDialog( bool bShowDirMergeSettings, QWidget *parent, char *name )
-  :KDialogBase( IconList, i18n("Configure"), Help|Default|Apply|Ok|Cancel,
-                Ok, parent, name, true /*modal*/, true )
+OptionDialog::OptionDialog( bool bShowDirMergeSettings, QWidget *parent, char *name ) : 
+//    KPageDialog( IconList, i18n("Configure"), Help|Default|Apply|Ok|Cancel,
+//                 Ok, parent, name, true /*modal*/, true )
+    KPageDialog( parent )
 {
+   setFaceType( List );
+   setWindowTitle( i18n("Configure") );
+   setButtons( Help|Default|Apply|Ok|Cancel );
+   setDefaultButton( Ok );
+   setObjectName( name );
+   setModal( true  );
+   showButtonSeparator( true );
    setHelp( "kdiff3/index.html", QString::null );
 
    setupFontPage();
@@ -472,6 +487,10 @@
    // Initialize all values in the dialog
    resetToDefaults();
    slotApply();
+   connect(this, SIGNAL(applyClicked()), this, SLOT(slotApply()));
+   connect(this, SIGNAL(okClicked()), this, SLOT(slotOk()));
+   //helpClicked() is connected in KDiff3App::KDiff3App
+   connect(this, SIGNAL(defaultClicked()), this, SLOT(slotDefault()));
 }
 
 OptionDialog::~OptionDialog( void )
@@ -492,7 +511,10 @@
    new OptionToggleAction( true,  "Show Toolbar", &m_bShowToolBar, this );
    new OptionToggleAction( true,  "Show Statusbar", &m_bShowStatusBar, this );
 
+/*
+   TODO manage toolbar positioning
    new OptionNum( (int)KToolBar::Top, "ToolBarPos", &m_toolBarPos, this );
+*/
    new OptionSize( QSize(600,400),"Geometry", &m_geometry, this );
    new OptionPoint( QPoint(0,22), "Position", &m_position, this );
    new OptionToggleAction( false, "WindowStateMaximised", &m_bMaximised, this );
@@ -505,8 +527,11 @@
 
 void OptionDialog::setupFontPage( void )
 {
-   QFrame *page = addPage( i18n("Font"), i18n("Editor & Diff Output Font" ),
-                             BarIcon("fonts", KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem *pageItem = new KPageWidgetItem( page, i18n("Font") );
+   pageItem->setHeader( i18n("Editor & Diff Output Font" ) );
+   pageItem->setIcon( KIcon( "preferences-desktop-font" ) );
+   addPage( pageItem );
 
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
@@ -539,8 +564,12 @@
 
 void OptionDialog::setupColorPage( void )
 {
-   QFrame *page = addPage( i18n("Color"), i18n("Colors Settings"),
-      BarIcon("colorize", KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Color") );
+   pageItem->setHeader( i18n("Colors Settings") );
+   pageItem->setIcon( KIcon("preferences-desktop-color") );
+   addPage( pageItem );
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
@@ -684,13 +713,16 @@
 
 void OptionDialog::setupEditPage( void )
 {
-   QFrame *page = addPage( i18n("Editor"), i18n("Editor Behavior"),
-                           BarIcon("edit", KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Editor") );
+   pageItem->setHeader( i18n("Editor Behavior") );
+   pageItem->setIcon( KIcon( "accessories-text-editor") );
+   addPage( pageItem );
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
 
-
    QGridLayout *gbox = new QGridLayout();
    gbox->setColumnStretch(1,5);
    topLayout->addLayout( gbox );
@@ -730,14 +762,16 @@
    label = new QLabel( i18n("Line end style:"), page );
    gbox->addWidget( label, line, 0 );
    #ifdef _WIN32
-   int defaultLineEndStyle = eLineEndDos;
+   int defaultLineEndStyle = eLineEndStyleDos;
    #else
-   int defaultLineEndStyle = eLineEndUnix;
+   int defaultLineEndStyle = eLineEndStyleUnix;
    #endif
-   OptionComboBox* pLineEndStyle = new OptionComboBox( defaultLineEndStyle, "LineEndStyle", &m_lineEndStyle, page, this );
+   OptionComboBox* pLineEndStyle = new OptionComboBox( eLineEndStyleAutoDetect, "LineEndStyle", &m_lineEndStyle, page, this );
    gbox->addWidget( pLineEndStyle, line, 1 );
-   pLineEndStyle->insertItem( eLineEndUnix, "Unix" );
-   pLineEndStyle->insertItem( eLineEndDos, "Dos/Windows" );
+   pLineEndStyle->insertItem( eLineEndStyleUnix, "Unix" );
+   pLineEndStyle->insertItem( eLineEndStyleDos, "Dos/Windows" );
+   pLineEndStyle->insertItem( eLineEndStyleAutoDetect, "Autodetect" );
+
    label->setToolTip( i18n(
       "Sets the line endings for when an edited file is saved.\n"
       "DOS/Windows: CR+LF; UNIX: LF; with CR=0D, LF=0A")
@@ -750,8 +784,13 @@
 
 void OptionDialog::setupDiffPage( void )
 {
-   QFrame *page = addPage( i18n("Diff"), i18n("Diff Settings"),
-                           BarIcon("misc", KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Diff") );
+   pageItem->setHeader( i18n("Diff Settings") );
+   pageItem->setIcon( KIcon( "preferences-other" ) );
+   addPage( pageItem );
+
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
@@ -816,13 +855,26 @@
       );
    ++line;
 
+   OptionCheckBox* pDiff3AlignBC = new OptionCheckBox( i18n("Align B and C for 3 input files"), false, "Diff3AlignBC", &m_bDiff3AlignBC, page, this );
+   gbox->addWidget( pDiff3AlignBC, line, 0, 1, 2 );
+   pDiff3AlignBC->setToolTip( i18n(
+      "Try to align B and C when comparing or merging three input files.\n"
+      "Not recommended for merging because merge might get more complicated.\n"
+      "(Default is off.)")
+      );
+   ++line;
+
    topLayout->addStretch(10);
 }
 
 void OptionDialog::setupMergePage( void )
 {
-   QFrame *page = addPage( i18n("Merge"), i18n("Merge Settings"),
-                           BarIcon("misc", KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Merge") );
+   pageItem->setHeader( i18n("Merge Settings") );
+   pageItem->setIcon( KIcon( "plasmagik" ) );
+   addPage( pageItem );
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
@@ -844,6 +896,11 @@
       );
    ++line;
 
+   OptionCheckBox* pShowInfoDialogs = new OptionCheckBox( i18n("Show info dialogs"), true, "ShowInfoDialogs", &m_bShowInfoDialogs, page, this );
+   gbox->addWidget( pShowInfoDialogs, line, 0, 1, 2 );
+   pShowInfoDialogs->setToolTip( i18n("Show a dialog with information about the number of conflicts.") );
+   ++line;
+
    label = new QLabel( i18n("White space 2-file merge default:"), page );
    gbox->addWidget( label, line, 0 );
    OptionComboBox* pWhiteSpace2FileMergeDefault = new OptionComboBox( 0, "WhiteSpace2FileMergeDefault", &m_whiteSpace2FileMergeDefault, page, this );
@@ -1004,8 +1061,12 @@
 
 void OptionDialog::setupDirectoryMergePage( void )
 {
-   QFrame *page = addPage( i18n("Directory Merge"), i18n("Directory Merge"),
-                           BarIcon("folder", KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Directory Merge") );
+   pageItem->setHeader( i18n("Directory Merge") );
+   pageItem->setIcon( KIcon( "folder" ) );
+   addPage( pageItem );
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
@@ -1182,7 +1243,7 @@
    for(i=0;;++i)
    {
       QTextCodec* pCodec = QTextCodec::codecForIndex ( i );
-      if ( pCodec != 0 )  m.insert( std::make_pair( QString(pCodec->mimeName()).upper(), pCodec->mimeName()) );
+      if ( pCodec != 0 )  m.insert( std::make_pair( QString(pCodec->mimeName()).toUpper(), pCodec->mimeName()) );
       else                break;
    }
    
@@ -1263,8 +1324,12 @@
 {
    new Utf8BOMCodec();
 
-   QFrame *page = addPage( i18n("Regional Settings"), i18n("Regional Settings"),
-                           BarIcon("locale"/*"charset"*/, KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Regional Settings") );
+   pageItem->setHeader( i18n("Regional Settings") );
+   pageItem->setIcon( KIcon("locale" ) );
+   addPage( pageItem );
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
@@ -1278,7 +1343,7 @@
 
 #ifdef KREPLACEMENTS_H
 
-static char* countryMap[]={
+static const char* countryMap[]={
 "af Afrikaans",
 "ar Arabic",
 "az Azerbaijani",
@@ -1495,8 +1560,12 @@
 
 void OptionDialog::setupIntegrationPage( void )
 {
-   QFrame *page = addPage( i18n("Integration"), i18n("Integration Settings"),
-                           BarIcon("launch"/*"charset"*/, KIcon::SizeMedium ) );
+   QFrame* page = new QFrame();
+   KPageWidgetItem* pageItem = new KPageWidgetItem( page, i18n("Integration") );
+   pageItem->setHeader( i18n("Integration Settings") );
+   pageItem->setIcon( KIcon( "preferences-desktop-launch-feedback" ) );
+   addPage( pageItem );
+
    QVBoxLayout *topLayout = new QVBoxLayout( page );
    topLayout->setMargin( 5 );
    topLayout->setSpacing( spacingHint() );
@@ -1518,6 +1587,14 @@
       ));
    ++line;
 
+
+   OptionCheckBox* pEscapeKeyQuits = new OptionCheckBox( i18n("Quit also via Escape key"), false, "EscapeKeyQuits", &m_bEscapeKeyQuits, page, this );
+   gbox->addWidget( pEscapeKeyQuits, line, 0, 1, 2 );
+   pEscapeKeyQuits->setToolTip( i18n(
+                  "Fast method to exit.\n"
+                  "For those who are used to using the Escape-key."  ) );
+   ++line;
+
 #ifdef _WIN32
    QPushButton* pIntegrateWithClearCase = new QPushButton( i18n("Integrate with ClearCase"), page);
    gbox->addWidget( pIntegrateWithClearCase, line, 0 );
@@ -1594,7 +1671,7 @@
 void OptionDialog::setupKeysPage( void )
 {
    //QVBox *page = addVBoxPage( i18n("Keys"), i18n("KeyDialog" ),
-   //                          BarIcon("fonts", KIcon::SizeMedium ) );
+   //                          BarIcon("fonts", KIconLoader::SizeMedium ) );
 
    //QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
     //           new KFontChooser( page,"font",false/*onlyFixed*/,QStringList(),false,6 );
@@ -1617,7 +1694,8 @@
          "correctly, you might experience problems while editing.\n\n"
          "Do you want to continue or do you want to select another font."),
          i18n("Incompatible Font"),
-         i18n("Continue at Own Risk"), i18n("Select Another Font"));
+         KGuiItem( i18n("Continue at Own Risk") ),
+         KGuiItem( i18n("Select Another Font")) );
       if (result==KMessageBox::No)
          return;
    }
@@ -1635,7 +1713,7 @@
       (*i)->apply();
    }
 
-   emit applyClicked();   
+   emit applyDone();
 
 #ifdef _WIN32
    QString locale = m_language;
@@ -1683,37 +1761,41 @@
 class ConfigValueMap : public ValueMap
 {
 private:
-   KConfig* m_pConfig;
+   KConfigGroup m_config;
 public:
-   ConfigValueMap( KConfig* pConfig ) { m_pConfig = pConfig; }
+   ConfigValueMap( const KConfigGroup& config ) : m_config( config ){ }
 
-   void writeEntry(const QString& s, const QFont&  v ){ m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, const QColor& v ){ m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, const QSize&  v ){ m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, const QPoint& v ){ m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, int v )          { m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, bool v )         { m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, const QStringList& v, char separator ){ m_pConfig->writeEntry(s,v,separator); }
-   void writeEntry(const QString& s, const QString& v ){ m_pConfig->writeEntry(s,v); }
-   void writeEntry(const QString& s, const char* v )   { m_pConfig->writeEntry(s,v); }
+   void writeEntry(const QString& s, const QFont&  v ){ m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, const QColor& v ){ m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, const QSize&  v ){ m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, const QPoint& v ){ m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, int v )          { m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, bool v )         { m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, const QString& v ){ m_config.writeEntry(s,v); }
+   void writeEntry(const QString& s, const char* v )   { m_config.writeEntry(s,v); }
 
-   QFont       readFontEntry (const QString& s, QFont* defaultVal ) { return m_pConfig->readFontEntry(s,defaultVal); }
-   QColor      readColorEntry(const QString& s, QColor* defaultVal ){ return m_pConfig->readColorEntry(s,defaultVal); }
-   QSize       readSizeEntry (const QString& s, QSize* defaultVal ) { return m_pConfig->readSizeEntry(s,defaultVal); }
-   QPoint      readPointEntry(const QString& s, QPoint* defaultVal) { return m_pConfig->readPointEntry(s,defaultVal); }
-   bool        readBoolEntry (const QString& s, bool defaultVal )   { return m_pConfig->readBoolEntry(s,defaultVal); }
-   int         readNumEntry  (const QString& s, int defaultVal )    { return m_pConfig->readNumEntry(s,defaultVal); }
-   QStringList readListEntry (const QString& s, const QStringList& def, char separator )    { return m_pConfig->readListEntry(s.toLatin1(),def,separator); }
-   QString     readEntry     (const QString& s, const QString& defaultVal){ return m_pConfig->readEntry(s,defaultVal); }
+   QFont       readFontEntry (const QString& s, const QFont* defaultVal ) { return m_config.readEntry(s,*defaultVal); }
+   QColor      readColorEntry(const QString& s, const QColor* defaultVal ){ return m_config.readEntry(s,*defaultVal); }
+   QSize       readSizeEntry (const QString& s, const QSize* defaultVal ) { return m_config.readEntry(s,*defaultVal); }
+   QPoint      readPointEntry(const QString& s, const QPoint* defaultVal) { return m_config.readEntry(s,*defaultVal); }
+   bool        readBoolEntry (const QString& s, bool defaultVal )   { return m_config.readEntry(s,defaultVal); }
+   int         readNumEntry  (const QString& s, int defaultVal )    { return m_config.readEntry(s,defaultVal); }
+   QString     readStringEntry(const QString& s, const QString& defaultVal){ return m_config.readEntry(s,defaultVal); }
+#ifdef KREPLACEMENTS_H
+   void writeEntry(const QString& s, const QStringList& v, char separator ){ m_config.writeEntry(s,v,separator); }
+   QStringList readListEntry (const QString& s, const QStringList& def, char separator )    { return m_config.readEntry(s, def ,separator ); }
+#else
+   void writeEntry(const QString& s, const QStringList& v, char separator ){ m_config.writeEntry(s,v); }
+   QStringList readListEntry (const QString& s, const QStringList& def, char separator )    { return m_config.readEntry(s, def ); }
+#endif
 };
 
-void OptionDialog::saveOptions( KConfig* config )
+
+void OptionDialog::saveOptions( KSharedConfigPtr config )
 {
    // No i18n()-Translations here!
 
-   config->setGroup("KDiff3 Options");
-
-   ConfigValueMap cvm(config);
+   ConfigValueMap cvm(config->group(KDIFF3_CONFIG_GROUP));
    std::list<OptionItem*>::iterator i;
    for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
    {
@@ -1721,13 +1803,11 @@
    }
 }
 
-void OptionDialog::readOptions( KConfig* config )
+void OptionDialog::readOptions( KSharedConfigPtr config )
 {
    // No i18n()-Translations here!
 
-   config->setGroup("KDiff3 Options");
-
-   ConfigValueMap cvm(config);
+   ConfigValueMap cvm(config->group(KDIFF3_CONFIG_GROUP));
    std::list<OptionItem*>::iterator i;
    for(i=m_optionItemList.begin(); i!=m_optionItemList.end(); ++i)
    {
@@ -1737,15 +1817,10 @@
    setState();
 }
 
-void OptionDialog::slotHelp( void )
-{
-   KDialogBase::slotHelp();
-}
-
-QString OptionDialog::parseOptions( const QCStringList& optionList )
+QString OptionDialog::parseOptions( const QStringList& optionList )
 {
    QString result;
-   QCStringList::const_iterator i;
+   QStringList::const_iterator i;
    for ( i=optionList.begin(); i!=optionList.end(); ++i )
    {
       QString s = *i;
--- a/kdiff3/src-QT4/optiondialog.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/optiondialog.h	Tue Jan 06 17:51:29 2009 +0000
@@ -21,14 +21,8 @@
 #ifndef OPTION_DIALOG_H
 #define OPTION_DIALOG_H
 
-class QCheckBox;
-class QLabel;
-class QLineEdit;
-class KColorButton;
-class KFontChooser;
-class KConfig;
 
-#include <kdialogbase.h>
+#include <kpagedialog.h>
 #include <qstringlist.h>
 #include <list>
 #include <kcmdlineargs.h>
@@ -41,11 +35,14 @@
 
 enum e_LineEndStyle
 {
-   eLineEndUnix=0,
-   eLineEndDos
+   eLineEndStyleUnix=0,
+   eLineEndStyleDos,
+   eLineEndStyleAutoDetect,
+   eLineEndStyleUndefined, // only one line exists
+   eLineEndStyleConflict,   // User must resolve manually
 };
 
-class OptionDialog : public KDialogBase
+class OptionDialog : public KPageDialog
 {
    Q_OBJECT
 
@@ -53,7 +50,7 @@
 
     OptionDialog( bool bShowDirMergeSettings, QWidget *parent = 0, char *name = 0 );
     ~OptionDialog( void );
-    QString parseOptions( const QCStringList& optionList );
+    QString parseOptions( const QStringList& optionList );
     QString calcOptionHelp();
 
     // Some settings are not available in the option dialog:
@@ -107,6 +104,8 @@
     bool m_bShowWhiteSpace;
     bool m_bShowLineNumbers;
     bool m_bHorizDiffWindowSplitting;
+    bool m_bShowInfoDialogs;
+    bool m_bDiff3AlignBC;
 
     int  m_whiteSpace2FileMergeDefault;
     int  m_whiteSpace3FileMergeDefault;
@@ -162,9 +161,10 @@
 
     QString m_ignorableCmdLineOptions;
     bool m_bIntegrateWithClearCase;
+    bool m_bEscapeKeyQuits;
 
-    void saveOptions(KConfig* config);
-    void readOptions(KConfig* config);
+    void saveOptions(KSharedConfigPtr config);
+    void readOptions(KSharedConfigPtr config);
 
     void setState(); // Must be called before calling exec();
 
@@ -174,12 +174,13 @@
     virtual void slotDefault( void );
     virtual void slotOk( void );
     virtual void slotApply( void );
-    virtual void slotHelp( void );
 
     void slotEncodingChanged();
     void slotHistoryMergeRegExpTester();
     void slotIntegrateWithClearCase();
     void slotRemoveClearCaseIntegration();
+signals:
+    void applyDone();
 private:
     void resetToDefaults();
 
--- a/kdiff3/src-QT4/pdiff.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/pdiff.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -41,7 +41,6 @@
 #include <kmessagebox.h>
 #include <kfontdialog.h>
 #include <kstatusbar.h>
-#include <kkeydialog.h>
 
 
 #include <assert.h>
@@ -53,6 +52,7 @@
 #include <windows.h>
 #else
 #include <unistd.h>
+#include <kshortcutsdialog.h>
 #endif
 
 #include "gnudiff_diff.h"
@@ -266,7 +266,8 @@
                                i18n("\nMost likely this is not wanted during a merge.\n"
                                     "Do you want to disable these settings or continue with these settings active?"),
                                i18n("Option Unsafe for Merging"), 
-                               i18n("Use These Options During Merge"), i18n("Disable Unsafe Options")
+                               KGuiItem( i18n("Use These Options During Merge") ), 
+                               KGuiItem( i18n("Disable Unsafe Options") )
                                );
 
          if (result == KMessageBox::No )
@@ -358,9 +359,12 @@
       correctManualDiffAlignment( m_diff3LineList, &m_manualDiffHelpList );
       calcDiff3LineListTrim( m_diff3LineList, m_sd1.getLineDataForDiff(), m_sd2.getLineDataForDiff(), m_sd3.getLineDataForDiff(), &m_manualDiffHelpList );
 
-      calcDiff3LineListUsingBC( &m_diffList23, m_diff3LineList );
-      correctManualDiffAlignment( m_diff3LineList, &m_manualDiffHelpList );
-      calcDiff3LineListTrim( m_diff3LineList, m_sd1.getLineDataForDiff(), m_sd2.getLineDataForDiff(), m_sd3.getLineDataForDiff(), &m_manualDiffHelpList );
+      if ( m_pOptionDialog->m_bDiff3AlignBC )
+      {
+         calcDiff3LineListUsingBC( &m_diffList23, m_diff3LineList );
+         correctManualDiffAlignment( m_diff3LineList, &m_manualDiffHelpList );
+         calcDiff3LineListTrim( m_diff3LineList, m_sd1.getLineDataForDiff(), m_sd2.getLineDataForDiff(), m_sd3.getLineDataForDiff(), &m_manualDiffHelpList );
+      }
       debugLineCheck( m_diff3LineList, m_sd1.getSizeLines(), 1 );
       debugLineCheck( m_diff3LineList, m_sd2.getSizeLines(), 2 );
       debugLineCheck( m_diff3LineList, m_sd3.getSizeLines(), 3 );
@@ -387,8 +391,6 @@
    // Calc needed lines for display
    m_neededLines = m_diff3LineList.size();
 
-   m_pDirectoryMergeWindow->allowResizeEvents(false);
-
    QList<int> oldHeights;
    if ( m_pDirectoryMergeSplitter->isVisible() )
       oldHeights = m_pMainSplitter->sizes();
@@ -408,7 +410,6 @@
    }
 
    m_pMainWidget->setVisible( bGUI );
-   m_pDirectoryMergeWindow->allowResizeEvents(true);
 
    m_bTripleDiff = ! m_sd3.isEmpty();
 
@@ -416,6 +417,8 @@
    if ( ! m_pOptionDialog->m_bAutoSelectOutEncoding )
       m_pMergeResultWindowTitle->setEncoding( m_pOptionDialog->m_pEncodingOut );
 
+   m_pMergeResultWindowTitle->setLineEndStyles( m_sd1.getLineEndStyle(), m_sd2.getLineEndStyle(), m_sd3.getLineEndStyle() );
+
    if ( bGUI )
    {
       const ManualDiffHelpList* pMDHL = &m_manualDiffHelpList;
@@ -528,12 +531,12 @@
          else  if ( pTotalDiffStatus->bTextAEqB && pTotalDiffStatus->bTextAEqC )
             totalInfo += i18n("All input files contain the same text, but are not binary equal.");
          else {
-            if    ( pTotalDiffStatus->bBinaryAEqB ) totalInfo += i18n("Files %1 and %2 are binary equal.\n"                          ).arg("A").arg("B");
-            else if ( pTotalDiffStatus->bTextAEqB ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n").arg("A").arg("B");
-            if    ( pTotalDiffStatus->bBinaryAEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n"                          ).arg("A").arg("C");
-            else if ( pTotalDiffStatus->bTextAEqC ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n").arg("A").arg("C");
-            if    ( pTotalDiffStatus->bBinaryBEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n"                          ).arg("B").arg("C");
-            else if ( pTotalDiffStatus->bTextBEqC ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n").arg("B").arg("C");
+            if    ( pTotalDiffStatus->bBinaryAEqB ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("A"),QString("B"));
+            else if ( pTotalDiffStatus->bTextAEqB ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n",QString("A"),QString("B"));
+            if    ( pTotalDiffStatus->bBinaryAEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("A"),QString("C"));
+            else if ( pTotalDiffStatus->bTextAEqC ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n",QString("A"),QString("C"));
+            if    ( pTotalDiffStatus->bBinaryBEqC ) totalInfo += i18n("Files %1 and %2 are binary equal.\n",QString("B"),QString("C"));
+            else if ( pTotalDiffStatus->bTextBEqC ) totalInfo += i18n("Files %1 and %2 have equal text, but are not binary equal. \n",QString("B"),QString("C"));
          }
 
          if ( !totalInfo.isEmpty() )
@@ -615,9 +618,15 @@
 
 void KDiff3App::sourceMask( int srcMask, int enabledMask )
 {
+   chooseA->blockSignals(true);
+   chooseB->blockSignals(true);
+   chooseC->blockSignals(true);
    chooseA->setChecked( (srcMask & 1) != 0 );
    chooseB->setChecked( (srcMask & 2) != 0 );
    chooseC->setChecked( (srcMask & 4) != 0 );
+   chooseA->blockSignals(false);
+   chooseB->blockSignals(false);
+   chooseC->blockSignals(false);
    chooseA->setEnabled( (enabledMask & 1) != 0 );
    chooseB->setEnabled( (enabledMask & 2) != 0 );
    chooseC->setEnabled( (enabledMask & 4) != 0 );
@@ -658,13 +667,14 @@
    QHBoxLayout* pDiffHLayout = new QHBoxLayout( pDiffWindowFrame );
    pDiffHLayout->setMargin(0);
    pDiffHLayout->setSpacing(0);
-   pDiffWindowFrame->show();
+   pVSplitter->addWidget(pDiffWindowFrame);
+   //pDiffWindowFrame->show();
    m_pDiffWindowSplitter = new QSplitter();
    m_pDiffWindowSplitter->setOpaqueResize(false);
 
    m_pDiffWindowSplitter->setOrientation( m_pOptionDialog->m_bHorizDiffWindowSplitting ?  Qt::Horizontal : Qt::Vertical );
    pDiffHLayout->addWidget( m_pDiffWindowSplitter );
-   m_pDiffWindowSplitter->show();
+   //m_pDiffWindowSplitter->show();
 
    m_pOverview = new Overview( m_pOptionDialog );
    pDiffHLayout->addWidget(m_pOverview);
@@ -675,10 +685,13 @@
    pDiffHLayout->addWidget( m_pDiffVScrollBar );
 
    m_pDiffTextWindowFrame1 = new DiffTextWindowFrame( m_pDiffWindowSplitter, statusBar(), m_pOptionDialog, 1 );
-   m_pDiffTextWindowFrame1->show();
+   m_pDiffWindowSplitter->addWidget(m_pDiffTextWindowFrame1);
+   //m_pDiffTextWindowFrame1->show();
    m_pDiffTextWindowFrame2 = new DiffTextWindowFrame( m_pDiffWindowSplitter, statusBar(), m_pOptionDialog, 2 );
-   m_pDiffTextWindowFrame2->show();
+   m_pDiffWindowSplitter->addWidget(m_pDiffTextWindowFrame2);
+   //m_pDiffTextWindowFrame2->show();
    m_pDiffTextWindowFrame3 = new DiffTextWindowFrame( m_pDiffWindowSplitter, statusBar(), m_pOptionDialog, 3 );
+   m_pDiffWindowSplitter->addWidget(m_pDiffTextWindowFrame3);
    m_pDiffTextWindow1 = m_pDiffTextWindowFrame1->getDiffTextWindow();
    m_pDiffTextWindow2 = m_pDiffTextWindowFrame2->getDiffTextWindow();
    m_pDiffTextWindow3 = m_pDiffTextWindowFrame3->getDiffTextWindow();
@@ -688,6 +701,7 @@
 
    // Merge window
    m_pMergeWindowFrame = new QWidget( pVSplitter );
+   pVSplitter->addWidget(m_pMergeWindowFrame);
    QHBoxLayout* pMergeHLayout = new QHBoxLayout( m_pMergeWindowFrame );
    pMergeHLayout->setMargin(0);
    pMergeHLayout->setSpacing(0);
@@ -703,6 +717,8 @@
    m_pMergeVScrollBar = new QScrollBar( Qt::Vertical, m_pMergeWindowFrame );
    pMergeHLayout->addWidget( m_pMergeVScrollBar );
 
+   m_pMainSplitter->addWidget(m_pMainWidget);
+
    autoAdvance->setEnabled(true);
 
    QList<int> sizes = pVSplitter->sizes();
@@ -791,9 +807,9 @@
    for( i = 0; i<d3lv.size(); ++i )
    {
       const Diff3Line& d3l = *d3lv[i];
-      if ( mdhe.lineA1>=0  &&  mdhe.lineA1==d3l.lineA ||
-           mdhe.lineB1>=0  &&  mdhe.lineB1==d3l.lineB ||
-           mdhe.lineC1>=0  &&  mdhe.lineC1==d3l.lineC )
+      if ( (mdhe.lineA1>=0  &&  mdhe.lineA1==d3l.lineA) ||
+           (mdhe.lineB1>=0  &&  mdhe.lineB1==d3l.lineB) ||
+           (mdhe.lineC1>=0  &&  mdhe.lineC1==d3l.lineC) )
          return i;
    }
    return -1;
@@ -834,6 +850,13 @@
       m_pCornerWidget->setFixedSize( m_pDiffVScrollBar->width(), m_pHScrollBar->height() );
 
    slotUpdateAvailabilities();
+   setUpdatesEnabled(true);
+   // Workaround for a Qt-bug
+   QList<QTreeView*> treeViews = findChildren<QTreeView*>();
+   foreach( QTreeView* pTreeView, treeViews )
+   {
+      pTreeView->setUpdatesEnabled(true);
+   }
 }
 
 void KDiff3App::resizeEvent(QResizeEvent* e)
@@ -866,6 +889,11 @@
             slotEditCut();
             return true;
          }
+         if ( k->key()==Qt::Key_Escape && m_pKDiff3Shell && m_pOptionDialog->m_bEscapeKeyQuits )
+         {
+            m_pKDiff3Shell->close();
+            return true;
+         }
       }
       return QSplitter::eventFilter( o, e );    // standard event processing
    }
@@ -873,6 +901,11 @@
    if ( e->type() == QEvent::KeyPress )   // key press
    {
        QKeyEvent *k = (QKeyEvent*)e;
+       if ( k->key()==Qt::Key_Escape && m_pKDiff3Shell && m_pOptionDialog->m_bEscapeKeyQuits )
+       {
+          m_pKDiff3Shell->close();
+          return true;
+       }
 
        bool bCtrl = (k->QInputEvent::modifiers() & Qt::ControlModifier) != 0;
        if (k->key()==Qt::Key_Insert &&  bCtrl )
@@ -941,8 +974,7 @@
             init();
          }
 #else
-         KURL::List urlList;
-         KURLDrag::decode( pDropEvent, urlList );
+         KUrl::List urlList = KUrl::List::fromMimeData( pDropEvent->mimeData() );
          if ( canContinue() && !urlList.isEmpty() )
          {
             raise();
@@ -983,7 +1015,9 @@
    {
       int result = KMessageBox::warningYesNo(this,
          i18n("You are currently doing a directory merge. Are you sure, you want to abort?"),
-         i18n("Warning"), i18n("Abort"), i18n("Continue Merging") );
+         i18n("Warning"), 
+         KGuiItem( i18n("Abort") ), 
+         KGuiItem( i18n("Continue Merging") ) );
       if ( result!=KMessageBox::Yes )
          return;
    }
@@ -1041,9 +1075,9 @@
             m_pDirectoryMergeSplitter->hide();
             init();
 
-            if ( ! m_sd1.isEmpty() && !m_sd1.hasData()  ||
-                 ! m_sd2.isEmpty() && !m_sd2.hasData()  ||
-                 ! m_sd3.isEmpty() && !m_sd3.hasData() )
+            if ( (! m_sd1.isEmpty() && !m_sd1.hasData())  ||
+                 (! m_sd2.isEmpty() && !m_sd2.hasData())  ||
+                 (! m_sd3.isEmpty() && !m_sd3.hasData()) )
             {
                QString text( i18n("Opening of these files failed:") );
                text += "\n\n";
@@ -1112,9 +1146,9 @@
       if ( pTotalDiffStatus!=0 )
          return;
 
-      if ( ! m_sd1.isEmpty() && ! m_sd1.hasData()  ||
-           ! m_sd2.isEmpty() && ! m_sd2.hasData()  ||
-           ! m_sd3.isEmpty() && ! m_sd3.hasData() )
+      if ( (! m_sd1.isEmpty() && ! m_sd1.hasData())  ||
+           (! m_sd2.isEmpty() && ! m_sd2.hasData())  ||
+           (! m_sd3.isEmpty() && ! m_sd3.hasData()) )
       {
          QString text( i18n("Opening of these files failed:") );
          text += "\n\n";
@@ -1392,14 +1426,14 @@
 void KDiff3App::slotConfigure()
 {
    m_pOptionDialog->setState();
-   m_pOptionDialog->incInitialSize ( QSize(0,40) );
+   m_pOptionDialog->incrementInitialSize ( QSize(0,40) );
    m_pOptionDialog->exec();
    slotRefresh();
 }
 
 void KDiff3App::slotConfigureKeys()
 {
-    KKeyDialog::configure(actionCollection(), this);
+    KShortcutsDialog::configure(actionCollection(), KShortcutsEditor::LetterShortcutsAllowed, this);
 }
 
 void KDiff3App::slotRefresh()
@@ -1576,7 +1610,8 @@
    if (bPrinting)
       return;
 
-   m_pOverview->slotRedraw();
+   if (m_pOverview)
+      m_pOverview->slotRedraw();
    if ( m_pDiffTextWindow1 )
    {
       m_pDiffTextWindow1->setFirstLine( m_pDiffTextWindow1->convertDiff3LineIdxToLine( firstD3LIdx ) );
@@ -1662,7 +1697,7 @@
       {
          f4.addPath( f1.fileName() );
          if ( f4.isFile() && f4.exists() )
-            m_outputFilename = f4.absFilePath();
+            m_outputFilename = f4.absoluteFilePath();
       }
    }
    else if ( f1.isDir() )
@@ -1670,7 +1705,7 @@
       m_bDirCompare = true;
       if (bCreateNewInstance)
       {
-         emit createNewInstance( f1.absFilePath(), f2.absFilePath(), f3.absFilePath() );
+         emit createNewInstance( f1.absoluteFilePath(), f2.absoluteFilePath(), f3.absoluteFilePath() );
       }
       else
       {
@@ -1678,6 +1713,7 @@
          if (!m_bDefaultFilename) destDir = f4;
          m_pDirectoryMergeSplitter->show();
          if (m_pMainWidget!=0) m_pMainWidget->hide();
+         setUpdatesEnabled(true);
 
          bool bSuccess = m_pDirectoryMergeWindow->init(
             f1, f2, f3,
@@ -1717,7 +1753,9 @@
    {
       int result = KMessageBox::warningYesNoCancel(this,
          i18n("The merge result hasn't been saved."),
-         i18n("Warning"), i18n("Save && Continue"), i18n("Continue Without Saving") );
+         i18n("Warning"), 
+         KGuiItem( i18n("Save && Continue") ), 
+         KGuiItem( i18n("Continue Without Saving") ) );
       if ( result==KMessageBox::Cancel )
          return false;
       else if ( result==KMessageBox::Yes )
@@ -1745,10 +1783,8 @@
 {
    if( dirShowBoth->isChecked() )
    {
-      if ( m_bDirCompare )
-         m_pDirectoryMergeSplitter->show();
-      else
-         m_pDirectoryMergeSplitter->hide();
+      if ( m_pDirectoryMergeSplitter )
+         m_pDirectoryMergeSplitter->setVisible( m_bDirCompare );
 
       if ( m_pMainWidget!=0 )
          m_pMainWidget->show();
@@ -2034,29 +2070,36 @@
 
 void KDiff3App::slotOverviewNormal()
 {
-   m_pOverview->setOverviewMode( Overview::eOMNormal );
-   m_pMergeResultWindow->setOverviewMode( Overview::eOMNormal );
+   if ( m_pOverview != 0 )
+      m_pOverview->setOverviewMode( Overview::eOMNormal );
+   if ( m_pMergeResultWindow !=0 )
+      m_pMergeResultWindow->setOverviewMode( Overview::eOMNormal );
    slotUpdateAvailabilities();
 }
 
 void KDiff3App::slotOverviewAB()
 {
-   m_pOverview->setOverviewMode( Overview::eOMAvsB );
+   if ( m_pOverview != 0 )
+      m_pOverview->setOverviewMode( Overview::eOMAvsB );
    m_pMergeResultWindow->setOverviewMode( Overview::eOMAvsB );
    slotUpdateAvailabilities();
 }
 
 void KDiff3App::slotOverviewAC()
 {
-   m_pOverview->setOverviewMode( Overview::eOMAvsC );
-   m_pMergeResultWindow->setOverviewMode( Overview::eOMAvsC );
+   if ( m_pOverview != 0 )
+      m_pOverview->setOverviewMode( Overview::eOMAvsC );
+   if ( m_pMergeResultWindow !=0 )
+      m_pMergeResultWindow->setOverviewMode( Overview::eOMAvsC );
    slotUpdateAvailabilities();
 }
 
 void KDiff3App::slotOverviewBC()
 {
-   m_pOverview->setOverviewMode( Overview::eOMBvsC );
-   m_pMergeResultWindow->setOverviewMode( Overview::eOMBvsC );
+   if ( m_pOverview != 0 )
+      m_pOverview->setOverviewMode( Overview::eOMBvsC );
+   if ( m_pMergeResultWindow !=0 )
+      m_pMergeResultWindow->setOverviewMode( Overview::eOMBvsC );
    slotUpdateAvailabilities();
 }
 
@@ -2095,7 +2138,7 @@
       int& l2 = i->lastLine( winIdx );
       if (l1>=0 && l2>=0)
       {
-         if ( firstLine<=l1 && lastLine>=l1  ||  firstLine <=l2 && lastLine>=l2 )
+         if ( (firstLine<=l1 && lastLine>=l1)  ||  (firstLine <=l2 && lastLine>=l2) )
          {
             // overlap
             l1 = -1;
@@ -2177,14 +2220,15 @@
 
 void KDiff3App::slotUpdateAvailabilities()
 {
+   if (m_pMainSplitter==0)
+      return;
+
    bool bTextDataAvailable = ( m_sd1.hasData() || m_sd2.hasData() || m_sd3.hasData() );
 
    if( dirShowBoth->isChecked() )
    {
-      if ( m_bDirCompare )
-         m_pDirectoryMergeSplitter->show();
-      else
-         m_pDirectoryMergeSplitter->hide();
+      if ( m_pDirectoryMergeSplitter!=0 )
+         m_pDirectoryMergeSplitter->setVisible( m_bDirCompare );
 
       if ( m_pMainWidget!=0 && !m_pMainWidget->isVisible() &&
            bTextDataAvailable && !m_pDirectoryMergeWindow->isScanning()
@@ -2201,8 +2245,8 @@
    dirShowBoth->setEnabled( m_bDirCompare );
    dirViewToggle->setEnabled(
       m_bDirCompare &&
-      (!m_pDirectoryMergeSplitter->isVisible()  &&  m_pMainWidget!=0 && m_pMainWidget->isVisible() ||
-        m_pDirectoryMergeSplitter->isVisible()  &&  m_pMainWidget!=0 && !m_pMainWidget->isVisible() && bTextDataAvailable )
+      ((!m_pDirectoryMergeSplitter->isVisible()  &&  m_pMainWidget!=0 && m_pMainWidget->isVisible()) ||
+        (m_pDirectoryMergeSplitter->isVisible()  &&  m_pMainWidget!=0 && !m_pMainWidget->isVisible() && bTextDataAvailable) )
       );
 
    bool bDirWindowHasFocus = m_pDirectoryMergeSplitter->isVisible() && m_pDirectoryMergeWindow->hasFocus();
--- a/kdiff3/src-QT4/smalldialogs.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/smalldialogs.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -32,6 +32,7 @@
 #include <QDir>
 #include <QDropEvent>
 #include <QMenu>
+#include <QPushButton>
 
 #include <kfiledialog.h>
 #include <klocale.h>
@@ -59,7 +60,7 @@
    m_pLineA = new QComboBox();
    m_pLineA->setEditable(true);
    m_pLineA->insertItems( 0, m_pOptions->m_recentAFiles );
-   m_pLineA->setEditText( KURL(n1).prettyURL() );
+   m_pLineA->setEditText( KUrl(n1).prettyUrl() );
    m_pLineA->setMinimumWidth( 200 );
    QPushButton * button = new QPushButton( i18n("File..."), this );
    connect( button, SIGNAL(clicked()), this, SLOT( selectFileA() ) );
@@ -76,7 +77,7 @@
    m_pLineB  = new QComboBox();
    m_pLineB->setEditable(true);
    m_pLineB->insertItems( 0, m_pOptions->m_recentBFiles );
-   m_pLineB->setEditText( KURL(n2).prettyURL() );
+   m_pLineB->setEditText( KUrl(n2).prettyUrl() );
    m_pLineB->setMinimumWidth( 200 );
    button   = new QPushButton( i18n("File..."), this );
    connect( button, SIGNAL(clicked()), this, SLOT( selectFileB() ) );
@@ -93,7 +94,7 @@
    m_pLineC= new QComboBox();
    m_pLineC->setEditable(true);
    m_pLineC->insertItems( 0, m_pOptions->m_recentCFiles );
-   m_pLineC->setEditText( KURL(n3).prettyURL() );
+   m_pLineC->setEditText( KUrl(n3).prettyUrl() );
    m_pLineC->setMinimumWidth( 200 );
    button = new QPushButton( i18n("File..."), this );
    connect( button, SIGNAL(clicked()), this, SLOT( selectFileC() ) );
@@ -117,15 +118,15 @@
    hl->addWidget( button );
 
    QMenu* m = new QMenu(this);
-   m->addAction( i18n("Swap %1<->%2").arg("A").arg("B") );
-   m->addAction( i18n("Swap %1<->%2").arg("B").arg("C") );
-   m->addAction( i18n("Swap %1<->%2").arg("C").arg("A") );
-   m->addAction( i18n("Copy %1->Output").arg("A")  );
-   m->addAction( i18n("Copy %1->Output").arg("B")  );
-   m->addAction( i18n("Copy %1->Output").arg("C")  );
-   m->addAction( i18n("Swap %1<->Output").arg("A") );
-   m->addAction( i18n("Swap %1<->Output").arg("B") );
-   m->addAction( i18n("Swap %1<->Output").arg("C") );
+   m->addAction( i18n("Swap %1<->%2", QString("A"),QString("B") ));
+   m->addAction( i18n("Swap %1<->%2",QString("B"),QString("C") ));
+   m->addAction( i18n("Swap %1<->%2",QString("C"),QString("A") ));
+   m->addAction( i18n("Copy %1->Output",QString("A")  ));
+   m->addAction( i18n("Copy %1->Output",QString("B")  ));
+   m->addAction( i18n("Copy %1->Output",QString("C")  ));
+   m->addAction( i18n("Swap %1<->Output",QString("A") ));
+   m->addAction( i18n("Swap %1<->Output",QString("B") ));
+   m->addAction( i18n("Swap %1<->Output",QString("C") ));
    connect( m, SIGNAL(triggered(QAction*)), this, SLOT(slotSwapCopyNames(QAction*)));
    button->setMenu(m);
 
@@ -136,7 +137,7 @@
    m_pLineOut = new QComboBox();
    m_pLineOut->setEditable(true);
    m_pLineOut->insertItems( 0, m_pOptions->m_recentOutputFiles );
-   m_pLineOut->setEditText( KURL(outputName).prettyURL() );
+   m_pLineOut->setEditText( KUrl(outputName).prettyUrl() );
    m_pLineOut->setMinimumWidth( 200 );
    button = new QPushButton( i18n("File..."), this );
    connect( button, SIGNAL(clicked()), this, SLOT( selectOutputName() ) );
@@ -229,9 +230,9 @@
    if (current.isEmpty() && i>3 ){  current = m_pLineC->currentText(); }
    if (current.isEmpty()        ){  current = m_pLineB->currentText(); }
    if (current.isEmpty()        ){  current = m_pLineA->currentText(); }
-   KURL newURL = bDir ? KFileDialog::getExistingURL( current, this)
-                      : bSave ? KFileDialog::getSaveURL( current, 0, this)
-                              : KFileDialog::getOpenURL( current, 0, this);
+   KUrl newURL = bDir ? KFileDialog::getExistingDirectoryUrl( current, this)
+                      : bSave ? KFileDialog::getSaveUrl( current, 0, this)
+                              : KFileDialog::getOpenUrl( current, 0, this);
    if ( !newURL.isEmpty() )
    {
       pLine->setEditText( newURL.url() );
@@ -285,7 +286,7 @@
    fixCurrentText( m_pLineA );
 
    QString s = m_pLineA->currentText();
-   s = KURL::fromPathOrURL(s).prettyURL();
+   s = QUrl::fromLocalFile(s).toLocalFile();
    QStringList* sl = &m_pOptions->m_recentAFiles;
    // If an item exist, remove it from the list and reinsert it at the beginning.
    sl->removeAll(s);
@@ -294,7 +295,7 @@
 
    fixCurrentText( m_pLineB );
    s = m_pLineB->currentText();
-   s = KURL::fromPathOrURL(s).prettyURL();
+   s = QUrl::fromLocalFile(s).toLocalFile();
    sl = &m_pOptions->m_recentBFiles;
    sl->removeAll(s);
    if ( !s.isEmpty() ) sl->prepend( s );
@@ -302,7 +303,7 @@
 
    fixCurrentText( m_pLineC );
    s = m_pLineC->currentText();
-   s = KURL::fromPathOrURL(s).prettyURL();
+   s = QUrl::fromLocalFile(s).toLocalFile();
    sl = &m_pOptions->m_recentCFiles;
    sl->removeAll(s);
    if ( !s.isEmpty() ) sl->prepend( s );
@@ -310,7 +311,7 @@
 
    fixCurrentText( m_pLineOut );
    s = m_pLineOut->currentText();
-   s = KURL::fromPathOrURL(s).prettyURL();
+   s = QUrl::fromLocalFile(s).toLocalFile();
    sl = &m_pOptions->m_recentOutputFiles;
    sl->removeAll(s);
    if ( !s.isEmpty() ) sl->prepend( s );
@@ -573,7 +574,7 @@
    if ( ! bSuccess )
    {
       m_pHistoryEntryStartMatchResult->setText( i18n("Opening and closing parentheses don't match in regular expression.") );
-      m_pHistorySortKeyResult->setText( i18n("") );
+      m_pHistorySortKeyResult->setText( "" );
       return;
    }
    QRegExp historyEntryStartRegExp( m_pHistoryEntryStartRegExpEdit->text() );
@@ -588,7 +589,7 @@
    else
    {
       m_pHistoryEntryStartMatchResult->setText( i18n("Match failed.") );
-      m_pHistorySortKeyResult->setText( i18n("") );
+      m_pHistorySortKeyResult->setText( "" );
    }
 }
 
--- a/kdiff3/src-QT4/smalldialogs.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/smalldialogs.h	Tue Jan 06 17:51:29 2009 +0000
@@ -27,7 +27,6 @@
 class QComboBox;
 class QCheckBox;
 class QLineEdit;
-class QLabel;
 
 class OpenDialog : public QDialog
 {
--- a/kdiff3/src-QT4/stable.cpp	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/stable.cpp	Tue Jan 06 17:51:29 2009 +0000
@@ -1,1 +1,1 @@
-#include "stable.h"
\ No newline at end of file
+#include "stable.h"
--- a/kdiff3/src-QT4/stable.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/stable.h	Tue Jan 06 17:51:29 2009 +0000
@@ -2,5 +2,7 @@
 #define STABLE_H
 #include <QtCore>
 #include <QtGui>
+#ifdef _WIN32
 #include <qt_windows.h>
-#endif
\ No newline at end of file
+#endif
+#endif
--- a/kdiff3/src-QT4/version.h	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/src-QT4/version.h	Tue Jan 06 17:51:29 2009 +0000
@@ -1,2 +1,2 @@
 #undef VERSION
-#define VERSION "0.9.92-Qt4"
+#define VERSION "0.9.93"
--- a/kdiff3/windows_installer/README_WIN.txt	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/windows_installer/README_WIN.txt	Tue Jan 06 17:51:29 2009 +0000
@@ -2,8 +2,8 @@
 =========================
 
 Author: Joachim Eibl  (joachim.eibl@gmx.de)
-Copyright: (C) 2002-2007 by Joachim Eibl
-KDiff3-Version: 0.9.92
+Copyright: (C) 2002-2009 by Joachim Eibl
+KDiff3-Version: 0.9.93
 Homepage: http://kdiff3.sourceforge.net
 
 KDiff3 is a program that
@@ -18,15 +18,6 @@
 
 See the Changelog.txt for a list of fixed bugs and new features.
 
-Switching to Qt4
-================
-
-The current binary kdiff3.exe is Qt3 based. In the long run I will 
-switch to Qt4. For testing purposes a KDiff3-Qt4.exe binary is 
-included in the installation also. It has the big advantage that no
-console windows will open for external commands like the preprocessors.
-Please report bugs for the Qt4-based version too.
-
 
 Windows-specific information for the precompiled KDiff3 version:
 ================================================================
--- a/kdiff3/windows_installer/kdiff3.nsi	Tue Jan 06 17:15:53 2009 +0000
+++ b/kdiff3/windows_installer/kdiff3.nsi	Tue Jan 06 17:51:29 2009 +0000
@@ -3,7 +3,7 @@
 ;Apdapted for KDiff3 by Sebastien Fricker and Joachim Eibl
 ;Requires nsis_v2.19
 
-!define KDIFF3_VERSION "0.9.92"
+!define KDIFF3_VERSION "0.9.93"
 !define DIFF_EXT_CLSID "{9F8528E4-AB20-456E-84E5-3CE69D8720F3}"
 
 ;--------------------------------
@@ -224,9 +224,6 @@
   ;ADD YOUR OWN FILES HERE...
     DetailPrint "Writing files"
     File "kdiff3.exe"
-    File "kdiff3-QT4.exe"
-    File "QtGui4.dll"
-    File "QtCore4.dll"
     File "COPYING.txt"
     File "Readme_Win.txt"
     File "ChangeLog.txt"
@@ -243,7 +240,6 @@
     ;Create shortcuts
     CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\KDiff3.lnk" "$INSTDIR\kdiff3.exe"
-    CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\KDiff3-Qt4.lnk" "$INSTDIR\kdiff3-QT4.exe"
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Readme.lnk" "$INSTDIR\Readme_Win.txt"
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GPL.lnk"    "$INSTDIR\Copying.txt"
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
@@ -272,7 +268,7 @@
   DetailPrint "Integration to Explorer"
 ;  WriteRegStr HKCR "Directory\shell\KDiff3" "" '&KDiff3'
 ;  WriteRegStr HKCR "Directory\shell\KDiff3\command" "" '"$INSTDIR\kdiff3.exe" "%1"'
-    CreateShortCut "$SMPROGRAMS\..\..\SendTo\KDiff3.lnk" '"$INSTDIR\kdiff3.exe"'
+    CreateShortCut "$SENDTO\KDiff3.lnk" '"$INSTDIR\kdiff3.exe"'
 SectionEnd
 
 Section "Diff-Ext" SecIntegrationDiffExtForKDiff3
@@ -381,8 +377,6 @@
   Delete "$INSTDIR\Uninstall.exe"
   Delete "$INSTDIR\kdiff3.exe"
   Delete "$INSTDIR\kdiff3-QT4.exe"
-  Delete "$INSTDIR\QtGui4.dll"
-  Delete "$INSTDIR\QtCore4.dll"
   Delete "$INSTDIR\COPYING.txt"
   Delete "$INSTDIR\Readme_Win.txt"
   Delete "$INSTDIR\ChangeLog.txt"
@@ -405,7 +399,7 @@
 
   Delete "$SMPROGRAMS\$MUI_TEMP\Documentation.lnk"
   Delete "$QUICKLAUNCH\KDiff3.lnk"
-  Delete "$SMPROGRAMS\..\..\SendTo\KDiff3.lnk"
+  Delete "$SENDTO\KDiff3.lnk"
   
   ;Delete empty start menu parent diretories
   StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"