]> cloud.milkyroute.net Git - dolphin.git/commitdiff
commited initial version of Dolphin
authorPeter Penz <peter.penz19@gmail.com>
Tue, 21 Nov 2006 06:02:05 +0000 (06:02 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Tue, 21 Nov 2006 06:02:05 +0000 (06:02 +0000)
svn path=/trunk/playground/utils/dolphin/; revision=606622

138 files changed:
AUTHORS [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
COPYING [new file with mode: 0644]
COPYING-DOCS [new file with mode: 0644]
ConfigureChecks.cmake [new file with mode: 0644]
INSTALL [new file with mode: 0644]
README [new file with mode: 0644]
config.h.cmake [new file with mode: 0644]
src/CMakeLists.txt [new file with mode: 0644]
src/README [new file with mode: 0644]
src/bookmarkselector.cpp [new file with mode: 0644]
src/bookmarkselector.h [new file with mode: 0644]
src/bookmarkssettingspage.cpp [new file with mode: 0644]
src/bookmarkssettingspage.h [new file with mode: 0644]
src/bookmarkssidebarpage.cpp [new file with mode: 0644]
src/bookmarkssidebarpage.h [new file with mode: 0644]
src/detailsmodesettings.kcfg [new file with mode: 0644]
src/detailsmodesettings.kcfgc [new file with mode: 0644]
src/detailsviewsettingspage.cpp [new file with mode: 0644]
src/detailsviewsettingspage.h [new file with mode: 0644]
src/directoryviewpropertysettings.kcfg [new file with mode: 0644]
src/directoryviewpropertysettings.kcfgc [new file with mode: 0644]
src/dolphin.cpp [new file with mode: 0644]
src/dolphin.desktop [new file with mode: 0644]
src/dolphin.h [new file with mode: 0644]
src/dolphin.lsm [new file with mode: 0644]
src/dolphincontextmenu.cpp [new file with mode: 0644]
src/dolphincontextmenu.h [new file with mode: 0644]
src/dolphindetailsview.cpp [new file with mode: 0644]
src/dolphindetailsview.h [new file with mode: 0644]
src/dolphindirlister.cpp [new file with mode: 0644]
src/dolphindirlister.h [new file with mode: 0644]
src/dolphiniconsview.cpp [new file with mode: 0644]
src/dolphiniconsview.h [new file with mode: 0644]
src/dolphinsettings.cpp [new file with mode: 0644]
src/dolphinsettings.h [new file with mode: 0644]
src/dolphinsettingsdialog.cpp [new file with mode: 0644]
src/dolphinsettingsdialog.h [new file with mode: 0644]
src/dolphinstatusbar.cpp [new file with mode: 0644]
src/dolphinstatusbar.h [new file with mode: 0644]
src/dolphinui.rc [new file with mode: 0644]
src/dolphinview.cpp [new file with mode: 0644]
src/dolphinview.h [new file with mode: 0644]
src/editbookmarkdialog.cpp [new file with mode: 0644]
src/editbookmarkdialog.h [new file with mode: 0644]
src/filterbar.cpp [new file with mode: 0644]
src/filterbar.h [new file with mode: 0644]
src/generalsettings.kcfg [new file with mode: 0644]
src/generalsettings.kcfgc [new file with mode: 0644]
src/generalsettingspage.cpp [new file with mode: 0644]
src/generalsettingspage.h [new file with mode: 0644]
src/hi128-app-dolphin.png [new file with mode: 0644]
src/hi16-app-dolphin.png [new file with mode: 0644]
src/hi22-app-dolphin.png [new file with mode: 0644]
src/hi32-app-dolphin.png [new file with mode: 0644]
src/hi48-app-dolphin.png [new file with mode: 0644]
src/hi64-app-dolphin.png [new file with mode: 0644]
src/iconsmodesettings.kcfg [new file with mode: 0644]
src/iconsmodesettings.kcfgc [new file with mode: 0644]
src/iconsviewsettingspage.cpp [new file with mode: 0644]
src/iconsviewsettingspage.h [new file with mode: 0644]
src/infosidebarpage.cpp [new file with mode: 0644]
src/infosidebarpage.h [new file with mode: 0644]
src/itemeffectsmanager.cpp [new file with mode: 0644]
src/itemeffectsmanager.h [new file with mode: 0644]
src/main.cpp [new file with mode: 0644]
src/pics/128x128/CMakeLists.txt [new file with mode: 0644]
src/pics/128x128/preview.png [new file with mode: 0644]
src/pics/16x16/CMakeLists.txt [new file with mode: 0644]
src/pics/16x16/editurl.png [new file with mode: 0644]
src/pics/16x16/preview.png [new file with mode: 0644]
src/pics/22x22/CMakeLists.txt [new file with mode: 0644]
src/pics/22x22/preview.png [new file with mode: 0644]
src/pics/32x32/CMakeLists.txt [new file with mode: 0644]
src/pics/32x32/preview.png [new file with mode: 0644]
src/pics/48x48/CMakeLists.txt [new file with mode: 0644]
src/pics/48x48/preview.png [new file with mode: 0644]
src/pics/64x64/CMakeLists.txt [new file with mode: 0644]
src/pics/64x64/preview.png [new file with mode: 0644]
src/pics/CMakeLists.txt [new file with mode: 0644]
src/pixmapviewer.cpp [new file with mode: 0644]
src/pixmapviewer.h [new file with mode: 0644]
src/portinglog.txt [new file with mode: 0644]
src/previewsmodesettings.kcfg [new file with mode: 0644]
src/previewsmodesettings.kcfgc [new file with mode: 0644]
src/progressindicator.cpp [new file with mode: 0644]
src/progressindicator.h [new file with mode: 0644]
src/protocolcombo.cpp [new file with mode: 0644]
src/protocolcombo.h [new file with mode: 0644]
src/renamedialog.cpp [new file with mode: 0644]
src/renamedialog.h [new file with mode: 0644]
src/servicemenus/CMakeLists.txt [new file with mode: 0644]
src/servicemenus/amarok_append.desktop [new file with mode: 0644]
src/servicemenus/ark_compress.desktop [new file with mode: 0644]
src/servicemenus/ark_extract.desktop [new file with mode: 0644]
src/servicemenus/dolphin_su.desktop [new file with mode: 0644]
src/servicemenus/floppy_format.desktop [new file with mode: 0644]
src/servicemenus/imageconverter.desktop [new file with mode: 0644]
src/servicemenus/installfont.desktop [new file with mode: 0644]
src/servicemenus/isoservice.desktop [new file with mode: 0644]
src/servicemenus/jpegorient.desktop [new file with mode: 0644]
src/servicemenus/k3b_create_audio_cd.desktop [new file with mode: 0644]
src/servicemenus/k3b_create_video_cd.desktop [new file with mode: 0644]
src/servicemenus/k3b_write_bin_image.desktop [new file with mode: 0644]
src/servicemenus/k3b_write_iso_image.desktop [new file with mode: 0644]
src/servicemenus/mail_as_attachment.desktop [new file with mode: 0644]
src/servicemenus/media_eject.desktop [new file with mode: 0644]
src/servicemenus/media_mount.desktop [new file with mode: 0644]
src/servicemenus/media_realfolder.desktop [new file with mode: 0644]
src/servicemenus/media_safelyremove.desktop [new file with mode: 0644]
src/servicemenus/media_unmount.desktop [new file with mode: 0644]
src/servicemenus/open_in_digikam.desktop [new file with mode: 0644]
src/settingspagebase.cpp [new file with mode: 0644]
src/settingspagebase.h [new file with mode: 0644]
src/sidebar.cpp [new file with mode: 0755]
src/sidebar.h [new file with mode: 0755]
src/sidebarpage.cpp [new file with mode: 0644]
src/sidebarpage.h [new file with mode: 0644]
src/sidebarsettings.kcfg [new file with mode: 0644]
src/sidebarsettings.kcfgc [new file with mode: 0644]
src/statusbarmessagelabel.cpp [new file with mode: 0644]
src/statusbarmessagelabel.h [new file with mode: 0644]
src/statusbarspaceinfo.cpp [new file with mode: 0644]
src/statusbarspaceinfo.h [new file with mode: 0644]
src/undomanager.cpp [new file with mode: 0644]
src/undomanager.h [new file with mode: 0644]
src/urlbutton.cpp [new file with mode: 0644]
src/urlbutton.h [new file with mode: 0644]
src/urlnavigator.cpp [new file with mode: 0644]
src/urlnavigator.h [new file with mode: 0644]
src/urlnavigatorbutton.cpp [new file with mode: 0644]
src/urlnavigatorbutton.h [new file with mode: 0644]
src/viewproperties.cpp [new file with mode: 0644]
src/viewproperties.h [new file with mode: 0644]
src/viewpropertiesdialog.cpp [new file with mode: 0644]
src/viewpropertiesdialog.h [new file with mode: 0644]
src/viewsettingspage.cpp [new file with mode: 0644]
src/viewsettingspage.h [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..150860b
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,5 @@
+Peter Penz <peter.penz@gmx.at>
+Aaron J. Seigo <aseigo@kde.org>
+
+Cvetoslav Ludmiloff <ludmiloff@gmail.com>
+Stefan Monov <logixoul@gmail.com>
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..dee3c05
--- /dev/null
@@ -0,0 +1,20 @@
+project(dolphin)
+
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
+
+# search packages used by KDE
+find_package(KDE4 REQUIRED)
+include (KDE4Defaults)
+include (MacroLibrary)
+
+add_definitions (-DQT3_SUPPORT -DQT3_SUPPORT_WARNINGS)
+add_definitions (${QT_DEFINITIONS} ${QT_QTDBUS_DEFINITIONS} ${KDE4_DEFINITIONS} -DHAVE_CONFIG_H=1)
+link_directories (${KDE4_LIB_DIR})
+include_directories (${QDBUS_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES})
+
+include (ConfigureChecks.cmake)
+configure_file (config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h )
+
+add_subdirectory(src)
+
+macro_display_feature_log()
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..5185fd3
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,346 @@
+NOTE! The GPL below is copyrighted by the Free Software Foundation, but
+the instance of code that it refers to (the kde programs) are copyrighted
+by the authors who actually wrote it.
+
+---------------------------------------------------------------------------
+                       
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+               51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/COPYING-DOCS b/COPYING-DOCS
new file mode 100644 (file)
index 0000000..4a0fe1c
--- /dev/null
@@ -0,0 +1,397 @@
+               GNU Free Documentation License
+                 Version 1.2, November 2002
+
+
+ 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.
+
+
+0. PREAMBLE
+
+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.
+
+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.
+
+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.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+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.
+
+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.
+
+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.
+
+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.
+
+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.
+
+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".
+
+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.
+
+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.
+
+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.
+
+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.
+
+
+2. VERBATIM COPYING
+
+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.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+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.
+
+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.
+
+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.
+
+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.
+
+
+4. MODIFICATIONS
+
+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:
+
+A. 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.
+B. 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.
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. 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.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. 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.
+J. 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.
+K. 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.
+L. 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.
+M. Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+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.
+
+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.
+
+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.
+
+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.
+
+
+5. COMBINING DOCUMENTS
+
+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.
+
+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.
+
+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".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+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.
+
+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.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+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.
+
+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.
+
+
+8. TRANSLATION
+
+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.
+
+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.
+
+
+9. TERMINATION
+
+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.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+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/.
+
+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.
+
+
+ADDENDUM: How to use this License for your documents
+
+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:
+
+    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".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+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.
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
new file mode 100644 (file)
index 0000000..7870a16
--- /dev/null
@@ -0,0 +1,47 @@
+include(CheckIncludeFile)
+include(CheckIncludeFiles)
+include(CheckSymbolExists)
+include(CheckFunctionExists)
+include(CheckLibraryExists)
+include(CheckPrototypeExists)
+include(CheckTypeSize)
+include(MacroBoolTo01)
+# The FindKDE4.cmake module sets _KDE4_PLATFORM_DEFINITIONS with
+# definitions like _GNU_SOURCE that are needed on each platform.
+set(CMAKE_REQUIRED_DEFINITIONS ${_KDE4_PLATFORM_DEFINITIONS})
+
+macro_bool_to_01(KDE4_XMMS HAVE_XMMS)
+
+#now check for dlfcn.h using the cmake supplied CHECK_include_FILE() macro
+# If definitions like -D_GNU_SOURCE are needed for these checks they
+# should be added to _KDE4_PLATFORM_DEFINITIONS when it is originally
+# defined outside this file.  Here we include these definitions in
+# CMAKE_REQUIRED_DEFINITIONS so they will be included in the build of
+# checks below.
+set(CMAKE_REQUIRED_DEFINITIONS ${_KDE4_PLATFORM_DEFINITIONS})
+if (WIN32)
+   set(CMAKE_REQUIRED_LIBRARIES ${KDEWIN32_LIBRARIES} )
+   set(CMAKE_REQUIRED_INCLUDES  ${KDEWIN32_INCLUDES} )
+endif (WIN32)
+
+check_include_files(stdint.h HAVE_STDINT_H)
+check_include_files(sys/types.h HAVE_SYS_TYPES_H)
+check_include_files(ieeefp.h      HAVE_IEEEFP_H)
+check_include_files(mntent.h      HAVE_MNTENT_H)
+check_include_files(sys/loadavg.h HAVE_SYS_LOADAVG_H)
+check_include_files(sys/mnttab.h  HAVE_SYS_MNTTAB_H)
+check_include_files("sys/param.h;sys/mount.h"  HAVE_SYS_MOUNT_H)
+check_include_files(sys/statfs.h HAVE_SYS_STATFS_H)
+check_include_files(sys/statvfs.h HAVE_SYS_STATVFS_H)
+check_include_files(sys/ucred.h   HAVE_SYS_UCRED_H)
+check_include_files(sys/vfs.h     HAVE_SYS_VFS_H)
+
+check_function_exists(isinf      HAVE_FUNC_ISINF)
+
+check_type_size("int" SIZEOF_INT)
+check_type_size("char *"  SIZEOF_CHAR_P)
+check_type_size("long" SIZEOF_LONG)
+check_type_size("short" SIZEOF_SHORT)
+check_type_size("size_t" SIZEOF_SIZE_T)
+check_type_size("unsigned long" SIZEOF_UNSIGNED_LONG)
+
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..f8bad0c
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   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. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+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/kde/bin', `/usr/local/kde/lib', etc.  You can specify an
+installation prefix other than `/usr/local/kde' 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.
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..a27fb61
--- /dev/null
+++ b/README
@@ -0,0 +1,2 @@
+This version represents the KDE 4 port for Dolphin (see also http://enzosworld.gmxhome.de for details). It's a playground for testing some usability ideas for a file manager.
+
diff --git a/config.h.cmake b/config.h.cmake
new file mode 100644 (file)
index 0000000..b50c3fa
--- /dev/null
@@ -0,0 +1,153 @@
+/* config.h.  Generated by cmake from config.h.cmake */
+
+
+/* If we have Apple PowerBook support */
+/* #undef HAVE_POWERBOOK */
+
+/* Name of package */
+#define PACKAGE "kdeutils"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* The size of a `char *', as computed by sizeof. */
+#define SIZEOF_CHAR_P ${SIZEOF_CHAR_P}
+
+/* The size of a `int', as computed by sizeof. */
+#define SIZEOF_INT ${SIZEOF_INT}
+
+/* The size of a `long', as computed by sizeof. */
+#define SIZEOF_LONG ${SIZEOF_LONG}
+
+/* The size of a `short', as computed by sizeof. */
+#define SIZEOF_SHORT ${SIZEOF_SHORT}
+
+/* The size of a `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T ${SIZEOF_SIZE_T}
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG ${SIZEOF_UNSIGNED_LONG}
+
+/* Version number of package */
+#define VERSION "3.9.02"
+
+/* Defined if compiling without arts */
+#define WITHOUT_ARTS 1
+
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+
+
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+
+
+
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+
+
+
+#if !defined(HAVE_RES_INIT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+int res_init(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_SETENV_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+int setenv (const char *, const char *, int);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STATFS_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  int statfs(const char *path, struct statfs *buffer)
+;
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+
+
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+
+
+/* type to use in place of socklen_t if not defined */
+#define kde_socklen_t socklen_t
+
+/* type to use in place of socklen_t if not defined (deprecated, use
+   kde_socklen_t) */
+#define ksize_t socklen_t
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644 (file)
index 0000000..648fa96
--- /dev/null
@@ -0,0 +1,140 @@
+
+add_subdirectory( pics )
+add_subdirectory( servicemenus )
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### next target ###############
+
+set(dolphin_SRCS 
+   main.cpp 
+   dolphin.cpp 
+   dolphinview.cpp 
+   urlnavigator.cpp 
+   urlnavigatorbutton.cpp 
+   viewpropertiesdialog.cpp 
+   dolphinstatusbar.cpp 
+   dolphindirlister.cpp 
+   viewproperties.cpp 
+   dolphindetailsview.cpp 
+   dolphiniconsview.cpp 
+   dolphinsettings.cpp 
+   bookmarkselector.cpp 
+   urlbutton.cpp 
+   itemeffectsmanager.cpp 
+   dolphincontextmenu.cpp 
+   undomanager.cpp 
+   progressindicator.cpp 
+   iconsviewsettingspage.cpp 
+   pixmapviewer.cpp 
+   dolphinsettingsdialog.cpp 
+   viewsettingspage.cpp 
+   detailsviewsettingspage.cpp 
+   statusbarmessagelabel.cpp 
+   generalsettingspage.cpp 
+   bookmarkssettingspage.cpp 
+   editbookmarkdialog.cpp 
+   settingspagebase.cpp 
+   sidebar.cpp 
+   sidebarpage.cpp 
+   bookmarkssidebarpage.cpp 
+   infosidebarpage.cpp 
+   statusbarspaceinfo.cpp 
+   renamedialog.cpp 
+   filterbar.cpp 
+   protocolcombo.cpp )
+
+kde4_automoc(${dolphin_SRCS})
+
+kde4_add_kcfg_files(dolphin_SRCS 
+   directoryviewpropertysettings.kcfgc
+   generalsettings.kcfgc
+   iconsmodesettings.kcfgc
+   detailsmodesettings.kcfgc
+   previewsmodesettings.kcfgc
+   sidebarsettings.kcfgc )
+
+kde4_add_executable(dolphin ${dolphin_SRCS})
+
+target_link_libraries(dolphin  ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} )
+
+install(TARGETS dolphin DESTINATION ${BIN_INSTALL_DIR})
+
+
+########### install files ###############
+
+install( FILES  dolphin.desktop DESTINATION ${XDG_APPS_DIR} )
+install( FILES  directoryviewpropertysettings.kcfg generalsettings.kcfg                                iconsmodesettings.kcfg detailsmodesettings.kcfg previewsmodesettings.kcfg                               sidebarsettings.kcfg DESTINATION ${KCFG_INSTALL_DIR} )
+install( FILES  dolphinui.rc DESTINATION ${DATA_INSTALL_DIR}/dolphin )
+install( FILES  DESTINATION ${APPLNK_INSTALL_DIR}/System )
+
+kde4_install_icons( ${ICON_INSTALL_DIR} )
+
+
+
+#original Makefile.am contents follow:
+
+### Makefile.am for dolphin
+#
+#SUBDIRS = pics servicemenus
+#
+## this is the program that gets installed.  it's name is used for all
+## of the other Makefile.am variables
+#bin_PROGRAMS = dolphin
+#
+## set the include path for X, qt and KDE
+#INCLUDES         = $(all_includes)
+#
+## the library search path.
+#dolphin_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+#
+## the libraries to link against.
+#dolphin_LDADD   = $(LIB_KFILE) $(LIB_KDEPRINT)
+#
+## which sources should be compiled for dolphin
+#dolphin_SOURCES = main.cpp dolphin.cpp dolphinview.cpp urlnavigator.cpp directoryviewpropertysettings.kcfgc \
+#              urlnavigatorbutton.cpp viewpropertiesdialog.cpp dolphinstatusbar.cpp dolphindirlister.cpp \
+#              viewproperties.cpp dolphindetailsview.cpp dolphiniconsview.cpp dolphinsettings.cpp \
+#              bookmarkselector.cpp urlbutton.cpp itemeffectsmanager.cpp \
+#              dolphincontextmenu.cpp undomanager.cpp progressindicator.cpp \
+#              iconsviewsettingspage.cpp pixmapviewer.cpp dolphinsettingsdialog.cpp \
+#              viewsettingspage.cpp detailsviewsettingspage.cpp statusbarmessagelabel.cpp \
+#              generalsettingspage.cpp bookmarkssettingspage.cpp \
+#              editbookmarkdialog.cpp settingspagebase.cpp sidebar.cpp sidebarpage.cpp \
+#              bookmarkssidebarpage.cpp infosidebarpage.cpp statusbarspaceinfo.cpp renamedialog.cpp \
+#              filterbar.cpp protocolcombo.cpp generalsettings.kcfgc iconsmodesettings.kcfgc \
+#              detailsmodesettings.kcfgc previewsmodesettings.kcfgc sidebarsettings.kcfgc
+#
+## these are the headers for your project
+#noinst_HEADERS = dolphin.h dolphinview.h urlnavigator.h urlnavigatorbutton.h \
+#              viewpropertiesdialog.h dolphinstatusbar.h dolphindirlister.h viewproperties.h \
+#              dolphindetailsview.h dolphiniconsview.h dolphinsettings.h bookmarkselector.h \
+#              urlbutton.h itemeffectsmanager.h dolphincontextmenu.h undomanager.h \
+#              iconsviewsettingspage.h pixmapviewer.h \
+#              dolphinsettingsdialog.h detailsviewsettingspage.h viewsettingspage.h statusbarmessagelabel.h \
+#              generalsettingspage.h bookmarkssettingspage.h editbookmarkdialog.h \
+#              settingspagebase.h statusbarspaceinfo.h renamedialog.h sidebar.h sidebarsettings.h sidebarpage.h \
+#              bookmarkssidebarpage.h infosidebarpage.h protocolcombo.h
+#              infosidebarpage.h filterbar.h protocolcombo.h
+#
+## let automoc handle all of the meta source files (moc)
+#METASOURCES = AUTO
+#
+#messages: rc.cpp
+#      $(EXTRACTRC) `find . -name \*.ui -o -name \*.rc` > rc.cpp
+#      $(XGETTEXT) *.cpp -o $(podir)/dolphin.pot
+#
+## this is where the kdelnk file will go
+#kdelnkdir   = $(kde_appsdir)/System
+#xdg_apps_DATA = dolphin.desktop
+#
+## this is where the XML-GUI resource file goes
+#rcdir = $(kde_datadir)/dolphin
+#rc_DATA = dolphinui.rc
+#
+#kde_kcfg_DATA = directoryviewpropertysettings.kcfg generalsettings.kcfg \
+#                              iconsmodesettings.kcfg detailsmodesettings.kcfg previewsmodesettings.kcfg \
+#                              sidebarsettings.kcfg
+#
+#KDE_ICON = AUTO
diff --git a/src/README b/src/README
new file mode 100644 (file)
index 0000000..f04a563
--- /dev/null
@@ -0,0 +1,81 @@
+-----------------------------------------------
+Kde application framework template quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything 
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make 
+them more maintainable.
+
+For more details, consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app 
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/src/bookmarkselector.cpp b/src/bookmarkselector.cpp
new file mode 100644 (file)
index 0000000..4c091d3
--- /dev/null
@@ -0,0 +1,171 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+
+#include <assert.h>
+#include <q3popupmenu.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+
+#include <kiconloader.h>
+#include <kglobalsettings.h>
+#include <kbookmarkmanager.h>
+
+#include "bookmarkselector.h"
+#include "dolphinsettings.h"
+#include "dolphinview.h"
+#include "dolphin.h"
+#include "urlnavigator.h"
+
+BookmarkSelector::BookmarkSelector(URLNavigator* parent) :
+    URLButton(parent),
+    m_selectedIndex(0)
+{
+    setFocusPolicy(QWidget::NoFocus);
+
+    m_bookmarksMenu = new Q3PopupMenu(this);
+
+    KBookmarkGroup root = DolphinSettings::instance().bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+    int i = 0;
+    while (!bookmark.isNull()) {
+        m_bookmarksMenu->insertItem(MainBarIcon(bookmark.icon()),
+                                    bookmark.text(),
+                                    i);
+        if (i == m_selectedIndex) {
+            QPixmap pixmap = SmallIcon(bookmark.icon());
+            setPixmap(pixmap);
+            setMinimumWidth(pixmap.width() + 2);
+        }
+        bookmark = root.next(bookmark);
+        ++i;
+    }
+
+    connect(m_bookmarksMenu, SIGNAL(activated(int)),
+            this, SLOT(slotBookmarkActivated(int)));
+
+    setPopup(m_bookmarksMenu);
+}
+
+BookmarkSelector::~BookmarkSelector()
+{
+}
+
+void BookmarkSelector::updateSelection(const KUrl& url)
+{
+    KBookmarkGroup root = DolphinSettings::instance().bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+
+    int maxLength = 0;
+    m_selectedIndex = -1;
+
+    // Search the bookmark which is equal to the URL or at least is a parent URL.
+    // If there are more than one possible parent URL candidates, choose the bookmark
+    // which covers the bigger range of the URL.
+    int i = 0;
+    while (!bookmark.isNull()) {
+        const KUrl bookmarkURL = bookmark.url();
+        if (bookmarkURL.isParentOf(url)) {
+            const int length = bookmarkURL.prettyURL().length();
+            if (length > maxLength) {
+                m_selectedIndex = i;
+                setPixmap(SmallIcon(bookmark.icon()));
+                maxLength = length;
+            }
+        }
+        bookmark = root.next(bookmark);
+        ++i;
+    }
+
+    if (m_selectedIndex < 0) {
+        // No bookmark has been found which matches to the given URL. Show
+        // a generic folder icon as pixmap for indication:
+        setPixmap(SmallIcon("folder"));
+    }
+}
+
+KBookmark BookmarkSelector::selectedBookmark() const
+{
+    return DolphinSettings::instance().bookmark(m_selectedIndex);
+}
+
+void BookmarkSelector::drawButton(QPainter* painter)
+{
+    const int buttonWidth  = width();
+    const int buttonHeight = height();
+
+    QColor backgroundColor;
+    QColor foregroundColor;
+    const bool isHighlighted = isDisplayHintEnabled(EnteredHint) ||
+        isDisplayHintEnabled(DraggedHint);
+    if (isHighlighted) {
+        backgroundColor = KGlobalSettings::highlightColor();
+        foregroundColor = KGlobalSettings::highlightedTextColor();
+    }
+    else {
+        backgroundColor = colorGroup().background();
+        foregroundColor = KGlobalSettings::buttonTextColor();
+    }
+
+    // dimm the colors if the parent view does not have the focus
+    const DolphinView* parentView = urlNavigator()->dolphinView();
+    const Dolphin& dolphin = Dolphin::mainWin();
+
+    const bool isActive = (dolphin.activeView() == parentView);
+    if (!isActive) {
+        QColor dimmColor(colorGroup().background());
+        foregroundColor = mixColors(foregroundColor, dimmColor);
+        if (isHighlighted) {
+            backgroundColor = mixColors(backgroundColor, dimmColor);
+        }
+    }
+
+    if (!(isDisplayHintEnabled(ActivatedHint) && isActive) && !isHighlighted) {
+        // dimm the foreground color by mixing it with the background
+        foregroundColor = mixColors(foregroundColor, backgroundColor);
+        painter->setPen(foregroundColor);
+    }
+
+    // draw button backround
+    painter->setPen(NoPen);
+    painter->setBrush(backgroundColor);
+    painter->drawRect(0, 0, buttonWidth, buttonHeight);
+
+    // draw icon
+    const QPixmap* icon = pixmap();
+    if (icon != 0) {
+        const int x = (buttonWidth - icon->width()) / 2;
+        const int y = (buttonHeight - icon->height()) / 2;
+        painter->drawPixmap(x, y, *icon);
+    }
+}
+
+void BookmarkSelector::slotBookmarkActivated(int index)
+{
+    m_selectedIndex = index;
+
+    KBookmark bookmark = selectedBookmark();
+    setPixmap(SmallIcon(bookmark.icon()));
+
+    emit bookmarkActivated(index);
+}
+
+#include "bookmarkselector.moc"
+
diff --git a/src/bookmarkselector.h b/src/bookmarkselector.h
new file mode 100644 (file)
index 0000000..209cf73
--- /dev/null
@@ -0,0 +1,100 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef BOOKMARKSELECTOR_H
+#define BOOKMARKSELECTOR_H
+
+#include <kbookmark.h>
+#include <urlbutton.h>
+//Added by qt3to4:
+#include <Q3PopupMenu>
+
+class URLNavigator;
+class Q3PopupMenu;
+class KUrl;
+
+/**
+ * @brief Allows to select a bookmark from a popup menu.
+ *
+ * The icon from the current selected bookmark is shown
+ * inside the bookmark selector.
+ *
+ * @see URLNavigator
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class BookmarkSelector : public URLButton
+{
+    Q_OBJECT
+
+public:
+    /**
+     * @param parent Parent widget where the bookmark selector
+     *               is embedded into.
+     */
+    BookmarkSelector(URLNavigator* parent);
+
+    virtual ~BookmarkSelector();
+
+    /**
+     * Updates the selection dependent from the given URL \a url. The
+     * URL must not match exactly to one of the available bookmarks:
+     * The bookmark which is equal to the URL or at least is a parent URL
+     * is selected. If there are more than one possible parent URL candidates,
+     * the bookmark which covers the bigger range of the URL is selected.
+     */
+    void updateSelection(const KUrl& url);
+
+    /**
+     * Returns the index of the selected bookmark. To get
+     * the bookmark, use BookmarkSelector::selectedBookmark().
+     */
+    int selectedIndex() const { return m_selectedIndex; }
+
+    /** Returns the selected bookmark. */
+    KBookmark selectedBookmark() const;
+
+signals:
+    /**
+     * Is send when a bookmark has been activated by the user.
+     * @param index Index of the selected bookmark.
+     */
+    void bookmarkActivated(int index);
+
+protected:
+    /**
+     * Draws the icon of the selected URL as content of the URL
+     * selector.
+     */
+    virtual void drawButton(QPainter* painter);
+
+private slots:
+    /**
+     * Updates the selected index and the icon if a bookmark
+     * has been activated by the user.
+     */
+    void slotBookmarkActivated(int index);
+
+private:
+    int m_selectedIndex;
+    Q3PopupMenu* m_bookmarksMenu;
+
+};
+
+#endif
diff --git a/src/bookmarkssettingspage.cpp b/src/bookmarkssettingspage.cpp
new file mode 100644 (file)
index 0000000..58b0653
--- /dev/null
@@ -0,0 +1,318 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "bookmarkssettingspage.h"
+
+#include <assert.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <q3vbox.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <Q3VBoxLayout>
+
+#include <kbookmark.h>
+#include <kbookmarkmanager.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+
+#include "dolphinsettings.h"
+#include "editbookmarkdialog.h"
+
+BookmarksSettingsPage::BookmarksSettingsPage(QWidget*parent) :
+    SettingsPageBase(parent),
+    m_addButton(0),
+    m_removeButton(0),
+    m_moveUpButton(0),
+    m_moveDownButton(0)
+{
+    Q3VBoxLayout* topLayout = new Q3VBoxLayout(parent, 2, KDialog::spacingHint());
+
+    const int spacing = KDialog::spacingHint();
+
+    Q3HBox* hBox = new Q3HBox(parent);
+    hBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    hBox->setSpacing(spacing);
+    hBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
+
+    m_listView = new KListView(hBox);
+    m_listView->addColumn(i18n("Icon"));
+    m_listView->addColumn(i18n("Name"));
+    m_listView->addColumn(i18n("Location"));
+    m_listView->setResizeMode(Q3ListView::LastColumn);
+    m_listView->setColumnAlignment(0, Qt::AlignHCenter);
+    m_listView->setAllColumnsShowFocus(true);
+    m_listView->setSorting(-1);
+    connect(m_listView, SIGNAL(selectionChanged()),
+            this, SLOT(updateButtons()));
+    connect(m_listView, SIGNAL(pressed(Q3ListViewItem*)),
+            this, SLOT(slotBookmarkPressed(Q3ListViewItem*)));
+    connect(m_listView, SIGNAL(doubleClicked(Q3ListViewItem*, const QPoint&, int)),
+            this, SLOT(slotBookmarkDoubleClicked(Q3ListViewItem*, const QPoint&, int)));
+
+    Q3VBox* buttonBox = new Q3VBox(hBox);
+    buttonBox->setSpacing(spacing);
+
+    const QSizePolicy buttonSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+
+    m_addButton = new KPushButton(i18n("Add..."), buttonBox);
+    connect(m_addButton, SIGNAL(clicked()),
+            this, SLOT(slotAddButtonClicked()));
+    m_addButton->setSizePolicy(buttonSizePolicy);
+
+    m_editButton = new KPushButton(i18n("Edit..."), buttonBox);
+    connect(m_editButton, SIGNAL(clicked()),
+            this, SLOT(slotEditButtonClicked()));
+    m_editButton->setSizePolicy(buttonSizePolicy);
+
+    m_removeButton = new KPushButton(i18n("Remove"), buttonBox);
+    connect(m_removeButton, SIGNAL(clicked()),
+            this, SLOT(slotRemoveButtonClicked()));
+    m_removeButton->setSizePolicy(buttonSizePolicy);
+
+    m_moveUpButton = new KPushButton(i18n("Move Up"), buttonBox);
+    connect(m_moveUpButton, SIGNAL(clicked()),
+            this, SLOT(slotMoveUpButtonClicked()));
+    m_moveUpButton->setSizePolicy(buttonSizePolicy);
+
+    m_moveDownButton = new KPushButton(i18n("Move Down"), buttonBox);
+    connect(m_moveDownButton, SIGNAL(clicked()),
+            this, SLOT(slotMoveDownButtonClicked()));
+    m_moveDownButton->setSizePolicy(buttonSizePolicy);
+
+    // Add a dummy widget with no restriction regarding a vertical resizing.
+    // This assures that the spacing between the buttons is not increased.
+    new QWidget(buttonBox);
+
+    topLayout->addWidget(hBox);
+
+    // insert all editable bookmarks.
+    KBookmarkGroup root = DolphinSettings::instance().bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+
+    Q3ListViewItem* prev = 0;
+    while (!bookmark.isNull()) {
+        Q3ListViewItem* item = new Q3ListViewItem(m_listView);
+        item->setPixmap(PixmapIdx, SmallIcon(bookmark.icon()));
+        item->setText(NameIdx, bookmark.text());
+        item->setText(URLIdx, bookmark.url().prettyURL());
+
+        // add hidden column to be able to retrieve the icon name again
+        item->setText(IconIdx, bookmark.icon());
+
+        m_listView->insertItem(item);
+        if (prev != 0) {
+            item->moveItem(prev);
+        }
+        prev = item;
+
+        bookmark = root.next(bookmark);
+    }
+    m_listView->setSelected(m_listView->firstChild(), true);
+
+    updateButtons();
+}
+
+
+BookmarksSettingsPage::~BookmarksSettingsPage()
+{
+}
+
+void BookmarksSettingsPage::applySettings()
+{
+    // delete all bookmarks
+    KBookmarkManager* manager = DolphinSettings::instance().bookmarkManager();
+    KBookmarkGroup root = manager->root();
+    KBookmark bookmark = root.first();
+    while (!bookmark.isNull()) {
+        root.deleteBookmark(bookmark);
+        bookmark = root.first();
+    }
+
+    // add all items as bookmarks
+    Q3ListViewItem* item = m_listView->firstChild();
+    while (item != 0) {
+        root.addBookmark(manager,
+                         item->text(NameIdx),
+                         KURL(item->text(URLIdx)),
+                         item->text(IconIdx)); // hidden column
+        item = item->itemBelow();
+    }
+
+    manager->emitChanged(root);
+}
+
+void BookmarksSettingsPage::updateButtons()
+{
+    const Q3ListViewItem* selectedItem = m_listView->selectedItem();
+    const bool hasSelection = (selectedItem != 0);
+
+    m_editButton->setEnabled(hasSelection);
+    m_removeButton->setEnabled(hasSelection);
+
+    const bool enableMoveUp = hasSelection &&
+                              (selectedItem != m_listView->firstChild());
+    m_moveUpButton->setEnabled(enableMoveUp);
+
+    const bool enableMoveDown = hasSelection &&
+                                (selectedItem != m_listView->lastChild());
+    m_moveDownButton->setEnabled(enableMoveDown);
+}
+
+void BookmarksSettingsPage::slotBookmarkDoubleClicked(Q3ListViewItem*,
+                                                      const QPoint&,
+                                                      int)
+{
+    slotEditButtonClicked();
+}
+
+void BookmarksSettingsPage::slotBookmarkPressed(Q3ListViewItem* item)
+{
+    if (item == 0) {
+        m_listView->setSelected(m_listView->currentItem(), true);
+    }
+}
+
+void BookmarksSettingsPage::slotAddButtonClicked()
+{
+    KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add Bookmark"),
+                                                         i18n("New bookmark"),
+                                                         KURL(),
+                                                         "bookmark");
+    if (!bookmark.isNull()) {
+        // insert bookmark into listview
+        Q3ListViewItem* item = new Q3ListViewItem(m_listView);
+        item->setPixmap(PixmapIdx, SmallIcon(bookmark.icon()));
+        item->setText(NameIdx, bookmark.text());
+        item->setText(URLIdx, bookmark.url().prettyURL());
+        item->setText(IconIdx, bookmark.icon());
+        m_listView->insertItem(item);
+
+        Q3ListViewItem* lastItem = m_listView->lastChild();
+        if (lastItem != 0) {
+            item->moveItem(lastItem);
+        }
+
+        m_listView->setSelected(item, true);
+        updateButtons();
+    }
+}
+
+void BookmarksSettingsPage::slotEditButtonClicked()
+{
+    Q3ListViewItem* item = m_listView->selectedItem();
+    assert(item != 0); // 'edit' may not get invoked when having no items
+
+    KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Edit Bookmark"),
+                                                         item->text(NameIdx),
+                                                         KURL(item->text(URLIdx)),
+                                                         item->text(IconIdx));
+    if (!bookmark.isNull()) {
+        item->setPixmap(PixmapIdx, SmallIcon(bookmark.icon()));
+        item->setText(NameIdx, bookmark.text());
+        item->setText(URLIdx, bookmark.url().prettyURL());
+        item->setText(IconIdx, bookmark.icon());
+    }
+}
+
+void BookmarksSettingsPage::slotRemoveButtonClicked()
+{
+    Q3ListViewItem* selectedItem = m_listView->selectedItem();
+    assert(selectedItem != 0);
+    Q3ListViewItem* nextItem = selectedItem->itemBelow();
+    if (nextItem == 0) {
+        nextItem = selectedItem->itemAbove();
+    }
+
+    m_listView->takeItem(selectedItem);
+    if (nextItem != 0) {
+        m_listView->setSelected(nextItem, true);
+    }
+}
+
+void BookmarksSettingsPage::slotMoveUpButtonClicked()
+{
+    moveBookmark(-1);
+}
+
+void BookmarksSettingsPage::slotMoveDownButtonClicked()
+{
+    moveBookmark(+1);
+}
+
+int BookmarksSettingsPage::selectedBookmarkIndex() const
+{
+    int index = -1;
+
+    Q3ListViewItem* selectedItem = m_listView->selectedItem();
+    if (selectedItem != 0) {
+        index = 0;
+        Q3ListViewItem* item = m_listView->firstChild();
+        while (item != selectedItem) {
+            item = item->nextSibling();
+            ++index;
+        }
+    }
+
+    return index;
+}
+
+void BookmarksSettingsPage::moveBookmark(int direction)
+{
+    // this implementation currently only allows moving of bookmarks
+    // one step up or down
+    assert((direction >= -1) && (direction <= +1));
+
+    // swap bookmarks in listview
+    Q3ListViewItem* selectedItem = m_listView->selectedItem();
+    assert(selectedItem != 0);
+    Q3ListViewItem* item = (direction < 0) ? selectedItem->itemAbove() :
+                                            selectedItem->itemBelow();
+    assert(item != 0);
+
+    QPixmap pixmap;
+    if (item->pixmap(0) != 0) {
+        pixmap = *(item->pixmap(0));
+    }
+    QString name(item->text(NameIdx));
+    QString url(item->text(URLIdx));
+    QString icon(item->text(IconIdx));
+
+    if (selectedItem->pixmap(0) != 0) {
+        item->setPixmap(PixmapIdx, *(selectedItem->pixmap(0)));
+    }
+    item->setText(NameIdx, selectedItem->text(NameIdx));
+    item->setText(URLIdx, selectedItem->text(URLIdx));
+    item->setText(IconIdx, selectedItem->text(IconIdx));
+
+    selectedItem->setPixmap(PixmapIdx, pixmap);
+    selectedItem->setText(NameIdx, name);
+    selectedItem->setText(URLIdx, url);
+    selectedItem->setText(IconIdx, icon);
+
+    m_listView->setSelected(item, true);
+}
+
+#include "bookmarkssettingspage.moc"
diff --git a/src/bookmarkssettingspage.h b/src/bookmarkssettingspage.h
new file mode 100644 (file)
index 0000000..8636ad7
--- /dev/null
@@ -0,0 +1,93 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef BOOKMARKSSETTINGSPAGE_H
+#define BOOKMARKSSETTINGSPAGE_H
+
+#include <settingspagebase.h>
+#include <q3valuelist.h>
+
+class KListView;
+class KPushButton;
+class Q3ListViewItem;
+
+/**
+ * @brief Represents the page from the Dolphin Settings which allows
+ *        to modify the bookmarks.
+ */
+class BookmarksSettingsPage : public SettingsPageBase
+{
+    Q_OBJECT
+
+public:
+    BookmarksSettingsPage(QWidget* parent);
+
+    virtual ~BookmarksSettingsPage();
+
+    /** @see SettingsPageBase::applySettings */
+    virtual void applySettings();
+
+private slots:
+    void updateButtons();
+    void slotBookmarkDoubleClicked(Q3ListViewItem*, const QPoint&, int);
+    void slotAddButtonClicked();
+    void slotEditButtonClicked();
+    void slotRemoveButtonClicked();
+    void slotMoveUpButtonClicked();
+    void slotMoveDownButtonClicked();
+
+    /**
+     * Is connected with the signal QListView::pressed(QListViewItem* item)
+     * and assures that always one bookmarks stays selected although a
+     * click has been done on the viewport area.
+     * TODO: this is a workaround, possibly there is a more easy approach
+     * doing this...
+     */
+    void slotBookmarkPressed(Q3ListViewItem* item);
+
+private:
+    enum ColumnIndex {
+        PixmapIdx = 0,
+        NameIdx   = 1,
+        URLIdx    = 2,
+        IconIdx   = 3
+    };
+
+    KListView* m_listView;
+    KPushButton* m_addButton;
+    KPushButton* m_editButton;
+    KPushButton* m_removeButton;
+    KPushButton* m_moveUpButton;
+    KPushButton* m_moveDownButton;
+
+    /**
+     * Returns the index of the selected bookmark
+     * inside the bookmarks listview.
+     */
+    int selectedBookmarkIndex() const;
+
+    /**
+     * Moves the currently selected bookmark up, if 'direction'
+     * is < 0, otherwise the bookmark is moved down.
+     */
+    void moveBookmark(int direction);
+};
+
+#endif
diff --git a/src/bookmarkssidebarpage.cpp b/src/bookmarkssidebarpage.cpp
new file mode 100644 (file)
index 0000000..deb3119
--- /dev/null
@@ -0,0 +1,277 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "bookmarkssidebarpage.h"
+
+#include <q3listbox.h>
+#include <qlayout.h>
+#include <qpainter.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <Q3VBoxLayout>
+#include <QPaintEvent>
+#include <assert.h>
+#include <q3popupmenu.h>
+
+#include <kbookmark.h>
+#include <kbookmarkmanager.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "dolphinsettings.h"
+#include "dolphin.h"
+#include "dolphinview.h"
+#include "editbookmarkdialog.h"
+
+BookmarksSidebarPage::BookmarksSidebarPage(QWidget* parent) :
+    SidebarPage(parent)
+{
+    Q3VBoxLayout* layout = new Q3VBoxLayout(this);
+    m_bookmarksList = new BookmarksListBox(this);
+    m_bookmarksList->setPaletteBackgroundColor(colorGroup().background());
+
+    layout->addWidget(m_bookmarksList);
+    connect(m_bookmarksList, SIGNAL(mouseButtonClicked(int, Q3ListBoxItem*, const QPoint&)),
+            this, SLOT(slotMouseButtonClicked(int, Q3ListBoxItem*)));
+    connect(m_bookmarksList, SIGNAL(contextMenuRequested(Q3ListBoxItem*, const QPoint&)),
+            this, SLOT(slotContextMenuRequested(Q3ListBoxItem*, const QPoint&)));
+
+    KBookmarkManager* manager = DolphinSettings::instance().bookmarkManager();
+    connect(manager, SIGNAL(changed(const QString&, const QString&)),
+            this, SLOT(updateBookmarks()));
+
+    updateBookmarks();
+}
+
+BookmarksSidebarPage::~BookmarksSidebarPage()
+{
+}
+
+void BookmarksSidebarPage::activeViewChanged()
+{
+    connectToActiveView();
+}
+
+void BookmarksSidebarPage::updateBookmarks()
+{
+    m_bookmarksList->clear();
+
+    KIconLoader iconLoader;
+
+    KBookmarkGroup root = DolphinSettings::instance().bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+    while (!bookmark.isNull()) {
+        QPixmap icon(iconLoader.loadIcon(bookmark.icon(),
+                                         KIcon::NoGroup,
+                                         KIcon::SizeMedium));
+        BookmarkItem* item = new BookmarkItem(icon, bookmark.text());
+        m_bookmarksList->insertItem(item);
+
+        bookmark = root.next(bookmark);
+    }
+
+    connectToActiveView();
+}
+
+void BookmarksSidebarPage::slotMouseButtonClicked(int button, Q3ListBoxItem* item)
+{
+    if ((button != Qt::LeftButton) || (item == 0)) {
+        return;
+    }
+
+    const int index = m_bookmarksList->index(item);
+    KBookmark bookmark = DolphinSettings::instance().bookmark(index);
+    Dolphin::mainWin().activeView()->setURL(bookmark.url());
+}
+
+void BookmarksSidebarPage::slotContextMenuRequested(Q3ListBoxItem* item,
+                                                    const QPoint& pos)
+{
+    const int insertID = 1;
+    const int editID = 2;
+    const int deleteID = 3;
+    const int addID = 4;
+
+    Q3PopupMenu* popup = new Q3PopupMenu();
+    if (item == 0) {
+        popup->insertItem(SmallIcon("filenew"), i18n("Add Bookmark..."), addID);
+    }
+    else {
+        popup->insertItem(SmallIcon("filenew"), i18n("Insert Bookmark..."), insertID);
+        popup->insertItem(SmallIcon("edit"), i18n("Edit..."), editID);
+        popup->insertItem(SmallIcon("editdelete"), i18n("Delete"), deleteID);
+    }
+
+    KBookmarkManager* manager = DolphinSettings::instance().bookmarkManager();
+    KBookmarkGroup root = manager->root();
+    const int index = m_bookmarksList->index(m_bookmarksList->selectedItem());
+
+    const int result = popup->exec(pos);
+    switch (result) {
+        case insertID: {
+            KBookmark newBookmark = EditBookmarkDialog::getBookmark(i18n("Insert Bookmark"),
+                                                                    "New bookmark",
+                                                                    KURL(),
+                                                                    "bookmark");
+            if (!newBookmark.isNull()) {
+                root.addBookmark(manager, newBookmark);
+                if (index > 0) {
+                    KBookmark prevBookmark = DolphinSettings::instance().bookmark(index - 1);
+                    root.moveItem(newBookmark, prevBookmark);
+                }
+                else {
+                    // insert bookmark at first position (is a little bit tricky as KBookmarkGroup
+                    // only allows to move items after existing items)
+                    KBookmark firstBookmark = root.first();
+                    root.moveItem(newBookmark, firstBookmark);
+                    root.moveItem(firstBookmark, newBookmark);
+                }
+                manager->emitChanged(root);
+            }
+            break;
+        }
+
+        case editID: {
+            KBookmark oldBookmark = DolphinSettings::instance().bookmark(index);
+            KBookmark newBookmark = EditBookmarkDialog::getBookmark(i18n("Edit Bookmark"),
+                                                                    oldBookmark.text(),
+                                                                    oldBookmark.url(),
+                                                                    oldBookmark.icon());
+            if (!newBookmark.isNull()) {
+                root.addBookmark(manager, newBookmark);
+                root.moveItem(newBookmark, oldBookmark);
+                root.deleteBookmark(oldBookmark);
+                manager->emitChanged(root);
+            }
+            break;
+        }
+
+        case deleteID: {
+            KBookmark bookmark = DolphinSettings::instance().bookmark(index);
+            root.deleteBookmark(bookmark);
+            manager->emitChanged(root);
+            break;
+        }
+
+        case addID: {
+            KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add Bookmark"),
+                                                                 "New bookmark",
+                                                                 KURL(),
+                                                                 "bookmark");
+            if (!bookmark.isNull()) {
+                root.addBookmark(manager, bookmark);
+                manager->emitChanged(root);
+            }
+        }
+
+        default: break;
+    }
+
+    delete popup;
+    popup = 0;
+
+    DolphinView* view = Dolphin::mainWin().activeView();
+    adjustSelection(view->url());
+}
+
+
+void BookmarksSidebarPage::adjustSelection(const KURL& url)
+{
+    // TODO (remarked in dolphin/TODO): the following code is quite equal
+    // to BookmarkSelector::updateSelection().
+
+    KBookmarkGroup root = DolphinSettings::instance().bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+
+    int maxLength = 0;
+    int selectedIndex = -1;
+
+    // Search the bookmark which is equal to the URL or at least is a parent URL.
+    // If there are more than one possible parent URL candidates, choose the bookmark
+    // which covers the bigger range of the URL.
+    int i = 0;
+    while (!bookmark.isNull()) {
+        const KURL bookmarkURL = bookmark.url();
+        if (bookmarkURL.isParentOf(url)) {
+            const int length = bookmarkURL.prettyURL().length();
+            if (length > maxLength) {
+                selectedIndex = i;
+                maxLength = length;
+            }
+        }
+        bookmark = root.next(bookmark);
+        ++i;
+    }
+
+    const bool block = m_bookmarksList->signalsBlocked();
+    m_bookmarksList->blockSignals(true);
+    if (selectedIndex < 0) {
+        // no bookmark matches, hence deactivate any selection
+        const int currentIndex = m_bookmarksList->index(m_bookmarksList->selectedItem());
+        m_bookmarksList->setSelected(currentIndex, false);
+    }
+    else {
+        // select the bookmark which is part of the current URL
+        m_bookmarksList->setSelected(selectedIndex, true);
+    }
+    m_bookmarksList->blockSignals(block);
+}
+
+void BookmarksSidebarPage::slotURLChanged(const KURL& url)
+{
+    adjustSelection(url);
+}
+
+void BookmarksSidebarPage::connectToActiveView()
+{
+    DolphinView* view = Dolphin::mainWin().activeView();
+    adjustSelection(view->url());
+    connect(view, SIGNAL(signalURLChanged(const KURL&)),
+            this, SLOT(slotURLChanged(const KURL&)));
+}
+
+BookmarksListBox::BookmarksListBox(QWidget* parent) :
+    Q3ListBox(parent)
+{
+}
+BookmarksListBox::~BookmarksListBox()
+{
+}
+
+void BookmarksListBox::paintEvent(QPaintEvent* /* event */)
+{
+    // don't invoke QListBox::paintEvent(event) to prevent
+    // that any kind of frame is drawn
+}
+
+BookmarkItem::BookmarkItem(const QPixmap& pixmap, const QString& text) :
+    Q3ListBoxPixmap(pixmap, text)
+{
+}
+
+BookmarkItem::~BookmarkItem()
+{
+}
+
+int BookmarkItem::height(const Q3ListBox* listBox) const
+{
+    return Q3ListBoxPixmap::height(listBox) + 8;
+}
+
diff --git a/src/bookmarkssidebarpage.h b/src/bookmarkssidebarpage.h
new file mode 100644 (file)
index 0000000..3292eae
--- /dev/null
@@ -0,0 +1,122 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef _BOOKMARKSSIDEBARPAGE_H_
+#define _BOOKMARKSSIDEBARPAGE_H_
+
+#include <sidebarpage.h>
+#include <q3listbox.h>
+//Added by qt3to4:
+#include <QPaintEvent>
+#include <QPixmap>
+
+class KURL;
+class BookmarksListBox;
+
+/**
+ * @brief Sidebar page for accessing bookmarks.
+ *
+ * It is possible to add, remove and edit bookmarks
+ * by a context menu. The selection of the bookmark
+ * is automatically adjusted to the URL given by
+ * the active view.
+ */
+class BookmarksSidebarPage : public SidebarPage
+{
+        Q_OBJECT
+
+public:
+    BookmarksSidebarPage(QWidget* parent);
+    virtual ~BookmarksSidebarPage();
+
+protected:
+    /** @see SidebarPage::activeViewChanged() */
+    virtual void activeViewChanged();
+
+private slots:
+    /** Fills the listbox with the bookmarks stored in DolphinSettings. */
+    void updateBookmarks();
+
+    /**
+     * Checks whether the left mouse button has been clicked above a bookmark.
+     * If this is the case, the URL for the currently active view is adjusted.
+     */
+    void slotMouseButtonClicked(int button, Q3ListBoxItem* item);
+
+    /** @see QListBox::slotContextMenuRequested */
+    void slotContextMenuRequested(Q3ListBoxItem* item, const QPoint& pos);
+
+    /**
+     * Is invoked whenever the URL of the active view has been changed. Adjusts
+     * the selection of the listbox to the bookmark which is part of the current URL.
+     */
+    void slotURLChanged(const KURL& url);
+
+private:
+    /**
+     * Updates the selection dependent from the given URL \a url. The
+     * URL must not match exactly to one of the available bookmarks:
+     * The bookmark which is equal to the URL or at least is a parent URL
+     * is selected. If there are more than one possible parent URL candidates,
+     * the bookmark which covers the bigger range of the URL is selected.
+     */
+    void adjustSelection(const KURL& url);
+
+    /**
+     * Connects to signals from the currently active Dolphin view to get
+     * informed about URL and bookmark changes.
+     */
+    void connectToActiveView();
+
+    BookmarksListBox* m_bookmarksList;
+};
+
+/**
+ * @brief Listbox which contains a list of bookmarks.
+ *
+ * Only QListBox::paintEvent() has been overwritten to prevent
+ * that a (not wanted) frameborder is drawn.
+ */
+class BookmarksListBox : public Q3ListBox
+{
+    Q_OBJECT
+
+public:
+    BookmarksListBox(QWidget* parent);
+    virtual ~BookmarksListBox();
+
+protected:
+    /** @see QWidget::paintEvent() */
+    virtual void paintEvent(QPaintEvent* event);
+};
+
+/**
+ * @brief Item which can be added to a BookmarksListBox.
+ *
+ * Only QListBoxPixmap::height() has been overwritten to get
+ * a spacing between the items.
+ */
+class BookmarkItem : public Q3ListBoxPixmap
+{
+public:
+    BookmarkItem(const QPixmap& pixmap, const QString& text);
+    virtual ~BookmarkItem();
+    virtual int height(const Q3ListBox* listBox) const;
+};
+
+#endif // _BOOKMARKSSIDEBARPAGE_H_
diff --git a/src/detailsmodesettings.kcfg b/src/detailsmodesettings.kcfg
new file mode 100644 (file)
index 0000000..160ca26
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg>
+    <kcfgfile name="dolphinrc"/>
+    <include>kiconloader.h</include>
+    <group name="DetailsMode">
+        <entry name="FontFamily" type="String">
+            <label>Font family</label>
+            <default code="true">KGlobalSettings::generalFont().family()</default>
+        </entry>
+        <entry name="FontSize" type="Int">
+            <label>Font size</label>
+            <default code="true">KGlobalSettings::generalFont().pointSize()</default>
+        </entry>
+        <entry name="IconSize" type="Int">
+            <label>Icon size</label>
+            <default code="true">KIcon::SizeSmall</default>
+        </entry>
+        <entry name="ShowDate" type="Bool">
+            <label>Show date</label>
+            <default>true</default>
+        </entry>
+        <entry name="ShowGroup" type="Bool">
+            <label>Show group</label>
+            <default>false</default>
+        </entry>
+        <entry name="ShowOwner" type="Bool">
+            <label>Show owner</label>
+            <default>false</default>
+        </entry>
+        <entry name="ShowPermissions" type="Bool">
+            <label>Show permissions</label>
+            <default>false</default>
+        </entry>
+        <entry name="ShowSize" type="Bool">
+            <label>Show size</label>
+            <default>false</default>
+        </entry>
+    </group>
+</kcfg>
\ No newline at end of file
diff --git a/src/detailsmodesettings.kcfgc b/src/detailsmodesettings.kcfgc
new file mode 100644 (file)
index 0000000..4853c37
--- /dev/null
@@ -0,0 +1,4 @@
+File=detailsmodesettings.kcfg
+ClassName=DetailsModeSettings
+Singleton=false 
+Mutators=true
\ No newline at end of file
diff --git a/src/detailsviewsettingspage.cpp b/src/detailsviewsettingspage.cpp
new file mode 100644 (file)
index 0000000..d002550
--- /dev/null
@@ -0,0 +1,151 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "detailsviewsettingspage.h"
+#include <qcheckbox.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <kfontcombo.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <q3grid.h>
+#include <assert.h>
+#include <q3buttongroup.h>
+#include <qradiobutton.h>
+#include <qcombobox.h>
+#include <q3groupbox.h>
+#include <q3groupbox.h>
+#include "dolphinsettings.h"
+#include "detailsmodesettings.h"
+#include "dolphindetailsview.h"
+
+DetailsViewSettingsPage::DetailsViewSettingsPage(QWidget *parent) :
+    Q3VBox(parent),
+    m_dateBox(0),
+    m_permissionsBox(0),
+    m_ownerBox(0),
+    m_groupBox(0),
+    m_smallIconSize(0),
+    m_mediumIconSize(0),
+    m_largeIconSize(0)
+{
+    const int spacing = KDialog::spacingHint();
+    const int margin = KDialog::marginHint();
+    const QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+    setSpacing(spacing);
+    setMargin(margin);
+
+    DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+    assert(settings != 0);
+
+    // create "Columns" properties
+    Q3GroupBox* columnsGroup = new Q3GroupBox(4, Qt::Vertical, i18n("Columns"), this);
+    columnsGroup->setSizePolicy(sizePolicy);
+    columnsGroup->setMargin(margin);
+
+    Q3HBox* visibleColumnsLayout = new Q3HBox(columnsGroup);
+    m_dateBox = new QCheckBox(i18n("Date"), visibleColumnsLayout);
+    m_dateBox->setChecked(settings->showDate());
+
+    m_permissionsBox = new QCheckBox(i18n("Permissions"), visibleColumnsLayout);
+    m_permissionsBox->setChecked(settings->showPermissions());
+
+    m_ownerBox = new QCheckBox(i18n("Owner"), visibleColumnsLayout);
+    m_ownerBox->setChecked(settings->showOwner());
+
+    m_groupBox = new QCheckBox(i18n("Group"), visibleColumnsLayout);
+    m_groupBox->setChecked(settings->showGroup());
+
+    // Create "Icon" properties
+    Q3ButtonGroup* iconSizeGroup = new Q3ButtonGroup(3, Qt::Horizontal, i18n("Icon Size"), this);
+    iconSizeGroup->setSizePolicy(sizePolicy);
+    iconSizeGroup->setMargin(margin);
+    m_smallIconSize  = new QRadioButton(i18n("Small"), iconSizeGroup);
+    m_mediumIconSize = new QRadioButton(i18n("Medium"), iconSizeGroup);
+    m_largeIconSize  = new QRadioButton(i18n("Large"), iconSizeGroup);
+    switch (settings->iconSize()) {
+        case KIcon::SizeLarge:
+            m_largeIconSize->setChecked(true);
+            break;
+
+        case KIcon::SizeMedium:
+            m_mediumIconSize->setChecked(true);
+            break;
+
+        case KIcon::SizeSmall:
+        default:
+            m_smallIconSize->setChecked(true);
+    }
+
+    //new QLabel(i18n("Icon size:"), iconGroup);
+    //m_iconSizeBox = new QComboBox(iconGroup);
+    //m_iconSizeBox->insertItem(i18n("Small"));
+    //m_iconSizeBox->insertItem(i18n("Medium"));
+    //m_iconSizeBox->insertItem(i18n("Large"));
+
+    // create "Text" properties
+    Q3GroupBox* textGroup = new Q3GroupBox(2, Qt::Horizontal, i18n("Text"), this);
+    textGroup->setSizePolicy(sizePolicy);
+    textGroup->setMargin(margin);
+
+    new QLabel(i18n("Font family:"), textGroup);
+    m_fontFamilyBox = new KFontCombo(textGroup);
+    m_fontFamilyBox->setCurrentFont(settings->fontFamily());
+
+    new QLabel(i18n("Font size:"), textGroup);
+    m_fontSizeBox = new QSpinBox(6, 99, 1, textGroup);
+    m_fontSizeBox->setValue(settings->fontSize());
+
+    // Add a dummy widget with no restriction regarding
+    // a vertical resizing. This assures that the dialog layout
+    // is not stretched vertically.
+    new QWidget(this);
+}
+
+
+DetailsViewSettingsPage::~DetailsViewSettingsPage()
+{
+}
+
+void DetailsViewSettingsPage::applySettings()
+{
+    DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+    assert(settings != 0);
+
+    settings->setShowDate(m_dateBox->isChecked());
+    settings->setShowPermissions(m_permissionsBox->isChecked());
+    settings->setShowOwner(m_ownerBox->isChecked());
+    settings->setShowGroup(m_groupBox->isChecked());
+
+    int iconSize = KIcon::SizeSmall;
+    if (m_mediumIconSize->isChecked()) {
+        iconSize = KIcon::SizeMedium;
+    }
+    else if (m_largeIconSize->isChecked()) {
+        iconSize = KIcon::SizeLarge;
+    }
+    settings->setIconSize(iconSize);
+
+    settings->setFontFamily(m_fontFamilyBox->currentFont());
+    settings->setFontSize(m_fontSizeBox->value());
+}
+
+#include "detailsviewsettingspage.moc"
diff --git a/src/detailsviewsettingspage.h b/src/detailsviewsettingspage.h
new file mode 100644 (file)
index 0000000..742868d
--- /dev/null
@@ -0,0 +1,65 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DETAILSVIEWSETTINGSPAGE_H
+#define DETAILSVIEWSETTINGSPAGE_H
+
+#include <q3vbox.h>
+class QCheckBox;
+class KFontCombo;
+class QSpinBox;
+class QComboBox;
+class QRadioButton;
+
+/**
+ * @brief Represents the page from the Dolphin Settings which allows
+ * to modify the settings for the details view.
+ *
+ *  @author Peter Penz <peter.penz@gmx.at>
+ */
+class DetailsViewSettingsPage : public Q3VBox
+{
+    Q_OBJECT
+
+public:
+    DetailsViewSettingsPage(QWidget* parent);
+    virtual ~DetailsViewSettingsPage();
+
+    /**
+     * Applies the settings for the details view.
+     * The settings are persisted automatically when
+     * closing Dolphin.
+     */
+    void applySettings();
+
+private:
+    QCheckBox* m_dateBox;
+    QCheckBox* m_permissionsBox;
+    QCheckBox* m_ownerBox;
+    QCheckBox* m_groupBox;
+    QRadioButton* m_smallIconSize;
+    QRadioButton* m_mediumIconSize;
+    QRadioButton* m_largeIconSize;
+
+    KFontCombo* m_fontFamilyBox;
+    QSpinBox* m_fontSizeBox;
+};
+
+#endif
diff --git a/src/directoryviewpropertysettings.kcfg b/src/directoryviewpropertysettings.kcfg
new file mode 100644 (file)
index 0000000..7af729d
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+      http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+<kcfgfile arg="true" />
+
+<group name="Settings">
+
+<entry name="ShowHiddenFiles" key="ShowDotFiles" type="Bool" >
+      <label>Show hidden files</label>
+      <whatsthis>When this option is enabled hidden files, such as those starting with a '.', will be shown in the file view.</whatsthis>
+      <default>false</default>
+   </entry>
+
+</group>
+
+<group name="Dolphin">
+
+<entry name="ViewMode" type="Int" >
+      <label>View Mode</label>
+      <whatsthis>This option controls the style of the view. Currently supported values include icons (0), details (1) and previews (2) views.</whatsthis>
+      <default>DolphinView::PreviewsView</default>
+      <min>0</min>
+      <max code="true">DolphinView::MaxModeEnum</max>
+   </entry>
+
+<entry name="Sorting" type="Int" >
+      <label>Sort files by</label>
+      <whatsthis>This option defines which attribute (name, size, date, etc) sorting is performed on.</whatsthis>
+      <default code="true">DolphinView::SortByName</default>
+      <min>0</min>
+      <max code="true">DolphinView::MaxSortEnum</max>
+   </entry>
+
+<entry name="SortOrder" type="Int" >
+      <label>Order to sort files in</label>
+      <default code="true">Qt::Ascending</default>
+      <min code="true">Qt::Ascending</min>
+      <max code="true">Qt::Descending</max>
+   </entry>
+
+<entry name="ValidForSubDirs" type="Bool" >
+      <label>Apply view setting to sub-directories</label>
+      <default>false</default>
+   </entry>
+
+
+<entry name="Timestamp" type="DateTime" >
+      <label>Properties last changed</label>
+      <whatsthis>The last time these properties were changed by the user.</whatsthis>
+   </entry>
+
+</group>
+
+</kcfg>
+
+
diff --git a/src/directoryviewpropertysettings.kcfgc b/src/directoryviewpropertysettings.kcfgc
new file mode 100644 (file)
index 0000000..09a91d8
--- /dev/null
@@ -0,0 +1,6 @@
+File=directoryviewpropertysettings.kcfg
+Singleton=false
+ClassName=ViewPropertySettings
+Mutators=true
+GlobalEnums=true
+IncludeFiles=dolphinview.h,qnamespace.h
diff --git a/src/dolphin.cpp b/src/dolphin.cpp
new file mode 100644 (file)
index 0000000..602dafa
--- /dev/null
@@ -0,0 +1,1676 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Stefan Monov <logixoul@gmail.com>               *
+ *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphin.h"
+
+#include <assert.h>
+
+#include <kactioncollection.h>
+#include <ktoggleaction.h>
+#include <kbookmarkmanager.h>
+#include <kglobal.h>
+#include <kpropertiesdialog.h>
+#include <kicon.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kstatusbar.h>
+#include <kio/netaccess.h>
+#include <kfiledialog.h>
+#include <kconfig.h>
+#include <kurl.h>
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kmenu.h>
+#include <kio/renamedlg.h>
+#include <kinputdialog.h>
+#include <kshell.h>
+#include <kdesktopfile.h>
+#include <kstandarddirs.h>
+#include <kprotocolinfo.h>
+#include <kmessagebox.h>
+#include <kservice.h>
+#include <kstandarddirs.h>
+#include <krun.h>
+#include <klocale.h>
+
+#include <qclipboard.h>
+#include <q3dragobject.h>
+//Added by qt3to4:
+#include <Q3ValueList>
+#include <QCloseEvent>
+#include <QSplitter>
+
+#include "urlnavigator.h"
+#include "viewpropertiesdialog.h"
+#include "viewproperties.h"
+#include "dolphinsettings.h"
+#include "dolphinsettingsdialog.h"
+#include "dolphinstatusbar.h"
+#include "undomanager.h"
+#include "progressindicator.h"
+#include "dolphinsettings.h"
+#include "sidebar.h"
+#include "sidebarsettings.h"
+#include "generalsettings.h"
+
+Dolphin& Dolphin::mainWin()
+{
+    static Dolphin* instance = 0;
+    if (instance == 0) {
+        instance = new Dolphin();
+        instance->init();
+    }
+    return *instance;
+}
+
+Dolphin::~Dolphin()
+{
+}
+
+void Dolphin::setActiveView(DolphinView* view)
+{
+    assert((view == m_view[PrimaryIdx]) || (view == m_view[SecondaryIdx]));
+    if (m_activeView == view) {
+        return;
+    }
+
+    m_activeView = view;
+
+    updateHistory();
+    updateEditActions();
+    updateViewActions();
+    updateGoActions();
+
+    setCaption(m_activeView->url().fileName());
+
+    emit activeViewChanged();
+}
+
+void Dolphin::dropURLs(const KUrl::List& urls,
+                       const KUrl& destination)
+{
+    int selectedIndex = -1;
+
+    /* KDE4-TODO
+    const ButtonState keyboardState = KApplication::keyboardMouseState();
+    const bool shiftPressed = (keyboardState & ShiftButton) > 0;
+    const bool controlPressed = (keyboardState & ControlButton) > 0;
+
+
+
+    if (shiftPressed && controlPressed) {
+        // shortcut for 'Linke Here' is used
+        selectedIndex = 2;
+    }
+    else if (controlPressed) {
+        // shortcut for 'Copy Here' is used
+        selectedIndex = 1;
+    }
+    else if (shiftPressed) {
+        // shortcut for 'Move Here' is used
+        selectedIndex = 0;
+    }
+    else*/ {
+        // no shortcut is used, hence open a popup menu
+        KMenu popup(this);
+
+        popup.insertItem(SmallIcon("goto"), i18n("&Move Here") + "\t" /* KDE4-TODO: + KKey::modFlagLabel(KKey::SHIFT)*/, 0);
+        popup.insertItem(SmallIcon("editcopy"), i18n( "&Copy Here" ) /* KDE4-TODO + "\t" + KKey::modFlagLabel(KKey::CTRL)*/, 1);
+        popup.insertItem(i18n("&Link Here") /* KDE4-TODO + "\t" + KKey::modFlagLabel((KKey::ModFlag)(KKey::CTRL|KKey::SHIFT)) */, 2);
+        popup.insertSeparator();
+        popup.insertItem(SmallIcon("stop"), i18n("Cancel"), 3);
+        popup.setAccel(i18n("Escape"), 3);
+
+        /* KDE4-TODO: selectedIndex = popup.exec(QCursor::pos()); */
+        popup.exec(QCursor::pos());
+        selectedIndex = 0; // KD4-TODO: use QAction instead of switch below
+    }
+
+    if (selectedIndex < 0) {
+        return;
+    }
+
+    switch (selectedIndex) {
+        case 0: {
+            // 'Move Here' has been selected
+            updateViewProperties(urls);
+            moveURLs(urls, destination);
+            break;
+        }
+
+        case 1: {
+            // 'Copy Here' has been selected
+            updateViewProperties(urls);
+            copyURLs(urls, destination);
+            break;
+        }
+
+        case 2: {
+            // 'Link Here' has been selected
+            KIO::Job* job = KIO::link(urls, destination);
+            addPendingUndoJob(job, DolphinCommand::Link, urls, destination);
+            break;
+        }
+
+        default:
+            // 'Cancel' has been selected
+            break;
+    }
+}
+
+void Dolphin::refreshViews()
+{
+    const bool split = DolphinSettings::instance().generalSettings()->splitView();
+    const bool isPrimaryViewActive = (m_activeView == m_view[PrimaryIdx]);
+    KUrl url;
+    for (int i = PrimaryIdx; i <= SecondaryIdx; ++i) {
+       if (m_view[i] != 0) {
+            url = m_view[i]->url();
+
+            // delete view instance...
+            m_view[i]->close();
+            m_view[i]->deleteLater();
+            m_view[i] = 0;
+        }
+
+        if (split || (i == PrimaryIdx)) {
+            // ... and recreate it
+            ViewProperties props(url);
+            m_view[i] = new DolphinView(m_splitter,
+                                        url,
+                                        props.viewMode(),
+                                        props.isShowHiddenFilesEnabled());
+            m_view[i]->show();
+        }
+    }
+
+    m_activeView = isPrimaryViewActive ? m_view[PrimaryIdx] : m_view[SecondaryIdx];
+    assert(m_activeView != 0);
+
+    updateViewActions();
+    emit activeViewChanged();
+}
+
+void Dolphin::slotHistoryChanged()
+{
+    updateHistory();
+}
+
+void Dolphin::slotURLChanged(const KUrl& url)
+{
+    updateEditActions();
+    updateGoActions();
+    setCaption(url.fileName());
+}
+
+void Dolphin::slotURLChangeRequest(const KUrl& url)
+{
+       clearStatusBar();
+       m_activeView->setURL(url);
+}
+
+void Dolphin::slotViewModeChanged()
+{
+    updateViewActions();
+}
+
+void Dolphin::slotShowHiddenFilesChanged()
+{
+    KToggleAction* showHiddenFilesAction =
+        static_cast<KToggleAction*>(actionCollection()->action("show_hidden_files"));
+    showHiddenFilesAction->setChecked(m_activeView->isShowHiddenFilesEnabled());
+}
+
+void Dolphin::slotShowFilterBarChanged()
+{
+    KToggleAction* showFilterBarAction =
+        static_cast<KToggleAction*>(actionCollection()->action("show_filter_bar"));
+    showFilterBarAction->setChecked(m_activeView->isFilterBarVisible());
+}
+
+void Dolphin::slotSortingChanged(DolphinView::Sorting sorting)
+{
+    KAction* action = 0;
+    switch (sorting) {
+        case DolphinView::SortByName:
+            action = actionCollection()->action("by_name");
+            break;
+        case DolphinView::SortBySize:
+            action = actionCollection()->action("by_size");
+            break;
+        case DolphinView::SortByDate:
+            action = actionCollection()->action("by_date");
+            break;
+        default:
+            break;
+    }
+
+    if (action != 0) {
+        KToggleAction* toggleAction = static_cast<KToggleAction*>(action);
+        toggleAction->setChecked(true);
+    }
+}
+
+void Dolphin::slotSortOrderChanged(Qt::SortOrder order)
+{
+    KToggleAction* descending = static_cast<KToggleAction*>(actionCollection()->action("descending"));
+    const bool sortDescending = (order == Qt::Descending);
+    descending->setChecked(sortDescending);
+}
+
+void Dolphin::slotSelectionChanged()
+{
+    updateEditActions();
+
+    assert(m_view[PrimaryIdx] != 0);
+    int selectedURLsCount = m_view[PrimaryIdx]->selectedURLs().count();
+    if (m_view[SecondaryIdx] != 0) {
+        selectedURLsCount += m_view[SecondaryIdx]->selectedURLs().count();
+    }
+
+    KAction* compareFilesAction = actionCollection()->action("compare_files");
+    compareFilesAction->setEnabled(selectedURLsCount == 2);
+
+    m_activeView->updateStatusBar();
+
+    emit selectionChanged();
+}
+
+void Dolphin::closeEvent(QCloseEvent* event)
+{
+    // KDE4-TODO
+    //KConfig* config = kapp->config();
+    //config->setGroup("General");
+    //config->writeEntry("First Run", false);
+
+    DolphinSettings& settings = DolphinSettings::instance();
+    GeneralSettings* generalSettings = settings.generalSettings();
+    generalSettings->setFirstRun(false);
+
+    SidebarSettings* sidebarSettings = settings.sidebarSettings();
+    const bool isSidebarVisible = (m_sidebar != 0);
+    sidebarSettings->setVisible(isSidebarVisible);
+    if (isSidebarVisible) {
+        sidebarSettings->setWidth(m_sidebar->width());
+    }
+
+    settings.save();
+
+    KMainWindow::closeEvent(event);
+}
+
+void Dolphin::saveProperties(KConfig* config)
+{
+    config->setGroup("Primary view");
+    config->writeEntry("URL", m_view[PrimaryIdx]->url().url());
+    config->writeEntry("Editable URL", m_view[PrimaryIdx]->isURLEditable());
+    if (m_view[SecondaryIdx] != 0) {
+        config->setGroup("Secondary view");
+        config->writeEntry("URL", m_view[SecondaryIdx]->url().url());
+        config->writeEntry("Editable URL", m_view[SecondaryIdx]->isURLEditable());
+    }
+}
+
+void Dolphin::readProperties(KConfig* config)
+{
+    config->setGroup("Primary view");
+    m_view[PrimaryIdx]->setURL(config->readEntry("URL"));
+    m_view[PrimaryIdx]->setURLEditable(config->readBoolEntry("Editable URL"));
+    if (config->hasGroup("Secondary view")) {
+        config->setGroup("Secondary view");
+        if (m_view[SecondaryIdx] == 0) {
+            toggleSplitView();
+        }
+        m_view[SecondaryIdx]->setURL(config->readEntry("URL"));
+        m_view[SecondaryIdx]->setURLEditable(config->readBoolEntry("Editable URL"));
+    }
+    else if (m_view[SecondaryIdx] != 0) {
+        toggleSplitView();
+    }
+}
+
+void Dolphin::createFolder()
+{
+    // Parts of the following code have been taken
+    // from the class KonqPopupMenu located in
+    // libqonq/konq_popupmenu.h of Konqueror.
+    // (Copyright (C) 2000  David Faure <faure@kde.org>,
+    // Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>)
+
+    clearStatusBar();
+
+    DolphinStatusBar* statusBar = m_activeView->statusBar();
+    const KUrl baseURL(m_activeView->url());
+
+    QString name(i18n("New Folder"));
+    baseURL.path(KUrl::AddTrailingSlash);
+    
+
+    if (baseURL.isLocalFile() && QFileInfo(baseURL.path(KUrl::AddTrailingSlash) + name).exists()) {
+        name = KIO::RenameDlg::suggestName(baseURL, i18n("New Folder"));
+    }
+
+    bool ok = false;
+    name = KInputDialog::getText(i18n("New Folder"),
+                                 i18n("Enter folder name:" ),
+                                 name,
+                                 &ok,
+                                 this);
+
+    if (!ok) {
+        // the user has pressed 'Cancel'
+        return;
+    }
+
+    assert(!name.isEmpty());
+
+    KUrl url;
+    if ((name[0] == '/') || (name[0] == '~')) {
+        url.setPath(KShell::tildeExpand(name));
+    }
+    else {
+        name = KIO::encodeFileName(name);
+        url = baseURL;
+        url.addPath(name);
+    }
+    ok = KIO::NetAccess::mkdir(url, this);
+
+    // TODO: provide message type hint
+    if (ok) {
+        statusBar->setMessage(i18n("Created folder %1.").arg(url.path()),
+                              DolphinStatusBar::OperationCompleted);
+
+        DolphinCommand command(DolphinCommand::CreateFolder, KUrl::List(), url);
+        UndoManager::instance().addCommand(command);
+    }
+    else {
+        // Creating of the folder has been failed. Check whether the creating
+        // has been failed because a folder with the same name exists...
+        if (KIO::NetAccess::exists(url, true, this)) {
+            statusBar->setMessage(i18n("A folder named %1 already exists.").arg(url.path()),
+                                  DolphinStatusBar::Error);
+        }
+        else {
+            statusBar->setMessage(i18n("Creating of folder %1 failed.").arg(url.path()),
+                                  DolphinStatusBar::Error);
+        }
+
+    }
+}
+
+void Dolphin::createFile()
+{
+    // Parts of the following code have been taken
+    // from the class KonqPopupMenu located in
+    // libqonq/konq_popupmenu.h of Konqueror.
+    // (Copyright (C) 2000  David Faure <faure@kde.org>,
+    // Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>)
+
+    clearStatusBar();
+
+    // TODO: const Entry& entry = m_createFileTemplates[QString(sender->name())];
+    // should be enough. Anyway: the implemantation of [] does a linear search internally too.
+    KSortableList<CreateFileEntry, QString>::ConstIterator it = m_createFileTemplates.begin();
+    KSortableList<CreateFileEntry, QString>::ConstIterator end = m_createFileTemplates.end();
+
+    const QString senderName(sender()->name());
+    bool found = false;
+    CreateFileEntry entry;
+    while (!found && (it != end)) {
+        if ((*it).index() == senderName) {
+            entry = (*it).value();
+            found = true;
+        }
+        else {
+            ++it;
+        }
+    }
+
+    DolphinStatusBar* statusBar = m_activeView->statusBar();
+    if (!found || !QFile::exists(entry.templatePath)) {
+        statusBar->setMessage(i18n("Could not create file."), DolphinStatusBar::Error);
+       return;
+    }
+
+    // Get the source path of the template which should be copied.
+    // The source path is part of the URL entry of the desktop file.
+    const int pos = entry.templatePath.findRev('/');
+    QString sourcePath(entry.templatePath.left(pos + 1));
+    sourcePath += KDesktopFile(entry.templatePath, true).readPathEntry("URL");
+
+    QString name(i18n(entry.name.ascii()));
+    // Most entry names end with "..." (e. g. "HTML File..."), which is ok for
+    // menus but no good choice for a new file name -> remove the dots...
+    name.replace("...", QString::null);
+
+    // add the file extension to the name
+    name.append(sourcePath.right(sourcePath.length() - sourcePath.findRev('.')));
+
+    // Check whether a file with the current name already exists. If yes suggest automatically
+    // a unique file name (e. g. "HTML File" will be replaced by "HTML File_1").
+    const KUrl viewURL(m_activeView->url());
+    const bool fileExists = viewURL.isLocalFile() &&
+                            QFileInfo(viewURL.path(KUrl::AddTrailingSlash) + KIO::encodeFileName(name)).exists();
+    if (fileExists) {
+        name = KIO::RenameDlg::suggestName(viewURL, name);
+    }
+
+    // let the user change the suggested file name
+    bool ok = false;
+    name = KInputDialog::getText(entry.name,
+                                 entry.comment,
+                                 name,
+                                 &ok,
+                                 this);
+    if (!ok) {
+        // the user has pressed 'Cancel'
+        return;
+    }
+
+    // before copying the template to the destination path check whether a file
+    // with the given name already exists
+    const QString destPath(viewURL.pathOrUrl() + "/" + KIO::encodeFileName(name));
+    const KUrl destURL(destPath);
+    if (KIO::NetAccess::exists(destURL, false, this)) {
+        statusBar->setMessage(i18n("A file named %1 already exists.").arg(name),
+                              DolphinStatusBar::Error);
+        return;
+    }
+
+    // copy the template to the destination path
+    const KUrl sourceURL(sourcePath);
+    KIO::CopyJob* job = KIO::copyAs(sourceURL, destURL);
+    job->setDefaultPermissions(true);
+    if (KIO::NetAccess::synchronousRun(job, this)) {
+        statusBar->setMessage(i18n("Created file %1.").arg(name),
+                              DolphinStatusBar::OperationCompleted);
+
+        KUrl::List list;
+        list.append(sourceURL);
+        DolphinCommand command(DolphinCommand::CreateFile, list, destURL);
+        UndoManager::instance().addCommand(command);
+
+    }
+    else {
+        statusBar->setMessage(i18n("Creating of file %1 failed.").arg(name),
+                              DolphinStatusBar::Error);
+    }
+}
+
+void Dolphin::rename()
+{
+    clearStatusBar();
+    m_activeView->renameSelectedItems();
+}
+
+void Dolphin::moveToTrash()
+{
+    clearStatusBar();
+    KUrl::List selectedURLs = m_activeView->selectedURLs();
+    KIO::Job* job = KIO::trash(selectedURLs);
+    addPendingUndoJob(job, DolphinCommand::Trash, selectedURLs, m_activeView->url());
+}
+
+void Dolphin::deleteItems()
+{
+    clearStatusBar();
+
+    KUrl::List list = m_activeView->selectedURLs();
+    const uint itemCount = list.count();
+    assert(itemCount >= 1);
+
+    QString text;
+    if (itemCount > 1) {
+        text = i18n("Do you really want to delete the %1 selected items?").arg(itemCount);
+    }
+    else {
+        const KUrl& url = list.first();
+        text = i18n("Do you really want to delete '%1'?").arg(url.fileName());
+    }
+
+    const bool del = KMessageBox::warningContinueCancel(this,
+                                                        text,
+                                                        QString::null,
+                                                        KGuiItem(i18n("Delete"), SmallIcon("editdelete"))
+                                                       ) == KMessageBox::Continue;
+    if (del) {
+        KIO::Job* job = KIO::del(list);
+        connect(job, SIGNAL(result(KIO::Job*)),
+                this, SLOT(slotHandleJobError(KIO::Job*)));
+        connect(job, SIGNAL(result(KIO::Job*)),
+                this, SLOT(slotDeleteFileFinished(KIO::Job*)));
+    }
+}
+
+void Dolphin::properties()
+{
+    const KFileItemList* sourceList = m_activeView->selectedItems();
+    if (sourceList == 0) {
+        return;
+    }
+
+    KFileItemList list;
+    KFileItemList::const_iterator it = sourceList->begin();
+    const KFileItemList::const_iterator end = sourceList->end();
+    KFileItem* item = 0;
+    while (it != end) {
+        list.append(item);
+        ++it;
+    }
+
+    new KPropertiesDialog(list, this);
+}
+
+void Dolphin::quit()
+{
+    close();
+}
+
+void Dolphin::slotHandleJobError(KIO::Job* job)
+{
+    if (job->error() != 0) {
+        m_activeView->statusBar()->setMessage(job->errorString(),
+                                              DolphinStatusBar::Error);
+    }
+}
+
+void Dolphin::slotDeleteFileFinished(KIO::Job* job)
+{
+    if (job->error() == 0) {
+        m_activeView->statusBar()->setMessage(i18n("Delete operation completed."),
+                                               DolphinStatusBar::OperationCompleted);
+
+        // TODO: In opposite to the 'Move to Trash' operation in the class KFileIconView
+        // no rearranging of the item position is done when a file has been deleted.
+        // This is bypassed by reloading the view, but it might be worth to investigate
+        // deeper for the root of this issue.
+        m_activeView->reload();
+    }
+}
+
+void Dolphin::slotUndoAvailable(bool available)
+{
+    KAction* undoAction = actionCollection()->action(KStdAction::stdName(KStdAction::Undo));
+    if (undoAction != 0) {
+        undoAction->setEnabled(available);
+    }
+}
+
+void Dolphin::slotUndoTextChanged(const QString& text)
+{
+    KAction* undoAction = actionCollection()->action(KStdAction::stdName(KStdAction::Undo));
+    if (undoAction != 0) {
+        undoAction->setText(text);
+    }
+}
+
+void Dolphin::slotRedoAvailable(bool available)
+{
+    KAction* redoAction = actionCollection()->action(KStdAction::stdName(KStdAction::Redo));
+    if (redoAction != 0) {
+        redoAction->setEnabled(available);
+    }
+}
+
+void Dolphin::slotRedoTextChanged(const QString& text)
+{
+    KAction* redoAction = actionCollection()->action(KStdAction::stdName(KStdAction::Redo));
+    if (redoAction != 0) {
+        redoAction->setText(text);
+    }
+}
+
+void Dolphin::cut()
+{
+    m_clipboardContainsCutData = true;
+    /* KDE4-TODO: Q3DragObject* data = new KURLDrag(m_activeView->selectedURLs(),
+                                       widget());
+    QApplication::clipboard()->setData(data);*/
+}
+
+void Dolphin::copy()
+{
+    m_clipboardContainsCutData = false;
+    /* KDE4-TODO:
+    Q3DragObject* data = new KUrlDrag(m_activeView->selectedURLs(),
+                                     widget());
+    QApplication::clipboard()->setData(data);*/
+}
+
+void Dolphin::paste()
+{
+    /* KDE4-TODO:
+    QClipboard* clipboard = QApplication::clipboard();
+    QMimeSource* data = clipboard->data();
+    if (!KUrlDrag::canDecode(data)) {
+        return;
+    }
+
+    clearStatusBar();
+
+    KUrl::List sourceURLs;
+    KUrlDrag::decode(data, sourceURLs);
+
+    // per default the pasting is done into the current URL of the view
+    KUrl destURL(m_activeView->url());
+
+    // check whether the pasting should be done into a selected directory
+    KUrl::List selectedURLs = m_activeView->selectedURLs();
+    if (selectedURLs.count() == 1) {
+        const KFileItem fileItem(S_IFDIR,
+                                 KFileItem::Unknown,
+                                 selectedURLs.first(),
+                                 true);
+        if (fileItem.isDir()) {
+            // only one item is selected which is a directory, hence paste
+            // into this directory
+            destURL = selectedURLs.first();
+        }
+    }
+
+
+    updateViewProperties(sourceURLs);
+    if (m_clipboardContainsCutData) {
+        moveURLs(sourceURLs, destURL);
+        m_clipboardContainsCutData = false;
+        clipboard->clear();
+    }
+    else {
+        copyURLs(sourceURLs, destURL);
+    }*/
+}
+
+void Dolphin::updatePasteAction()
+{
+    KAction* pasteAction = actionCollection()->action(KStdAction::stdName(KStdAction::Paste));
+    if (pasteAction == 0) {
+        return;
+    }
+
+    QString text(i18n("Paste"));
+    QClipboard* clipboard = QApplication::clipboard();
+    QMimeSource* data = clipboard->data();
+    /* KDE4-TODO:
+    if (KUrlDrag::canDecode(data)) {
+        pasteAction->setEnabled(true);
+
+        KUrl::List urls;
+        KUrlDrag::decode(data, urls);
+        const int count = urls.count();
+        if (count == 1) {
+            pasteAction->setText(i18n("Paste 1 File"));
+        }
+        else {
+            pasteAction->setText(i18n("Paste %1 Files").arg(count));
+        }
+    }
+    else {*/
+        pasteAction->setEnabled(false);
+        pasteAction->setText(i18n("Paste"));
+    //}
+
+    if (pasteAction->isEnabled()) {
+        KUrl::List urls = m_activeView->selectedURLs();
+        const uint count = urls.count();
+        if (count > 1) {
+            // pasting should not be allowed when more than one file
+            // is selected
+            pasteAction->setEnabled(false);
+        }
+        else if (count == 1) {
+            // Only one file is selected. Pasting is only allowed if this
+            // file is a directory.
+            const KFileItem fileItem(S_IFDIR,
+                                     KFileItem::Unknown,
+                                     urls.first(),
+                                     true);
+            pasteAction->setEnabled(fileItem.isDir());
+        }
+    }
+}
+
+void Dolphin::selectAll()
+{
+    clearStatusBar();
+    m_activeView->selectAll();
+}
+
+void Dolphin::invertSelection()
+{
+    clearStatusBar();
+    m_activeView->invertSelection();
+}
+void Dolphin::setIconsView()
+{
+    m_activeView->setMode(DolphinView::IconsView);
+}
+
+void Dolphin::setDetailsView()
+{
+    m_activeView->setMode(DolphinView::DetailsView);
+}
+
+void Dolphin::setPreviewsView()
+{
+    m_activeView->setMode(DolphinView::PreviewsView);
+}
+
+void Dolphin::sortByName()
+{
+    m_activeView->setSorting(DolphinView::SortByName);
+}
+
+void Dolphin::sortBySize()
+{
+    m_activeView->setSorting(DolphinView::SortBySize);
+}
+
+void Dolphin::sortByDate()
+{
+    m_activeView->setSorting(DolphinView::SortByDate);
+}
+
+void Dolphin::toggleSortOrder()
+{
+    const Qt::SortOrder order = (m_activeView->sortOrder() == Qt::Ascending) ?
+                                Qt::Descending :
+                                Qt::Ascending;
+    m_activeView->setSortOrder(order);
+}
+
+void Dolphin::toggleSplitView()
+{
+    if (m_view[SecondaryIdx] == 0) {
+        // create a secondary view
+        m_view[SecondaryIdx] = new DolphinView(m_splitter,
+                                               m_view[PrimaryIdx]->url(),
+                                               m_view[PrimaryIdx]->mode(),
+                                               m_view[PrimaryIdx]->isShowHiddenFilesEnabled());
+        m_view[SecondaryIdx]->show();
+    }
+    else {
+        // remove secondary view
+        if (m_activeView == m_view[PrimaryIdx]) {
+            m_view[SecondaryIdx]->close();
+            m_view[SecondaryIdx]->deleteLater();
+            m_view[SecondaryIdx] = 0;
+            setActiveView(m_view[PrimaryIdx]);
+        }
+        else {
+            // The secondary view is active, hence from the users point of view
+            // the content of the secondary view should be moved to the primary view.
+            // From an implementation point of view it is more efficient to close
+            // the primary view and exchange the internal pointers afterwards.
+            m_view[PrimaryIdx]->close();
+            m_view[PrimaryIdx]->deleteLater();
+            m_view[PrimaryIdx] = m_view[SecondaryIdx];
+            m_view[SecondaryIdx] = 0;
+            setActiveView(m_view[PrimaryIdx]);
+        }
+    }
+}
+
+void Dolphin::reloadView()
+{
+    clearStatusBar();
+    m_activeView->reload();
+}
+
+void Dolphin::stopLoading()
+{
+}
+
+void Dolphin::showHiddenFiles()
+{
+    clearStatusBar();
+
+    const KToggleAction* showHiddenFilesAction =
+        static_cast<KToggleAction*>(actionCollection()->action("show_hidden_files"));
+    const bool show = showHiddenFilesAction->isChecked();
+    m_activeView->setShowHiddenFilesEnabled(show);
+}
+
+void Dolphin::showFilterBar()
+{
+    const KToggleAction* showFilterBarAction =
+        static_cast<KToggleAction*>(actionCollection()->action("show_filter_bar"));
+    const bool show = showFilterBarAction->isChecked();
+    m_activeView->slotShowFilterBar(show);
+}
+
+void Dolphin::zoomIn()
+{
+    m_activeView->zoomIn();
+    updateViewActions();
+}
+
+void Dolphin::zoomOut()
+{
+    m_activeView->zoomOut();
+    updateViewActions();
+}
+
+void Dolphin::toggleEditLocation()
+{
+    clearStatusBar();
+
+    KToggleAction* action = static_cast<KToggleAction*>(actionCollection()->action("editable_location"));
+
+    bool editOrBrowse = action->isChecked();
+//    action->setChecked(action->setChecked);
+    m_activeView->setURLEditable(editOrBrowse);
+}
+
+void Dolphin::editLocation()
+{
+    KToggleAction* action = static_cast<KToggleAction*>(actionCollection()->action("editable_location"));
+    action->setChecked(true);
+    m_activeView->setURLEditable(true);
+}
+
+void Dolphin::adjustViewProperties()
+{
+    clearStatusBar();
+    ViewPropertiesDialog dlg(m_activeView);
+    dlg.exec();
+}
+
+void Dolphin::goBack()
+{
+    clearStatusBar();
+    m_activeView->goBack();
+}
+
+void Dolphin::goForward()
+{
+    clearStatusBar();
+    m_activeView->goForward();
+}
+
+void Dolphin::goUp()
+{
+    clearStatusBar();
+    m_activeView->goUp();
+}
+
+void Dolphin::goHome()
+{
+    clearStatusBar();
+    m_activeView->goHome();
+}
+
+void Dolphin::openTerminal()
+{
+    QString command("konsole --workdir \"");
+    command.append(m_activeView->url().path());
+    command.append('\"');
+
+    KRun::runCommand(command, "Konsole", "konsole");
+}
+
+void Dolphin::findFile()
+{
+    KRun::run("kfind", m_activeView->url());
+}
+
+void Dolphin::compareFiles()
+{
+    // The method is only invoked if exactly 2 files have
+    // been selected. The selected files may be:
+    // - both in the primary view
+    // - both in the secondary view
+    // - one in the primary view and the other in the secondary
+    //   view
+    assert(m_view[PrimaryIdx] != 0);
+
+    KUrl urlA;
+    KUrl urlB;
+    KUrl::List urls = m_view[PrimaryIdx]->selectedURLs();
+
+    switch (urls.count()) {
+        case 0: {
+            assert(m_view[SecondaryIdx] != 0);
+            urls = m_view[SecondaryIdx]->selectedURLs();
+            assert(urls.count() == 2);
+            urlA = urls[0];
+            urlB = urls[1];
+            break;
+        }
+
+        case 1: {
+            urlA = urls[0];
+            assert(m_view[SecondaryIdx] != 0);
+            urls = m_view[SecondaryIdx]->selectedURLs();
+            assert(urls.count() == 1);
+            urlB = urls[0];
+            break;
+        }
+
+        case 2: {
+            urlA = urls[0];
+            urlB = urls[1];
+            break;
+        }
+
+        default: {
+            // may not happen: compareFiles may only get invoked if 2
+            // files are selected
+            assert(false);
+        }
+    }
+
+    QString command("kompare -c \"");
+    command.append(urlA.pathOrUrl());
+    command.append("\" \"");
+    command.append(urlB.pathOrUrl());
+    command.append('\"');
+    KRun::runCommand(command, "Kompare", "kompare");
+
+}
+
+void Dolphin::editSettings()
+{
+    // TODO: make a static method for opening the settings dialog
+    DolphinSettingsDialog dlg;
+    dlg.exec();
+}
+
+void Dolphin::addUndoOperation(KIO::Job* job)
+{
+    if (job->error() != 0) {
+        slotHandleJobError(job);
+    }
+    else {
+        const int id = job->progressId();
+
+        // set iterator to the executed command with the current id...
+        Q3ValueList<UndoInfo>::Iterator it = m_pendingUndoJobs.begin();
+        const Q3ValueList<UndoInfo>::Iterator end = m_pendingUndoJobs.end();
+        bool found = false;
+        while (!found && (it != end)) {
+            if ((*it).id == id) {
+                found = true;
+            }
+            else {
+                ++it;
+            }
+        }
+
+        if (found) {
+            DolphinCommand command = (*it).command;
+            if (command.type() == DolphinCommand::Trash) {
+                // To be able to perform an undo for the 'Move to Trash' operation
+                // all source URLs must be updated with the trash URL. E. g. when moving
+                // a file "test.txt" and a second file "test.txt" to the trash,
+                // then the filenames in the trash are "0-test.txt" and "1-test.txt".
+                QMap<QString, QString> metaData = job->metaData();
+                KUrl::List newSourceURLs;
+
+                KUrl::List sourceURLs = command.source();
+                KUrl::List::Iterator sourceIt = sourceURLs.begin();
+                const KUrl::List::Iterator sourceEnd = sourceURLs.end();
+
+                while (sourceIt != sourceEnd) {
+                    QMap<QString, QString>::ConstIterator metaIt = metaData.find("trashURL-" + (*sourceIt).path());
+                    if (metaIt != metaData.end()) {
+                        newSourceURLs.append(KUrl(metaIt.data()));
+                    }
+                    ++sourceIt;
+                }
+                command.setSource(newSourceURLs);
+            }
+
+            UndoManager::instance().addCommand(command);
+            m_pendingUndoJobs.erase(it);
+
+            DolphinStatusBar* statusBar = m_activeView->statusBar();
+            switch (command.type()) {
+                case DolphinCommand::Copy:
+                    statusBar->setMessage(i18n("Copy operation completed."),
+                                          DolphinStatusBar::OperationCompleted);
+                    break;
+                case DolphinCommand::Move:
+                    statusBar->setMessage(i18n("Move operation completed."),
+                                          DolphinStatusBar::OperationCompleted);
+                    break;
+                case DolphinCommand::Trash:
+                    statusBar->setMessage(i18n("Move to trash operation completed."),
+                                          DolphinStatusBar::OperationCompleted);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+}
+
+void Dolphin::toggleSidebar()
+{
+    if (m_sidebar == 0) {
+        openSidebar();
+    }
+    else {
+        closeSidebar();
+    }
+
+    KToggleAction* sidebarAction = static_cast<KToggleAction*>(actionCollection()->action("sidebar"));
+    sidebarAction->setChecked(m_sidebar != 0);
+}
+
+void Dolphin::closeSidebar()
+{
+    if (m_sidebar == 0) {
+        // the sidebar has already been closed
+        return;
+    }
+
+    // store width of sidebar and remember that the sidebar has been closed
+    SidebarSettings* settings = DolphinSettings::instance().sidebarSettings();
+    settings->setVisible(false);
+    settings->setWidth(m_sidebar->width());
+
+    m_sidebar->deleteLater();
+    m_sidebar = 0;
+}
+
+Dolphin::Dolphin() :
+    KMainWindow(0, "Dolphin"),
+    m_splitter(0),
+    m_sidebar(0),
+    m_activeView(0),
+    m_clipboardContainsCutData(false)
+{
+    m_view[PrimaryIdx] = 0;
+    m_view[SecondaryIdx] = 0;
+
+    m_fileGroupActions.setAutoDelete(true);
+
+    // TODO: the following members are not used yet. See documentation
+    // of Dolphin::linkGroupActions() and Dolphin::linkToDeviceActions()
+    // in the header file for details.
+    //m_linkGroupActions.setAutoDelete(true);
+    //m_linkToDeviceActions.setAutoDelete(true);
+}
+
+void Dolphin::init()
+{
+    // Check whether Dolphin runs the first time. If yes then
+    // a proper default window size is given at the end of Dolphin::init().
+    GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();
+    const bool firstRun = generalSettings->firstRun();
+
+    setAcceptDrops(true);
+
+    m_splitter = new QSplitter(this);
+
+    DolphinSettings& settings = DolphinSettings::instance();
+
+    KBookmarkManager* manager = settings.bookmarkManager();
+    assert(manager != 0);
+    KBookmarkGroup root = manager->root();
+    if (root.first().isNull()) {
+        root.addBookmark(manager, i18n("Home"), settings.generalSettings()->homeURL(), "folder_home");
+        root.addBookmark(manager, i18n("Storage Media"), KUrl("media:/"), "blockdevice");
+        root.addBookmark(manager, i18n("Network"), KUrl("remote:/"), "network_local");
+        root.addBookmark(manager, i18n("Root"), KUrl("/"), "folder_red");
+        root.addBookmark(manager, i18n("Trash"), KUrl("trash:/"), "trashcan_full");
+    }
+
+    setupActions();
+    setupGUI(Keys|Save|Create|ToolBar);
+
+    const KUrl& homeURL = root.first().url();
+    setCaption(homeURL.fileName());
+    ViewProperties props(homeURL);
+    m_view[PrimaryIdx] = new DolphinView(m_splitter,
+                                         homeURL,
+                                         props.viewMode(),
+                                         props.isShowHiddenFilesEnabled());
+
+    m_activeView = m_view[PrimaryIdx];
+
+    setCentralWidget(m_splitter);
+
+    // open sidebar
+    SidebarSettings* sidebarSettings = settings.sidebarSettings();
+    assert(sidebarSettings != 0);
+    if (sidebarSettings->visible()) {
+        openSidebar();
+    }
+
+    createGUI();
+
+    stateChanged("new_file");
+    setAutoSaveSettings();
+
+    QClipboard* clipboard = QApplication::clipboard();
+    connect(clipboard, SIGNAL(dataChanged()),
+            this, SLOT(updatePasteAction()));
+    updatePasteAction();
+    updateGoActions();
+
+    setupCreateNewMenuActions();
+
+    loadSettings();
+
+    if (firstRun) {
+        // assure a proper default size if Dolphin runs the first time
+        resize(640, 480);
+    }
+}
+
+void Dolphin::loadSettings()
+{
+    GeneralSettings* settings = DolphinSettings::instance().generalSettings();
+
+    KToggleAction* splitAction = static_cast<KToggleAction*>(actionCollection()->action("split_view"));
+    if (settings->splitView()) {
+        splitAction->setChecked(true);
+        toggleSplitView();
+    }
+
+    updateViewActions();
+}
+
+void Dolphin::setupActions()
+{
+    // setup 'File' menu
+    //KAction* createFolder = new KAction(i18n("Folder..."), "Ctrl+N",
+    //                                    this, SLOT(createFolder()),
+    //                                    actionCollection(), "create_folder");
+    KAction* createFolder = new KAction(i18n("Folder..."), actionCollection(), "create_folder");
+    createFolder->setIcon(KIcon("folder"));
+    createFolder->setShortcut(Qt::Key_N);
+    connect(createFolder, SIGNAL(triggered()), this, SLOT(createFolder()));
+
+    //new KAction(i18n("Rename"), KKey(Key_F2),
+    //            this, SLOT(rename()),
+    //            actionCollection(), "rename");
+    KAction* rename = new KAction(i18n("Rename"), actionCollection(), "rename");
+    rename->setShortcut(Qt::Key_F2);
+    connect(rename, SIGNAL(triggered()), this, SLOT(rename()));
+
+    //KAction* moveToTrashAction = new KAction(i18n("Move to Trash"), KKey(Key_Delete),
+    //                                         this, SLOT(moveToTrash()),
+    //                                         actionCollection(), "move_to_trash");
+    //moveToTrashAction->setIcon("edittrash");
+    KAction* moveToTrash = new KAction(i18n("Move to Trash"), actionCollection(), "move_to_trash");
+    moveToTrash->setIcon(KIcon("edittrash"));
+    moveToTrash->setShortcut(QKeySequence::Delete);
+    connect(moveToTrash, SIGNAL(triggered()), this, SLOT(moveToTrash()));
+
+    //KAction* deleteAction = new KAction(i18n("Delete"), "Shift+Delete",
+    //                                    this, SLOT(deleteItems()),
+    //                                    actionCollection(), "delete");
+    //deleteAction->setIcon("editdelete");
+    KAction* deleteAction = new KAction(i18n("Delete"), actionCollection(), "delete");
+    deleteAction->setShortcut(Qt::ALT | Qt::Key_Delete);
+    deleteAction->setIcon(KIcon("editdelete"));
+    connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteItems()));
+
+    //new KAction(i18n("Propert&ies"), "Alt+Return",
+    //                 this, SLOT(properties()),
+    //                 actionCollection(), "properties");
+    KAction* properties = new KAction(i18n("Propert&ies"), actionCollection(), "properties");
+    properties->setShortcut(Qt::Key_Alt | Qt::Key_Return);
+    connect(properties, SIGNAL(triggered()), this, SLOT(properties()));
+
+    KStdAction::quit(this, SLOT(quit()), actionCollection());
+
+    // setup 'Edit' menu
+    UndoManager& undoManager = UndoManager::instance();
+    KStdAction::undo(&undoManager,
+                     SLOT(undo()),
+                     actionCollection());
+    connect(&undoManager, SIGNAL(undoAvailable(bool)),
+            this, SLOT(slotUndoAvailable(bool)));
+    connect(&undoManager, SIGNAL(undoTextChanged(const QString&)),
+            this, SLOT(slotUndoTextChanged(const QString&)));
+
+    KStdAction::redo(&undoManager,
+                     SLOT(redo()),
+                     actionCollection());
+    connect(&undoManager, SIGNAL(redoAvailable(bool)),
+            this, SLOT(slotRedoAvailable(bool)));
+    connect(&undoManager, SIGNAL(redoTextChanged(const QString&)),
+            this, SLOT(slotRedoTextChanged(const QString&)));
+
+    KStdAction::cut(this, SLOT(cut()), actionCollection());
+    KStdAction::copy(this, SLOT(copy()), actionCollection());
+    KStdAction::paste(this, SLOT(paste()), actionCollection());
+
+    //new KAction(i18n("Select All"), "Ctrl+A",
+    //            this, SLOT(selectAll()),
+    //            actionCollection(), "select_all");
+    KAction* selectAll = new KAction(i18n("Select All"), actionCollection(), "select_all");
+    selectAll->setShortcut(Qt::CTRL + Qt::Key_A);
+    connect(selectAll, SIGNAL(triggered()), this, SLOT(selectAll()));
+
+    //new KAction(i18n("Invert Selection"), "Ctrl+Shift+A",
+    //            this, SLOT(invertSelection()),
+    //            actionCollection(), "invert_selection");
+    KAction* invertSelection = new KAction(i18n("Invert Selection"), actionCollection(), "invert_selection");
+    invertSelection->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_A);
+    connect(invertSelection, SIGNAL(triggered()), this, SLOT(invertSelection()));
+
+    // setup 'View' menu
+    KStdAction::zoomIn(this,
+                       SLOT(zoomIn()),
+                       actionCollection());
+
+    KStdAction::zoomOut(this,
+                        SLOT(zoomOut()),
+                        actionCollection());
+
+    //KAction* iconsView = new KRadioAction(i18n("Icons"), "Ctrl+1",
+    //                                      this, SLOT(setIconsView()),
+    //                                      actionCollection(), "icons");
+    KAction* iconsView = new KAction(i18n("Icons"), actionCollection(), "icons");
+    iconsView->setShortcut(Qt::CTRL | Qt::Key_1);
+    iconsView->setIcon(KIcon("view_icon"));
+    connect(iconsView, SIGNAL(triggered()), this, SLOT(setIconsView()));
+
+    //KRadioAction* detailsView = new KRadioAction(i18n("Details"), "Ctrl+2",
+    //                                             this, SLOT(setDetailsView()),
+    //                                             actionCollection(), "details");
+    KAction* detailsView = new KAction(i18n("Details"), actionCollection(), "details");
+    detailsView->setShortcut(Qt::CTRL | Qt::Key_2);
+    detailsView->setIcon(KIcon("view_text"));
+    connect(detailsView, SIGNAL(triggered()), this, SLOT(setIconsView()));
+
+    //KRadioAction* previewsView = new KRadioAction(i18n("Previews"), "Ctrl+3",
+    //                                               this, SLOT(setPreviewsView()),
+    //                                               actionCollection(), "previews");
+    KAction* previewsView = new KAction(i18n("Previews"), actionCollection(), "previews");
+    previewsView->setShortcut(Qt::CTRL | Qt::Key_3);
+    previewsView->setIcon(KIcon("gvdirpart"));
+    connect(previewsView, SIGNAL(triggered()), this, SLOT(setPreviewsView()));
+
+    QActionGroup* viewModeGroup = new QActionGroup(this);
+    viewModeGroup->addAction(iconsView);
+    viewModeGroup->addAction(detailsView);
+    viewModeGroup->addAction(previewsView);
+
+    KAction* sortByName = new KAction(i18n("By Name"), actionCollection(), "by_name");
+    connect(sortByName, SIGNAL(triggered()), this, SLOT(sortByName()));
+
+    KAction* sortBySize = new KAction(i18n("By Size"), actionCollection(), "by_name");
+    connect(sortBySize, SIGNAL(triggered()), this, SLOT(sortBySize()));
+
+    KAction* sortByDate = new KAction(i18n("By Date"), actionCollection(), "by_name");
+    connect(sortByDate, SIGNAL(triggered()), this, SLOT(sortByDate()));
+
+    QActionGroup* sortGroup = new QActionGroup(this);
+    sortGroup->addAction(sortByName);
+    sortGroup->addAction(sortBySize);
+    sortGroup->addAction(sortByDate);
+
+    KToggleAction* sortDescending = new KToggleAction(i18n("Descending"), actionCollection(), "descending");
+    connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));
+
+    KToggleAction* showHiddenFiles = new KToggleAction(i18n("Show Hidden Files"), actionCollection(), "show_hidden_files");
+    //showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_      KDE4-TODO: what Qt-Key represents '.'?
+    connect(showHiddenFiles, SIGNAL(triggered()), this, SLOT(showHiddenFiles()));
+
+    KToggleAction* split = new KToggleAction(i18n("Split View"), actionCollection(), "split_view");
+    split->setShortcut(Qt::Key_F10);
+    split->setIcon(KIcon("view_left_right"));
+    connect(split, SIGNAL(triggered()), this, SLOT(toggleSplitView()));
+
+    KAction* reload = new KAction(i18n("Reload"), "F5", actionCollection(), "reload");
+    reload->setShortcut(Qt::Key_F5);
+    reload->setIcon(KIcon("reload"));
+    connect(reload, SIGNAL(triggered()), this, SLOT(reloadView()));
+
+    KAction* stop = new KAction(i18n("Stop"), actionCollection(), "stop");
+    stop->setIcon(KIcon("stop"));
+    connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));
+
+    KToggleAction* showFullLocation = new KToggleAction(i18n("Show Full Location"), actionCollection(), "editable_location");
+    showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L);
+    connect(showFullLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation()));
+
+    KToggleAction* editLocation = new KToggleAction(i18n("Edit Location"), actionCollection(), "edit_location");
+    editLocation->setShortcut(Qt::Key_F6);
+    connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation()));
+
+    KToggleAction* sidebar = new KToggleAction(i18n("Sidebar"), actionCollection(), "sidebar");
+    sidebar->setShortcut(Qt::Key_F9);
+    connect(sidebar, SIGNAL(triggered()), this, SLOT(toggleSidebar()));
+
+    KAction* adjustViewProps = new KAction(i18n("Adjust View Properties..."), actionCollection(), "view_properties");
+    connect(adjustViewProps, SIGNAL(triggered()), this, SLOT(adjustViewProperties()));
+
+    // setup 'Go' menu
+    KStdAction::back(this, SLOT(goBack()), actionCollection());
+    KStdAction::forward(this, SLOT(goForward()), actionCollection());
+    KStdAction::up(this, SLOT(goUp()), actionCollection());
+    KStdAction::home(this, SLOT(goHome()), actionCollection());
+
+    // setup 'Tools' menu
+    KAction* openTerminal = new KAction(i18n("Open Terminal"), actionCollection(), "open_terminal");
+    openTerminal->setShortcut(Qt::Key_F4);
+    openTerminal->setIcon(KIcon("konsole"));
+    connect(openTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));
+
+    KAction* findFile = new KAction(i18n("Find File..."), actionCollection(), "find_file");
+    findFile->setShortcut(Qt::Key_F);
+    findFile->setIcon(KIcon("filefind"));
+    connect(findFile, SIGNAL(triggered()), this, SLOT(findFile()));
+
+    KToggleAction* showFilterBar = new KToggleAction(i18n("Show Filter Bar"), actionCollection(), "show_filter_bar");
+    showFilterBar->setShortcut(Qt::Key_Slash);
+    connect(showFilterBar, SIGNAL(triggered()), this, SLOT(showFilterBar()));
+
+    KAction* compareFiles = new KAction(i18n("Compare Files"), actionCollection(), "compare_files");
+    compareFiles->setIcon(KIcon("kompare"));
+    compareFiles->setEnabled(false);
+    connect(compareFiles, SIGNAL(triggered()), this, SLOT(compareFiles()));
+
+    // setup 'Settings' menu
+    KStdAction::preferences(this, SLOT(editSettings()), actionCollection());
+}
+
+void Dolphin::setupCreateNewMenuActions()
+{
+    // Parts of the following code have been taken
+    // from the class KNewMenu located in
+    // libqonq/knewmenu.h of Konqueror.
+    //  Copyright (C) 1998, 1999 David Faure <faure@kde.org>
+    //                2003       Sven Leiber <s.leiber@web.de>
+
+    QStringList files = actionCollection()->instance()->dirs()->findAllResources("templates");
+    for (QStringList::Iterator it = files.begin() ; it != files.end(); ++it) {
+        if ((*it)[0] != '.' ) {
+            KSimpleConfig config(*it, true);
+            config.setDesktopGroup();
+
+            // tricky solution to ensure that TextFile is at the beginning
+            // because this filetype is the most used (according kde-core discussion)
+            const QString name(config.readEntry("Name"));
+            QString key(name);
+
+            const QString path(config.readPathEntry("URL"));
+            if (!path.endsWith("emptydir")) {
+                if (path.endsWith("TextFile.txt")) {
+                    key = "1" + key;
+                }
+                else if (!KDesktopFile::isDesktopFile(path)) {
+                    key = "2" + key;
+                }
+                else if (path.endsWith("URL.desktop")){
+                    key = "3" + key;
+                }
+                else if (path.endsWith("Program.desktop")){
+                    key = "4" + key;
+                }
+                else {
+                    key = "5";
+                }
+
+                const QString icon(config.readEntry("Icon"));
+                const QString comment(config.readEntry("Comment"));
+                const QString type(config.readEntry("Type"));
+
+                const QString filePath(*it);
+
+
+                if (type == "Link") {
+                    CreateFileEntry entry;
+                    entry.name = name;
+                    entry.icon = icon;
+                    entry.comment = comment;
+                    entry.templatePath = filePath;
+                    m_createFileTemplates.insert(key, entry);
+                }
+            }
+        }
+    }
+    m_createFileTemplates.sort();
+
+    unplugActionList("create_actions");
+    KSortableList<CreateFileEntry, QString>::ConstIterator it = m_createFileTemplates.begin();
+    KSortableList<CreateFileEntry, QString>::ConstIterator end = m_createFileTemplates.end();
+    /* KDE4-TODO:
+    while (it != end) {
+        CreateFileEntry entry = (*it).value();
+        KAction* action = new KAction(entry.name);
+        action->setIcon(entry.icon);
+        action->setName((*it).index());
+        connect(action, SIGNAL(activated()),
+                this, SLOT(createFile()));
+
+        const QChar section = ((*it).index()[0]);
+        switch (section) {
+            case '1':
+            case '2': {
+                m_fileGroupActions.append(action);
+                break;
+            }
+
+            case '3':
+            case '4': {
+                // TODO: not used yet. See documentation of Dolphin::linkGroupActions()
+                // and Dolphin::linkToDeviceActions() in the header file for details.
+                //m_linkGroupActions.append(action);
+                break;
+            }
+
+            case '5': {
+                // TODO: not used yet. See documentation of Dolphin::linkGroupActions()
+                // and Dolphin::linkToDeviceActions() in the header file for details.
+                //m_linkToDeviceActions.append(action);
+                break;
+            }
+            default:
+                break;
+        }
+        ++it;
+    }
+
+    plugActionList("create_file_group", m_fileGroupActions);
+    //plugActionList("create_link_group", m_linkGroupActions);
+    //plugActionList("link_to_device", m_linkToDeviceActions);*/
+}
+
+void Dolphin::updateHistory()
+{
+    int index = 0;
+    const Q3ValueList<URLNavigator::HistoryElem> list = m_activeView->urlHistory(index);
+
+    KAction* backAction = actionCollection()->action("go_back");
+    if (backAction != 0) {
+        backAction->setEnabled(index < static_cast<int>(list.count()) - 1);
+    }
+
+    KAction* forwardAction = actionCollection()->action("go_forward");
+    if (forwardAction != 0) {
+        forwardAction->setEnabled(index > 0);
+    }
+}
+
+void Dolphin::updateEditActions()
+{
+    const KFileItemList* list = m_activeView->selectedItems();
+    if ((list == 0) || (*list).isEmpty()) {
+        stateChanged("has_no_selection");
+    }
+    else {
+        stateChanged("has_selection");
+
+        KAction* renameAction = actionCollection()->action("rename");
+        if (renameAction != 0) {
+            renameAction->setEnabled(list->count() >= 1);
+        }
+
+        bool enableMoveToTrash = true;
+
+        KFileItemList::const_iterator it = list->begin();
+        const KFileItemList::const_iterator end = list->end();
+        KFileItem* item = 0;
+        while (it != end) {
+            const KUrl& url = item->url();
+            // only enable the 'Move to Trash' action for local files
+            if (!url.isLocalFile()) {
+                enableMoveToTrash = false;
+            }
+            ++it;
+        }
+
+        KAction* moveToTrashAction = actionCollection()->action("move_to_trash");
+        moveToTrashAction->setEnabled(enableMoveToTrash);
+    }
+    updatePasteAction();
+}
+
+void Dolphin::updateViewActions()
+{
+    KAction* zoomInAction = actionCollection()->action(KStdAction::stdName(KStdAction::ZoomIn));
+    if (zoomInAction != 0) {
+        zoomInAction->setEnabled(m_activeView->isZoomInPossible());
+    }
+
+    KAction* zoomOutAction = actionCollection()->action(KStdAction::stdName(KStdAction::ZoomOut));
+    if (zoomOutAction != 0) {
+        zoomOutAction->setEnabled(m_activeView->isZoomOutPossible());
+    }
+
+    KAction* action = 0;
+    switch (m_activeView->mode()) {
+        case DolphinView::IconsView:
+            action = actionCollection()->action("icons");
+            break;
+        case DolphinView::DetailsView:
+            action = actionCollection()->action("details");
+            break;
+        case DolphinView::PreviewsView:
+            action = actionCollection()->action("previews");
+            break;
+        default:
+            break;
+    }
+
+    if (action != 0) {
+        KToggleAction* toggleAction = static_cast<KToggleAction*>(action);
+        toggleAction->setChecked(true);
+    }
+
+    slotSortingChanged(m_activeView->sorting());
+    slotSortOrderChanged(m_activeView->sortOrder());
+
+    KToggleAction* showFilterBarAction =
+        static_cast<KToggleAction*>(actionCollection()->action("show_filter_bar"));
+    showFilterBarAction->setChecked(m_activeView->isFilterBarVisible());
+
+    KToggleAction* showHiddenFilesAction =
+        static_cast<KToggleAction*>(actionCollection()->action("show_hidden_files"));
+    showHiddenFilesAction->setChecked(m_activeView->isShowHiddenFilesEnabled());
+
+    KToggleAction* splitAction = static_cast<KToggleAction*>(actionCollection()->action("split_view"));
+    splitAction->setChecked(m_view[SecondaryIdx] != 0);
+
+    KToggleAction* sidebarAction = static_cast<KToggleAction*>(actionCollection()->action("sidebar"));
+    sidebarAction->setChecked(m_sidebar != 0);
+}
+
+void Dolphin::updateGoActions()
+{
+    KAction* goUpAction = actionCollection()->action(KStdAction::stdName(KStdAction::Up));
+    const KUrl& currentURL = m_activeView->url();
+    goUpAction->setEnabled(currentURL.upUrl() != currentURL);
+}
+
+void Dolphin::updateViewProperties(const KUrl::List& urls)
+{
+    if (urls.isEmpty()) {
+        return;
+    }
+
+    // Updating the view properties might take up to several seconds
+    // when dragging several thousand URLs. Writing a KIO slave for this
+    // use case is not worth the effort, but at least the main widget
+    // must be disabled and a progress should be shown.
+    ProgressIndicator progressIndicator(i18n("Updating view properties..."),
+                                        QString::null,
+                                        urls.count());
+
+    KUrl::List::ConstIterator end = urls.end();
+    for(KUrl::List::ConstIterator it = urls.begin(); it != end; ++it) {
+        progressIndicator.execOperation();
+
+        ViewProperties props(*it);
+        props.save();
+    }
+}
+
+void Dolphin::copyURLs(const KUrl::List& source, const KUrl& dest)
+{
+    KIO::Job* job = KIO::copy(source, dest);
+    addPendingUndoJob(job, DolphinCommand::Copy, source, dest);
+}
+
+void Dolphin::moveURLs(const KUrl::List& source, const KUrl& dest)
+{
+    KIO::Job* job = KIO::move(source, dest);
+    addPendingUndoJob(job, DolphinCommand::Move, source, dest);
+}
+
+void Dolphin::addPendingUndoJob(KIO::Job* job,
+                                DolphinCommand::Type commandType,
+                                const KUrl::List& source,
+                                const KUrl& dest)
+{
+    connect(job, SIGNAL(result(KIO::Job*)),
+            this, SLOT(addUndoOperation(KIO::Job*)));
+
+    UndoInfo undoInfo;
+    undoInfo.id = job->progressId();
+    undoInfo.command = DolphinCommand(commandType, source, dest);
+    m_pendingUndoJobs.append(undoInfo);
+}
+
+void Dolphin::clearStatusBar()
+{
+    m_activeView->statusBar()->clear();
+}
+
+void Dolphin::openSidebar()
+{
+    if (m_sidebar != 0) {
+        // the sidebar is already open
+        return;
+    }
+
+    m_sidebar = new Sidebar(m_splitter);
+    m_sidebar->show();
+
+    connect(m_sidebar, SIGNAL(urlChanged(const KUrl&)),
+            this, SLOT(slotURLChangeRequest(const KUrl&)));
+    m_splitter->setCollapsible(m_sidebar, false);
+    m_splitter->setResizeMode(m_sidebar, QSplitter::KeepSize);
+    m_splitter->moveToFirst(m_sidebar);
+
+    SidebarSettings* settings = DolphinSettings::instance().sidebarSettings();
+    settings->setVisible(true);
+}
+
+#include "dolphin.moc"
diff --git a/src/dolphin.desktop b/src/dolphin.desktop
new file mode 100644 (file)
index 0000000..9159e47
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Dolphin
+Exec=dolphin %i %m -caption "%c"
+Icon=dolphin
+Type=Application
+DocPath=dolphin/dolphin.html
+Categories=System;FileManager;
+GenericName=File Manager
+GenericName[de]=Datei Manager
+Terminal=false
diff --git a/src/dolphin.h b/src/dolphin.h
new file mode 100644 (file)
index 0000000..4ad7096
--- /dev/null
@@ -0,0 +1,455 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Stefan Monov <logixoul@gmail.com>               *
+ *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef _DOLPHIN_H_
+#define _DOLPHIN_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <kmainwindow.h>
+#include <q3valuelist.h>
+#include <q3ptrlist.h>
+#include <qstring.h>
+//Added by qt3to4:
+#include <QCloseEvent>
+#include <ksortablelist.h>
+
+#include "dolphinview.h"
+#include "undomanager.h"
+
+class KPrinter;
+class KUrl;
+class QLineEdit;
+class KFileIconView;
+class Q3HBox;
+class Q3IconViewItem;
+class QSplitter;
+class KAction;
+class URLNavigator;
+class Sidebar;
+
+/**
+ * @short Main window for Dolphin.
+ *
+ * Handles the menus, toolbars and Dolphin views.
+ *
+ * @author Peter Penz <peter.penz@gmx.at>
+*/
+class Dolphin : public KMainWindow
+{
+    Q_OBJECT
+
+public:
+    /**
+     * Returns the instance for the Dolphin main window.
+     */
+    // KXMLGUIClient::instance() already in use :-(
+    static Dolphin& mainWin();
+
+    virtual ~Dolphin();
+
+       /**
+     * Activates the given view, which means that
+     * all menu actions are applied to this view. When
+     * having a split view setup the nonactive view
+     * is usually shown in darker colors.
+     */
+    void setActiveView(DolphinView* view);
+
+    /**
+     * Returns the currently active view. See
+     * Dolphin::setActiveView() for more details.
+     */
+    DolphinView* activeView() const { return m_activeView; }
+
+    /**
+     * Handles the dropping of URLs to the given
+     * destination. A context menu with the options
+     * 'Move Here', 'Copy Here', 'Link Here' and
+     * 'Cancel' is offered to the user.
+     * @param urls        List of URLs which have been
+     *                    dropped.
+     * @param destination Destination URL, where the
+     *                    list or URLs should be moved,
+     *                    copied or linked to.
+     */
+    void dropURLs(const KUrl::List& urls,
+                  const KUrl& destination);
+
+    /**
+     * Returns 'true', if the clipboard contains data
+     * which has been cutted by the Cut action (Ctrl + X).
+     */
+    bool clipboardContainsCutData() const { return m_clipboardContainsCutData; }
+
+    /**
+     * Returns the list of actions which are part of the file group
+     * of the 'Create New...' sub menu. Usually the list contains actions
+     * for creating folders, text files, HTML files etc.
+     */
+    const Q3PtrList<KAction>& fileGroupActions() const { return m_fileGroupActions; }
+    //const QPtrList<KAction>& linkGroupActions() const { return m_linkGroupActions; }
+    //const QPtrList<KAction>& linkToDeviceActions() const { return m_linkToDeviceActions; }
+
+    /**
+     * Refreshs the views of the main window by recreating them dependent from
+     * the given Dolphin settings.
+     */
+    void refreshViews();
+
+signals:
+    /**
+     * Is send if the active view has been changed in
+     * the split view mode.
+     */
+    void activeViewChanged();
+
+    /**
+     * Is send if the selection of the currently active view has
+     * been changed.
+     */
+    void selectionChanged();
+
+public slots:
+    /**
+     * Updates the state of the 'Back' and 'Forward' menu
+     * actions corresponding the the current history.
+     */
+    void slotHistoryChanged();
+
+    /**
+     * Updates the caption of the main window and the state
+     * of all menu actions which depend from a changed URL.
+     */
+    void slotURLChanged(const KUrl& url);
+
+    /**
+     * Go to the given URL.
+     */
+    void slotURLChangeRequest(const KUrl& url);
+
+    /** Updates the state of all 'View' menu actions. */
+    void slotViewModeChanged();
+
+    /** Updates the state of the 'Show hidden files' menu action. */
+    void slotShowHiddenFilesChanged();
+
+    /** Updates the state of the 'Show filter bar' menu action. */
+    void slotShowFilterBarChanged();
+
+    /** Updates the state of the 'Sort by' actions. */
+    void slotSortingChanged(DolphinView::Sorting sorting);
+
+    /** Updates the state of the 'Sort Ascending/Descending' action. */
+    void slotSortOrderChanged(Qt::SortOrder order);
+
+    /** Updates the state of the 'Edit' menu actions. */
+    void slotSelectionChanged();
+
+protected:
+    /** @see QMainWindow::closeEvent */
+    virtual void closeEvent(QCloseEvent* event);
+
+    /**
+     * This method is called when it is time for the app to save its
+     * properties for session management purposes.
+     */
+    void saveProperties(KConfig*);
+
+    /**
+     * This method is called when this app is restored.  The KConfig
+     * object points to the session management config file that was saved
+     * with @ref saveProperties
+     */
+    void readProperties(KConfig*);
+
+private slots:
+    /** Opens an input dialog for creating a new folder. */
+    void createFolder();
+
+    /** Creates a file with the MIME type given by the sender. */
+    void createFile();
+
+    /** Renames the selected item of the active view. */
+    void rename();
+
+    /** Moves the selected items of the active view to the trash. */
+    void moveToTrash();
+
+    /** Deletes the selected items of the active view. */
+    void deleteItems();
+
+    /**
+     * Opens the properties window for the selected items of the
+     * active view. The properties windows shows informations
+     * like name, size and permissions.
+     */
+    void properties();
+
+    /** Stores all settings and quits Dolphin. */
+    void quit();
+
+    /**
+     * Shows the error information of the job \a job
+     * in the status bar.
+     */
+    void slotHandleJobError(KIO::Job* job);
+
+    /**
+     * Indicates in the status bar that the delete operation
+     * of the job \a job has been finished.
+     */
+    void slotDeleteFileFinished(KIO::Job* job);
+
+    /**
+     * Updates the state of the 'Undo' menu action dependent
+     * from the parameter \a available.
+     */
+    void slotUndoAvailable(bool available);
+
+    /** Sets the text of the 'Undo' menu action to \a text. */
+    void slotUndoTextChanged(const QString& text);
+
+    /**
+     * Updates the state of the 'Redo' menu action dependent
+     * from the parameter \a available.
+     */
+    void slotRedoAvailable(bool available);
+
+    /** Sets the text of the 'Redo' menu action to \a text. */
+    void slotRedoTextChanged(const QString& text);
+
+    /**
+     * Copies all selected items to the clipboard and marks
+     * the items as cutted.
+     */
+    void cut();
+
+    /** Copies all selected items to the clipboard. */
+    void copy();
+
+    /** Pastes the clipboard data to the active view. */
+    void paste();
+
+    /**
+     * Updates the text of the paste action dependent from
+     * the number of items which are in the clipboard.
+     */
+    void updatePasteAction();
+
+    /** Selects all items from the active view. */
+    void selectAll();
+
+    /**
+     * Inverts the selection of all items of the active view:
+     * Selected items get nonselected and nonselected items get
+     * selected.
+     */
+    void invertSelection();
+
+    /** The current active view is switched to the icons mode. */
+    void setIconsView();
+
+    /** The current active view is switched to the details mode. */
+    void setDetailsView();
+
+    /** The current active view is switched to the previews mode. */
+    void setPreviewsView();
+
+    /** The sorting of the current view should be done by the name. */
+    void sortByName();
+
+    /** The sorting of the current view should be done by the size. */
+    void sortBySize();
+
+    /** The sorting of the current view should be done by the date. */
+    void sortByDate();
+
+    /** Switches between an ascending and descending sorting order. */
+    void toggleSortOrder();
+
+    /**
+     * Switches between one and two views:
+     * If one view is visible, it will get split into two views.
+     * If already two views are visible, the nonactivated view gets closed.
+     */
+    void toggleSplitView();
+
+    /** Reloads the current active view. */
+    void reloadView();
+
+    /** Stops the loading process for the current active view. */
+    void stopLoading();
+
+    /**
+     * Switches between showing and hiding of hidden marked files dependent
+     * from the current state of the 'Show Hidden Files' menu toggle action.
+     */
+    void showHiddenFiles();
+
+    /**
+     * Switches between showing and hiding of the filter bar dependent
+     * from the current state of the 'Show Filter Bar' menu toggle action.
+     */
+    void showFilterBar();
+
+    /** Increases the size of the current set view mode. */
+    void zoomIn();
+
+    /** Decreases the size of the current set view mode. */
+    void zoomOut();
+
+    /**
+     * Toggles between edit and brose mode of the navigation bar.
+     */
+    void toggleEditLocation();
+
+    /**
+     * Switches to the edit mode of the navigation bar. If the edit mode is
+     * already active, it is assured that the navigation bar get focused.
+     */
+    void editLocation();
+
+    /**
+     * Opens the view properties dialog, which allows to modify the properties
+     * of the currently active view.
+     */
+    void adjustViewProperties();
+
+    /** Goes back on step of the URL history. */
+    void goBack();
+
+    /** Goes forward one step of the URL history. */
+    void goForward();
+
+    /** Goes up one hierarchy of the current URL. */
+    void goUp();
+
+    /** Goes to the home URL. */
+    void goHome();
+
+    /** Opens a terminal for the current shown directory. */
+    void openTerminal();
+
+    /** Opens KFind for the current shown directory. */
+    void findFile();
+
+    /** Opens Kompare for 2 selected files. */
+    void compareFiles();
+
+    /** Opens the settings dialog for Dolphin. */
+    void editSettings();
+
+    /**
+     * Adds the undo operation given by \a job
+     * to the UndoManager.
+     */
+    void addUndoOperation(KIO::Job* job);
+
+
+    void toggleSidebar();
+
+    /**
+     * Stores the current sidebar width and closes
+     * the sidebar.
+     */
+    void closeSidebar();
+
+private:
+    Dolphin();
+    void init();
+    void loadSettings();
+
+    void setupAccel();
+    void setupActions();
+    void setupCreateNewMenuActions();
+    void updateHistory();
+    void updateEditActions();
+    void updateViewActions();
+    void updateGoActions();
+    void updateViewProperties(const KUrl::List& urls);
+    void copyURLs(const KUrl::List& source, const KUrl& dest);
+    void moveURLs(const KUrl::List& source, const KUrl& dest);
+    void addPendingUndoJob(KIO::Job* job,
+                           DolphinCommand::Type commandType,
+                           const KUrl::List& source,
+                           const KUrl& dest);
+    void clearStatusBar();
+    void openSidebar();
+
+    QSplitter* m_splitter;
+    Sidebar* m_sidebar;
+    DolphinView* m_activeView;
+
+    /**
+     * Dolphin supports only one or two views, which
+     * are handled internally as primary and secondary view.
+     */
+    enum ViewIndex
+    {
+        PrimaryIdx = 0,
+        SecondaryIdx = 1
+    };
+    DolphinView* m_view[SecondaryIdx + 1];
+
+    /// If set to true, the clipboard contains data which should be cutted after pasting.
+    bool m_clipboardContainsCutData;
+
+    /**
+     * Asynchronous operations like 'Move' and 'Copy' may only be added as undo
+     * operation after they have been finished successfully. When an asynchronous
+     * operation is started, it is added to a pending undo jobs list in the meantime.
+     * As soon as the job has been finished, the operation is added to the undo mangager.
+     * @see UndoManager
+     * @see Dolphin::addPendingUndoJob
+     * @see Dolphin::addUndoOperation
+     */
+    struct UndoInfo
+    {
+        int id;
+        DolphinCommand command;
+    };
+    Q3ValueList<UndoInfo> m_pendingUndoJobs;
+
+    /** Contains meta information for creating files. */
+    struct CreateFileEntry
+    {
+        QString name;
+        QString filePath;
+        QString templatePath;
+        QString icon;
+        QString comment;
+    };
+
+    Q3PtrList<KAction> m_fileGroupActions;
+    KSortableList<CreateFileEntry,QString> m_createFileTemplates;
+
+    // TODO: not used yet. See documentation of Dolphin::linkGroupActions()
+    // and Dolphin::linkToDeviceActions() in for details.
+    //QPtrList<KAction> m_linkGroupActions;
+    //QPtrList<KAction> m_linkToDeviceActions;
+};
+
+#endif // _DOLPHIN_H_
+
diff --git a/src/dolphin.lsm b/src/dolphin.lsm
new file mode 100644 (file)
index 0000000..6733258
--- /dev/null
@@ -0,0 +1,16 @@
+Begin3
+Title:          Dolphin -- Some description
+Version:        0.1
+Entered-date:   
+Description:    
+Keywords:       KDE Qt
+Author:         Peter Penz <peter.penz@gmx.at>
+Maintained-by:  Peter Penz <peter.penz@gmx.at>
+Home-page:      
+Alternate-site: 
+Primary-site:   ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+                xxxxxx  dolphin-0.1.tar.gz
+                xxx     dolphin-0.1.lsm
+Platform:       Linux. Needs KDE
+Copying-policy: GPL
+End
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp
new file mode 100644 (file)
index 0000000..51ce6bb
--- /dev/null
@@ -0,0 +1,476 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at) and              *
+ *   Cvetoslav Ludmiloff                                                   *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphincontextmenu.h"
+
+#include <kactioncollection.h>
+#include <kbookmarkmanager.h>
+#include <kbookmark.h>
+#include <ktrader.h>
+#include <klocale.h>
+#include <krun.h>
+#include <qdir.h>
+//Added by qt3to4:
+#include <Q3ValueList>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+#include <kaction.h>
+#include <kpropertiesdialog.h>
+#include <kdesktopfile.h>
+#include <assert.h>
+#include <ksortablevaluelist.h>
+#include <kio/netaccess.h>
+
+#include "dolphin.h"
+#include "dolphinview.h"
+#include "editbookmarkdialog.h"
+#include "dolphinsettings.h"
+
+
+DolphinContextMenu::DolphinContextMenu(DolphinView* parent,
+                                       KFileItem* fileInfo,
+                                       const QPoint& pos) :
+   m_dolphinView(parent),
+   m_fileInfo(fileInfo),
+   m_pos(pos)
+{
+}
+
+void DolphinContextMenu::open()
+{
+    if (m_fileInfo == 0) {
+        openViewportContextMenu();
+    }
+    else {
+        openItemContextMenu();
+    }
+}
+
+DolphinContextMenu::~DolphinContextMenu()
+{
+}
+
+void DolphinContextMenu::openViewportContextMenu()
+{
+    // Parts of the following code have been taken
+    // from the class KonqOperations located in
+    // libqonq/konq_operations.h of Konqueror.
+    // (Copyright (C) 2000  David Faure <faure@kde.org>)
+
+    assert(m_fileInfo == 0);
+    const int propertiesID = 100;
+       const int bookmarkID = 101;
+
+    KPopupMenu* popup = new KPopupMenu(m_dolphinView);
+    Dolphin& dolphin = Dolphin::mainWin();
+
+    // setup 'Create New' menu
+    KPopupMenu* createNewMenu = new KPopupMenu();
+
+    KAction* createFolderAction = dolphin.actionCollection()->action("create_folder");
+    if (createFolderAction != 0) {
+        createFolderAction->plug(createNewMenu);
+    }
+
+    createNewMenu->insertSeparator();
+
+    KAction* action = 0;
+
+    Q3PtrListIterator<KAction> fileGrouptIt(dolphin.fileGroupActions());
+    while ((action = fileGrouptIt.current()) != 0) {
+        action->plug(createNewMenu);
+        ++fileGrouptIt;
+    }
+
+    // TODO: not used yet. See documentation of Dolphin::linkGroupActions()
+    // and Dolphin::linkToDeviceActions() in the header file for details.
+    //
+    //createNewMenu->insertSeparator();
+    //
+    //QPtrListIterator<KAction> linkGroupIt(dolphin.linkGroupActions());
+    //while ((action = linkGroupIt.current()) != 0) {
+    //    action->plug(createNewMenu);
+    //    ++linkGroupIt;
+    //}
+    //
+    //KPopupMenu* linkToDeviceMenu = new KPopupMenu();
+    //QPtrListIterator<KAction> linkToDeviceIt(dolphin.linkToDeviceActions());
+    //while ((action = linkToDeviceIt.current()) != 0) {
+    //    action->plug(linkToDeviceMenu);
+    //    ++linkToDeviceIt;
+    //}
+    //
+    //createNewMenu->insertItem(i18n("Link to Device"), linkToDeviceMenu);
+
+    popup->insertItem(SmallIcon("filenew"), i18n("Create New"), createNewMenu);
+    popup->insertSeparator();
+
+    KAction* pasteAction = dolphin.actionCollection()->action(KStdAction::stdName(KStdAction::Paste));
+    pasteAction->plug(popup);
+
+    // setup 'View Mode' menu
+    KPopupMenu* viewModeMenu = new KPopupMenu();
+
+    KAction* iconsMode = dolphin.actionCollection()->action("icons");
+    iconsMode->plug(viewModeMenu);
+
+    KAction* detailsMode = dolphin.actionCollection()->action("details");
+    detailsMode->plug(viewModeMenu);
+
+    KAction* previewsMode = dolphin.actionCollection()->action("previews");
+    previewsMode->plug(viewModeMenu);
+
+    popup->insertItem(i18n("View Mode"), viewModeMenu);
+    popup->insertSeparator();
+
+    popup->insertItem(i18n("Bookmark this folder"), bookmarkID);
+    popup->insertSeparator();
+
+    popup->insertItem(i18n("Properties..."), propertiesID);
+
+    int id = popup->exec(m_pos);
+    if (id == propertiesID) {
+        new KPropertiesDialog(dolphin.activeView()->url());
+    }
+    else if (id == bookmarkID) {
+        const KURL& url = dolphin.activeView()->url();
+        KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add folder as bookmark"),
+                                                             url.filename(),
+                                                             url,
+                                                             "bookmark");
+        if (!bookmark.isNull()) {
+            KBookmarkManager* manager = DolphinSettings::instance().bookmarkManager();
+            KBookmarkGroup root = manager->root();
+            root.addBookmark(manager, bookmark);
+            manager->emitChanged(root);
+        }
+    }
+
+    popup->deleteLater();
+}
+
+void DolphinContextMenu::openItemContextMenu()
+{
+    // Parts of the following code have been taken
+    // from the class KonqOperations located in
+    // libqonq/konq_operations.h of Konqueror.
+    // (Copyright (C) 2000  David Faure <faure@kde.org>)
+
+    assert(m_fileInfo != 0);
+
+    KPopupMenu* popup = new KPopupMenu(m_dolphinView);
+    Dolphin& dolphin = Dolphin::mainWin();
+    const KURL::List urls = m_dolphinView->selectedURLs();
+
+    // insert 'Cut', 'Copy' and 'Paste'
+    const KStdAction::StdAction actionNames[] = { KStdAction::Cut, KStdAction::Copy, KStdAction::Paste };
+    const int count = sizeof(actionNames) / sizeof(KStdAction::StdAction);
+    for (int i = 0; i < count; ++i) {
+        KAction* action = dolphin.actionCollection()->action(KStdAction::stdName(actionNames[i]));
+        if (action != 0) {
+            action->plug(popup);
+        }
+    }
+    popup->insertSeparator();
+
+    // insert 'Rename'
+    KAction* renameAction = dolphin.actionCollection()->action("rename");
+    renameAction->plug(popup);
+
+    // insert 'Move to Trash' for local URLs, otherwise insert 'Delete'
+    const KURL& url = dolphin.activeView()->url();
+    if (url.isLocalFile()) {
+        KAction* moveToTrashAction = dolphin.actionCollection()->action("move_to_trash");
+        moveToTrashAction->plug(popup);
+    }
+    else {
+        KAction* deleteAction = dolphin.actionCollection()->action("delete");
+        deleteAction->plug(popup);
+    }
+
+    // insert 'Bookmark this folder...' entry
+    // urls is a list of selected items, so insert boolmark menu if
+    // urls contains only one item, i.e. no multiple selection made
+    if (m_fileInfo->isDir() && (urls.count() == 1)) {
+        popup->insertItem(i18n("Bookmark this folder"), bookmarkID);
+    }
+
+    popup->insertSeparator();
+
+    // Insert 'Open With...' sub menu
+    Q3ValueVector<KService::Ptr> openWithVector;
+    const int openWithID = insertOpenWithItems(popup, openWithVector);
+
+    // Insert 'Actions' sub menu
+    Q3ValueVector<KDEDesktopMimeType::Service> actionsVector;
+    insertActionItems(popup, actionsVector);
+
+    // insert 'Properties...' entry
+    popup->insertSeparator();
+    KAction* propertiesAction = dolphin.actionCollection()->action("properties");
+    propertiesAction->plug(popup);
+
+    int id = popup->exec(m_pos);
+
+    if (id == bookmarkID) {
+        const KURL selectedURL(m_fileInfo->url());
+        KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add folder as bookmark"),
+                                                             selectedURL.filename(),
+                                                             selectedURL,
+                                                             "bookmark");
+        if (!bookmark.isNull()) {
+            KBookmarkManager* manager = DolphinSettings::instance().bookmarkManager();
+            KBookmarkGroup root = manager->root();
+            root.addBookmark(manager, bookmark);
+            manager->emitChanged(root);
+        }
+    }
+    else if (id >= actionsIDStart) {
+        // one of the 'Actions' items has been selected
+        KDEDesktopMimeType::executeService(urls, actionsVector[id - actionsIDStart]);
+    }
+    else if (id >= openWithIDStart) {
+        // one of the 'Open With' items has been selected
+        if (id == openWithID) {
+            // the item 'Other...' has been selected
+            KRun::displayOpenWithDialog(urls);
+        }
+        else {
+            KService::Ptr servicePtr = openWithVector[id - openWithIDStart];
+            KRun::run(*servicePtr, urls);
+        }
+    }
+
+    openWithVector.clear();
+    actionsVector.clear();
+    popup->deleteLater();
+}
+
+int DolphinContextMenu::insertOpenWithItems(KPopupMenu* popup,
+                                            Q3ValueVector<KService::Ptr>& openWithVector)
+{
+    // Prepare 'Open With' sub menu. Usually a sub menu is created, where all applications
+    // are listed which are registered to open the item. As last entry "Other..." will be
+    // attached which allows to select a custom application. If no applications are registered
+    // no sub menu is created at all, only "Open With..." will be offered.
+    const KFileItemList* list = m_dolphinView->selectedItems();
+    assert(list != 0);
+
+    bool insertOpenWithItems = true;
+    const QString contextMimeType(m_fileInfo->mimetype());
+    KFileItemListIterator mimeIt(*list);
+    KFileItem* item = 0;
+    while (insertOpenWithItems && ((item = mimeIt.current()) != 0)) {
+        insertOpenWithItems = (contextMimeType == item->mimetype());
+        ++mimeIt;
+    }
+
+    int openWithID = -1;
+
+    if (insertOpenWithItems) {
+        // fill the 'Open with' sub menu with application types
+        const KMimeType::Ptr mimePtr = KMimeType::findByURL(m_fileInfo->url());
+        KTrader::OfferList offers = KTrader::self()->query(mimePtr->name(),
+                                                           "Type == 'Application'");
+        int index = openWithIDStart;
+        if (offers.count() > 0) {
+            KTrader::OfferList::Iterator it;
+            KPopupMenu* openWithMenu = new KPopupMenu();
+            for(it = offers.begin(); it != offers.end(); ++it) {
+                // The offer list from the KTrader returns duplicate
+                // application entries. Although this seems to be a configuration
+                // problem outside the scope of Dolphin, duplicated entries just
+                // will be skipped here.
+                const QString appName((*it)->name());
+                if (!containsEntry(openWithMenu, appName)) {
+                    openWithMenu->insertItem((*it)->pixmap(KIcon::Small),
+                                            appName, index);
+                    openWithVector.append(*it);
+                    ++index;
+                }
+            }
+
+            openWithMenu->insertSeparator();
+            openWithMenu->insertItem(i18n("&Other..."), index);
+            popup->insertItem(i18n("Open With"), openWithMenu);
+        }
+        else {
+            // No applications are registered, hence just offer
+            // a "Open With..." item instead of a sub menu containing
+            // only one entry.
+            popup->insertItem(i18n("Open With..."), openWithIDStart);
+        }
+        openWithID = index;
+    }
+    else {
+        // At least one of the selected items has a different MIME type. In this case
+        // just show a disabled "Open With..." entry.
+        popup->insertItem(i18n("Open With..."), openWithIDStart);
+        popup->setItemEnabled(openWithIDStart, false);
+    }
+
+    popup->setItemEnabled(openWithID, insertOpenWithItems);
+
+    return openWithID;
+}
+
+void DolphinContextMenu::insertActionItems(KPopupMenu* popup,
+                                           Q3ValueVector<KDEDesktopMimeType::Service>& actionsVector)
+{
+    KPopupMenu* actionsMenu = new KPopupMenu();
+
+    int actionsIndex = 0;
+
+    QStringList dirs = KGlobal::dirs()->findDirs("data", "dolphin/servicemenus/");
+
+    KPopupMenu* menu = 0;
+    for (QStringList::ConstIterator dirIt = dirs.begin(); dirIt != dirs.end(); ++dirIt) {
+        QDir dir(*dirIt);
+        QStringList entries = dir.entryList("*.desktop", QDir::Files);
+
+        for (QStringList::ConstIterator entryIt = entries.begin(); entryIt != entries.end(); ++entryIt) {
+            KSimpleConfig cfg(*dirIt + *entryIt, true);
+            cfg.setDesktopGroup();
+            if ((cfg.hasKey("Actions") || cfg.hasKey("X-KDE-GetActionMenu")) && cfg.hasKey("ServiceTypes")) {
+                const QStringList types = cfg.readListEntry("ServiceTypes");
+                for (QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) {
+                    // check whether the mime type is equal or whether the
+                    // mimegroup (e. g. image/*) is supported
+
+                    bool insert = false;
+                    if ((*it) == "all/allfiles") {
+                        // The service type is valid for all files, but not for directories.
+                        // Check whether the selected items only consist of files...
+                        const KFileItemList* list = m_dolphinView->selectedItems();
+                        assert(list != 0);
+
+                        KFileItemListIterator mimeIt(*list);
+                        KFileItem* item = 0;
+                        insert = true;
+                        while (insert && ((item = mimeIt.current()) != 0)) {
+                            insert = !item->isDir();
+                            ++mimeIt;
+                        }
+                    }
+
+                    if (!insert) {
+                        // Check whether the MIME types of all selected files match
+                        // to the mimetype of the service action. As soon as one MIME
+                        // type does not match, no service menu is shown at all.
+                        const KFileItemList* list = m_dolphinView->selectedItems();
+                        assert(list != 0);
+
+                        KFileItemListIterator mimeIt(*list);
+                        KFileItem* item = 0;
+                        insert = true;
+                        while (insert && ((item = mimeIt.current()) != 0)) {
+                            const QString mimeType((*mimeIt)->mimetype());
+                            const QString mimeGroup(mimeType.left(mimeType.find('/')));
+
+                            insert  = (*it == mimeType) ||
+                                      ((*it).right(1) == "*") &&
+                                      ((*it).left((*it).find('/')) == mimeGroup);
+                            ++mimeIt;
+                        }
+                    }
+
+                    if (insert) {
+                        menu = actionsMenu;
+
+                        const QString submenuName = cfg.readEntry( "X-KDE-Submenu" );
+                        if (!submenuName.isEmpty()) {
+                            menu = new KPopupMenu();
+                            actionsMenu->insertItem(submenuName, menu, submenuID);
+                        }
+
+                        Q3ValueList<KDEDesktopMimeType::Service> userServices =
+                            KDEDesktopMimeType::userDefinedServices(*dirIt + *entryIt, true);
+
+                        Q3ValueList<KDEDesktopMimeType::Service>::Iterator serviceIt;
+                        for (serviceIt = userServices.begin(); serviceIt != userServices.end(); ++serviceIt) {
+                            KDEDesktopMimeType::Service service = (*serviceIt);
+                            if (!service.m_strIcon.isEmpty()) {
+                                menu->insertItem(SmallIcon(service.m_strIcon),
+                                                 service.m_strName,
+                                                 actionsIDStart + actionsIndex);
+                            }
+                            else {
+                                menu->insertItem(service.m_strName,
+                                                 actionsIDStart + actionsIndex);
+                            }
+                            actionsVector.append(service);
+                            ++actionsIndex;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    const int itemsCount = actionsMenu->count();
+    if (itemsCount == 0) {
+        // no actions are available at all, hence show the "Actions"
+        // submenu disabled
+        actionsMenu->setEnabled(false);
+    }
+
+    if (itemsCount == 1) {
+        // Exactly one item is available. Instead of showing a sub menu with
+        // only one item, show the item directly in the root menu.
+        if (menu == actionsMenu) {
+            // The item is an action, hence show the action in the root menu.
+            const int id = actionsMenu->idAt(0);
+            const QString text(actionsMenu->text(id));
+            const QIcon* iconSet = actionsMenu->iconSet(id);
+            if (iconSet == 0) {
+                popup->insertItem(text, id);
+            }
+            else {
+                popup->insertItem(*iconSet, text, id);
+            }
+        }
+        else {
+            // The item is a sub menu, hence show the sub menu in the root menu.
+            popup->insertItem(actionsMenu->text(submenuID), menu);
+        }
+        actionsMenu->deleteLater();
+        actionsMenu = 0;
+    }
+    else {
+        popup->insertItem(i18n("Actions"), actionsMenu);
+    }
+}
+
+bool DolphinContextMenu::containsEntry(const KPopupMenu* menu,
+                                       const QString& entryName) const
+{
+    assert(menu != 0);
+
+    const uint count = menu->count();
+    for (uint i = 0; i < count; ++i) {
+        const int id = menu->idAt(i);
+        if (menu->text(id) == entryName) {
+            return true;
+        }
+    }
+
+    return false;
+}
diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h
new file mode 100644 (file)
index 0000000..43e3fca
--- /dev/null
@@ -0,0 +1,128 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINCONTEXTMENU_H
+#define DOLPHINCONTEXTMENU_H
+
+#include <qpoint.h>
+#include <qstring.h>
+#include <q3valuelist.h>
+#include <kmountpoint.h>
+#include <q3valuevector.h>
+#include <kservice.h>
+#include <kpropertiesdialog.h>
+#include <kdedesktopmimetype.h>
+
+class KPopupMenu;
+class KFileItem;
+class QPoint;
+class QWidget;
+class DolphinView;
+
+/**
+ * @brief Represents the context menu which appears when doing a right
+ * click on an item or the viewport of the file manager.
+ *
+ * Beside static menu entries (e. g. 'Paste' or 'Properties') two
+ * dynamic sub menus are shown when opening a context menu above
+ * an item:
+ * - 'Open With': Contains all applications which are registered to
+ *                open items of the given MIME type.
+ * - 'Actions':   Contains all actions which can be applied to the
+ *                given item.
+ *
+ *     @author Peter Penz <peter.penz@gmx.at>
+ */
+class DolphinContextMenu
+{
+public:
+    /**
+     * @parent    Pointer to the dolphin view the context menu
+     *            belongs to.
+     * @fileInfo  Pointer to the file item the context menu
+     *            is applied. If 0 is passed, the context menu
+     *            is above the viewport.
+     * @pos       Position of the upper left edge of the context menu.
+     */
+    DolphinContextMenu(DolphinView* parent,
+                       KFileItem* fileInfo,
+                       const QPoint& pos);
+
+    virtual ~DolphinContextMenu();
+
+    /** Opens the context menu modal. */
+    void open();
+
+private:
+    void openViewportContextMenu();
+    void openItemContextMenu();
+
+    /**
+     * Inserts the 'Open With...' submenu to \a popup.
+     * @param popup          Menu where the 'Open With...' sub menu should
+     *                       be added.
+     * @param openWithVector Output parameter which contains all 'Open with...'
+     *                       services.
+     * @return               Identifier of the first 'Open With...' entry.
+     *                       All succeeding identifiers have an increased value of 1
+     *                       to the predecessor.
+     */
+    int insertOpenWithItems(KPopupMenu* popup,
+                            Q3ValueVector<KService::Ptr>& openWithVector);
+
+    /**
+     * Inserts the 'Actions...' submenu to \a popup.
+     * @param popup          Menu where the 'Actions...' sub menu should
+     *                       be added.
+     * @param openWithVector Output parameter which contains all 'Actions...'
+     *                       services.
+     */
+    void insertActionItems(KPopupMenu* popup,
+                           Q3ValueVector<KDEDesktopMimeType::Service>& actionsVector);
+
+    /**
+     * Returns true, if 'menu' contains already
+     * an entry with the name 'entryName'.
+     */
+    bool containsEntry(const KPopupMenu* menu,
+                       const QString& entryName) const;
+
+    enum {
+        submenuID       =   90,
+        bookmarkID      =   91,
+        openWithIDStart =  100,
+        actionsIDStart  = 1000,
+    };
+
+    DolphinView* m_dolphinView;
+    KFileItem* m_fileInfo;
+    QPoint m_pos;
+
+    struct Entry {
+        int type;
+        QString name;
+        QString filePath;     // empty for separator
+        QString templatePath; // same as filePath for template
+        QString icon;
+        QString comment;
+    };
+};
+
+#endif
diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp
new file mode 100644 (file)
index 0000000..1c779b8
--- /dev/null
@@ -0,0 +1,815 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphindetailsview.h"
+
+#include <kurldrag.h>
+#include <qpainter.h>
+#include <qobject.h>
+#include <q3header.h>
+#include <qclipboard.h>
+#include <qpainter.h>
+//Added by qt3to4:
+#include <Q3ValueList>
+#include <QPixmap>
+#include <QDragMoveEvent>
+#include <QDropEvent>
+#include <QResizeEvent>
+#include <QMouseEvent>
+#include <QEvent>
+#include <QPaintEvent>
+#include <klocale.h>
+#include <kglobalsettings.h>
+#include <qscrollbar.h>
+#include <qcursor.h>
+#include <qstyle.h>
+#include <assert.h>
+
+#include "dolphinview.h"
+#include "viewproperties.h"
+#include "dolphin.h"
+#include "kiconeffect.h"
+#include "dolphinsettings.h"
+#include "dolphinstatusbar.h"
+#include "detailsmodesettings.h"
+
+DolphinDetailsView::DolphinDetailsView(DolphinView* parent) :
+    KFileDetailView(parent, 0),
+    m_dolphinView(parent),
+    m_resizeTimer(0),
+    m_scrollTimer(0),
+    m_rubber(0)
+{
+    m_resizeTimer = new QTimer(this);
+    connect(m_resizeTimer, SIGNAL(timeout()),
+            this, SLOT(updateColumnsWidth()));
+
+    setAcceptDrops(true);
+    setSelectionMode(KFile::Extended);
+    setHScrollBarMode(Q3ScrollView::AlwaysOff);
+
+    setColumnAlignment(SizeColumn, Qt::AlignRight);
+    for (int i = DateColumn; i <= GroupColumn; ++i) {
+        setColumnAlignment(i, Qt::AlignHCenter);
+    }
+
+    Dolphin& dolphin = Dolphin::mainWin();
+
+    connect(this, SIGNAL(onItem(Q3ListViewItem*)),
+            this, SLOT(slotOnItem(Q3ListViewItem*)));
+    connect(this, SIGNAL(onViewport()),
+            this, SLOT(slotOnViewport()));
+    connect(this, SIGNAL(contextMenuRequested(Q3ListViewItem*, const QPoint&, int)),
+            this, SLOT(slotContextMenuRequested(Q3ListViewItem*, const QPoint&, int)));
+    connect(this, SIGNAL(selectionChanged()),
+            &dolphin, SLOT(slotSelectionChanged()));
+    connect(&dolphin, SIGNAL(activeViewChanged()),
+            this, SLOT(slotActivationUpdate()));
+    connect(this, SIGNAL(itemRenamed(Q3ListViewItem*, const QString&, int)),
+            this, SLOT(slotItemRenamed(Q3ListViewItem*, const QString&, int)));
+    connect(this, SIGNAL(dropped(QDropEvent*, const KURL::List&, const KURL&)),
+            parent, SLOT(slotURLListDropped(QDropEvent*, const KURL::List&, const KURL&)));
+
+    QClipboard* clipboard = QApplication::clipboard();
+    connect(clipboard, SIGNAL(dataChanged()),
+            this, SLOT(slotUpdateDisabledItems()));
+
+    Q3Header* viewHeader = header();
+    viewHeader->setResizeEnabled(false);
+    viewHeader->setMovingEnabled(false);
+    connect(viewHeader, SIGNAL(clicked(int)),
+            this, SLOT(slotHeaderClicked(int)));
+
+    setMouseTracking(true);
+    setDefaultRenameAction(Q3ListView::Accept);
+
+    refreshSettings();
+}
+
+DolphinDetailsView::~DolphinDetailsView()
+{
+    delete m_rubber;
+    m_rubber = 0;
+}
+
+void DolphinDetailsView::beginItemUpdates()
+{
+}
+
+void DolphinDetailsView::endItemUpdates()
+{
+    updateDisabledItems();
+
+    // Restore the current item. Use the information stored in the history if
+    // available. Otherwise use the first item as current item.
+
+    const KFileListViewItem* item = static_cast<const KFileListViewItem*>(firstChild());
+    if (item != 0) {
+        setCurrentItem(item->fileInfo());
+    }
+
+    int index = 0;
+    const Q3ValueList<URLNavigator::HistoryElem> history = m_dolphinView->urlHistory(index);
+    if (!history.isEmpty()) {
+        KFileView* fileView = static_cast<KFileView*>(this);
+        fileView->setCurrentItem(history[index].currentFileName());
+        setContentsPos(history[index].contentsX(), history[index].contentsY());
+    }
+
+    updateColumnsWidth();
+}
+
+void DolphinDetailsView::insertItem(KFileItem* fileItem)
+{
+    KFileView::insertItem(fileItem);
+
+    DolphinListViewItem* item = new DolphinListViewItem(static_cast<Q3ListView*>(this), fileItem);
+
+    QDir::SortSpec spec = KFileView::sorting();
+    if (spec & QDir::Time) {
+        item->setKey(sortingKey(fileItem->time(KIO::UDS_MODIFICATION_TIME),
+                                fileItem->isDir(),
+                                spec));
+    }
+    else if (spec & QDir::Size) {
+       item->setKey(sortingKey(fileItem->size(), fileItem->isDir(), spec));
+    }
+    else {
+       item->setKey(sortingKey(fileItem->text(), fileItem->isDir(), spec));
+    }
+
+    fileItem->setExtraData(this, item);
+}
+
+bool DolphinDetailsView::isOnFilename(const Q3ListViewItem* item, const QPoint& pos) const
+{
+    const QPoint absPos(mapToGlobal(QPoint(0, 0)));
+    return (pos.x() - absPos.x()) <= filenameWidth(item);
+}
+
+void DolphinDetailsView::refreshSettings()
+{
+    const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+    assert(settings != 0);
+
+    if (!settings->showGroup()) {
+        removeColumn(GroupColumn);
+    }
+    if (!settings->showOwner()) {
+        removeColumn(OwnerColumn);
+    }
+    if (!settings->showPermissions()) {
+        removeColumn(PermissionsColumn);
+    }
+    if (!settings->showDate()) {
+        removeColumn(DateColumn);
+    }
+
+    QFont adjustedFont(font());
+    adjustedFont.setFamily(settings->fontFamily());
+    adjustedFont.setPointSize(settings->fontSize());
+    setFont(adjustedFont);
+
+    updateView(true);
+}
+
+void DolphinDetailsView::zoomIn()
+{
+    if (isZoomInPossible()) {
+        DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+        switch (settings->iconSize()) {
+            case KIcon::SizeSmall:  settings->setIconSize(KIcon::SizeMedium); break;
+            case KIcon::SizeMedium: settings->setIconSize(KIcon::SizeLarge); break;
+            default: assert(false); break;
+        }
+        ItemEffectsManager::zoomIn();
+    }
+}
+
+void DolphinDetailsView::zoomOut()
+{
+    if (isZoomOutPossible()) {
+        DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+        switch (settings->iconSize()) {
+            case KIcon::SizeLarge:  settings->setIconSize(KIcon::SizeMedium); break;
+            case KIcon::SizeMedium: settings->setIconSize(KIcon::SizeSmall); break;
+            default: assert(false); break;
+        }
+        ItemEffectsManager::zoomOut();
+    }
+}
+
+bool DolphinDetailsView::isZoomInPossible() const
+{
+    DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+    return settings->iconSize() < KIcon::SizeLarge;
+}
+
+bool DolphinDetailsView::isZoomOutPossible() const
+{
+    DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+    return settings->iconSize() > KIcon::SizeSmall;
+}
+
+void DolphinDetailsView::resizeContents(int width, int height)
+{
+    KFileDetailView::resizeContents(width, height);
+
+    // When loading several 1000 items a punch of resize events
+    // drops in. As updating the column width is a quite expensive
+    // operation, this operation will be postponed until there is
+    // no resize event for at least 50 milliseconds.
+    m_resizeTimer->stop();
+    m_resizeTimer->start(50, true);
+}
+
+void DolphinDetailsView::slotOnItem(Q3ListViewItem* item)
+{
+    if (isOnFilename(item, QCursor::pos())) {
+        activateItem(item);
+        KFileItem* fileItem = static_cast<KFileListViewItem*>(item)->fileInfo();
+        m_dolphinView->requestItemInfo(fileItem->url());
+    }
+    else {
+        resetActivatedItem();
+    }
+}
+
+void DolphinDetailsView::slotOnViewport()
+{
+    resetActivatedItem();
+    m_dolphinView->requestItemInfo(KURL());
+}
+
+void DolphinDetailsView::setContextPixmap(void* context,
+                                        const QPixmap& pixmap)
+{
+    reinterpret_cast<KFileListViewItem*>(context)->setPixmap(0, pixmap);
+}
+
+const QPixmap* DolphinDetailsView::contextPixmap(void* context)
+{
+    return reinterpret_cast<KFileListViewItem*>(context)->pixmap(0);
+}
+
+void* DolphinDetailsView::firstContext()
+{
+    return reinterpret_cast<void*>(firstChild());
+}
+
+void* DolphinDetailsView::nextContext(void* context)
+{
+    KFileListViewItem* listViewItem = reinterpret_cast<KFileListViewItem*>(context);
+    return reinterpret_cast<void*>(listViewItem->nextSibling());
+}
+
+KFileItem* DolphinDetailsView::contextFileInfo(void* context)
+{
+    return reinterpret_cast<KFileListViewItem*>(context)->fileInfo();
+}
+
+
+void DolphinDetailsView::contentsDragMoveEvent(QDragMoveEvent* event)
+{
+    KFileDetailView::contentsDragMoveEvent(event);
+
+    // If a dragging is done above a directory, show the icon as 'active' for
+    // a visual feedback
+    KFileListViewItem* item = static_cast<KFileListViewItem*>(itemAt(event->pos()));
+
+    bool showActive = false;
+    if (item != 0) {
+        const KFileItem* fileInfo = item->fileInfo();
+        showActive = (fileInfo != 0) && fileInfo->isDir();
+    }
+
+    if (showActive) {
+        slotOnItem(item);
+    }
+    else {
+        slotOnViewport();
+    }
+}
+
+void DolphinDetailsView::resizeEvent(QResizeEvent* event)
+{
+    KFileDetailView::resizeEvent(event);
+
+    // When loading several 1000 items a punch of resize events
+    // drops in. As updating the column width is a quite expensive
+    // operation, this operation will be postponed until there is
+    // no resize event for at least 50 milliseconds.
+    m_resizeTimer->stop();
+    m_resizeTimer->start(50, true);
+}
+
+bool DolphinDetailsView::acceptDrag(QDropEvent* event) const
+{
+    bool accept = KURLDrag::canDecode(event) &&
+                  (event->action() == QDropEvent::Copy ||
+                   event->action() == QDropEvent::Move ||
+                   event->action() == QDropEvent::Link);
+    if (accept) {
+        if (static_cast<const QWidget*>(event->source()) == this) {
+            KFileListViewItem* item = static_cast<KFileListViewItem*>(itemAt(event->pos()));
+            accept = (item != 0);
+            if (accept) {
+                KFileItem* fileItem = item->fileInfo();
+                accept = fileItem->isDir();
+            }
+        }
+    }
+
+    return accept;
+}
+
+void DolphinDetailsView::contentsDropEvent(QDropEvent* event)
+{
+    // KFileDetailView::contentsDropEvent does not care whether the mouse
+    // cursor is above a filename or not, the destination URL is always
+    // the URL of the item. This is fixed here in a way that the destination
+    // URL is only the URL of the item if the cursor is above the filename.
+    const QPoint pos(QCursor::pos());
+    const QPoint viewportPos(viewport()->mapToGlobal(QPoint(0, 0)));
+    Q3ListViewItem* item = itemAt(QPoint(pos.x() - viewportPos.x(), pos.y() - viewportPos.y()));
+    if ((item == 0) || ((item != 0) && isOnFilename(item, pos))) {
+        // dropping is done on the viewport or directly above a filename
+        KFileDetailView::contentsDropEvent(event);
+        return;
+    }
+
+    // Dropping is done above an item, but the mouse cursor is not above the file name.
+    // In this case the signals of the base implementation will be blocked and send
+    // in a corrected manner afterwards.
+    assert(item != 0);
+    const bool block = signalsBlocked();
+    blockSignals(true);
+    KFileDetailView::contentsDropEvent(event);
+    blockSignals(block);
+
+    if (!acceptDrag(event)) {
+        return;
+    }
+
+    emit dropped(event, 0);
+    KURL::List urls;
+    if (KURLDrag::decode(event, urls) && !urls.isEmpty()) {
+        emit dropped(event, urls, KURL());
+        sig->dropURLs(0, event, urls);
+    }
+}
+
+void DolphinDetailsView::contentsMousePressEvent(QMouseEvent* event)
+{
+    if (m_rubber != 0) {
+        drawRubber();
+        delete m_rubber;
+        m_rubber = 0;
+    }
+
+    // Swallow the base implementation of the mouse press event
+    // if the mouse cursor is not above the filename. This prevents
+    // that the item gets selected and simulates an equal usability
+    // like in the icon view.
+    const QPoint pos(QCursor::pos());
+    const QPoint viewportPos(viewport()->mapToGlobal(QPoint(0, 0)));
+    Q3ListViewItem* item = itemAt(QPoint(pos.x() - viewportPos.x(), pos.y() - viewportPos.y()));
+    if ((item != 0) && isOnFilename(item, pos)) {
+        KFileDetailView::contentsMousePressEvent(event);
+    }
+    else if (event->button() == Qt::LeftButton) {
+        const ButtonState keyboardState = KApplication::keyboardMouseState();
+        const bool isSelectionActive = (keyboardState & ShiftButton) ||
+                                       (keyboardState & ControlButton);
+        if (!isSelectionActive) {
+            clearSelection();
+        }
+
+        assert(m_rubber == 0);
+        m_rubber = new QRect(event->x(), event->y(), 0, 0);
+    }
+
+    resetActivatedItem();
+    emit signalRequestActivation();
+
+    m_dolphinView->statusBar()->clear();
+}
+
+void DolphinDetailsView::contentsMouseMoveEvent(QMouseEvent* event)
+{
+    if (m_rubber != 0) {
+        slotAutoScroll();
+        return;
+    }
+
+    KFileDetailView::contentsMouseMoveEvent(event);
+
+    const QPoint& pos = event->globalPos();
+    const QPoint viewportPos = viewport()->mapToGlobal(QPoint(0, 0));
+    Q3ListViewItem* item = itemAt(QPoint(pos.x() - viewportPos.x(), pos.y() - viewportPos.y()));
+    if ((item != 0) && isOnFilename(item, pos)) {
+        activateItem(item);
+    }
+    else {
+        resetActivatedItem();
+    }
+}
+
+void DolphinDetailsView::contentsMouseReleaseEvent(QMouseEvent* event)
+{
+    if (m_rubber != 0) {
+        drawRubber();
+        delete m_rubber;
+        m_rubber = 0;
+    }
+
+    if (m_scrollTimer != 0) {
+        disconnect(m_scrollTimer, SIGNAL(timeout()),
+                    this, SLOT(slotAutoScroll()));
+        m_scrollTimer->stop();
+        delete m_scrollTimer;
+        m_scrollTimer = 0;
+    }
+
+    KFileDetailView::contentsMouseReleaseEvent(event);
+}
+
+void DolphinDetailsView::paintEmptyArea(QPainter* painter, const QRect& rect)
+{
+    if (m_dolphinView->isActive()) {
+        KFileDetailView::paintEmptyArea(painter, rect);
+    }
+    else {
+        const QBrush brush(colorGroup().background());
+        painter->fillRect(rect, brush);
+    }
+}
+
+void DolphinDetailsView::drawRubber()
+{
+    // Parts of the following code have been taken
+    // from the class KonqBaseListViewWidget located in
+    // konqueror/listview/konq_listviewwidget.h of Konqueror.
+    // (Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
+    //  2001, 2002, 2004 Michael Brade <brade@kde.org>)
+    if (m_rubber == 0) {
+        return;
+    }
+
+    QPainter p;
+    p.begin(viewport());
+    p.setRasterOp(NotROP);
+    p.setPen(QPen(color0, 1));
+    p.setBrush(NoBrush);
+
+    QPoint point(m_rubber->x(), m_rubber->y());
+    point = contentsToViewport(point);
+    style().drawPrimitive(QStyle::PE_FocusRect, &p,
+                          QRect(point.x(), point.y(), m_rubber->width(), m_rubber->height()),
+                          colorGroup(), QStyle::Style_Default, colorGroup().base());
+    p.end();
+}
+
+void DolphinDetailsView::viewportPaintEvent(QPaintEvent* paintEvent)
+{
+    drawRubber();
+    KFileDetailView::viewportPaintEvent(paintEvent);
+    drawRubber();
+}
+
+void DolphinDetailsView::leaveEvent(QEvent* event)
+{
+    KFileDetailView::leaveEvent(event);
+    slotOnViewport();
+}
+
+void DolphinDetailsView::slotActivationUpdate()
+{
+    update();
+
+    // TODO: there must be a simpler way to say
+    // "update all children"
+    const QObjectList* list = children();
+    if (list == 0) {
+        return;
+    }
+
+    QObjectListIterator it(*list);
+    QObject* object = 0;
+    while ((object = it.current()) != 0) {
+        if (object->inherits("QWidget")) {
+            QWidget* widget = static_cast<QWidget*>(object);
+            widget->update();
+        }
+        ++it;
+    }
+}
+
+void DolphinDetailsView::slotContextMenuRequested(Q3ListViewItem* item,
+                                                  const QPoint& pos,
+                                                  int /* col */)
+{
+    KFileItem* fileInfo = 0;
+    if ((item != 0) && isOnFilename(item, pos)) {
+        fileInfo = static_cast<KFileListViewItem*>(item)->fileInfo();
+    }
+    m_dolphinView->openContextMenu(fileInfo, pos);
+
+}
+
+void DolphinDetailsView::slotUpdateDisabledItems()
+{
+    updateDisabledItems();
+}
+
+void DolphinDetailsView::slotAutoScroll()
+{
+    // Parts of the following code have been taken
+    // from the class KonqBaseListViewWidget located in
+    // konqueror/listview/konq_listviewwidget.h of Konqueror.
+    // (Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
+    //  2001, 2002, 2004 Michael Brade <brade@kde.org>)
+
+    const QPoint pos(viewport()->mapFromGlobal(QCursor::pos()));
+    const QPoint vc(viewportToContents(pos));
+
+    if (vc == m_rubber->bottomRight()) {
+        return;
+    }
+
+    drawRubber();
+
+    m_rubber->setBottomRight(vc);
+
+    Q3ListViewItem* item = itemAt(QPoint(0,0));
+
+    const bool block = signalsBlocked();
+    blockSignals(true);
+
+    const QRect rubber(m_rubber->normalize());
+    const int bottom = contentsY() + visibleHeight() - 1;
+
+    // select all items which intersect with the rubber, deselect all others
+    bool bottomReached = false;
+    while ((item != 0) && !bottomReached) {
+        QRect rect(itemRect(item));
+        rect.setWidth(filenameWidth(item));
+        rect = QRect(viewportToContents(rect.topLeft()),
+                     viewportToContents(rect.bottomRight()));
+        if (rect.isValid() && (rect.top() <= bottom)) {
+            const KFileItem* fileItem = static_cast<KFileListViewItem*>(item)->fileInfo();
+            setSelected(fileItem, rect.intersects(rubber));
+            item = item->itemBelow();
+        }
+        else {
+            bottomReached = true;
+        }
+    }
+
+    blockSignals(block);
+    emit selectionChanged();
+
+    drawRubber();
+
+    // scroll the viewport if the top or bottom margin is reached
+    const int scrollMargin = 40;
+    ensureVisible(vc.x(), vc.y(), scrollMargin, scrollMargin);
+    const bool scroll = !QRect(scrollMargin,
+                               scrollMargin,
+                               viewport()->width()  - 2 * scrollMargin,
+                               viewport()->height() - 2 * scrollMargin).contains(pos);
+    if (scroll) {
+        if (m_scrollTimer == 0) {
+            m_scrollTimer = new QTimer( this );
+            connect(m_scrollTimer, SIGNAL(timeout()),
+                    this, SLOT(slotAutoScroll()));
+            m_scrollTimer->start(100, false);
+        }
+    }
+    else if (m_scrollTimer != 0) {
+        disconnect(m_scrollTimer, SIGNAL(timeout()),
+                   this, SLOT(slotAutoScroll()));
+        m_scrollTimer->stop();
+        delete m_scrollTimer;
+        m_scrollTimer = 0;
+    }
+}
+
+void DolphinDetailsView::updateColumnsWidth()
+{
+    const int columnCount = columns();
+    int requiredWidth = 0;
+    for (int i = 1; i < columnCount; ++i) {
+        // When a directory contains no items, a minimum width for
+        // the column must be available, so that the header is readable.
+        // TODO: use header data instead of the hardcoded 64 value...
+        int columnWidth = 64;
+        QFontMetrics fontMetrics(font());
+        for (Q3ListViewItem* item = firstChild(); item != 0; item = item->nextSibling()) {
+            const int width = item->width(fontMetrics, this, i);
+            if (width > columnWidth) {
+                columnWidth = width;
+            }
+        }
+        columnWidth += 16;    // add custom margin
+        setColumnWidth(i, columnWidth);
+        requiredWidth += columnWidth;
+    }
+
+    // resize the first column in a way that the
+    // whole available width is used
+    int firstColumnWidth = visibleWidth() - requiredWidth;
+    if (firstColumnWidth < 128) {
+        firstColumnWidth = 128;
+    }
+    setColumnWidth(0, firstColumnWidth);
+}
+
+void DolphinDetailsView::slotItemRenamed(Q3ListViewItem* item,
+                                         const QString& name,
+                                         int /* column */)
+{
+    KFileItem* fileInfo = static_cast<KFileListViewItem*>(item)->fileInfo();
+    m_dolphinView->rename(KURL(fileInfo->url()), name);
+}
+
+void DolphinDetailsView::slotHeaderClicked(int /* section */)
+{
+    // The sorting has already been changed in QListView if this slot is
+    // invoked, but Dolphin was not informed about this (no signal is available
+    // which indicates a change of the sorting). This is bypassed by changing
+    // the sorting and sort order to a temporary other value and readjust it again.
+    const int column = sortColumn();
+    if (column <= DateColumn) {
+        DolphinView::Sorting sorting = DolphinView::SortByName;
+        switch (column) {
+            case SizeColumn: sorting = DolphinView::SortBySize; break;
+            case DateColumn: sorting = DolphinView::SortByDate; break;
+            case NameColumn:
+            default: break;
+        }
+
+        const Qt::SortOrder currSortOrder = sortOrder();
+
+        // temporary adjust the sorting and sort order to different values...
+        const DolphinView::Sorting tempSorting = (sorting == DolphinView::SortByName) ?
+                                                 DolphinView::SortBySize :
+                                                 DolphinView::SortByName;
+        m_dolphinView->setSorting(tempSorting);
+        const Qt::SortOrder tempSortOrder = (currSortOrder == Qt::Ascending) ?
+                                            Qt::Descending : Qt::Ascending;
+        m_dolphinView->setSortOrder(tempSortOrder);
+
+        // ... so that setting them again results in storing the new setting.
+        m_dolphinView->setSorting(sorting);
+        m_dolphinView->setSortOrder(currSortOrder);
+    }
+}
+
+DolphinDetailsView::DolphinListViewItem::DolphinListViewItem(Q3ListView* parent,
+                                                             KFileItem* fileItem) :
+    KFileListViewItem(parent, fileItem)
+{
+    const int iconSize = DolphinSettings::instance().detailsModeSettings()->iconSize();
+    KFileItem* info = fileInfo();
+    setPixmap(DolphinDetailsView::NameColumn, info->pixmap(iconSize));
+
+    // The base class KFileListViewItem represents the column 'Size' only as byte values.
+    // Adjust those values in a way that a mapping to GBytes, MBytes, KBytes and Bytes
+    // is done. As the file size for directories is useless (only the size of the directory i-node
+    // is given), it is removed completely.
+    if (fileItem->isDir()) {
+        setText(SizeColumn, " - ");
+    }
+    else {
+        QString sizeText(KIO::convertSize(fileItem->size()));
+        sizeText.append(" ");
+        setText(SizeColumn, sizeText);
+    }
+
+    // Dolphin allows to remove specific columns, but the base class KFileListViewItem
+    // is not aware about this (or at least the class KFileDetailView does not react on
+    // QListView::remove()). Therefore the columns are rearranged here.
+    const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
+    assert(settings != 0);
+
+    int column_idx = DateColumn;    // the columns for 'name' and 'size' cannot get removed
+    for (int i = DolphinDetailsView::DateColumn; i <= DolphinDetailsView::GroupColumn; ++i) {
+        if (column_idx < i) {
+            setText(column_idx, text(i));
+        }
+
+        bool inc = false;
+        switch (i) {
+            case DateColumn:        inc = settings->showDate(); break;
+            case PermissionsColumn: inc = settings->showPermissions(); break;
+            case OwnerColumn:       inc = settings->showOwner(); break;
+            case GroupColumn:       inc = settings->showGroup(); break;
+            default: break;
+        }
+
+        if (inc) {
+            ++column_idx;
+        }
+    }
+}
+
+DolphinDetailsView::DolphinListViewItem::~DolphinListViewItem()
+{
+}
+
+void DolphinDetailsView::DolphinListViewItem::paintCell(QPainter* painter,
+                                                        const QColorGroup& colorGroup,
+                                                        int column,
+                                                        int cellWidth,
+                                                        int alignment)
+{
+    const Q3ListView* view = listView();
+    const bool isActive = view->parent() == Dolphin::mainWin().activeView();
+    if (isSelected()) {
+        // Per default the selection is drawn above the whole width of the item. As a consistent
+        // behavior with the icon view is wanted, only the the column containing the file name
+        // should be shown as selected.
+        QColorGroup defaultColorGroup(colorGroup);
+        const QColor highlightColor(isActive ? backgroundColor(column) : view->colorGroup().background());
+        defaultColorGroup.setColor(QColorGroup::Highlight , highlightColor);
+        defaultColorGroup.setColor(QColorGroup::HighlightedText, colorGroup.color(QColorGroup::Text));
+        KFileListViewItem::paintCell(painter, defaultColorGroup, column, cellWidth, alignment);
+
+        if (column == 0) {
+            // draw the selection only on the first column
+            Q3ListView* parent = listView();
+            const int itemWidth = width(parent->fontMetrics(), parent, 0);
+            if (isActive) {
+                KFileListViewItem::paintCell(painter, colorGroup, column, itemWidth, alignment);
+            }
+            else {
+                Q3ListViewItem::paintCell(painter, colorGroup, column, itemWidth, alignment);
+            }
+        }
+    }
+    else {
+        if (isActive) {
+            KFileListViewItem::paintCell(painter, colorGroup, column, cellWidth, alignment);
+        }
+        else {
+            Q3ListViewItem::paintCell(painter, colorGroup, column, cellWidth, alignment);
+        }
+    }
+
+    if (column < listView()->columns() - 1) {
+        // draw a separator between columns
+        painter->setPen(KGlobalSettings::buttonBackground());
+        painter->drawLine(cellWidth - 1, 0, cellWidth - 1, height() - 1);
+    }
+}
+
+void DolphinDetailsView::DolphinListViewItem::paintFocus(QPainter* painter,
+                                                         const QColorGroup& colorGroup,
+                                                         const QRect& rect)
+{
+    // draw the focus consistently with the selection (see implementation notes
+    // in DolphinListViewItem::paintCell)
+    Q3ListView* parent = listView();
+    int visibleWidth = width(parent->fontMetrics(), parent, 0);
+    const int colWidth = parent->columnWidth(0);
+    if (visibleWidth > colWidth) {
+        visibleWidth = colWidth;
+    }
+
+    QRect focusRect(rect);
+    focusRect.setWidth(visibleWidth);
+
+    KFileListViewItem::paintFocus(painter, colorGroup, focusRect);
+}
+
+int DolphinDetailsView::filenameWidth(const Q3ListViewItem* item) const
+{
+    assert(item != 0);
+
+    int visibleWidth = item->width(fontMetrics(), this, 0);
+    const int colWidth = columnWidth(0);
+    if (visibleWidth > colWidth) {
+        visibleWidth = colWidth;
+    }
+
+    return visibleWidth;
+}
+#include "dolphindetailsview.moc"
diff --git a/src/dolphindetailsview.h b/src/dolphindetailsview.h
new file mode 100644 (file)
index 0000000..86f579c
--- /dev/null
@@ -0,0 +1,224 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINDETAILSVIEW_H
+#define DOLPHINDETAILSVIEW_H
+
+#include <kfiledetailview.h>
+#include <itemeffectsmanager.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <QResizeEvent>
+#include <QEvent>
+#include <QDropEvent>
+#include <QMouseEvent>
+#include <QDragMoveEvent>
+#include <QPaintEvent>
+
+class QRect;
+class QTimer;
+class DolphinView;
+
+/**
+ * @brief Represents the details view which shows the name, size,
+ * date, permissions, owner and group of an item.
+ *
+ * The width of the columns are automatically adjusted in a way
+ * that full available width of the view is used by stretching the width
+ * of the name column.
+ *
+ * @author Peter Penz
+ */
+class DolphinDetailsView : public KFileDetailView, public ItemEffectsManager
+{
+    Q_OBJECT
+
+public:
+    /**
+     * Maps the column indices of KFileDetailView to a
+     * descriptive column name.
+     */
+    enum ColumnName {
+        NameColumn        = 0,
+        SizeColumn        = 1,
+        DateColumn        = 2,
+        PermissionsColumn = 3,
+        OwnerColumn       = 4,
+        GroupColumn       = 5
+    };
+
+    DolphinDetailsView(DolphinView* parent);
+
+    virtual ~DolphinDetailsView();
+
+    /** @see ItemEffectsManager::updateItems */
+    virtual void beginItemUpdates();
+
+    /** @see ItemEffectsManager::updateItems */
+    virtual void endItemUpdates();
+
+    /** @see KFileView::insertItem */
+    virtual void insertItem(KFileItem* fileItem);
+
+    /**
+     * @return  True, if the position \a pos is above the name of
+     *          item \a item.
+     */
+    bool isOnFilename(const Q3ListViewItem* item, const QPoint& pos) const;
+
+    /**
+     * Reads out the dolphin settings for the details view and refreshs
+     * the details view.
+     */
+    // TODO: Other view implementations use a similar interface. When using
+    // Interview in Qt4 this method should be moved to a base class (currently
+    // not possible due to having different base classes for the views).
+    void refreshSettings();
+
+    /** @see ItemEffectsManager::zoomIn() */
+    virtual void zoomIn();
+
+    /** @see ItemEffectsManager::zoomOut() */
+    virtual void zoomOut();
+
+    /** @see ItemEffectsManager::isZoomInPossible() */
+    virtual bool isZoomInPossible() const;
+
+    /** @see ItemEffectsManager::isZoomOutPossible() */
+    virtual bool isZoomOutPossible() const;
+
+signals:
+    /**
+     * Is send, if the details view should be activated. Usually an activation
+     * is triggered by a mouse click.
+     */
+    void signalRequestActivation();
+
+public slots:
+    /** @see KFileDetailView::resizeContents */
+    virtual void resizeContents(int width, int height);
+
+    /** Is connected to the onItem-signal from KFileDetailView. */
+    void slotOnItem(Q3ListViewItem* item);
+
+    /** Is connected to the onViewport-signal from KFileDetailView. */
+    void slotOnViewport();
+
+protected:
+    /** @see ItemEffectsManager::setContextPixmap() */
+    virtual void setContextPixmap(void* context,
+                                  const QPixmap& pixmap);
+
+    /** @see ItemEffectsManager::setContextPixmap() */
+    virtual const QPixmap* contextPixmap(void* context);
+
+    /** @see ItemEffectsManager::setContextPixmap() */
+    virtual void* firstContext();
+
+    /** @see ItemEffectsManager::setContextPixmap() */
+    virtual void* nextContext(void* context);
+
+    /** @see ItemEffectsManager::setContextPixmap() */
+    virtual KFileItem* contextFileInfo(void* context);
+
+    /** @see KFileDetailView::contentsDragMoveEvent() */
+    virtual void contentsDragMoveEvent(QDragMoveEvent* event);
+
+    /** @see KFileDetailView::resizeEvent() */
+    virtual void resizeEvent(QResizeEvent* event);
+
+    /** @see KFileDetailView::acceptDrag() */
+    virtual bool acceptDrag (QDropEvent* event) const;
+
+    /** @see KFileDetailView::contentsDropEvent() */
+    virtual void contentsDropEvent(QDropEvent* event);
+
+    /** @see KFileDetailView::contentsMousePressEvent() */
+    virtual void contentsMousePressEvent(QMouseEvent* event);
+
+    /** @see KFileDetailView::contentsMouseMoveEvent() */
+    virtual void contentsMouseMoveEvent(QMouseEvent* event);
+
+    /** @see KFileDetailView::contentsMouseReleaseEvent() */
+    virtual void contentsMouseReleaseEvent(QMouseEvent* event);
+
+    /** @see QListView::paintEmptyArea() */
+    virtual void paintEmptyArea(QPainter* painter, const QRect& rect);
+
+    /** Draws the selection rubber. */
+    void drawRubber();
+
+    /** @see QListView::viewportPaintEvent() */
+    virtual void viewportPaintEvent(QPaintEvent* paintEvent);
+
+    /** @see QWidget::leaveEvent() */
+    virtual void leaveEvent(QEvent* event);
+
+private slots:
+    void slotActivationUpdate();
+    void slotContextMenuRequested(Q3ListViewItem* item,
+                                  const QPoint& pos,
+                                  int col);
+    void slotUpdateDisabledItems();
+    void slotAutoScroll();
+    void updateColumnsWidth();
+    void slotItemRenamed(Q3ListViewItem* item,
+                         const QString& name,
+                         int column);
+
+    /**
+     * Is invoked when a section from the header has
+     * been clicked and stores the sort column and sort
+     * order.
+     */
+    void slotHeaderClicked(int section);
+
+private:
+    class DolphinListViewItem : public KFileListViewItem {
+    public:
+        DolphinListViewItem(Q3ListView* parent,
+                            KFileItem* fileItem);
+        virtual ~DolphinListViewItem();
+        virtual void paintCell(QPainter* painter,
+                               const QColorGroup& colorGroup,
+                               int column,
+                               int cellWidth,
+                               int alignment);
+
+        virtual void paintFocus(QPainter* painter,
+                                const QColorGroup& colorGroup,
+                                const QRect& rect);
+    };
+
+    DolphinView* m_dolphinView;
+    QTimer* m_resizeTimer;
+    QTimer* m_scrollTimer;
+    QRect* m_rubber;
+
+    /**
+     * Returns the width of the filename in pixels including
+     * the icon. It is assured that the returned width is
+     * <= the width of the filename column.
+     */
+    int filenameWidth(const Q3ListViewItem* item) const;
+
+};
+
+#endif
diff --git a/src/dolphindirlister.cpp b/src/dolphindirlister.cpp
new file mode 100644 (file)
index 0000000..160c419
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphindirlister.h"
+#include <kio/jobclasses.h>
+
+// TODO:
+#include <stdio.h>
+
+DolphinDirLister::DolphinDirLister() :
+    KDirLister(true)
+{
+}
+
+DolphinDirLister::~DolphinDirLister()
+{
+}
+
+void DolphinDirLister::handleError(KIO::Job* job)
+{
+    // TODO: some error texts should be adjusted manually
+    emit errorMessage(job->errorString());
+}
+
+#include "dolphindirlister.moc"
diff --git a/src/dolphindirlister.h b/src/dolphindirlister.h
new file mode 100644 (file)
index 0000000..d425942
--- /dev/null
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINDIRLISTER_H
+#define DOLPHINDIRLISTER_H
+
+#include <kdirlister.h>
+
+/**
+ * @brief Extends the class KDirLister by emitting an error
+ * signal containing text.
+ *
+ * @author Peter Penz
+ */
+class DolphinDirLister : public KDirLister
+{
+    Q_OBJECT
+
+public:
+    DolphinDirLister();
+    virtual ~DolphinDirLister();
+
+signals:
+    /** Is emitted whenever an error occured. */
+    void errorMessage(const QString& msg);
+
+protected:
+    virtual void handleError(KIO::Job* job);
+};
+
+#endif
diff --git a/src/dolphiniconsview.cpp b/src/dolphiniconsview.cpp
new file mode 100644 (file)
index 0000000..2576abb
--- /dev/null
@@ -0,0 +1,509 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphiniconsview.h"
+#include <qpainter.h>
+//Added by qt3to4:
+#include <QDragMoveEvent>
+#include <QDropEvent>
+#include <Q3ValueList>
+#include <QPixmap>
+#include <QMouseEvent>
+#include <QDragEnterEvent>
+#include <kiconeffect.h>
+#include <kapplication.h>
+#include <qobject.h>
+#include <kglobalsettings.h>
+#include <kurldrag.h>
+#include <qclipboard.h>
+#include <assert.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kfileitem.h>
+
+#include "dolphinview.h"
+#include "viewproperties.h"
+#include "dolphin.h"
+#include "dolphinstatusbar.h"
+#include "dolphinsettings.h"
+#include "iconsmodesettings.h"
+
+DolphinIconsView::DolphinIconsView(DolphinView* parent, LayoutMode layoutMode) :
+    KFileIconView(parent, 0),
+    m_previewIconSize(-1),
+    m_layoutMode(layoutMode),
+    m_dolphinView(parent)
+{
+    setAcceptDrops(true);
+    setMode(KIconView::Execute);
+    setSelectionMode(KFile::Extended);
+    Dolphin& dolphin = Dolphin::mainWin();
+
+    connect(this, SIGNAL(onItem(Q3IconViewItem*)),
+            this, SLOT(slotOnItem(Q3IconViewItem*)));
+    connect(this, SIGNAL(onViewport()),
+            this, SLOT(slotOnViewport()));
+    connect(this, SIGNAL(contextMenuRequested(Q3IconViewItem*, const QPoint&)),
+            this, SLOT(slotContextMenuRequested(Q3IconViewItem*, const QPoint&)));
+    connect(this, SIGNAL(selectionChanged()),
+            &dolphin, SLOT(slotSelectionChanged()));
+    connect(&dolphin, SIGNAL(activeViewChanged()),
+            this, SLOT(slotActivationUpdate()));
+    connect(this, SIGNAL(itemRenamed(Q3IconViewItem*, const QString&)),
+            this, SLOT(slotItemRenamed(Q3IconViewItem*, const QString&)));
+    connect(this, SIGNAL(dropped(QDropEvent*, const KURL::List&, const KURL&)),
+            parent, SLOT(slotURLListDropped(QDropEvent*, const KURL::List&, const KURL&)));
+
+    QClipboard* clipboard = QApplication::clipboard();
+    connect(clipboard, SIGNAL(dataChanged()),
+            this, SLOT(slotUpdateDisabledItems()));
+
+    // KFileIconView creates two actions for zooming, which are directly connected to the
+    // slots KFileIconView::zoomIn() and KFileIconView::zoomOut(). As this behavior is not
+    // wanted and the slots are not virtual, the actions are disabled here.
+    KAction* zoomInAction = actionCollection()->action("zoomIn");
+    assert(zoomInAction != 0);
+    zoomInAction->setEnabled(false);
+
+    KAction* zoomOutAction = actionCollection()->action("zoomOut");
+    assert(zoomOutAction != 0);
+    zoomOutAction->setEnabled(false);
+
+    setItemsMovable(true);
+    setWordWrapIconText(true);
+    if (m_layoutMode == Previews) {
+        showPreviews();
+    }
+    refreshSettings();
+}
+
+DolphinIconsView::~DolphinIconsView()
+{
+}
+
+void DolphinIconsView::setLayoutMode(LayoutMode mode)
+{
+    if (m_layoutMode != mode) {
+        m_layoutMode = mode;
+        refreshSettings();
+    }
+}
+
+void DolphinIconsView::beginItemUpdates()
+{
+}
+
+void DolphinIconsView::endItemUpdates()
+{
+    arrangeItemsInGrid();
+
+    // TODO: KFileIconView does not emit any signal when the preview
+    // has been finished. Using a delay of 300 ms is a temporary workaround
+    // until the DolphinIconsView will implement the previews by it's own in
+    // future releases.
+    QTimer::singleShot(300, this, SLOT(slotUpdateDisabledItems()));
+
+    const KFileIconViewItem* item = static_cast<const KFileIconViewItem*>(firstItem());
+    if (item != 0) {
+        setCurrentItem(item->fileInfo());
+    }
+
+    int index = 0;
+    const Q3ValueList<URLNavigator::HistoryElem> history = m_dolphinView->urlHistory(index);
+    if (!history.isEmpty()) {
+        KFileView* fileView = static_cast<KFileView*>(this);
+        fileView->setCurrentItem(history[index].currentFileName());
+        setContentsPos(history[index].contentsX(), history[index].contentsY());
+    }
+}
+
+void DolphinIconsView::refreshSettings()
+{
+    const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    assert(settings != 0);
+
+    setIconSize(settings->iconSize());
+
+    const Q3IconView::Arrangement arrangement = settings->arrangement() == "LeftToRight" ? // TODO: use enum directly in settings
+                                               Q3IconView::LeftToRight : Q3IconView::TopToBottom;
+    const Q3IconView::ItemTextPos textPos = (arrangement == Q3IconView::LeftToRight) ?
+                                           Q3IconView::Bottom :
+                                           Q3IconView::Right;
+    setArrangement(arrangement);
+    setItemTextPos(textPos);
+
+    // TODO: tempory crash; will get changed anyway for KDE 4
+    /*setGridX(settings->gridWidth());
+    setGridY(settings->gridHeight());
+    setSpacing(settings->gridSpacing());*/
+
+    QFont adjustedFont(font());
+    adjustedFont.setFamily(settings->fontFamily());
+    adjustedFont.setPointSize(settings->fontSize());
+    setFont(adjustedFont);
+    setIconTextHeight(settings->numberOfTexlines());
+
+    if (m_layoutMode == Previews) {
+        // There is no getter method for the current size in KFileIconView. To
+        // prevent a flickering the current size is stored in m_previewIconSize and
+        // setPreviewSize is only invoked if the size really has changed.
+        showPreviews();
+
+        const int size = settings->previewSize();
+        if (size != m_previewIconSize) {
+            m_previewIconSize = size;
+            setPreviewSize(size);
+        }
+    }
+}
+
+void DolphinIconsView::zoomIn()
+{
+    if (isZoomInPossible()) {
+        IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+        const int textWidthHint = DolphinSettings::instance().textWidthHint(); // TODO: remove for KDE4
+
+        const int iconSize = increasedIconSize(settings->iconSize());
+        settings->setIconSize(iconSize);
+
+        if (m_layoutMode == Previews) {
+            const int previewSize = increasedIconSize(settings->previewSize());
+            settings->setPreviewSize(previewSize);
+        }
+
+        DolphinSettings::instance().calculateGridSize(textWidthHint); // TODO: remove for KDE4
+        ItemEffectsManager::zoomIn();
+    }
+}
+
+void DolphinIconsView::zoomOut()
+{
+    if (isZoomOutPossible()) {
+        IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+        const int textWidthHint = DolphinSettings::instance().textWidthHint(); // TODO: remove for KDE4
+
+        const int iconSize = decreasedIconSize(settings->iconSize());
+        settings->setIconSize(iconSize);
+
+        if (m_layoutMode == Previews) {
+            const int previewSize = decreasedIconSize(settings->previewSize());
+            settings->setPreviewSize(previewSize);
+        }
+
+        DolphinSettings::instance().calculateGridSize(textWidthHint); // TODO: remove for KDE4
+        ItemEffectsManager::zoomOut();
+    }
+}
+
+bool DolphinIconsView::isZoomInPossible() const
+{
+    IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    const int size = (m_layoutMode == Icons) ? settings->iconSize() : settings->previewSize();
+    return size < KIcon::SizeEnormous;
+}
+
+bool DolphinIconsView::isZoomOutPossible() const
+{
+    IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    return settings->iconSize() > KIcon::SizeSmall;
+}
+
+void DolphinIconsView::arrangeItemsInGrid( bool updated )
+{
+
+    KFileIconView::arrangeItemsInGrid(updated);
+
+    if (m_layoutMode == Previews) {
+        // The class KFileIconView has a bug when the size of the previews differs from the size
+        // of the icons: For specific MIME types the y-position and the height is calculated in
+        // a wrong manner. The following code bypasses this issue. No bugreport has been submitted
+        // as this functionality is not used by any KDE3 application and the core developers are
+        // busy enough for KDE4 now :-)
+
+        KFileIconViewItem* item = static_cast<KFileIconViewItem*>(Q3IconView::firstItem());
+        QString mimetype;
+        while (item != 0) {
+            mimetype = item->fileInfo()->mimetype();
+            const bool fixSize = mimetype.contains("text") ||
+                                 mimetype.contains("application/x-");
+            if (fixSize) {
+                item->setPixmapSize(QSize(m_previewIconSize, m_previewIconSize));
+            }
+            item = static_cast<KFileIconViewItem *>(item->nextItem());
+        }
+    }
+}
+
+void DolphinIconsView::setContextPixmap(void* context,
+                                        const QPixmap& pixmap)
+{
+    reinterpret_cast<KFileIconViewItem*>(context)->setPixmap(pixmap);
+}
+
+const QPixmap* DolphinIconsView::contextPixmap(void* context)
+{
+    return reinterpret_cast<KFileIconViewItem*>(context)->pixmap();
+}
+
+void* DolphinIconsView::firstContext()
+{
+    return reinterpret_cast<void*>(firstItem());
+}
+
+void* DolphinIconsView::nextContext(void* context)
+{
+    KFileIconViewItem* iconViewItem = reinterpret_cast<KFileIconViewItem*>(context);
+    return reinterpret_cast<void*>(iconViewItem->nextItem());
+}
+
+KFileItem* DolphinIconsView::contextFileInfo(void* context)
+{
+    return reinterpret_cast<KFileIconViewItem*>(context)->fileInfo();
+}
+
+void DolphinIconsView::contentsMousePressEvent(QMouseEvent* event)
+{
+    KFileIconView::contentsMousePressEvent(event);
+    resetActivatedItem();
+    emit signalRequestActivation();
+    m_dolphinView->statusBar()->clear();
+}
+
+void DolphinIconsView::contentsMouseReleaseEvent(QMouseEvent* event)
+{
+    KFileIconView::contentsMouseReleaseEvent(event);
+
+    // The KFileIconView does not send any selectionChanged signal if
+    // a selection is done by using the "select-during-button-pressed" feature.
+    // Hence inform Dolphin about the selection change manually:
+    Dolphin::mainWin().slotSelectionChanged();
+}
+
+void DolphinIconsView::drawBackground(QPainter* painter, const QRect& rect)
+{
+    if (m_dolphinView->isActive()) {
+        KFileIconView::drawBackground(painter, rect);
+    }
+    else {
+        const QBrush brush(colorGroup().background());
+        painter->fillRect(0, 0, width(), height(), brush);
+    }
+}
+
+Q3DragObject* DolphinIconsView::dragObject()
+{
+    KURL::List urls;
+    KFileItemListIterator it(*KFileView::selectedItems());
+    while (it.current() != 0) {
+        urls.append((*it)->url());
+        ++it;
+    }
+
+    QPixmap pixmap;
+    if(urls.count() > 1) {
+        pixmap = DesktopIcon("kmultiple", iconSize());
+    }
+    else {
+        KFileIconViewItem* item = static_cast<KFileIconViewItem*>(currentItem());
+        if ((item != 0) && (item->pixmap() != 0)) {
+            pixmap = *(item->pixmap());
+        }
+    }
+
+    if (pixmap.isNull()) {
+        pixmap = currentFileItem()->pixmap(iconSize());
+    }
+
+    Q3DragObject* dragObj = new KURLDrag(urls, widget());
+    dragObj->setPixmap(pixmap);
+    return dragObj;
+}
+
+void DolphinIconsView::contentsDragEnterEvent(QDragEnterEvent* event)
+{
+    // TODO: The method KFileIconView::contentsDragEnterEvent() does
+    // not allow drag and drop inside itself, which prevents the possability
+    // to move a file into a directory. As the method KFileIconView::acceptDrag()
+    // is not virtual, we must overwrite the method
+    // KFileIconView::contentsDragEnterEvent() and do some cut/copy/paste for this
+    // usecase. Corresponding to the documentation the method KFileIconView::acceptDrag()
+    // will get virtual in KDE 4, which will simplify the code.
+
+    if (event->source() != this) {
+        KFileIconView::contentsDragEnterEvent(event);
+        return;
+    }
+
+    const bool accept = KURLDrag::canDecode(event) &&
+                        (event->action() == QDropEvent::Copy ||
+                         event->action() == QDropEvent::Move ||
+                         event->action() == QDropEvent::Link );
+    if (accept) {
+        event->acceptAction();
+    }
+    else {
+        event->ignore();
+    }
+}
+
+void DolphinIconsView::contentsDragMoveEvent(QDragMoveEvent* event)
+{
+    KFileIconView::contentsDragMoveEvent(event);
+
+    // If a dragging is done above a directory, show the icon as 'active' for
+    // a visual feedback
+    KFileIconViewItem* item = static_cast<KFileIconViewItem*>(findItem(contentsToViewport(event->pos())));
+
+    bool showActive = false;
+    if (item != 0) {
+        const KFileItem* fileInfo = item->fileInfo();
+        showActive = (fileInfo != 0) && fileInfo->isDir();
+    }
+
+    if (showActive) {
+        slotOnItem(item);
+    }
+    else {
+        slotOnViewport();
+    }
+}
+
+void DolphinIconsView::contentsDropEvent(QDropEvent* event)
+{
+    // TODO: Most of the following code is a copy of
+    // KFileIconView::contentsDropEvent. See comment in
+    // DolphinIconsView::contentsDragEnterEvent for details.
+
+    if (event->source() != this) {
+        KFileIconView::contentsDropEvent(event);
+        return;
+    }
+
+    KFileIconViewItem* item = static_cast<KFileIconViewItem*>(findItem(contentsToViewport(event->pos())));
+    const bool accept = KURLDrag::canDecode(event) &&
+                        (event->action() == QDropEvent::Copy ||
+                         event->action() == QDropEvent::Move ||
+                         event->action() == QDropEvent::Link ) &&
+                        (item != 0);
+    if (!accept) {
+        return;
+    }
+
+    KFileItem* fileItem = item->fileInfo();
+    if (!fileItem->isDir()) {
+        // the file is not a directory, hence don't accept any drop
+        return;
+    }
+    emit dropped(event, fileItem);
+    KURL::List urls;
+    if (KURLDrag::decode(event, urls) && !urls.isEmpty()) {
+        emit dropped(event, urls, fileItem != 0 ? fileItem->url() : KURL());
+        sig->dropURLs(fileItem, event, urls);
+    }
+}
+
+void DolphinIconsView::slotOnItem(Q3IconViewItem* item)
+{
+    assert(item != 0);
+    activateItem(reinterpret_cast<void*>(item));
+
+    KFileItem* fileItem = static_cast<KFileIconViewItem*>(item)->fileInfo();
+    m_dolphinView->requestItemInfo(fileItem->url());
+}
+
+void DolphinIconsView::slotOnViewport()
+{
+    resetActivatedItem();
+    m_dolphinView->requestItemInfo(KURL());
+}
+
+void DolphinIconsView::slotContextMenuRequested(Q3IconViewItem* item,
+                                                const QPoint& pos)
+{
+    KFileItem* fileInfo = 0;
+    if (item != 0) {
+        fileInfo = static_cast<KFileIconViewItem*>(item)->fileInfo();
+    }
+    m_dolphinView->openContextMenu(fileInfo, pos);
+}
+
+void DolphinIconsView::slotItemRenamed(Q3IconViewItem* item,
+                                       const QString& name)
+{
+    KFileItem* fileInfo = static_cast<KFileIconViewItem*>(item)->fileInfo();
+    m_dolphinView->rename(KURL(fileInfo->url()), name);
+}
+
+void DolphinIconsView::slotActivationUpdate()
+{
+    update();
+
+    // TODO: there must be a simpler way to say
+    // "update all children"
+    const QObjectList* list = children();
+    if (list == 0) {
+        return;
+    }
+
+    QObjectListIterator it(*list);
+    QObject* object = 0;
+    while ((object = it.current()) != 0) {
+        if (object->inherits("QWidget")) {
+            QWidget* widget = static_cast<QWidget*>(object);
+            widget->update();
+        }
+        ++it;
+    }
+}
+
+void DolphinIconsView::slotUpdateDisabledItems()
+{
+    updateDisabledItems();
+}
+
+int DolphinIconsView::increasedIconSize(int size) const
+{
+    int incSize = 0;
+    switch (size) {
+        case KIcon::SizeSmall:       incSize = KIcon::SizeSmallMedium; break;
+        case KIcon::SizeSmallMedium: incSize = KIcon::SizeMedium; break;
+        case KIcon::SizeMedium:      incSize = KIcon::SizeLarge; break;
+        case KIcon::SizeLarge:       incSize = KIcon::SizeHuge; break;
+        case KIcon::SizeHuge:        incSize = KIcon::SizeEnormous; break;
+        default: assert(false); break;
+    }
+    return incSize;
+}
+
+int DolphinIconsView::decreasedIconSize(int size) const
+{
+    int decSize = 0;
+    switch (size) {
+        case KIcon::SizeSmallMedium: decSize = KIcon::SizeSmall; break;
+        case KIcon::SizeMedium: decSize = KIcon::SizeSmallMedium; break;
+        case KIcon::SizeLarge: decSize = KIcon::SizeMedium; break;
+        case KIcon::SizeHuge: decSize = KIcon::SizeLarge; break;
+        case KIcon::SizeEnormous: decSize = KIcon::SizeHuge; break;
+        default: assert(false); break;
+    }
+    return decSize;
+}
+
+#include "dolphiniconsview.moc"
diff --git a/src/dolphiniconsview.h b/src/dolphiniconsview.h
new file mode 100644 (file)
index 0000000..30ab314
--- /dev/null
@@ -0,0 +1,173 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINICONSVIEW_H
+#define DOLPHINICONSVIEW_H
+
+#include <kfileiconview.h>
+#include <qpixmap.h>
+//Added by qt3to4:
+#include <QDragEnterEvent>
+#include <QDropEvent>
+#include <QMouseEvent>
+#include <QDragMoveEvent>
+#include <kurl.h>
+#include <itemeffectsmanager.h>
+
+class DolphinView;
+
+/**
+ * @brief Represents the view, where each item is shown as an icon.
+ *
+ * It is also possible that instead of the icon a preview of the item
+ * content is shown.
+ *
+ * @author Peter Penz
+ */
+class DolphinIconsView : public KFileIconView, public ItemEffectsManager
+{
+    Q_OBJECT
+
+public:
+    enum LayoutMode {
+        Icons,
+        Previews
+    };
+
+    DolphinIconsView(DolphinView *parent, LayoutMode layoutMode);
+
+    virtual ~DolphinIconsView();
+
+    void setLayoutMode(LayoutMode mode);
+    LayoutMode layoutMode() const { return m_layoutMode; }
+
+    /** @see ItemEffectsManager::updateItems */
+    virtual void beginItemUpdates();
+
+    /** @see ItemEffectsManager::updateItems */
+    virtual void endItemUpdates();
+
+    /**
+     * Reads out the dolphin settings for the icons view and refreshs
+     * the details view.
+     */
+    // TODO: Other view implementations use a similar interface. When using
+    // Interview in Qt4 this method should be moved to a base class (currently
+    // not possible due to having different base classes for the views).
+    void refreshSettings();
+
+    /** @see ItemEffectsManager::zoomIn() */
+    virtual void zoomIn();
+
+    /** @see ItemEffectsManager::zoomOut() */
+    virtual void zoomOut();
+
+    /** @see ItemEffectsManager::isZoomInPossible() */
+    virtual bool isZoomInPossible() const;
+
+    /** @see ItemEffectsManager::isZoomOutPossible() */
+    virtual bool isZoomOutPossible() const;
+
+public slots:
+    /**
+     * Bypass a layout issue in KFileIconView in combination with previews.
+     * @see KFileIconView::arrangeItemsInGrid
+     */
+    virtual void arrangeItemsInGrid(bool updated = true);
+
+signals:
+    /**
+     * Is send, if the details view should be activated. Usually an activation
+     * is triggered by a mouse click.
+     */
+    void signalRequestActivation();
+
+protected:
+    /** @see ItemEffectsManager::setContextPixmap */
+    virtual void setContextPixmap(void* context,
+                                  const QPixmap& pixmap);
+
+    /** @see ItemEffectsManager::contextPixmap */
+    virtual const QPixmap* contextPixmap(void* context);
+
+    /** @see ItemEffectsManager::firstContext */
+    virtual void* firstContext();
+
+    /** @see ItemEffectsManager::nextContext */
+    virtual void* nextContext(void* context);
+
+    /** @see ItemEffectsManager::contextFileInfo */
+    virtual KFileItem* contextFileInfo(void* context);
+
+    /** @see KFileIconView::contentsMousePressEvent */
+    virtual void contentsMousePressEvent(QMouseEvent* event);
+
+    /** @see KFileIconView::contentsMouseReleaseEvent */
+    virtual void contentsMouseReleaseEvent(QMouseEvent* event);
+
+    /** @see KFileIconView::drawBackground */
+    virtual void drawBackground(QPainter* painter, const QRect& rect);
+
+    /** @see KFileIconView::dragObject */
+    virtual Q3DragObject* dragObject();
+
+    /** @see KFileIconView::contentsDragEnterEvent */
+    virtual void contentsDragEnterEvent(QDragEnterEvent* event);
+
+    /** @see KFileIconView::contentsDragMoveEvent */
+    virtual void contentsDragMoveEvent(QDragMoveEvent* event);
+
+    /** @see KFileIconView::contentsDropEvent */
+    virtual void contentsDropEvent(QDropEvent* event);
+
+private slots:
+    /** Is connected to the onItem-signal from KFileIconView. */
+    void slotOnItem(Q3IconViewItem* item);
+
+    /** Is connected to the onViewport-signal from KFileIconView. */
+    void slotOnViewport();
+
+    /**
+     * Opens the context menu for the item \a item on the given
+     * position \a pos.
+     */
+    void slotContextMenuRequested(Q3IconViewItem* item,
+                                  const QPoint& pos);
+
+    /** Renames the item \a item to the name \a name. */
+    void slotItemRenamed(Q3IconViewItem* item,
+                         const QString& name);
+
+    void slotActivationUpdate();
+    void slotUpdateDisabledItems();
+
+private:
+    int m_previewIconSize;
+    LayoutMode m_layoutMode;
+    DolphinView* m_dolphinView;
+
+    /** Returns the increased icon size for the size \a size. */
+    int increasedIconSize(int size) const;
+
+    /** Returns the decreased icon size for the size \a size. */
+    int decreasedIconSize(int size) const;
+};
+
+#endif
diff --git a/src/dolphinsettings.cpp b/src/dolphinsettings.cpp
new file mode 100644 (file)
index 0000000..8e040d7
--- /dev/null
@@ -0,0 +1,184 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at),                 *
+ *   Cvetoslav Ludmiloff and Patrice Tremblay                              *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphinsettings.h"
+
+#include <assert.h>
+#include <qdir.h>
+
+#include <kapplication.h>
+#include <kbookmark.h>
+#include <kbookmarkmanager.h>
+#include <kicontheme.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include "dolphin.h"
+#include "generalsettings.h"
+#include "iconsmodesettings.h"
+#include "previewsmodesettings.h"
+#include "detailsmodesettings.h"
+#include "sidebarsettings.h"
+
+DolphinSettings& DolphinSettings::instance()
+{
+    static DolphinSettings* instance = 0;
+    if (instance == 0) {
+        instance = new DolphinSettings();
+    }
+    return *instance;
+}
+
+KBookmark DolphinSettings::bookmark(int index) const
+{
+    int i = 0;
+    KBookmarkGroup root = bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+    while (!bookmark.isNull()) {
+        if (i == index) {
+            return bookmark;
+        }
+        ++i;
+        bookmark = root.next(bookmark);
+    }
+
+    return KBookmark();
+}
+
+KBookmarkManager* DolphinSettings::bookmarkManager() const
+{
+    QString basePath = KGlobal::instance()->instanceName();
+    basePath.append("/bookmarks.xml");
+    const QString file = locateLocal("data", basePath);
+
+    return KBookmarkManager::managerForFile(file, false);
+}
+
+void DolphinSettings::save()
+{
+    m_generalSettings->writeConfig();
+    m_iconsModeSettings->writeConfig();
+    m_previewsModeSettings->writeConfig();
+    m_detailsModeSettings->writeConfig();
+    m_sidebarSettings->writeConfig();
+
+    QString basePath = KGlobal::instance()->instanceName();
+    basePath.append("/bookmarks.xml");
+    const QString file = locateLocal( "data", basePath);
+
+    KBookmarkManager* manager = KBookmarkManager::managerForFile(file, false);
+    manager->save(false);
+}
+
+void DolphinSettings::calculateGridSize(int hint)
+{
+    // TODO: remove in KDE4
+    const int previewSize = m_iconsModeSettings->previewSize();
+    const int iconSize = m_iconsModeSettings->iconSize();
+    const int maxSize = (previewSize > iconSize) ? previewSize : iconSize;
+    const Q3IconView::Arrangement arrangement = (m_iconsModeSettings->arrangement() == "LeftToRight") ?
+                                               Q3IconView::LeftToRight : Q3IconView::TopToBottom;
+
+    int gridWidth = 0;
+    int gridHeight = 0;
+    if (arrangement == Q3IconView::LeftToRight) {
+        int widthUnit = maxSize + (maxSize / 2);
+        if (widthUnit < KIcon::SizeLarge) {
+            widthUnit = KIcon::SizeLarge;
+        }
+
+        gridWidth = widthUnit + hint * KIcon::SizeLarge;
+
+        gridHeight = iconSize;
+        if (gridHeight <= KIcon::SizeMedium) {
+            gridHeight = gridHeight * 2;
+        }
+        else {
+            gridHeight += maxSize / 2;
+        }
+    }
+    else {
+        assert(arrangement == Q3IconView::TopToBottom);
+        gridWidth = maxSize + (hint + 1) * (8 * m_iconsModeSettings->fontSize());
+
+        // The height-setting is ignored yet by KFileIconView if the TopToBottom
+        // arrangement is active. Anyway write the setting to have a defined value.
+        gridHeight = maxSize;
+    }
+
+    m_iconsModeSettings->setGridWidth(gridWidth);
+    m_iconsModeSettings->setGridHeight(gridHeight);
+}
+
+int DolphinSettings::textWidthHint() const
+{
+    // TODO: remove in KDE4
+    const int previewSize = m_iconsModeSettings->previewSize();
+    const int iconSize = m_iconsModeSettings->iconSize();
+    const Q3IconView::Arrangement arrangement = (m_iconsModeSettings->arrangement() == "LeftToRight") ?
+                                               Q3IconView::LeftToRight : Q3IconView::TopToBottom;
+
+    const int gridWidth = m_iconsModeSettings->gridWidth();
+
+    const int maxSize = (previewSize > iconSize) ? previewSize : iconSize;
+    int hint = 0;
+    if (arrangement == Q3IconView::LeftToRight) {
+        int widthUnit = maxSize + (maxSize / 2);
+        if (widthUnit < KIcon::SizeLarge) {
+            widthUnit = KIcon::SizeLarge;
+        }
+        hint = (gridWidth - widthUnit) / KIcon::SizeLarge;
+    }
+    else {
+        assert(arrangement == Q3IconView::TopToBottom);
+        hint = (gridWidth - maxSize) / (8 * m_iconsModeSettings->fontSize()) - 1;
+        if (hint > 2) {
+            hint = 2;
+        }
+    }
+    return hint;
+}
+
+DolphinSettings::DolphinSettings()
+{
+    m_generalSettings = new GeneralSettings();
+    m_iconsModeSettings = new IconsModeSettings();
+    m_previewsModeSettings = new PreviewsModeSettings();
+    m_detailsModeSettings = new DetailsModeSettings();
+    m_sidebarSettings = new SidebarSettings();
+}
+
+DolphinSettings::~DolphinSettings()
+{
+    delete m_generalSettings;
+    m_generalSettings = 0;
+
+    delete m_iconsModeSettings;
+    m_iconsModeSettings = 0;
+
+    delete m_previewsModeSettings;
+    m_previewsModeSettings = 0;
+
+    delete m_detailsModeSettings;
+    m_detailsModeSettings = 0;
+
+    delete m_sidebarSettings;
+    m_sidebarSettings = 0;
+}
diff --git a/src/dolphinsettings.h b/src/dolphinsettings.h
new file mode 100644 (file)
index 0000000..a9dcb8b
--- /dev/null
@@ -0,0 +1,103 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINSETTINGS_H
+#define DOLPHINSETTINGS_H
+
+class KBookmark;
+class KBookmarkManager;
+class GeneralSettings;
+class IconsModeSettings;
+class PreviewsModeSettings;
+class DetailsModeSettings;
+class SidebarSettings;
+
+/**
+ * @brief Manages and stores all settings from Dolphin.
+ *
+ * The following properties are stored:
+ * - home URL
+ * - default view mode
+ * - URL navigator state (editable or not)
+ * - split view
+ * - bookmarks
+ * - properties for icons and details view
+ */
+class DolphinSettings {
+public:
+    static DolphinSettings& instance();
+
+    GeneralSettings* generalSettings() const { return m_generalSettings; }
+    IconsModeSettings* iconsModeSettings() const { return m_iconsModeSettings; }
+    PreviewsModeSettings* previewsModeSettings() const { return m_previewsModeSettings; }
+    DetailsModeSettings* detailsModeSettings() const { return m_detailsModeSettings; }
+    SidebarSettings* sidebarSettings() const { return m_sidebarSettings; }
+
+    KBookmarkManager* bookmarkManager() const;
+
+    // TODO: should this really belong here or get moved to a derived KBookmarkManager?
+    // Dolphin uses some lists where an index is given and the corresponding bookmark
+    // should get retrieved...
+    KBookmark bookmark(int index) const;
+
+    /** @see DolphinSettingsBase::save */
+    virtual void save();
+
+    /**
+     * TODO: just temporary until the port to KDE4 has been done
+     *
+     * Calculates the width and the height of the grid dependant from \a hint and
+     * the current settings. The hint gives information about the wanted text
+     * width, where a lower value indicates a smaller text width. Currently
+     * in Dolphin the values 0, 1 and 2 are used. See also
+     * DolhinIconsViewSettings::textWidthHint.
+     *
+     * The calculation of the grid width and grid height is a little bit tricky,
+     * as the user model does not fit to the implementation model of QIconView. The user model
+     * allows to specify icon-, preview- and text width sizes, whereas the implementation
+     * model expects only a grid width and height. The nasty thing is that the specified
+     * width and height varies dependant from the arrangement (e. g. the height is totally
+     * ignored for the top-to-bottom arrangement inside QIconView).
+     */
+    void calculateGridSize(int hint);
+
+    /**
+     * TODO: just temporary until the port to KDE4 has been done
+     *
+     * Returns the text width hint dependant from the given settings.
+     * A lower value indicates a smaller text width. Currently
+     * in Dolphin the values 0, 1 and 2 are used. The text width hint can
+     * be used later for DolphinIconsViewSettings::calculateGridSize().
+     */
+    int textWidthHint() const;
+
+protected:
+    DolphinSettings();
+    virtual ~DolphinSettings();
+
+private:
+    GeneralSettings* m_generalSettings;
+    IconsModeSettings* m_iconsModeSettings;
+    PreviewsModeSettings* m_previewsModeSettings;
+    DetailsModeSettings* m_detailsModeSettings;
+    SidebarSettings* m_sidebarSettings;
+};
+
+#endif
diff --git a/src/dolphinsettingsdialog.cpp b/src/dolphinsettingsdialog.cpp
new file mode 100644 (file)
index 0000000..d1bb276
--- /dev/null
@@ -0,0 +1,79 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphinsettingsdialog.h"
+#include <klocale.h>
+#include <kiconloader.h>
+#include "generalsettingspage.h"
+#include "viewsettingspage.h"
+#include "bookmarkssettingspage.h"
+#include "dolphin.h"
+//Added by qt3to4:
+#include <Q3Frame>
+
+DolphinSettingsDialog::DolphinSettingsDialog() :
+    KDialogBase(IconList, i18n("Dolphin Preferences"),
+                Ok|Apply|Cancel, Ok)
+{
+    KIconLoader iconLoader;
+    Q3Frame* generalSettingsFrame = addPage(i18n("General"), 0,
+                                                iconLoader.loadIcon("exec",
+                                                                    KIcon::NoGroup,
+                                                                    KIcon::SizeMedium));
+    m_generalSettingsPage = new GeneralSettingsPage(generalSettingsFrame);
+
+    Q3Frame* viewSettingsFrame = addPage(i18n("View Modes"), 0,
+                                        iconLoader.loadIcon("view_choose",
+                                                            KIcon::NoGroup,
+                                                            KIcon::SizeMedium));
+    m_viewSettingsPage = new ViewSettingsPage(viewSettingsFrame);
+
+    Q3Frame* bookmarksSettingsFrame = addPage(i18n("Bookmarks"), 0,
+                                             iconLoader.loadIcon("bookmark",
+                                                                 KIcon::NoGroup,
+                                                                 KIcon::SizeMedium));
+    m_bookmarksSettingsPage = new BookmarksSettingsPage(bookmarksSettingsFrame);
+}
+
+DolphinSettingsDialog::~DolphinSettingsDialog()
+{
+}
+
+void DolphinSettingsDialog::slotOk()
+{
+    applySettings();
+    KDialogBase::slotOk();
+}
+
+void DolphinSettingsDialog::slotApply()
+{
+    applySettings();
+    KDialogBase::slotApply();
+}
+
+void DolphinSettingsDialog::applySettings()
+{
+    m_generalSettingsPage->applySettings();
+    m_viewSettingsPage->applySettings();
+    m_bookmarksSettingsPage->applySettings();
+    Dolphin::mainWin().refreshViews();
+}
+
+#include "dolphinsettingsdialog.moc"
diff --git a/src/dolphinsettingsdialog.h b/src/dolphinsettingsdialog.h
new file mode 100644 (file)
index 0000000..8c9ac3c
--- /dev/null
@@ -0,0 +1,56 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINSETTINGSDIALOG_H
+#define DOLPHINSETTINGSDIALOG_H
+
+#include <kdialog.h>
+class GeneralSettingsPage;
+class ViewSettingsPage;
+class BookmarksSettingsPage;
+
+/**
+ * @brief Settings dialog for Dolphin.
+ *
+ * Contains the pages for general settings, view settings and
+ * bookmark settings.
+ *
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class DolphinSettingsDialog : public KDialog {
+    Q_OBJECT
+
+public:
+    DolphinSettingsDialog();
+    virtual ~DolphinSettingsDialog();
+
+protected slots:
+    virtual void slotOk();
+    virtual void slotApply();
+
+private:
+    GeneralSettingsPage* m_generalSettingsPage;
+    ViewSettingsPage* m_viewSettingsPage;
+    BookmarksSettingsPage* m_bookmarksSettingsPage;
+
+    void applySettings();
+};
+
+#endif
diff --git a/src/dolphinstatusbar.cpp b/src/dolphinstatusbar.cpp
new file mode 100644 (file)
index 0000000..44b6e23
--- /dev/null
@@ -0,0 +1,166 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphinstatusbar.h"
+#include <qprogressbar.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <kiconloader.h>
+
+#include "dolphinview.h"
+#include "statusbarmessagelabel.h"
+#include "statusbarspaceinfo.h"
+
+DolphinStatusBar::DolphinStatusBar(DolphinView* parent) :
+    Q3HBox(parent),
+    m_messageLabel(0),
+    m_spaceInfo(0),
+    m_progressBar(0),
+    m_progress(100)
+{
+    m_messageLabel = new StatusBarMessageLabel(this);
+    m_messageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
+
+    m_spaceInfo = new StatusBarSpaceInfo(this);
+    m_spaceInfo->setURL(parent->url());
+
+    m_progressText = new QLabel(this);
+    m_progressText->hide();
+
+    m_progressBar = new QProgressBar(this);
+    m_progressBar->hide();
+
+    m_progressTimer = new QTimer(this);
+    connect(m_progressTimer, SIGNAL(timeout()),
+            this, SLOT(slotProgressTimer()));
+
+    const QSize size(m_progressBar->sizeHint());
+    m_progressBar->setMaximumWidth(size.width());
+    setMinimumHeight(size.height());
+    m_messageLabel->setMinimumTextHeight(size.height());
+
+    connect(parent, SIGNAL(signalURLChanged(const KUrl&)),
+            this, SLOT(slotURLChanged(const KUrl&)));
+}
+
+
+DolphinStatusBar::~DolphinStatusBar()
+{
+}
+
+void DolphinStatusBar::setMessage(const QString& msg,
+                                  Type type)
+{
+    m_messageLabel->setText(msg);
+    if (msg.isEmpty() || (msg == m_defaultText)) {
+        type = Default;
+    }
+    m_messageLabel->setType(type);
+
+    if ((type == Error) && (m_progress < 100)) {
+        // If an error message is shown during a progress is ongoing,
+        // the (never finishing) progress information should be hidden immediately
+        // (invoking 'setProgress(100)' only leads to a delayed hiding).
+        m_progressBar->hide();
+        m_progressText->hide();
+        setProgress(100);
+    }
+}
+
+DolphinStatusBar::Type DolphinStatusBar::type() const
+{
+    return m_messageLabel->type();
+}
+
+QString DolphinStatusBar::message() const
+{
+    return m_messageLabel->text();
+}
+
+void DolphinStatusBar::setProgressText(const QString& text)
+{
+    m_progressText->setText(text);
+}
+
+QString DolphinStatusBar::progressText() const
+{
+    return m_progressText->text();
+}
+
+void DolphinStatusBar::setProgress(int percent)
+{
+    if (percent < 0) {
+        percent = 0;
+    }
+    else if (percent > 100) {
+        percent = 100;
+    }
+
+    m_progress = percent;
+    m_progressBar->setValue(m_progress);
+    m_progressTimer->start(300, true);
+
+    const QString msg(m_messageLabel->text());
+    if (msg.isEmpty() || (msg == m_defaultText)) {
+        if (percent == 0) {
+            m_messageLabel->setText(QString::null);
+            m_messageLabel->setType(Default);
+        }
+        else if (percent == 100) {
+            m_messageLabel->setText(m_defaultText);
+        }
+    }
+}
+
+void DolphinStatusBar::clear()
+{
+    // TODO: check for timeout, so that it's prevented that
+    // a message is cleared too early.
+    m_messageLabel->setText(m_defaultText);
+    m_messageLabel->setType(Default);
+}
+
+void DolphinStatusBar::setDefaultText(const QString& text)
+{
+    m_defaultText = text;
+}
+
+void DolphinStatusBar::slotProgressTimer()
+{
+    if (m_progress < 100) {
+        // progress should be shown
+        m_progressBar->show();
+        m_progressText->show();
+        m_spaceInfo->hide();
+    }
+    else {
+        // progress should not be shown anymore
+        m_progressBar->hide();
+        m_progressText->hide();
+        m_spaceInfo->show();
+    }
+}
+
+void DolphinStatusBar::slotURLChanged(const KUrl& url)
+{
+    m_spaceInfo->setURL(url);
+}
+
+#include "dolphinstatusbar.moc"
diff --git a/src/dolphinstatusbar.h b/src/dolphinstatusbar.h
new file mode 100644 (file)
index 0000000..903e1cd
--- /dev/null
@@ -0,0 +1,135 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef DOLPHINSTATUSBAR_H
+#define DOLPHINSTATUSBAR_H
+
+#include <q3hbox.h>
+//Added by qt3to4:
+#include <QLabel>
+class QProgressBar;
+class QLabel;
+class QTimer;
+class StatusBarMessageLabel;
+class StatusBarSpaceInfo;
+class DolphinView;
+class KUrl;
+
+/**
+ * @brief Represents the statusbar of a Dolphin view.
+ *
+ * The statusbar allows to show messages and progress
+ * information.
+ *
+ * @author Peter Penz
+ */
+class DolphinStatusBar : public Q3HBox {
+    Q_OBJECT
+
+public:
+    /**
+     * Describes the type of the message text. Dependent
+     * from the type a corresponding icon and color is
+     * used for the message text.
+     */
+    enum Type {
+        Default,
+        OperationCompleted,
+        Information,
+        Error
+    };
+
+    DolphinStatusBar(DolphinView* parent = 0);
+    virtual ~DolphinStatusBar();
+
+    /**
+     * Sets the message text to \a msg. Dependant
+     * from the given type \a type an icon is shown and
+     * the color of the text is adjusted. The height of
+     * the statusbar is automatically adjusted in a way,
+     * that the full text fits into the available width.
+     *
+     * If a progress is ongoing and a message
+     * with the type Type::Error is set, the progress
+     * is cleared automatically.
+     */
+    void setMessage(const QString& msg, Type type);
+
+    QString message() const;
+    Type type() const;
+
+    /**
+     * Sets the text for the progress information.
+     * The text is shown with a delay of 300 milliseconds:
+     * if the progress set by DolphinStatusBar::setProgress()
+     * does reach 100 % within 300 milliseconds,
+     * the progress text is not shown at all. This assures that
+     * no flickering occurs for showing a progress of fast
+     * operations.
+     */
+    void setProgressText(const QString& text);
+    QString progressText() const;
+
+    /**
+     * Sets the progress in percent (0 - 100). The
+     * progress is shown with a delay of 300 milliseconds:
+     * if the progress does reach 100 % within 300 milliseconds,
+     * the progress is not shown at all. This assures that
+     * no flickering occurs for showing a progress of fast
+     * operations.
+     */
+    void setProgress(int percent);
+    int progress() const { return m_progress; }
+
+    /**
+     * Clears the message text of the status bar by replacing
+     * the message with the default text, which can be set
+     * by DolphinStatusBar::setDefaultText(). The progress
+     * information is not cleared.
+     */
+    void clear();
+
+    /**
+     * Sets the default text, which is shown if the status bar
+     * is cleared by DolphinStatusBar::clear().
+     */
+    void setDefaultText(const QString& text);
+    const QString& defaultText() const { return m_defaultText; }
+
+private slots:
+    void slotProgressTimer();
+
+    /**
+     * Is invoked, when the URL of the DolphinView, where the
+     * statusbar belongs too, has been changed.
+     */
+    void slotURLChanged(const KUrl& url);
+
+private:
+    StatusBarMessageLabel* m_messageLabel;
+    StatusBarSpaceInfo* m_spaceInfo;
+    QLabel* m_progressText;
+    QProgressBar* m_progressBar;
+    QTimer* m_progressTimer;
+    int m_progress;
+    QString m_defaultText;
+};
+
+#endif
diff --git a/src/dolphinui.rc b/src/dolphinui.rc
new file mode 100644 (file)
index 0000000..6e5e274
--- /dev/null
@@ -0,0 +1,109 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui version="1" name="dolphin" >
+ <MenuBar>
+  <Menu name="file" >
+   <Menu name="create_new" >
+    <text>Create New</text>
+    <Action name="create_folder" />
+    <Separator/>
+    <ActionList name="create_file_group" />
+   </Menu>
+   <Separator/>
+   <Action name="rename" />
+   <Action name="move_to_trash" />
+   <Action name="delete" />
+   <Separator/>
+   <Action name="properties" />
+  </Menu>
+  <Menu name="edit" >
+   <Action name="select_all" />
+   <Action name="invert_selection" />
+  </Menu>
+  <Menu name="view" >
+   <Menu name="view_mode" >
+    <text>View Mode</text>
+    <Action name="icons" />
+    <Action name="details" />
+    <Action name="previews" />
+   </Menu>
+   <Menu name="sort" >
+    <text>Sort</text>
+    <Action name="by_name" />
+    <Action name="by_size" />
+    <Action name="by_date" />
+    <Separator/>
+    <Action name="descending" />
+   </Menu>
+   <Action name="show_hidden_files" />
+   <Separator/>
+   <Action name="split_view" />
+   <Action name="reload" />
+   <Action name="stop" />
+   <Separator/>
+   <Menu name="navigation_bar" >
+    <text>Navigation Bar</text>
+    <Action name="editable_location" />
+    <Action name="edit_location" />
+   </Menu>
+   <Action name="sidebar" />
+   <Action name="view_properties" />
+  </Menu>
+  <Menu name="tools">
+    <Action name="open_terminal" />
+    <Action name="find_file" />
+    <Action name="show_filter_bar" />
+    <Action name="compare_files" />
+  </Menu>
+</MenuBar>
+<State name="new_file" >
+  <disable>
+   <Action name="edit_undo" />
+   <Action name="edit_redo" />
+   <Action name="edit_cut" />
+   <Action name="edit_copy" />
+   <Action name="rename" />
+   <Action name="move_to_trash" />
+   <Action name="delete" />
+   <Action name="invert_selection" />
+   <Separator/>
+   <Action name="properties" />
+   <Action name="go_back" />
+   <Action name="go_forward" />
+  </disable>
+ </State>
+ <State name="has_selection" >
+  <enable>
+   <Action name="edit_cut" />
+   <Action name="edit_copy" />
+   <Action name="move_to_trash" />
+   <Action name="delete" />
+   <Action name="properties" />
+   <Action name="invert_selection" />
+  </enable>
+ </State>
+ <State name="has_no_selection" >
+  <disable>
+   <Action name="edit_cut" />
+   <Action name="edit_copy" />
+   <Action name="rename" />
+   <Action name="move_to_trash" />
+   <Action name="delete" />
+   <Action name="properties" />
+   <Action name="invert_selection" />
+  </disable>
+ </State>
+ <ToolBar noMerge="1" name="mainToolBar" >
+  <text>Main Toolbar</text>
+  <Action name="go_back" />
+  <Action name="go_forward" />
+  <Separator name="separator_1" />
+  <Action name="icons" />
+  <Action name="details" />
+  <Action name="previews" />
+  <Separator name="separator_0" />
+  <Action name="split_view" />
+ </ToolBar>
+ <ActionProperties>
+  <Action shortcut="Backspace;XF86Back" name="go_back" />
+ </ActionProperties>
+</kpartgui>
diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp
new file mode 100644 (file)
index 0000000..d6dc75d
--- /dev/null
@@ -0,0 +1,1087 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Gregor Kališnik <gregor@podnapisi.net>          *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphinview.h"
+
+#include <qlayout.h>
+//Added by qt3to4:
+#include <Q3ValueList>
+#include <QDropEvent>
+#include <QMouseEvent>
+#include <Q3VBoxLayout>
+#include <kurl.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <kio/renamedlg.h>
+#include <assert.h>
+
+#include "urlnavigator.h"
+#include "dolphinstatusbar.h"
+#include "dolphin.h"
+#include "dolphindirlister.h"
+#include "viewproperties.h"
+#include "dolphindetailsview.h"
+#include "dolphiniconsview.h"
+#include "dolphincontextmenu.h"
+#include "undomanager.h"
+#include "renamedialog.h"
+#include "progressindicator.h"
+
+#include "filterbar.h"
+
+DolphinView::DolphinView(QWidget *parent,
+                         const KUrl& url,
+                         Mode mode,
+                         bool showHiddenFiles) :
+    QWidget(parent),
+    m_refreshing(false),
+    m_showProgress(false),
+    m_mode(mode),
+    m_iconsView(0),
+    m_detailsView(0),
+    m_statusBar(0),
+    m_iconSize(0),
+    m_folderCount(0),
+    m_fileCount(0),
+    m_filterBar(0)
+{
+    setFocusPolicy(Qt::StrongFocus);
+    m_topLayout = new Q3VBoxLayout(this);
+
+    Dolphin& dolphin = Dolphin::mainWin();
+
+    connect(this, SIGNAL(signalModeChanged()),
+            &dolphin, SLOT(slotViewModeChanged()));
+    connect(this, SIGNAL(signalShowHiddenFilesChanged()),
+            &dolphin, SLOT(slotShowHiddenFilesChanged()));
+    connect(this, SIGNAL(signalSortingChanged(DolphinView::Sorting)),
+            &dolphin, SLOT(slotSortingChanged(DolphinView::Sorting)));
+    connect(this, SIGNAL(signalSortOrderChanged(Qt::SortOrder)),
+            &dolphin, SLOT(slotSortOrderChanged(Qt::SortOrder)));
+
+    m_urlNavigator = new URLNavigator(url, this);
+    connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
+            this, SLOT(slotURLChanged(const KUrl&)));
+    connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
+            &dolphin, SLOT(slotURLChanged(const KUrl&)));
+    connect(m_urlNavigator, SIGNAL(historyChanged()),
+            &dolphin, SLOT(slotHistoryChanged()));
+
+    m_statusBar = new DolphinStatusBar(this);
+
+    m_dirLister = new DolphinDirLister();
+    m_dirLister->setAutoUpdate(true);
+    m_dirLister->setMainWindow(this);
+    m_dirLister->setShowingDotFiles(showHiddenFiles);
+    connect(m_dirLister, SIGNAL(clear()),
+            this, SLOT(slotClear()));
+    connect(m_dirLister, SIGNAL(percent(int)),
+            this, SLOT(slotPercent(int)));
+    connect(m_dirLister, SIGNAL(deleteItem(KFileItem*)),
+            this, SLOT(slotDeleteItem(KFileItem*)));
+    connect(m_dirLister, SIGNAL(completed()),
+            this, SLOT(slotCompleted()));
+    connect(m_dirLister, SIGNAL(infoMessage(const QString&)),
+            this, SLOT(slotInfoMessage(const QString&)));
+    connect(m_dirLister, SIGNAL(errorMessage(const QString&)),
+            this, SLOT(slotErrorMessage(const QString&)));
+    connect(m_dirLister, SIGNAL(refreshItems(const KFileItemList&)),
+            this, SLOT(slotRefreshItems(const KFileItemList&)));
+    connect(m_dirLister, SIGNAL(redirection(const KUrl&, const KUrl&)),
+            this, SIGNAL(redirection(const KUrl&, const KUrl&)));
+    connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)),
+           this, SLOT(slotAddItems(const KFileItemList&)));
+
+    m_iconSize = K3Icon::SizeMedium;
+
+    m_topLayout->addWidget(m_urlNavigator);
+    createView();
+
+    m_filterBar = new FilterBar(this);
+    m_filterBar->hide();
+    m_topLayout->addWidget(m_filterBar);
+    connect(m_filterBar, SIGNAL(signalFilterChanged(const QString&)),
+           this, SLOT(slotChangeNameFilter(const QString&)));
+
+    m_topLayout->addWidget(m_statusBar);
+}
+
+DolphinView::~DolphinView()
+{
+    delete m_dirLister;
+    m_dirLister = 0;
+}
+
+void DolphinView::setURL(const KUrl& url)
+{
+    m_urlNavigator->setURL(url);
+}
+
+const KUrl& DolphinView::url() const
+{
+    return m_urlNavigator->url();
+}
+
+void DolphinView::requestActivation()
+{
+    Dolphin::mainWin().setActiveView(this);
+}
+
+bool DolphinView::isActive() const
+{
+    return (Dolphin::mainWin().activeView() == this);
+}
+
+void DolphinView::setMode(Mode mode)
+{
+    if (mode == m_mode) {
+        return;         // the wished mode is already set
+    }
+
+    QWidget* view = (m_iconsView != 0) ? static_cast<QWidget*>(m_iconsView) :
+                                         static_cast<QWidget*>(m_detailsView);
+    if (view != 0) {
+        m_topLayout->remove(view);
+        view->close();
+        view->deleteLater();
+        m_iconsView = 0;
+        m_detailsView = 0;
+    }
+
+    m_mode = mode;
+
+    createView();
+
+    ViewProperties props(m_urlNavigator->url());
+    props.setViewMode(m_mode);
+
+    emit signalModeChanged();
+}
+
+DolphinView::Mode DolphinView::mode() const
+{
+    return m_mode;
+}
+
+void DolphinView::setShowHiddenFilesEnabled(bool show)
+{
+    if (m_dirLister->showingDotFiles() == show) {
+        return;
+    }
+
+    ViewProperties props(m_urlNavigator->url());
+    props.setShowHiddenFilesEnabled(show);
+    props.save();
+
+    m_dirLister->setShowingDotFiles(show);
+
+    emit signalShowHiddenFilesChanged();
+
+    reload();
+}
+
+bool DolphinView::isShowHiddenFilesEnabled() const
+{
+    return m_dirLister->showingDotFiles();
+}
+
+void DolphinView::setViewProperties(const ViewProperties& props)
+{
+    setMode(props.viewMode());
+    setSorting(props.sorting());
+    setSortOrder(props.sortOrder());
+    setShowHiddenFilesEnabled(props.isShowHiddenFilesEnabled());
+}
+
+void DolphinView::renameSelectedItems()
+{
+    const KUrl::List urls = selectedURLs();
+    if (urls.count() > 1) {
+        // More than one item has been selected for renaming. Open
+        // a rename dialog and rename all items afterwards.
+        RenameDialog dialog(urls);
+        if (dialog.exec() == QDialog::Rejected) {
+            return;
+        }
+
+        DolphinView* view = Dolphin::mainWin().activeView();
+        const QString& newName = dialog.newName();
+        if (newName.isEmpty()) {
+            view->statusBar()->setMessage(i18n("The new item name is invalid."),
+                                          DolphinStatusBar::Error);
+        }
+        else {
+            UndoManager& undoMan = UndoManager::instance();
+            undoMan.beginMacro();
+
+            assert(newName.contains('#'));
+
+            const int urlsCount = urls.count();
+            ProgressIndicator* progressIndicator =
+                new  ProgressIndicator(i18n("Renaming items..."),
+                                       i18n("Renaming finished."),
+                                       urlsCount);
+
+            // iterate through all selected items and rename them...
+            const int replaceIndex = newName.find('#');
+            assert(replaceIndex >= 0);
+            for (int i = 0; i < urlsCount; ++i) {
+                const KUrl& source = urls[i];
+                QString name(newName);
+                name.replace(replaceIndex, 1, renameIndexPresentation(i + 1, urlsCount));
+
+                if (source.fileName() != name) {
+                    KUrl dest(source.upUrl());
+                    dest.addPath(name);
+
+                    const bool destExists = KIO::NetAccess::exists(dest, false, view);
+                    if (destExists) {
+                        delete progressIndicator;
+                        progressIndicator = 0;
+                        view->statusBar()->setMessage(i18n("Renaming failed (item '%1' already exists).").arg(name),
+                                                      DolphinStatusBar::Error);
+                        break;
+                    }
+                    else if (KIO::NetAccess::file_move(source, dest)) {
+                        // TODO: From the users point of view he executed one 'rename n files' operation,
+                        // but internally we store it as n 'rename 1 file' operations for the undo mechanism.
+                        DolphinCommand command(DolphinCommand::Rename, source, dest);
+                        undoMan.addCommand(command);
+                    }
+                }
+
+                progressIndicator->execOperation();
+            }
+            delete progressIndicator;
+            progressIndicator = 0;
+
+            undoMan.endMacro();
+        }
+    }
+    else {
+        // Only one item has been selected for renaming. Use the custom
+        // renaming mechanism from the views.
+        assert(urls.count() == 1);
+        if (m_mode == DetailsView) {
+            Q3ListViewItem* item = m_detailsView->firstChild();
+            while (item != 0) {
+                if (item->isSelected()) {
+                    m_detailsView->rename(item, DolphinDetailsView::NameColumn);
+                    break;
+                }
+                item = item->nextSibling();
+            }
+        }
+        else {
+            KFileIconViewItem* item = static_cast<KFileIconViewItem*>(m_iconsView->firstItem());
+            while (item != 0) {
+                if (item->isSelected()) {
+                    item->rename();
+                    break;
+                }
+                item = static_cast<KFileIconViewItem*>(item->nextItem());
+            }
+        }
+    }
+}
+
+void DolphinView::selectAll()
+{
+    fileView()->selectAll();
+}
+
+void DolphinView::invertSelection()
+{
+    fileView()->invertSelection();
+}
+
+DolphinStatusBar* DolphinView::statusBar() const
+{
+    return m_statusBar;
+}
+
+int DolphinView::contentsX() const
+{
+    return scrollView()->contentsX();
+}
+
+int DolphinView::contentsY() const
+{
+    return scrollView()->contentsY();
+}
+
+void DolphinView::refreshSettings()
+{
+    if (m_iconsView != 0) {
+        m_iconsView->refreshSettings();
+    }
+
+    if (m_detailsView != 0) {
+        // TODO: There is no usable interface in QListView/KFileDetailView
+        // to hide/show columns. The easiest approach is to delete
+        // the current instance and recreate a new one, which automatically
+        // refreshs the settings. If a proper interface is available in Qt4
+        // m_detailsView->refreshSettings() would be enough.
+        m_topLayout->remove(m_detailsView);
+        m_detailsView->close();
+        m_detailsView->deleteLater();
+        m_detailsView = 0;
+
+        createView();
+    }
+}
+
+void DolphinView::updateStatusBar()
+{
+    // As the item count information is less important
+    // in comparison with other messages, it should only
+    // be shown if:
+    // - the status bar is empty or
+    // - shows already the item count information or
+    // - shows only a not very important information
+    // - if any progress is given don't show the item count info at all
+    const QString msg(m_statusBar->message());
+    const bool updateStatusBarMsg = (msg.isEmpty() ||
+                                     (msg == m_statusBar->defaultText()) ||
+                                     (m_statusBar->type() == DolphinStatusBar::Information)) &&
+                                    (m_statusBar->progress() == 100);
+
+    const QString text(hasSelection() ? selectionStatusBarText() : defaultStatusBarText());
+    m_statusBar->setDefaultText(text);
+
+    if (updateStatusBarMsg) {
+        m_statusBar->setMessage(text, DolphinStatusBar::Default);
+    }
+}
+
+void DolphinView::requestItemInfo(const KUrl& url)
+{
+    emit signalRequestItemInfo(url);
+}
+
+bool DolphinView::isURLEditable() const
+{
+    return m_urlNavigator->isURLEditable();
+}
+
+void DolphinView::zoomIn()
+{
+    itemEffectsManager()->zoomIn();
+}
+
+void DolphinView::zoomOut()
+{
+    itemEffectsManager()->zoomOut();
+}
+
+bool DolphinView::isZoomInPossible() const
+{
+    return itemEffectsManager()->isZoomInPossible();
+}
+
+bool DolphinView::isZoomOutPossible() const
+{
+    return itemEffectsManager()->isZoomOutPossible();
+}
+
+void DolphinView::setSorting(Sorting sorting)
+{
+    if (sorting != this->sorting()) {
+        KFileView* view = fileView();
+        int spec = view->sorting() & ~QDir::Name & ~QDir::Size & ~QDir::Time & ~QDir::Unsorted;
+
+        switch (sorting) {
+            case SortByName: spec = spec | QDir::Name; break;
+            case SortBySize: spec = spec | QDir::Size; break;
+            case SortByDate: spec = spec | QDir::Time; break;
+            default: break;
+        }
+
+        ViewProperties props(url());
+        props.setSorting(sorting);
+
+        view->setSorting(static_cast<QDir::SortSpec>(spec));
+
+        emit signalSortingChanged(sorting);
+    }
+}
+
+DolphinView::Sorting DolphinView::sorting() const
+{
+    const QDir::SortSpec spec = fileView()->sorting();
+
+    if (spec & QDir::Time) {
+        return SortByDate;
+    }
+
+    if (spec & QDir::Size) {
+        return SortBySize;
+    }
+
+    return SortByName;
+}
+
+void DolphinView::setSortOrder(Qt::SortOrder order)
+{
+    if (sortOrder() != order) {
+        KFileView* view = fileView();
+        int sorting = view->sorting();
+        sorting = (order == Qt::Ascending) ? (sorting & ~QDir::Reversed) :
+                                             (sorting | QDir::Reversed);
+
+        ViewProperties props(url());
+        props.setSortOrder(order);
+
+        view->setSorting(static_cast<QDir::SortSpec>(sorting));
+
+        emit signalSortOrderChanged(order);
+    }
+}
+
+Qt::SortOrder DolphinView::sortOrder() const
+{
+    return fileView()->isReversed() ? Qt::Descending : Qt::Ascending;
+}
+
+void DolphinView::goBack()
+{
+    m_urlNavigator->goBack();
+}
+
+void DolphinView::goForward()
+{
+    m_urlNavigator->goForward();
+}
+
+void DolphinView::goUp()
+{
+    m_urlNavigator->goUp();
+}
+
+void DolphinView::goHome()
+{
+    m_urlNavigator->goHome();
+}
+
+void DolphinView::setURLEditable(bool editable)
+{
+    m_urlNavigator->editURL(editable);
+}
+
+const Q3ValueList<URLNavigator::HistoryElem> DolphinView::urlHistory(int& index) const
+{
+    return m_urlNavigator->history(index);
+}
+
+bool DolphinView::hasSelection() const
+{
+    const KFileItemList* list = selectedItems();
+    return (list != 0) && !list->isEmpty();
+}
+
+const KFileItemList* DolphinView::selectedItems() const
+{
+    return fileView()->selectedItems();
+}
+
+KUrl::List DolphinView::selectedURLs() const
+{
+    KUrl::List urls;
+
+    const KFileItemList* list = fileView()->selectedItems();
+    if (list != 0) {
+        KFileItemList::const_iterator it = list->begin();
+        const KFileItemList::const_iterator end = list->end();
+        KFileItem* item = 0;
+        while (it != end) {
+            urls.append(item->url());
+            ++it;
+        }
+    }
+
+    return urls;
+}
+
+const KFileItem* DolphinView::currentFileItem() const
+{
+    return fileView()->currentFileItem();
+}
+
+void DolphinView::openContextMenu(KFileItem* fileInfo, const QPoint& pos)
+{
+    DolphinContextMenu contextMenu(this, fileInfo, pos);
+    contextMenu.open();
+}
+
+void DolphinView::rename(const KUrl& source, const QString& newName)
+{
+    bool ok = false;
+
+    if (newName.isEmpty() || (source.fileName() == newName)) {
+        return;
+    }
+
+    KUrl dest(source.upUrl());
+    dest.addPath(newName);
+
+    const bool destExists = KIO::NetAccess::exists(dest,
+                                                   false,
+                                                   Dolphin::mainWin().activeView());
+    if (destExists) {
+        // the destination already exists, hence ask the user
+        // how to proceed...
+        KIO::RenameDlg renameDialog(this,
+                                    i18n("File Already Exists"),
+                                    source.path(),
+                                    dest.path(),
+                                    KIO::M_OVERWRITE);
+        switch (renameDialog.exec()) {
+            case KIO::R_OVERWRITE:
+                // the destination should be overwritten
+                ok = KIO::NetAccess::file_move(source, dest, -1, true);
+                break;
+
+            case KIO::R_RENAME: {
+                // a new name for the destination has been used
+                KUrl newDest(renameDialog.newDestUrl());
+                ok = KIO::NetAccess::file_move(source, newDest);
+                break;
+            }
+
+            default:
+                // the renaming operation has been canceled
+                reload();
+                return;
+        }
+    }
+    else {
+        // no destination exists, hence just move the file to
+        // do the renaming
+        ok = KIO::NetAccess::file_move(source, dest);
+    }
+
+    if (ok) {
+        m_statusBar->setMessage(i18n("Renamed file '%1' to '%2'.").arg(source.fileName(), dest.fileName()),
+                                DolphinStatusBar::OperationCompleted);
+
+        DolphinCommand command(DolphinCommand::Rename, source, dest);
+        UndoManager::instance().addCommand(command);
+    }
+    else {
+        m_statusBar->setMessage(i18n("Renaming of file '%1' to '%2' failed.").arg(source.fileName(), dest.fileName()),
+                                DolphinStatusBar::Error);
+        reload();
+    }
+}
+
+void DolphinView::reload()
+{
+    startDirLister(m_urlNavigator->url(), true);
+}
+
+void DolphinView::slotURLListDropped(QDropEvent* /* event */,
+                                     const KUrl::List& urls,
+                                     const KUrl& url)
+{
+    KUrl destination(url);
+    if (destination.isEmpty()) {
+        destination = m_urlNavigator->url();
+    }
+    else {
+        // Check whether the destination URL is a directory. If this is not the
+        // case, use the navigator URL as destination (otherwise the destination,
+        // which represents a file, would be replaced by a copy- or move-operation).
+        KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, destination);
+        if (!fileItem.isDir()) {
+            destination = m_urlNavigator->url();
+        }
+    }
+
+    Dolphin::mainWin().dropURLs(urls, destination);
+}
+
+void DolphinView::mouseReleaseEvent(QMouseEvent* event)
+{
+    QWidget::mouseReleaseEvent(event);
+    Dolphin::mainWin().setActiveView(this);
+}
+
+void DolphinView::slotURLChanged(const KUrl& url)
+{
+    const ViewProperties props(url);
+    setMode(props.viewMode());
+
+    const bool showHiddenFiles = props.isShowHiddenFilesEnabled();
+    setShowHiddenFilesEnabled(showHiddenFiles);
+    m_dirLister->setShowingDotFiles(showHiddenFiles);
+
+    setSorting(props.sorting());
+    setSortOrder(props.sortOrder());
+
+    startDirLister(url);
+
+    // The selectionChanged signal is not emitted when a new view object is
+    // created. The application does not care whether a view is represented by a
+    // different instance, hence inform the application that the selection might have
+    // changed so that it can update it's actions.
+    Dolphin::mainWin().slotSelectionChanged();
+
+    emit signalURLChanged(url);
+}
+
+void DolphinView::triggerIconsViewItem(Q3IconViewItem* item)
+{
+    /* KDE4-TODO:
+    const Qt::ButtonState keyboardState = KApplication::keyboardMouseState();
+    const bool isSelectionActive = ((keyboardState & Qt::ShiftModifier) > 0) ||
+                                   ((keyboardState & Qt::ControlModifier) > 0);*/
+    const bool isSelectionActive = false;
+    if ((item != 0) && !isSelectionActive) {
+        // Updating the URL must be done outside the scope of this slot,
+        // as iconview items will get deleted.
+        QTimer::singleShot(0, this, SLOT(updateURL()));
+        Dolphin::mainWin().setActiveView(this);
+    }
+}
+
+void DolphinView::triggerDetailsViewItem(Q3ListViewItem* item,
+                                         const QPoint& pos,
+                                         int /* column */)
+{
+    if (item == 0) {
+        return;
+    }
+
+    if (m_detailsView->isOnFilename(item, pos)) {
+        // Updating the URL must be done outside the scope of this slot,
+        // as listview items will get deleted.
+        QTimer::singleShot(0, this, SLOT(updateURL()));
+        Dolphin::mainWin().setActiveView(this);
+    }
+    else {
+        m_detailsView->clearSelection();
+    }
+}
+
+void DolphinView::triggerDetailsViewItem(Q3ListViewItem* item)
+{
+    const QPoint pos(0, item->itemPos());
+    triggerDetailsViewItem(item, pos, 0);
+}
+
+void DolphinView::updateURL()
+{
+    KFileView* fileView = (m_iconsView != 0) ? static_cast<KFileView*>(m_iconsView) :
+                                               static_cast<KFileView*>(m_detailsView);
+
+    KFileItem* fileItem = fileView->currentFileItem();
+    if (fileItem == 0) {
+        return;
+    }
+
+    if (fileItem->isDir()) {
+        // Prefer the local path over the URL. This assures that the
+        // volume space information is correct. Assuming that the URL is media:/sda1,
+        // and the local path is /windows/C: For the URL the space info is related
+        // to the root partition (and hence wrong) and for the local path the space
+        // info is related to the windows partition (-> correct).
+        const QString localPath(fileItem->localPath());
+        if (localPath.isEmpty()) {
+            setURL(fileItem->url());
+        }
+        else {
+            setURL(KUrl(localPath));
+        }
+    }
+    else {
+        fileItem->run();
+    }
+}
+
+void DolphinView::slotPercent(int percent)
+{
+    if (m_showProgress) {
+        m_statusBar->setProgress(percent);
+    }
+}
+
+void DolphinView::slotClear()
+{
+    fileView()->clearView();
+    updateStatusBar();
+}
+
+void DolphinView::slotDeleteItem(KFileItem* item)
+{
+    fileView()->removeItem(item);
+    updateStatusBar();
+}
+
+void DolphinView::slotCompleted()
+{
+    m_refreshing = true;
+
+    KFileView* view = fileView();
+    view->clearView();
+
+    // TODO: in Qt4 the code should get a lot
+    // simpler and nicer due to Interview...
+    if (m_iconsView != 0) {
+        m_iconsView->beginItemUpdates();
+    }
+    if (m_detailsView != 0) {
+        m_detailsView->beginItemUpdates();
+    }
+
+    if (m_showProgress) {
+        m_statusBar->setProgressText(QString::null);
+        m_statusBar->setProgress(100);
+        m_showProgress = false;
+    }
+
+    KFileItemList items(m_dirLister->items());
+    KFileItemList::const_iterator it = items.begin();
+    const KFileItemList::const_iterator end = items.end();
+
+    m_fileCount = 0;
+    m_folderCount = 0;
+
+    KFileItem* item = 0;
+    while (it != end) {
+        view->insertItem(item);
+        if (item->isDir()) {
+            ++m_folderCount;
+        }
+        else {
+            ++m_fileCount;
+        }
+        ++it;
+    }
+
+    updateStatusBar();
+
+    if (m_iconsView != 0) {
+        // Prevent a flickering of the icon view widget by giving a small
+        // timeslot to swallow asynchronous update events.
+        m_iconsView->setUpdatesEnabled(false);
+        QTimer::singleShot(10, this, SLOT(slotDelayedUpdate()));
+    }
+
+    if (m_detailsView != 0) {
+        m_detailsView->endItemUpdates();
+        m_refreshing = false;
+    }
+}
+
+void DolphinView::slotDelayedUpdate()
+{
+    if (m_iconsView != 0) {
+        m_iconsView->setUpdatesEnabled(true);
+        m_iconsView->endItemUpdates();
+    }
+    m_refreshing = false;
+}
+
+void DolphinView::slotInfoMessage(const QString& msg)
+{
+    m_statusBar->setMessage(msg, DolphinStatusBar::Information);
+}
+
+void DolphinView::slotErrorMessage(const QString& msg)
+{
+    m_statusBar->setMessage(msg, DolphinStatusBar::Error);
+}
+
+void DolphinView::slotRefreshItems(const KFileItemList& /* list */)
+{
+    QTimer::singleShot(0, this, SLOT(reload()));
+}
+
+void DolphinView::slotAddItems(const KFileItemList& list)
+{
+  fileView()->addItemList(list);
+  fileView()->updateView();
+}
+
+void DolphinView::slotGrabActivation()
+{
+    Dolphin::mainWin().setActiveView(this);
+}
+
+void DolphinView::slotContentsMoving(int x, int y)
+{
+    if (!m_refreshing) {
+        // Only emit a 'contents moved' signal if the user
+        // moved the content by adjusting the sliders. Adjustments
+        // resulted by refreshing a directory should not be respected.
+        emit contentsMoved(x, y);
+    }
+}
+
+void DolphinView::createView()
+{
+    assert(m_iconsView == 0);
+    assert(m_detailsView == 0);
+
+    switch (m_mode) {
+    case IconsView:
+    case PreviewsView: {
+        const DolphinIconsView::LayoutMode layoutMode = (m_mode == IconsView) ?
+                                                        DolphinIconsView::Icons :
+                                                        DolphinIconsView::Previews;
+        m_iconsView = new DolphinIconsView(this, layoutMode);
+        m_topLayout->insertWidget(1, m_iconsView);
+        setFocusProxy(m_iconsView);
+
+        connect(m_iconsView, SIGNAL(executed(Q3IconViewItem*)),
+                this, SLOT(triggerIconsViewItem(Q3IconViewItem*)));
+        connect(m_iconsView, SIGNAL(returnPressed(Q3IconViewItem*)),
+                this, SLOT(triggerIconsViewItem(Q3IconViewItem*)));
+        connect(m_iconsView, SIGNAL(signalRequestActivation()),
+                this, SLOT(slotGrabActivation()));
+
+        m_iconsView->endItemUpdates();
+        m_iconsView->show();
+        m_iconsView->setFocus();
+        break;
+    }
+
+    case DetailsView: {
+        m_detailsView = new DolphinDetailsView(this);
+        m_topLayout->insertWidget(1, m_detailsView);
+        setFocusProxy(m_detailsView);
+
+        connect(m_detailsView, SIGNAL(executed(Q3ListViewItem*, const QPoint&, int)),
+                this, SLOT(triggerDetailsViewItem(Q3ListViewItem*, const QPoint&, int)));
+        connect(m_detailsView, SIGNAL(returnPressed(Q3ListViewItem*)),
+                this, SLOT(triggerDetailsViewItem(Q3ListViewItem*)));
+        connect(m_detailsView, SIGNAL(signalRequestActivation()),
+                this, SLOT(slotGrabActivation()));
+        m_detailsView->show();
+        m_detailsView->setFocus();
+        break;
+    }
+
+    default:
+        break;
+    }
+
+    connect(scrollView(), SIGNAL(contentsMoving(int, int)),
+            this, SLOT(slotContentsMoving(int, int)));
+
+    startDirLister(m_urlNavigator->url());
+}
+
+KFileView* DolphinView::fileView() const
+{
+    return (m_mode == DetailsView) ? static_cast<KFileView*>(m_detailsView) :
+                                     static_cast<KFileView*>(m_iconsView);
+}
+
+Q3ScrollView* DolphinView::scrollView() const
+{
+    return (m_mode == DetailsView) ? static_cast<Q3ScrollView*>(m_detailsView) :
+                                     static_cast<Q3ScrollView*>(m_iconsView);
+}
+
+ItemEffectsManager* DolphinView::itemEffectsManager() const
+{
+    return (m_mode == DetailsView) ? static_cast<ItemEffectsManager*>(m_detailsView) :
+                                     static_cast<ItemEffectsManager*>(m_iconsView);
+}
+
+void DolphinView::startDirLister(const KUrl& url, bool reload)
+{
+    if (!url.isValid()) {
+        const QString location(url.pathOrUrl());
+        if (location.isEmpty()) {
+            m_statusBar->setMessage(i18n("The location is empty."), DolphinStatusBar::Error);
+        }
+        else {
+            m_statusBar->setMessage(i18n("The location '%1' is invalid.").arg(location),
+                                    DolphinStatusBar::Error);
+        }
+        return;
+    }
+
+    // Only show the directory loading progress if the status bar does
+    // not contain another progress information. This means that
+    // the directory loading progress information has the lowest priority.
+    const QString progressText(m_statusBar->progressText());
+    m_showProgress = progressText.isEmpty() ||
+                     (progressText == i18n("Loading directory..."));
+    if (m_showProgress) {
+        m_statusBar->setProgressText(i18n("Loading directory..."));
+        m_statusBar->setProgress(0);
+    }
+
+    m_refreshing = true;
+    m_dirLister->stop();
+    m_dirLister->openUrl(url, false, reload);
+}
+
+QString DolphinView::defaultStatusBarText() const
+{
+    // TODO: the following code is not suitable for languages where multiple forms
+    // of plurals are given (e. g. in Poland three forms of plurals exist).
+    const int itemCount = m_folderCount + m_fileCount;
+
+    QString text;
+    if (itemCount == 1) {
+        text = i18n("1 Item");
+    }
+    else {
+        text = i18n("%1 Items").arg(itemCount);
+    }
+
+    text += " (";
+
+    if (m_folderCount == 1) {
+        text += i18n("1 Folder");
+    }
+    else {
+        text += i18n("%1 Folders").arg(m_folderCount);
+    }
+
+    text += ", ";
+
+    if (m_fileCount == 1) {
+        text += i18n("1 File");
+    }
+    else {
+        text += i18n("%1 Files").arg(m_fileCount);
+    }
+
+    text += ")";
+
+    return text;
+}
+
+QString DolphinView::selectionStatusBarText() const
+{
+    // TODO: the following code is not suitable for languages where multiple forms
+    // of plurals are given (e. g. in Poland three forms of plurals exist).
+    QString text;
+    const KFileItemList* list = selectedItems();
+    assert((list != 0) && !list->isEmpty());
+
+    int fileCount = 0;
+    int folderCount = 0;
+    KIO::filesize_t byteSize = 0;
+    KFileItemList::const_iterator it = list->begin();
+    const KFileItemList::const_iterator end = list->end();
+    while (it != end){
+        KFileItem* item = *it;
+        if (item->isDir()) {
+            ++folderCount;
+        }
+        else {
+            ++fileCount;
+            byteSize += item->size();
+        }
+        ++it;
+    }
+
+    if (folderCount == 1) {
+        text = i18n("1 Folder selected");
+    }
+    else if (folderCount > 1) {
+        text = i18n("%1 Folders selected").arg(folderCount);
+    }
+
+    if ((fileCount > 0) && (folderCount > 0)) {
+        text += ", ";
+    }
+
+    const QString sizeText(KIO::convertSize(byteSize));
+    if (fileCount == 1) {
+        text += i18n("1 File selected (%1)").arg(sizeText);
+    }
+    else if (fileCount > 1) {
+        text += i18n("%1 Files selected (%1)").arg(fileCount).arg(sizeText);
+    }
+
+    return text;
+}
+
+QString DolphinView::renameIndexPresentation(int index, int itemCount) const
+{
+    // assure that the string reprentation for all indicess have the same
+    // number of characters based on the given number of items
+    QString str(QString::number(index));
+    int chrCount = 1;
+    while (itemCount >= 10) {
+        ++chrCount;
+        itemCount /= 10;
+    }
+    str.reserve(chrCount);
+
+    const int insertCount = chrCount - str.length();
+    for (int i = 0; i < insertCount; ++i) {
+        str.insert(0, '0');
+    }
+    return str;
+}
+
+void DolphinView::slotShowFilterBar(bool show)
+{
+    assert(m_filterBar != 0);
+    if (show) {
+        m_filterBar->show();
+    }
+    else {
+        m_filterBar->hide();
+    }
+}
+
+void DolphinView::slotChangeNameFilter(const QString& nameFilter)
+{
+    // The name filter of KDirLister does a 'hard' filtering, which
+    // means that only the items are shown where the names match
+    // exactly the filter. This is non-transparent for the user, which
+    // just wants to have a 'soft' filtering: does the name contain
+    // the filter string?
+    QString adjustedFilter(nameFilter);
+    adjustedFilter.insert(0, '*');
+    adjustedFilter.append('*');
+
+    m_dirLister->setNameFilter(adjustedFilter);
+    m_dirLister->emitChanges();
+
+    // TODO: this is a workaround for QIconView: the item position
+    // stay as they are by filtering, only an inserting of an item
+    // results to an automatic adjusting of the item position. In Qt4/KDE4
+    // this workaround should get obsolete due to Interview.
+    KFileView* view = fileView();
+    if (view == m_iconsView) {
+        KFileItem* first = view->firstFileItem();
+        if (first != 0) {
+            view->removeItem(first);
+            view->insertItem(first);
+        }
+    }
+}
+
+bool DolphinView::isFilterBarVisible()
+{
+  return m_filterBar->isVisible();
+}
+
+#include "dolphinview.moc"
diff --git a/src/dolphinview.h b/src/dolphinview.h
new file mode 100644 (file)
index 0000000..fbde824
--- /dev/null
@@ -0,0 +1,458 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Gregor Kališnik <gregor@podnapisi.net>          *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+
+#ifndef _DOLPHINVIEW_H_
+#define _DOLPHINVIEW_H_
+
+#include <qwidget.h>
+//Added by qt3to4:
+#include <QDropEvent>
+#include <Q3ValueList>
+#include <QMouseEvent>
+#include <Q3VBoxLayout>
+#include <kparts/part.h>
+#include <kfileitem.h>
+#include <kfileiconview.h>
+#include <kio/job.h>
+#include <urlnavigator.h>
+
+class QPainter;
+class KUrl;
+class QLineEdit;
+class URLNavigator;
+class QTimer;
+class Q3IconViewItem;
+class Q3ListViewItem;
+class Q3VBoxLayout;
+class KFileView;
+class Dolphin;
+class DolphinDirLister;
+class DolphinStatusBar;
+class DolphinIconsView;
+class DolphinDetailsView;
+class ViewProperties;
+class Q3ScrollView;
+class KProgress;
+class ItemEffectsManager;
+class FilterBar;
+/**
+ * @short Represents a view for the directory content
+ * including the navigation bar and status bar.
+ *
+ * View modes for icons, details and previews are supported. Currently
+ * Dolphin allows to have up to two views inside the main window.
+ *
+ * @see DolphinIconsView
+ * @see DolphinDetailsView
+ * @see URLNavigator
+ * @see DolphinStatusBar
+ *
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class DolphinView : public QWidget
+{
+    Q_OBJECT
+
+public:
+       /**
+     * Defines the view mode for a directory. The view mode
+     * can be defined when constructing a DolphinView. The
+     * view mode is automatically updated if the directory itself
+     * defines a view mode (see class ViewProperties for details).
+     */
+    enum Mode
+    {
+        /**
+         * The directory items are shown as icons including an
+         * icon name. */
+        IconsView = 0,
+
+        /**
+         * The icon, the name and at least the size of the directory
+         * items are shown in a table. It is possible to add columns
+         * for date, group and permissions.
+         */
+        DetailsView = 1,
+
+        /**
+         * The directory items are shown as preview if possible. As
+         * fallback the items are shown as icons.
+         */
+        PreviewsView = 2,
+        MaxModeEnum = PreviewsView
+    };
+
+    /** Defines the sort order for the items of a directory. */
+    enum Sorting
+    {
+        SortByName = 0,
+        SortBySize = 1,
+        SortByDate = 2,
+        MaxSortEnum = SortByDate
+    };
+
+    DolphinView(QWidget* parent,
+                const KUrl& url,
+                Mode mode = IconsView,
+                bool showHiddenFiles = false);
+
+    virtual ~DolphinView();
+
+    /**
+     * Sets the current active URL.
+     * The signals URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void setURL(const KUrl& url);
+
+    /** Returns the current active URL. */
+    const KUrl& url() const;
+
+    void requestActivation();
+    bool isActive() const;
+
+    void setMode(Mode mode);
+    Mode mode() const;
+    void setShowHiddenFilesEnabled(bool show);
+    bool isShowHiddenFilesEnabled() const;
+
+    void setViewProperties(const ViewProperties& props);
+
+    /**
+     * Triggers the renaming of the currently selected items, where
+     * the user must input a new name for the items.
+     */
+    void renameSelectedItems();
+
+    /**
+     * Selects all items.
+     * @see DolphinView::selectedItems()
+     */
+    void selectAll();
+
+    /**
+     * Inverts the current selection: selected items get unselected,
+     * unselected items get selected.
+     * @see DolphinView::selectedItems()
+     */
+    void invertSelection();
+
+    /**
+     * Goes back one step in the URL history. The signals
+     * URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void goBack();
+
+    /**
+     * Goes forward one step in the URL history. The signals
+     * URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void goForward();
+
+    /**
+     * Goes up one step of the URL path. The signals
+     * URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void goUp();
+
+    /**
+     * Goes to the home URL. The signals URLNavigator::urlChanged
+     * and URLNavigator::historyChanged are submitted.
+     */
+    void goHome();
+
+    /**
+     * Sets the URL of the navigation bar to an editable state
+     * if \a editable is true. If \a editable is false, each part of
+     * the location is presented by a button for a fast navigation.
+     */
+    void setURLEditable(bool editable);
+
+    /**
+     * Returns the complete URL history. The index 0 indicates the oldest
+     * history element.
+     * @param index     Output parameter which indicates the current
+     *                  index of the location.
+     */
+    const Q3ValueList<URLNavigator::HistoryElem> urlHistory(int& index) const;
+
+    /**
+     * Returns true, if at least one item is selected.
+     */
+    bool hasSelection() const;
+
+    /**
+     * Returns the selected items. 0 is returned, if no item
+     * is selected.
+     * @see DolphinView::selectedURLs()
+     */
+    const KFileItemList* selectedItems() const;
+
+    /**
+     * Returns a list of URLs for all selected items. An empty list
+     * is returned, if no item is selected.
+     * @see DolphinView::selectedItems()
+     */
+    KUrl::List selectedURLs() const;
+
+    /**
+     * Returns the current item, where the cursor is. 0 is returned, if there is no
+     * current item (e. g. if the view is empty). Note that the current item must
+     * not be a selected item.
+     * @see DolphinView::selectedItems()
+     */
+    const KFileItem* currentFileItem() const;
+
+    /**
+     * Opens the context menu for the item indicated by \a fileInfo
+     * on the position \a pos. If 0 is passed for the file info, a context
+     * menu for the viewport is opened.
+     */
+    void openContextMenu(KFileItem* fileInfo, const QPoint& pos);
+
+    /**
+     * Renames the filename of the source URL by the new file name.
+     * If the new file name already exists, a dialog is opened which
+     * asks the user to enter a new name.
+     */
+    void rename(const KUrl& source, const QString& newName);
+
+    /** Returns the status bar of the view. */
+    DolphinStatusBar* statusBar() const;
+
+    /**
+     * Returns the x-position of the view content.
+     * The content of the view might be larger than the visible area
+     * and hence a scrolling must be done.
+     */
+    int contentsX() const;
+
+    /**
+     * Returns the y-position of the view content.
+     * The content of the view might be larger than the visible area
+     * and hence a scrolling must be done.
+     */
+    int contentsY() const;
+
+    /**
+     * Returns true, if the URL shown by the navigation bar is editable.
+     * @see URLNavigator
+     */
+    bool isURLEditable() const;
+
+    /** Increases the size of the current set view mode. */
+    void zoomIn();
+
+    /** Decreases the size of the current set view mode. */
+    void zoomOut();
+
+    /**
+     * Returns true, if zooming in is possible. If false is returned,
+     * the minimal zoom size is possible.
+     */
+    bool isZoomInPossible() const;
+
+    /**
+     * Returns true, if zooming out is possible. If false is returned,
+     * the maximum zoom size is possible.
+     */
+    bool isZoomOutPossible() const;
+
+    /** Sets the sort order of the items inside a directory (see DolphinView::Sorting). */
+    void setSorting(Sorting sorting);
+
+    /** Returns the sort order of the items inside a directory (see DolphinView::Sorting). */
+    Sorting sorting() const;
+
+    /** Sets the sort order (Qt::Ascending or Qt::Descending) for the items. */
+    void setSortOrder(Qt::SortOrder order);
+
+    /** Returns the current used sort order (Qt::Ascending or Qt::Descending). */
+    Qt::SortOrder sortOrder() const;
+
+    /** Refreshs the view settings by reading out the stored settings. */
+    void refreshSettings();
+
+    /**
+     * Updates the number of items (= number of files + number of
+     * directories) in the statusbar. If files are selected, the number
+     * of selected files and the sum of the filesize is shown.
+     */
+    void updateStatusBar();
+
+    /** Returns the URLNavigator of the view for read access. */
+    const URLNavigator* urlNavigator() const { return m_urlNavigator; }
+
+    /**
+     * Triggers to request user information for the item given
+     * by the URL \a url. The signal signalRequestItemInfo is emitted,
+     * which provides a way for widgets to get an indication to update
+     * the item information.
+     */
+    void requestItemInfo(const KUrl& url);
+
+    /**
+     * Checks if the filter bar is visible.
+     *
+     * @return @c true Filter bar is visible.
+     * @return @c false Filter bar is not visible.
+     */
+    bool isFilterBarVisible();
+
+public slots:
+    void reload();
+    void slotURLListDropped(QDropEvent* event,
+                            const KUrl::List& urls,
+                            const KUrl& url);
+
+    /**
+     * Slot that popups the filter bar like FireFox popups his Search bar.
+     */
+    void slotShowFilterBar(bool show);
+
+signals:
+    /** Is emitted if URL of the view has been changed to \a url. */
+    void signalURLChanged(const KUrl& url);
+
+    /**
+     * Is emitted if the view mode (IconsView, DetailsView,
+     * PreviewsView) has been changed.
+     */
+    void signalModeChanged();
+
+    /** Is emitted if the 'show hidden files' property has been changed. */
+    void signalShowHiddenFilesChanged();
+
+    /** Is emitted if the sorting by name, size or date has been changed. */
+    void signalSortingChanged(DolphinView::Sorting sorting);
+
+    /** Is emitted if the sort order (ascending or descending) has been changed. */
+    void signalSortOrderChanged(Qt::SortOrder order);
+
+    /**
+     * Is emitted if information of an item is requested to be shown e. g. in the sidebar.
+     * It the URL is empty, no item information request is pending.
+     */
+    void signalRequestItemInfo(const KUrl& url);
+
+    /** Is emitted if the contents has been moved to \a x, \a y. */
+    void contentsMoved(int x, int y);
+
+    /**
+     * Is emitted whenever the selection has been changed. The current selection can
+     * be retrieved by Dolphin::mainWin().activeView()->selectedItems() or by
+     * Dolphin::mainWin().activeView()->selectedURLs().
+     */
+    void signalSelectionChanged();
+
+    /**
+     * Is emitted whenever the directory view is redirected by an ioslave
+     */
+    void redirection(const KUrl& oldUrl, const KUrl& newUrl);
+
+protected:
+    /** @see QWidget::mouseReleaseEvent */
+    virtual void mouseReleaseEvent(QMouseEvent* event);
+
+private slots:
+    void slotURLChanged(const KUrl& kurl);
+    void triggerIconsViewItem(Q3IconViewItem *item);
+    void triggerDetailsViewItem(Q3ListViewItem* item,
+                                const QPoint& pos,
+                                int column);
+    void triggerDetailsViewItem(Q3ListViewItem* item);
+    void updateURL();
+
+    void slotPercent(int percent);
+    void slotClear();
+    void slotDeleteItem(KFileItem* item);
+    void slotCompleted();
+    void slotDelayedUpdate();
+    void slotInfoMessage(const QString& msg);
+    void slotErrorMessage(const QString& msg);
+    void slotRefreshItems(const KFileItemList& list);
+    void slotAddItems(const KFileItemList& list);
+
+    void slotGrabActivation();
+
+    /**
+     * Is invoked shortly before the contents of a view implementation
+     * has been moved and emits the signal contentsMoved. Note that no
+     * signal is emitted when the contents moving is only temporary by
+     * e. g. reloading a directory.
+     */
+    void slotContentsMoving(int x, int y);
+
+    /**
+     * Filters the currently shown items by \a nameFilter. All items
+     * which contain the given filter string will be shown.
+     */
+    void slotChangeNameFilter(const QString& nameFilter);
+
+private:
+    void createView();
+    KFileView* fileView() const;
+    Q3ScrollView* scrollView() const;
+    ItemEffectsManager* itemEffectsManager() const;
+    void startDirLister(const KUrl& url, bool reload = false);
+
+    /**
+     * Returns the default text of the status bar, if no item is
+     * selected.
+     */
+    QString defaultStatusBarText() const;
+
+    /**
+     * Returns the text for the status bar, if at least one item
+     * is selected.
+     */
+    QString selectionStatusBarText() const;
+
+    /**
+     * Returns the string representation for the index \a index
+     * for renaming \itemCount items.
+     */
+    QString renameIndexPresentation(int index, int itemCount) const;
+
+    bool m_refreshing;
+    bool m_showProgress;
+    Mode m_mode;
+
+    Q3VBoxLayout* m_topLayout;
+    URLNavigator* m_urlNavigator;
+
+    DolphinIconsView* m_iconsView;
+    DolphinDetailsView* m_detailsView;
+    DolphinStatusBar* m_statusBar;
+
+    int m_iconSize;
+    int m_folderCount;
+    int m_fileCount;
+
+    DolphinDirLister* m_dirLister;
+
+    FilterBar *m_filterBar;
+};
+
+#endif // _DOLPHINVIEW_H_
diff --git a/src/editbookmarkdialog.cpp b/src/editbookmarkdialog.cpp
new file mode 100644 (file)
index 0000000..d467db1
--- /dev/null
@@ -0,0 +1,122 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "editbookmarkdialog.h"
+#include <q3grid.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <klocale.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <kiconloader.h>
+#include <qpushbutton.h>
+#include <kurl.h>
+#include <kfiledialog.h>
+#include <kicondialog.h>
+#include <q3hbox.h>
+
+EditBookmarkDialog::~EditBookmarkDialog()
+{
+}
+
+KBookmark EditBookmarkDialog::getBookmark(const QString& title,
+                                          const QString& name,
+                                          const KURL& url,
+                                          const QString& icon)
+{
+    EditBookmarkDialog dialog(title, name, url, icon);
+    dialog.exec();
+    return dialog.m_bookmark;
+}
+
+void EditBookmarkDialog::slotOk()
+{
+    m_bookmark = KBookmark::standaloneBookmark(m_name->text(),
+                                               KURL(m_location->text()),
+                                               m_iconName);
+
+    KDialogBase::slotOk();
+}
+
+EditBookmarkDialog::EditBookmarkDialog(const QString& title,
+                                       const QString& name,
+                                       const KURL& url,
+                                       const QString& icon) :
+    KDialogBase(Plain, title, Ok|Cancel, Ok),
+    m_iconButton(0),
+    m_name(0),
+    m_location(0)
+{
+    Q3VBoxLayout* topLayout = new Q3VBoxLayout(plainPage(), 0, spacingHint());
+
+    Q3Grid* grid = new Q3Grid(2, Qt::Horizontal, plainPage());
+    grid->setSpacing(spacingHint());
+
+    // create icon widgets
+    new QLabel(i18n("Icon:"), grid);
+    m_iconName = icon;
+    m_iconButton = new QPushButton(SmallIcon(m_iconName), QString::null, grid);
+    m_iconButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    connect(m_iconButton, SIGNAL(clicked()),
+            this, SLOT(selectIcon()));
+
+    // create name widgets
+    new QLabel(i18n("Name:"), grid);
+    m_name = new QLineEdit(name, grid);
+    m_name->selectAll();
+    m_name->setFocus();
+
+    // create location widgets
+    new QLabel(i18n("Location:"), grid);
+
+    Q3HBox* locationBox = new Q3HBox(grid);
+    locationBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    locationBox->setSpacing(spacingHint());
+    m_location = new QLineEdit(url.prettyURL(), locationBox);
+    m_location->setMinimumWidth(320);
+
+    QPushButton* selectLocationButton = new QPushButton(SmallIcon("folder"), QString::null, locationBox);
+    selectLocationButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    connect(selectLocationButton, SIGNAL(clicked()),
+            this, SLOT(selectLocation()));
+
+    topLayout->addWidget(grid);
+}
+
+void EditBookmarkDialog::selectIcon()
+{
+    const QString iconName(KIconDialog::getIcon(KIcon::Small, KIcon::FileSystem));
+    if (!iconName.isEmpty()) {
+        m_iconName = iconName;
+        m_iconButton->setIconSet(SmallIcon(iconName));
+    }
+}
+
+void EditBookmarkDialog::selectLocation()
+{
+    const QString location(m_location->text());
+    KURL url(KFileDialog::getExistingURL(location));
+    if (!url.isEmpty()) {
+        m_location->setText(url.prettyURL());
+    }
+}
+
+#include "editbookmarkdialog.moc"
diff --git a/src/editbookmarkdialog.h b/src/editbookmarkdialog.h
new file mode 100644 (file)
index 0000000..e3578a9
--- /dev/null
@@ -0,0 +1,82 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef EDITBOOKMARKDIALOG_H
+#define EDITBOOKMARKDIALOG_H
+
+#include <kbookmark.h>
+#include <kdialogbase.h>
+
+class Bookmark;
+class QLineEdit;
+class QPushButton;
+
+/**
+ * @brief Allows to edit the icon, URL and name of a bookmark.
+ *
+ * The default usage is like this:
+ * \code
+ * KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add Bookmark"),
+ *                                                      i18n("New bookmark"),
+ *                                                      KURL(),
+ *                                                      "bookmark");
+ * if (!bookmark.isNull()) {
+ *     // ...
+ * }
+ * \endcode
+ */
+class EditBookmarkDialog : public KDialogBase
+{
+    Q_OBJECT
+
+public:
+    virtual ~EditBookmarkDialog();
+
+    /**
+     * Opens a dialog where the current icon, URL and name of
+     * an URL are editable. The title of the dialog is set to \a title.
+     * @return A valid bookmark, if the user has pressed OK. Otherwise
+     *         a null bookmark is returned (see Bookmark::isNull()).
+     */
+    static KBookmark getBookmark(const QString& title,
+                                 const QString& name,
+                                 const KURL& url,
+                                 const QString& icon);
+
+protected slots:
+    virtual void slotOk();
+
+protected:
+    EditBookmarkDialog(const QString& title,
+                       const QString& name,
+                       const KURL& url,
+                       const QString& icon);
+
+private slots:
+    void selectIcon();
+    void selectLocation();
+
+private:
+    QString m_iconName;
+    QPushButton* m_iconButton;
+    QLineEdit* m_name;
+    QLineEdit* m_location;
+    KBookmark m_bookmark;
+};
+#endif
diff --git a/src/filterbar.cpp b/src/filterbar.cpp
new file mode 100644 (file)
index 0000000..eb7be1b
--- /dev/null
@@ -0,0 +1,94 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Gregor Kališnik <gregor@podnapisi.net>          *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#include "filterbar.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <QKeyEvent>
+#include <Q3HBoxLayout>
+
+#include <kdialog.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <klineedit.h>
+#include <kiconloader.h>
+
+#include "dolphin.h"
+
+FilterBar::FilterBar(QWidget *parent, const char *name) :
+    QWidget(parent, name)
+{
+    const int gap = 3;
+
+    Q3VBoxLayout* foo = new Q3VBoxLayout(this);
+    foo->addSpacing(gap);
+
+    Q3HBoxLayout* layout = new Q3HBoxLayout(foo);
+    layout->addSpacing(gap);
+
+    m_filter = new QLabel(i18n("Filter:"), this);
+    layout->addWidget(m_filter);
+    layout->addSpacing(KDialog::spacingHint());
+
+    m_filterInput = new KLineEdit(this);
+    layout->addWidget(m_filterInput);
+
+    m_close = new KPushButton(this);
+    m_close->setIconSet(SmallIcon("fileclose"));
+    m_close->setFlat(true);
+    layout->addWidget(m_close);
+    layout->addSpacing(gap);
+
+    connect(m_filterInput, SIGNAL(textChanged(const QString&)),
+            this, SIGNAL(signalFilterChanged(const QString&)));
+    connect(m_close, SIGNAL(clicked()), this, SLOT(hide()));
+    connect(m_close, SIGNAL(clicked()),
+            &Dolphin::mainWin(), SLOT(slotShowFilterBarChanged()));
+}
+
+FilterBar::~FilterBar()
+{
+}
+
+void FilterBar::hide()
+{
+    m_filterInput->clear();
+    m_filterInput->clearFocus();
+    QWidget::hide();
+}
+
+void FilterBar::show()
+{
+    m_filterInput->setFocus();
+    QWidget::show();
+}
+
+void FilterBar::keyReleaseEvent(QKeyEvent* event)
+{
+    QWidget::keyReleaseEvent(event);
+    if ((event->key() == Qt::Key_Escape)) {
+        hide();
+        Dolphin::mainWin().slotShowFilterBarChanged();
+    }
+}
+
+#include "filterbar.moc"
diff --git a/src/filterbar.h b/src/filterbar.h
new file mode 100644 (file)
index 0000000..5f5ca9d
--- /dev/null
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Gregor Kališnik <gregor@podnapisi.net>          *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef FILTERBAR_H
+#define FILTERBAR_H
+
+#include <qwidget.h>
+//Added by qt3to4:
+#include <QKeyEvent>
+#include <QLabel>
+
+class QLabel;
+class KLineEdit;
+class KPushButton;
+
+/**
+ * @brief Provides an input field for filtering the currently shown items.
+ *
+ * @author Gregor Kališnik <gregor@podnapisi.net>
+ */
+class FilterBar : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FilterBar(QWidget *parent = 0, const char *name = 0);
+    virtual ~FilterBar();
+
+signals:
+    /**
+    * Signal that reports the name filter has been
+    * changed to \a nameFilter.
+    */
+    void signalFilterChanged(const QString& nameFilter);
+
+public slots:
+    /** @see QWidget::hide() */
+    virtual void hide();
+
+    /** @see QWidget::show() */
+    virtual void show();
+
+protected:
+    virtual void keyReleaseEvent(QKeyEvent* event);
+
+private:
+    QLabel* m_filter;
+    KLineEdit* m_filterInput;
+    KPushButton* m_close;
+};
+
+#endif
diff --git a/src/generalsettings.kcfg b/src/generalsettings.kcfg
new file mode 100644 (file)
index 0000000..5b6470d
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg> 
+    <kcfgfile name="dolphinrc"/>
+    <group name="General">
+        <entry name="DefaultViewMode" type="Int">
+            <label>Default view mode</label>
+            <default>0</default>
+        </entry>
+        <entry name="EditableURL" type="Bool">
+            <label>Should the URL be editable for the user</label>
+            <default>false</default>
+        </entry>
+        <entry name="FirstRun" type="Bool">
+            <label>Is the application started the first time</label>
+            <default>true</default>
+        </entry>
+        <entry name="HomeURL" type="String">
+            <label>Home URL</label>
+            <default>~</default>
+        </entry>
+        <entry name="SplitView" type="Bool">
+            <label>Split the view into two panes</label>
+            <default>false</default>
+        </entry>
+    </group>
+</kcfg>
\ No newline at end of file
diff --git a/src/generalsettings.kcfgc b/src/generalsettings.kcfgc
new file mode 100644 (file)
index 0000000..96d4c1f
--- /dev/null
@@ -0,0 +1,4 @@
+File=generalsettings.kcfg
+ClassName=GeneralSettings 
+Singleton=false 
+Mutators=true
\ No newline at end of file
diff --git a/src/generalsettingspage.cpp b/src/generalsettingspage.cpp
new file mode 100644 (file)
index 0000000..d1d22eb
--- /dev/null
@@ -0,0 +1,169 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at) and              *
+ *   and Patrice Tremblay                                                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "generalsettingspage.h"
+
+#include <qlayout.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <kdialog.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <q3vbox.h>
+#include <q3grid.h>
+#include <q3groupbox.h>
+#include <klocale.h>
+#include <qcheckbox.h>
+#include <q3buttongroup.h>
+#include <qpushbutton.h>
+#include <kfiledialog.h>
+#include <qradiobutton.h>
+
+#include "dolphinsettings.h"
+#include "dolphin.h"
+#include "dolphinview.h"
+#include "generalsettings.h"
+
+GeneralSettingsPage::GeneralSettingsPage(QWidget* parent) :
+    SettingsPageBase(parent),
+    m_homeURL(0),
+    m_startSplit(0),
+    m_startEditable(0)
+{
+    Q3VBoxLayout* topLayout = new Q3VBoxLayout(parent, 2, KDialog::spacingHint());
+
+    const int spacing = KDialog::spacingHint();
+    const int margin = KDialog::marginHint();
+    const QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+    GeneralSettings* settings = DolphinSettings::instance().generalSettings();
+
+    Q3VBox* vBox = new Q3VBox(parent);
+    vBox->setSizePolicy(sizePolicy);
+    vBox->setSpacing(spacing);
+    vBox->setMargin(margin);
+    vBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
+
+    // create 'Home URL' editor
+    Q3GroupBox* homeGroup = new Q3GroupBox(1, Qt::Horizontal, i18n("Home URL"), vBox);
+    homeGroup->setSizePolicy(sizePolicy);
+    homeGroup->setMargin(margin);
+
+    Q3HBox* homeURLBox = new Q3HBox(homeGroup);
+    homeURLBox->setSizePolicy(sizePolicy);
+    homeURLBox->setSpacing(spacing);
+
+    new QLabel(i18n("Location:"), homeURLBox);
+    m_homeURL = new QLineEdit(settings->homeURL(), homeURLBox);
+
+    QPushButton* selectHomeURLButton = new QPushButton(SmallIcon("folder"), QString::null, homeURLBox);
+    connect(selectHomeURLButton, SIGNAL(clicked()),
+            this, SLOT(selectHomeURL()));
+
+    Q3HBox* buttonBox = new Q3HBox(homeGroup);
+    buttonBox->setSizePolicy(sizePolicy);
+    buttonBox->setSpacing(spacing);
+    QPushButton* useCurrentButton = new QPushButton(i18n("Use current location"), buttonBox);
+    connect(useCurrentButton, SIGNAL(clicked()),
+            this, SLOT(useCurrentLocation()));
+    QPushButton* useDefaultButton = new QPushButton(i18n("Use default location"), buttonBox);
+    connect(useDefaultButton, SIGNAL(clicked()),
+            this, SLOT(useDefaulLocation()));
+
+    // create 'Default View Mode' group
+    Q3ButtonGroup* buttonGroup = new Q3ButtonGroup(3, Qt::Vertical, i18n("Default View Mode"), vBox);
+    buttonGroup->setSizePolicy(sizePolicy);
+    buttonGroup->setMargin(margin);
+
+    m_iconsView = new QRadioButton(i18n("Icons"), buttonGroup);
+    m_detailsView = new QRadioButton(i18n("Details"), buttonGroup);
+    m_previewsView = new QRadioButton(i18n("Previews"), buttonGroup);
+
+    switch (settings->defaultViewMode()) {
+        case DolphinView::IconsView:    m_iconsView->setChecked(true); break;
+        case DolphinView::DetailsView:  m_detailsView->setChecked(true); break;
+        case DolphinView::PreviewsView: m_previewsView->setChecked(true); break;
+    }
+
+    // create 'Start with split view' checkbox
+    m_startSplit = new QCheckBox(i18n("Start with split view"), vBox);
+    m_startSplit->setChecked(settings->splitView());
+
+    // create 'Start with editable navigation bar' checkbox
+    m_startEditable = new QCheckBox(i18n("Start with editable navigation bar"), vBox);
+    m_startEditable->setChecked(settings->editableURL());
+
+    // Add a dummy widget with no restriction regarding
+    // a vertical resizing. This assures that the dialog layout
+    // is not stretched vertically.
+    new QWidget(vBox);
+
+    topLayout->addWidget(vBox);
+}
+
+
+GeneralSettingsPage::~GeneralSettingsPage()
+{
+}
+
+void GeneralSettingsPage::applySettings()
+{
+    GeneralSettings* settings = DolphinSettings::instance().generalSettings();
+
+    const KURL url(m_homeURL->text());
+    KFileItem fileItem(S_IFDIR, KFileItem::Unknown, url);
+    if (url.isValid() && fileItem.isDir()) {
+        settings->setHomeURL(url.prettyURL());
+    }
+
+    DolphinView::Mode viewMode = DolphinView::IconsView;
+    if (m_detailsView->isChecked()) {
+        viewMode = DolphinView::DetailsView;
+    }
+    else if (m_previewsView->isChecked()) {
+        viewMode = DolphinView::PreviewsView;
+    }
+    settings->setDefaultViewMode(viewMode);
+
+    settings->setSplitView(m_startSplit->isChecked());
+    settings->setEditableURL(m_startEditable->isChecked());
+}
+
+void GeneralSettingsPage::selectHomeURL()
+{
+    const QString homeURL(m_homeURL->text());
+    KURL url(KFileDialog::getExistingURL(homeURL));
+    if (!url.isEmpty()) {
+        m_homeURL->setText(url.prettyURL());
+    }
+}
+
+void GeneralSettingsPage::useCurrentLocation()
+{
+    const DolphinView* view = Dolphin::mainWin().activeView();
+    m_homeURL->setText(view->url().prettyURL());
+}
+
+void GeneralSettingsPage::useDefaulLocation()
+{
+    m_homeURL->setText("file://" + QDir::homeDirPath());
+}
+
+#include "generalsettingspage.moc"
diff --git a/src/generalsettingspage.h b/src/generalsettingspage.h
new file mode 100644 (file)
index 0000000..eb889a8
--- /dev/null
@@ -0,0 +1,62 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef GENERALSETTINGSPAGE_H
+#define GENERALSETTINGSPAGE_H
+
+#include <settingspagebase.h>
+class QLineEdit;
+class QRadioButton;
+class QCheckBox;
+
+/**
+ * @brief Page for the 'General' settings of the Dolphin settings dialog.
+ *
+ * The general settings allow to set the home URL, the default view mode
+ * and the split view mode.
+ *
+ *     @author Peter Penz <peter.penz@gmx.at>
+ */
+class GeneralSettingsPage : public SettingsPageBase
+{
+    Q_OBJECT
+
+public:
+    GeneralSettingsPage(QWidget* parent);
+
+    virtual ~GeneralSettingsPage();
+
+    /** @see SettingsPageBase::applySettings */
+    virtual void applySettings();
+
+private slots:
+    void selectHomeURL();
+    void useCurrentLocation();
+    void useDefaulLocation();
+
+private:
+    QLineEdit* m_homeURL;
+    QRadioButton* m_iconsView;
+    QRadioButton* m_detailsView;
+    QRadioButton* m_previewsView;
+    QCheckBox* m_startSplit;
+    QCheckBox* m_startEditable;
+};
+
+#endif
diff --git a/src/hi128-app-dolphin.png b/src/hi128-app-dolphin.png
new file mode 100644 (file)
index 0000000..e01c24b
Binary files /dev/null and b/src/hi128-app-dolphin.png differ
diff --git a/src/hi16-app-dolphin.png b/src/hi16-app-dolphin.png
new file mode 100644 (file)
index 0000000..d3d48de
Binary files /dev/null and b/src/hi16-app-dolphin.png differ
diff --git a/src/hi22-app-dolphin.png b/src/hi22-app-dolphin.png
new file mode 100644 (file)
index 0000000..8e4b0d3
Binary files /dev/null and b/src/hi22-app-dolphin.png differ
diff --git a/src/hi32-app-dolphin.png b/src/hi32-app-dolphin.png
new file mode 100644 (file)
index 0000000..6747c6b
Binary files /dev/null and b/src/hi32-app-dolphin.png differ
diff --git a/src/hi48-app-dolphin.png b/src/hi48-app-dolphin.png
new file mode 100644 (file)
index 0000000..ab9c665
Binary files /dev/null and b/src/hi48-app-dolphin.png differ
diff --git a/src/hi64-app-dolphin.png b/src/hi64-app-dolphin.png
new file mode 100644 (file)
index 0000000..b25e754
Binary files /dev/null and b/src/hi64-app-dolphin.png differ
diff --git a/src/iconsmodesettings.kcfg b/src/iconsmodesettings.kcfg
new file mode 100644 (file)
index 0000000..1862523
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg> 
+    <kcfgfile name="dolphinrc"/>
+    <include>kiconloader.h</include>
+    <group name="IconsMode">
+        <entry name="Arrangement" type="String">
+            <label>Arrangement</label>
+            <default>LeftToRight</default>
+        </entry>
+        <entry name="FontFamily" type="String">
+            <label>Font family</label>
+            <default code="true">KGlobalSettings::generalFont().family()</default>
+        </entry>
+        <entry name="FontSize" type="Int">
+            <label>Font size</label>
+            <default code="true">KGlobalSettings::generalFont().pointSize()</default>
+        </entry>
+        <entry name="GridHeight" type="Int">
+            <label>Grid height</label>
+            <default code="true">KIcon::SizeMedium</default>
+        </entry>
+        <entry name="GridWidth" type="Int">
+            <label>Grid width</label>
+            <default>0</default>
+        </entry>
+        <entry name="GridSpacing" type="Int">
+            <label>Grid spacing</label>
+        </entry>
+        <entry name="IconSize" type="Int">
+            <label>Icon size</label>
+            <default code="true">KIcon::SizeMedium</default>
+        </entry>
+        <entry name="NumberOfTexlines" type="Int">
+            <label>Number of textlines</label>
+            <default>2</default>
+        </entry>
+        <entry name="PreviewSize" type="Int">
+            <label>Preview size</label>
+            <default code="true">KIcon::SizeMedium</default>
+        </entry>
+    </group>
+</kcfg>
\ No newline at end of file
diff --git a/src/iconsmodesettings.kcfgc b/src/iconsmodesettings.kcfgc
new file mode 100644 (file)
index 0000000..31f564a
--- /dev/null
@@ -0,0 +1,4 @@
+File=iconsmodesettings.kcfg
+ClassName=IconsModeSettings
+Singleton=false 
+Mutators=true
\ No newline at end of file
diff --git a/src/iconsviewsettingspage.cpp b/src/iconsviewsettingspage.cpp
new file mode 100644 (file)
index 0000000..ad95155
--- /dev/null
@@ -0,0 +1,262 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "iconsviewsettingspage.h"
+
+#include <qlabel.h>
+#include <qslider.h>
+#include <q3buttongroup.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <kiconloader.h>
+#include <kfontcombo.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <assert.h>
+
+#include "iconsmodesettings.h"
+#include "dolphinsettings.h"
+#include "pixmapviewer.h"
+
+#define GRID_SPACING_BASE 8
+#define GRID_SPACING_INC 12
+
+IconsViewSettingsPage::IconsViewSettingsPage(DolphinIconsView::LayoutMode mode,
+                                             QWidget* parent) :
+    Q3VBox(parent),
+    m_mode(mode),
+    m_iconSizeSlider(0),
+    m_previewSizeSlider(0),
+    m_textWidthBox(0),
+    m_gridSpacingBox(0),
+    m_fontFamilyBox(0),
+    m_fontSizeBox(0),
+    m_textlinesCountBox(0),
+    m_arrangementBox(0)
+{
+    const int spacing = KDialog::spacingHint();
+    const int margin = KDialog::marginHint();
+    const QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+    setSpacing(spacing);
+    setMargin(margin);
+
+    IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    assert(settings != 0);
+
+    Q3HBox* sizesLayout = new Q3HBox(this);
+    sizesLayout->setSpacing(spacing);
+    sizesLayout->setSizePolicy(sizePolicy);
+
+    // create 'Icon Size' group including slider and preview
+    Q3GroupBox* iconSizeGroup = new Q3GroupBox(2, Qt::Vertical, i18n("Icon Size"), sizesLayout);
+    iconSizeGroup->setSizePolicy(sizePolicy);
+    iconSizeGroup->setMargin(margin);
+
+    const QColor iconBackgroundColor(KGlobalSettings::baseColor());
+
+    Q3HBox* iconSizeVBox = new Q3HBox(iconSizeGroup);
+    iconSizeVBox->setSpacing(spacing);
+    new QLabel(i18n("Small"), iconSizeVBox);
+    m_iconSizeSlider = new QSlider(0, 5, 1, 0,  Qt::Horizontal, iconSizeVBox);
+    m_iconSizeSlider->setValue(sliderValue(settings->iconSize()));
+    m_iconSizeSlider->setTickmarks(QSlider::Below);
+    connect(m_iconSizeSlider, SIGNAL(valueChanged(int)),
+            this, SLOT(slotIconSizeChanged(int)));
+    new QLabel(i18n("Large"), iconSizeVBox);
+
+    m_iconSizeViewer = new PixmapViewer(iconSizeGroup);
+    m_iconSizeViewer->setMinimumWidth(KIcon::SizeEnormous);
+    m_iconSizeViewer->setFixedHeight(KIcon::SizeEnormous);
+    m_iconSizeViewer->setEraseColor(iconBackgroundColor);
+    slotIconSizeChanged(m_iconSizeSlider->value());
+
+    if (m_mode == DolphinIconsView::Previews) {
+        // create 'Preview Size' group including slider and preview
+        Q3GroupBox* previewSizeGroup = new Q3GroupBox(2, Qt::Vertical, i18n("Preview Size"), sizesLayout);
+        previewSizeGroup->setSizePolicy(sizePolicy);
+        previewSizeGroup->setMargin(margin);
+
+        Q3HBox* previewSizeVBox = new Q3HBox(previewSizeGroup);
+        previewSizeVBox->setSpacing(spacing);
+        new QLabel(i18n("Small"), previewSizeVBox);
+        m_previewSizeSlider = new QSlider(0, 5, 1, 0,  Qt::Horizontal, previewSizeVBox);
+        m_previewSizeSlider->setValue(sliderValue(settings->previewSize()));
+        m_previewSizeSlider->setTickmarks(QSlider::Below);
+        connect(m_previewSizeSlider, SIGNAL(valueChanged(int)),
+                this, SLOT(slotPreviewSizeChanged(int)));
+        new QLabel(i18n("Large"), previewSizeVBox);
+
+        m_previewSizeViewer = new PixmapViewer(previewSizeGroup);
+        m_previewSizeViewer->setMinimumWidth(KIcon::SizeEnormous);
+        m_previewSizeViewer->setFixedHeight(KIcon::SizeEnormous);
+        m_previewSizeViewer->setEraseColor(iconBackgroundColor);
+
+        slotPreviewSizeChanged(m_previewSizeSlider->value());
+    }
+
+    Q3GroupBox* textGroup = new Q3GroupBox(2, Qt::Horizontal, i18n("Text"), this);
+    textGroup->setSizePolicy(sizePolicy);
+    textGroup->setMargin(margin);
+
+    new QLabel(i18n("Font family:"), textGroup);
+    m_fontFamilyBox = new KFontCombo(textGroup);
+    m_fontFamilyBox->setCurrentFont(settings->fontFamily());
+
+    new QLabel(i18n("Font size:"), textGroup);
+    m_fontSizeBox = new QSpinBox(6, 99, 1, textGroup);
+    m_fontSizeBox->setValue(settings->fontSize());
+
+    new QLabel(i18n("Number of lines:"), textGroup);
+    m_textlinesCountBox = new QSpinBox(1, 5, 1, textGroup);
+    m_textlinesCountBox->setValue(settings->numberOfTexlines());
+
+    new QLabel(i18n("Text width:"), textGroup);
+    m_textWidthBox = new QComboBox(textGroup);
+    m_textWidthBox->insertItem(i18n("Small"));
+    m_textWidthBox->insertItem(i18n("Medium"));
+    m_textWidthBox->insertItem(i18n("Large"));
+
+    Q3GroupBox* gridGroup = new Q3GroupBox(2, Qt::Horizontal, i18n("Grid"), this);
+    gridGroup->setSizePolicy(sizePolicy);
+    gridGroup->setMargin(margin);
+
+    const bool leftToRightArrangement = (settings->arrangement() == Q3IconView::LeftToRight);
+    new QLabel(i18n("Arrangement:"), gridGroup);
+    m_arrangementBox = new QComboBox(gridGroup);
+    m_arrangementBox->insertItem(i18n("Left to right"));
+    m_arrangementBox->insertItem(i18n("Top to bottom"));
+    m_arrangementBox->setCurrentItem(leftToRightArrangement ? 0 : 1);
+
+    new QLabel(i18n("Grid spacing:"), gridGroup);
+    m_gridSpacingBox = new QComboBox(gridGroup);
+    m_gridSpacingBox->insertItem(i18n("Small"));
+    m_gridSpacingBox->insertItem(i18n("Medium"));
+    m_gridSpacingBox->insertItem(i18n("Large"));
+    m_gridSpacingBox->setCurrentItem((settings->gridSpacing() - GRID_SPACING_BASE) / GRID_SPACING_INC);
+
+    // Add a dummy widget with no restriction regarding
+    // a vertical resizing. This assures that the dialog layout
+    // is not stretched vertically.
+    new QWidget(this);
+
+    adjustTextWidthSelection();
+}
+
+IconsViewSettingsPage::~IconsViewSettingsPage()
+{
+}
+
+void IconsViewSettingsPage::applySettings()
+{
+    IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    assert(settings != 0);
+
+    const int defaultSize = iconSize(m_iconSizeSlider->value());
+    settings->setIconSize(defaultSize);
+
+    int previewSize = (m_mode == DolphinIconsView::Previews) ?
+                      iconSize(m_previewSizeSlider->value()) :
+                      defaultSize;
+    if (previewSize < defaultSize) {
+        // assure that the preview size is never smaller than the icon size
+        previewSize = defaultSize;
+    }
+    settings->setPreviewSize(previewSize);
+
+    const int fontSize = m_fontSizeBox->value();
+
+    QString arrangement = (m_arrangementBox->currentItem() == 0) ?
+                          "LeftToRight" :
+                          "TopToBottom";
+    settings->setArrangement(arrangement);
+    DolphinSettings::instance().calculateGridSize(m_textWidthBox->currentItem());
+
+    settings->setFontFamily(m_fontFamilyBox->currentFont());
+    settings->setFontSize(fontSize);
+    settings->setNumberOfTexlines(m_textlinesCountBox->value());
+
+    settings->setGridSpacing(GRID_SPACING_BASE +
+                             m_gridSpacingBox->currentItem() * GRID_SPACING_INC);
+}
+
+void IconsViewSettingsPage::slotIconSizeChanged(int value)
+{
+    KIconLoader iconLoader;
+    m_iconSizeViewer->setPixmap(iconLoader.loadIcon("folder", KIcon::Desktop, iconSize(value)));
+
+    if (m_previewSizeSlider != 0) {
+        int previewSizeValue = m_previewSizeSlider->value();
+        if (previewSizeValue < value) {
+            // assure that the preview size is never smaller than the icon size
+            previewSizeValue = value;
+        }
+        slotPreviewSizeChanged(previewSizeValue);
+    }
+}
+
+void IconsViewSettingsPage::slotPreviewSizeChanged(int value)
+{
+    KIconLoader iconLoader;
+    const int iconSizeValue = m_iconSizeSlider->value();
+    if (value < iconSizeValue) {
+        // assure that the preview size is never smaller than the icon size
+        value = iconSizeValue;
+    }
+    m_previewSizeViewer->setPixmap(iconLoader.loadIcon("preview", KIcon::Desktop, iconSize(value)));
+}
+
+int IconsViewSettingsPage::iconSize(int sliderValue) const
+{
+    int size = KIcon::SizeMedium;
+    switch (sliderValue) {
+        case 0: size = KIcon::SizeSmall; break;
+        case 1: size = KIcon::SizeSmallMedium; break;
+        case 2: size = KIcon::SizeMedium; break;
+        case 3: size = KIcon::SizeLarge; break;
+        case 4: size = KIcon::SizeHuge; break;
+        case 5: size = KIcon::SizeEnormous; break;
+    }
+    return size;
+}
+
+int IconsViewSettingsPage::sliderValue(int iconSize) const
+{
+    int value = 0;
+    switch (iconSize) {
+        case KIcon::SizeSmall: value = 0; break;
+        case KIcon::SizeSmallMedium: value = 1; break;
+        case KIcon::SizeMedium: value = 2; break;
+        case KIcon::SizeLarge: value = 3; break;
+        case KIcon::SizeHuge: value = 4; break;
+        case KIcon::SizeEnormous: value = 5; break;
+        default: break;
+    }
+    return value;
+}
+
+void IconsViewSettingsPage::adjustTextWidthSelection()
+{
+    IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    assert(settings != 0);
+    m_textWidthBox->setCurrentItem(DolphinSettings::instance().textWidthHint());
+}
+
+#include "iconsviewsettingspage.moc"
diff --git a/src/iconsviewsettingspage.h b/src/iconsviewsettingspage.h
new file mode 100644 (file)
index 0000000..ed6637e
--- /dev/null
@@ -0,0 +1,99 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef ICONSVIEWSETTINGSPAGE_H
+#define ICONSVIEWSETTINGSPAGE_H
+
+#include <q3vbox.h>
+#include <dolphiniconsview.h>
+
+class QSlider;
+class QComboBox;
+class QCheckBox;
+class QPushButton;
+class QSpinBox;
+class KFontCombo;
+class PixmapViewer;
+
+/**
+ * @brief Tab page for the 'Icons Mode' and 'Previews Mode' settings
+ * of the Dolphin settings dialog.
+ *
+ * Allows to set:
+ * - icon size
+ * - preview size
+ * - text width
+ * - grid spacing
+ * - font family
+ * - font size
+ * - number of text lines
+ * - arrangement
+ *
+ * @see DolphinIconsViewSettings
+ *  @author Peter Penz <peter.penz@gmx.at>
+ */
+class IconsViewSettingsPage : public Q3VBox
+{
+    Q_OBJECT
+
+public:
+    IconsViewSettingsPage(DolphinIconsView::LayoutMode mode,
+                          QWidget* parent);
+    virtual ~IconsViewSettingsPage();
+
+    /**
+     * Applies the settings for the icons view.
+     * The settings are persisted automatically when
+     * closing Dolphin.
+     */
+    void applySettings();
+
+private slots:
+    void slotIconSizeChanged(int value);
+    void slotPreviewSizeChanged(int value);
+
+private:
+    DolphinIconsView::LayoutMode m_mode;
+
+    QSlider* m_iconSizeSlider;
+    PixmapViewer* m_iconSizeViewer;
+    QSlider* m_previewSizeSlider;
+    PixmapViewer* m_previewSizeViewer;
+    QComboBox* m_textWidthBox;
+    QComboBox* m_gridSpacingBox;
+    KFontCombo* m_fontFamilyBox;
+    QSpinBox* m_fontSizeBox;
+    QSpinBox* m_textlinesCountBox;
+    QComboBox* m_arrangementBox;
+
+    /** Returns the icon size for the given slider value. */
+    int iconSize(int sliderValue) const;
+
+    /** Returns the slider value for the given icon size. */
+    int sliderValue(int iconSize) const;
+
+    /**
+     * Adjusts the selection of the text width combo box dependant
+     * from the grid width and grid height settings.
+     */
+    void adjustTextWidthSelection();
+};
+
+#endif
diff --git a/src/infosidebarpage.cpp b/src/infosidebarpage.cpp
new file mode 100644 (file)
index 0000000..4419817
--- /dev/null
@@ -0,0 +1,634 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "infosidebarpage.h"
+#include <assert.h>
+
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qpushbutton.h>
+#include <q3vbox.h>
+#include <q3vgroupbox.h>
+#include <q3popupmenu.h>
+#include <qpainter.h>
+#include <qfontmetrics.h>
+#include <q3grid.h>
+#include <q3hgroupbox.h>
+//Added by qt3to4:
+#include <Q3ValueList>
+#include <QEvent>
+#include <Q3VBoxLayout>
+
+#include <kbookmarkmanager.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kio/previewjob.h>
+#include <kfileitem.h>
+#include <kdialog.h>
+#include <kglobalsettings.h>
+#include <kfilemetainfo.h>
+
+#include "dolphin.h"
+#include "pixmapviewer.h"
+#include "dolphinsettings.h"
+
+InfoSidebarPage::InfoSidebarPage(QWidget* parent) :
+    SidebarPage(parent),
+    m_multipleSelection(false),
+    m_pendingPreview(false),
+    m_timer(0),
+    m_preview(0),
+    m_name(0),
+    m_currInfoLineIdx(0),
+    m_infoGrid(0),
+    m_actionBox(0)
+{
+    const int spacing = KDialog::spacingHint();
+
+    m_timer = new QTimer(this);
+    connect(m_timer, SIGNAL(timeout()),
+            this, SLOT(slotTimeout()));
+
+    Q3VBoxLayout* layout = new Q3VBoxLayout(this);
+    layout->setSpacing(spacing);
+
+    // preview
+    m_preview = new PixmapViewer(this);
+    m_preview->setMinimumWidth(KIcon::SizeEnormous);
+    m_preview->setFixedHeight(KIcon::SizeEnormous);
+
+    // name
+    m_name = new QLabel(this);
+    m_name->setTextFormat(Qt::RichText);
+    m_name->setAlignment(m_name->alignment() | Qt::AlignHCenter);
+    QFontMetrics fontMetrics(m_name->font());
+    m_name->setMinimumHeight(fontMetrics.height() * 3);
+    m_name->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
+
+    QWidget* sep1 = new Q3HGroupBox(this);  // TODO: check whether default widget exist for this?
+    sep1->setFixedHeight(1);
+
+    // general information
+    m_infoGrid = new Q3Grid(2, this);
+    m_infoGrid->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+    QWidget* sep2 = new Q3HGroupBox(this);  // TODO: check whether default widget exist for this?
+    sep2->setFixedHeight(1);
+
+    // actions
+    m_actionBox = new Q3VBox(this);
+    m_actionBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+    // Add a dummy widget with no restriction regarding a vertical resizing.
+    // This assures that information is always top aligned.
+    QWidget* dummy = new QWidget(this);
+
+    layout->addItem(new QSpacerItem(spacing, spacing, QSizePolicy::Preferred, QSizePolicy::Fixed));
+    layout->addWidget(m_preview);
+    layout->addWidget(m_name);
+    layout->addWidget(sep1);
+    layout->addWidget(m_infoGrid);
+    layout->addWidget(sep2);
+    layout->addWidget(m_actionBox);
+    layout->addWidget(dummy);
+
+    connect(&Dolphin::mainWin(), SIGNAL(selectionChanged()),
+            this, SLOT(showItemInfo()));
+
+    connectToActiveView();
+}
+
+InfoSidebarPage::~InfoSidebarPage()
+{
+}
+
+void InfoSidebarPage::activeViewChanged()
+{
+    connectToActiveView();
+}
+
+void InfoSidebarPage::requestDelayedItemInfo(const KURL& url)
+{
+    cancelRequest();
+
+    if (!url.isEmpty() && !m_multipleSelection) {
+        m_urlCandidate = url;
+        m_timer->start(300, true);
+    }
+}
+
+void InfoSidebarPage::requestItemInfo(const KURL& url)
+{
+    cancelRequest();
+
+    if (!url.isEmpty() && !m_multipleSelection) {
+        m_shownURL = url;
+        showItemInfo();
+    }
+}
+
+void InfoSidebarPage::showItemInfo()
+{
+    cancelRequest();
+
+    m_multipleSelection = false;
+
+    // show the preview...
+    DolphinView* view = Dolphin::mainWin().activeView();
+    const KFileItemList* selectedItems = view->selectedItems();
+    if ((selectedItems != 0) && selectedItems->count() > 1) {
+        m_multipleSelection = true;
+    }
+
+    if (m_multipleSelection) {
+        KIconLoader iconLoader;
+        QPixmap icon = iconLoader.loadIcon("exec",
+                                           KIcon::NoGroup,
+                                           KIcon::SizeEnormous);
+        m_preview->setPixmap(icon);
+        m_name->setText(i18n("%1 items selected").arg(selectedItems->count()));
+    }
+    else if (!applyBookmark()) {
+        // try to get a preview pixmap from the item...
+        KURL::List list;
+        list.append(m_shownURL);
+
+        m_pendingPreview = true;
+        m_preview->setPixmap(QPixmap());
+
+        KIO::PreviewJob* job = KIO::filePreview(list,
+                                                m_preview->width(),
+                                                KIcon::SizeEnormous);
+        connect(job, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
+                this, SLOT(gotPreview(const KFileItem*, const QPixmap&)));
+        connect(job, SIGNAL(failed(const KFileItem*)),
+                this, SLOT(slotPreviewFailed(const KFileItem*)));
+
+        QString text("<b>");
+        text.append(m_shownURL.fileName());
+        text.append("</b>");
+        m_name->setText(text);
+    }
+
+    createMetaInfo();
+    insertActions();
+}
+
+void InfoSidebarPage::slotTimeout()
+{
+    m_shownURL = m_urlCandidate;
+    showItemInfo();
+}
+
+void InfoSidebarPage::slotPreviewFailed(const KFileItem* item)
+{
+    m_pendingPreview = false;
+    if (!applyBookmark()) {
+        m_preview->setPixmap(item->pixmap(KIcon::SizeEnormous));
+    }
+}
+
+void InfoSidebarPage::gotPreview(const KFileItem* /* item */,
+                                 const QPixmap& pixmap)
+{
+    if (m_pendingPreview) {
+        m_preview->setPixmap(pixmap);
+        m_pendingPreview = false;
+    }
+}
+
+void InfoSidebarPage::startService(int index)
+{
+    DolphinView* view = Dolphin::mainWin().activeView();
+    if (view->hasSelection()) {
+        KURL::List selectedURLs = view->selectedURLs();
+        KDEDesktopMimeType::executeService(selectedURLs, m_actionsVector[index]);
+    }
+    else {
+        KDEDesktopMimeType::executeService(m_shownURL, m_actionsVector[index]);
+    }
+}
+
+void InfoSidebarPage::connectToActiveView()
+{
+    cancelRequest();
+
+    DolphinView* view = Dolphin::mainWin().activeView();
+    connect(view, SIGNAL(signalRequestItemInfo(const KURL&)),
+            this, SLOT(requestDelayedItemInfo(const KURL&)));
+    connect(view, SIGNAL(signalURLChanged(const KURL&)),
+            this, SLOT(requestItemInfo(const KURL&)));
+
+    m_shownURL = view->url();
+    showItemInfo();
+}
+
+bool InfoSidebarPage::applyBookmark()
+{
+    KBookmarkGroup root = DolphinSettings::instance().bookmarkManager()->root();
+    KBookmark bookmark = root.first();
+    while (!bookmark.isNull()) {
+        if (m_shownURL.equals(bookmark.url(), true)) {
+            QString text("<b>");
+            text.append(bookmark.text());
+            text.append("</b>");
+            m_name->setText(text);
+
+            KIconLoader iconLoader;
+            QPixmap icon = iconLoader.loadIcon(bookmark.icon(),
+                                               KIcon::NoGroup,
+                                               KIcon::SizeEnormous);
+            m_preview->setPixmap(icon);
+            return true;
+        }
+        bookmark = root.next(bookmark);
+    }
+
+    return false;
+}
+
+void InfoSidebarPage::cancelRequest()
+{
+    m_timer->stop();
+    m_pendingPreview = false;
+}
+
+void InfoSidebarPage::createMetaInfo()
+{
+    // To prevent a flickering it's important to reuse available
+    // labels instead of deleting them and recreate them afterwards.
+    // The methods beginInfoLines(), addInfoLine() and endInfoLines()
+    // take care of this.
+    beginInfoLines();
+    DolphinView* view = Dolphin::mainWin().activeView();
+    if (!view->hasSelection()) {
+        KFileItem fileItem(S_IFDIR, KFileItem::Unknown, m_shownURL);
+        fileItem.refresh();
+
+        if (fileItem.isDir()) {
+            addInfoLine(i18n("Type:"), i18n("Directory"));
+        }
+        else {
+            addInfoLine(i18n("Type:"), fileItem.mimeComment());
+
+            QString sizeText(KIO::convertSize(fileItem.size()));
+            addInfoLine(i18n("Size:"), sizeText);
+            addInfoLine(i18n("Modified:"), fileItem.timeString());
+
+            const KFileMetaInfo& metaInfo = fileItem.metaInfo();
+            if (metaInfo.isValid()) {
+                QStringList keys = metaInfo.supportedKeys();
+                for (QStringList::Iterator it = keys.begin(); it != keys.end(); ++it) {
+                    if (showMetaInfo(*it)) {
+                        KFileMetaInfoItem metaInfoItem = metaInfo.item(*it);
+                        addInfoLine(*it, metaInfoItem.string());
+                    }
+                }
+            }
+        }
+    }
+    endInfoLines();
+}
+
+void InfoSidebarPage::beginInfoLines()
+{
+    m_currInfoLineIdx = 0;
+}
+
+void InfoSidebarPage::endInfoLines()
+{
+    if (m_currInfoLineIdx <= 0) {
+        return;
+    }
+
+    // remove labels which have not been used
+    if (m_currInfoLineIdx < static_cast<int>(m_infoWidgets.count())) {
+        Q3PtrListIterator<QLabel> deleteIter(m_infoWidgets);
+        deleteIter += m_currInfoLineIdx;
+
+        QWidget* widget = 0;
+        int removeCount = 0;
+        while ((widget = deleteIter.current()) != 0) {
+            widget->close();
+            widget->deleteLater();
+            ++deleteIter;
+            ++removeCount;
+        }
+        for (int i = 0; i < removeCount; ++i) {
+            m_infoWidgets.removeLast();
+        }
+    }
+}
+
+bool InfoSidebarPage::showMetaInfo(const QString& key) const
+{
+    // sorted list of keys, where it's data should be shown
+    static const char* keys[] = {
+        "Album",
+        "Artist",
+        "Author",
+        "Bitrate",
+        "Date",
+        "Dimensions",
+        "Genre",
+        "Length",
+        "Lines",
+        "Pages",
+        "Title",
+        "Words"
+    };
+
+    // do a binary search for the key...
+    int top = 0;
+    int bottom = sizeof(keys) / sizeof(char*) - 1;
+    while (top < bottom) {
+        const int middle = (top + bottom) / 2;
+        const int result = key.compare(keys[middle]);
+        if (result < 0) {
+            bottom = middle - 1;
+        }
+        else if (result > 0) {
+            top = middle + 1;
+        }
+        else {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+void InfoSidebarPage::addInfoLine(const QString& labelText, const QString& infoText)
+{
+    QString labelStr("<b>");
+    labelStr.append(labelText);
+    labelStr.append("</b>&nbsp;");
+
+    const int count = m_infoWidgets.count();
+    if (m_currInfoLineIdx < count - 1) {
+        // reuse available labels
+        m_infoWidgets.at(m_currInfoLineIdx++)->setText(labelStr);
+        m_infoWidgets.at(m_currInfoLineIdx++)->setText(infoText);
+    }
+    else {
+        // no labels are available anymore, hence create 2 new ones
+        QLabel* label = new QLabel(labelStr, m_infoGrid);
+        label->setTextFormat(Qt::RichText);
+        label->setAlignment(Qt::AlignRight |
+                            Qt::AlignTop);
+        label->show();
+        m_infoWidgets.append(label);
+
+        QLabel* info = new QLabel(infoText, m_infoGrid);
+        info->setTextFormat(Qt::RichText);
+        info->setAlignment(Qt::AlignTop | Qt::WordBreak);
+        info->show();
+        m_infoWidgets.append(info);
+
+        m_currInfoLineIdx += 2;
+    }
+}
+
+void InfoSidebarPage::insertActions()
+{
+    // delete all existing action widgets
+    // TODO: just use children() from QObject...
+    Q3PtrListIterator<QWidget> deleteIter(m_actionWidgets);
+    QWidget* widget = 0;
+    while ((widget = deleteIter.current()) != 0) {
+        widget->close();
+        widget->deleteLater();
+        ++deleteIter;
+    }
+
+    m_actionWidgets.clear();
+    m_actionsVector.clear();
+
+    int actionsIndex = 0;
+
+    // The algorithm for searching the available actions works on a list
+    // of KFileItems. If no selection is given, a temporary KFileItem
+    // by the given URL 'url' is created and added to the list.
+    KFileItem fileItem(S_IFDIR, KFileItem::Unknown, m_shownURL);
+    KFileItemList localList;
+    const KFileItemList* itemList = Dolphin::mainWin().activeView()->selectedItems();
+    if ((itemList == 0) || itemList->isEmpty()) {
+        fileItem.refresh();
+        localList.append(&fileItem);
+        itemList = &localList;
+    }
+
+    // 'itemList' contains now all KFileItems, where an item information should be shown.
+    // TODO: the following algorithm is quite equal to DolphinContextMenu::insertActionItems().
+    // It's open yet whether they should be merged or whether they have to work slightly different.
+    QStringList dirs = KGlobal::dirs()->findDirs("data", "dolphin/servicemenus/");
+    for (QStringList::ConstIterator dirIt = dirs.begin(); dirIt != dirs.end(); ++dirIt) {
+        QDir dir(*dirIt);
+        QStringList entries = dir.entryList("*.desktop", QDir::Files);
+
+        for (QStringList::ConstIterator entryIt = entries.begin(); entryIt != entries.end(); ++entryIt) {
+            KSimpleConfig cfg(*dirIt + *entryIt, true);
+            cfg.setDesktopGroup();
+            if ((cfg.hasKey("Actions") || cfg.hasKey("X-KDE-GetActionMenu")) && cfg.hasKey("ServiceTypes")) {
+                const QStringList types = cfg.readListEntry("ServiceTypes");
+                for (QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) {
+                    // check whether the mime type is equal or whether the
+                    // mimegroup (e. g. image/*) is supported
+
+                    bool insert = false;
+                    if ((*it) == "all/allfiles") {
+                        // The service type is valid for all files, but not for directories.
+                        // Check whether the selected items only consist of files...
+                        KFileItemListIterator mimeIt(*itemList);
+                        KFileItem* item = 0;
+                        insert = true;
+                        while (insert && ((item = mimeIt.current()) != 0)) {
+                            insert = !item->isDir();
+                            ++mimeIt;
+                        }
+                    }
+
+                    if (!insert) {
+                        // Check whether the MIME types of all selected files match
+                        // to the mimetype of the service action. As soon as one MIME
+                        // type does not match, no service menu is shown at all.
+                        KFileItemListIterator mimeIt(*itemList);
+                        KFileItem* item = 0;
+                        insert = true;
+                        while (insert && ((item = mimeIt.current()) != 0)) {
+                            const QString mimeType((*mimeIt)->mimetype());
+                            const QString mimeGroup(mimeType.left(mimeType.find('/')));
+
+                            insert  = (*it == mimeType) ||
+                                      ((*it).right(1) == "*") &&
+                                      ((*it).left((*it).find('/')) == mimeGroup);
+                            ++mimeIt;
+                        }
+                    }
+
+                    if (insert) {
+                        const QString submenuName = cfg.readEntry( "X-KDE-Submenu" );
+                        Q3PopupMenu* popup = 0;
+                        if (!submenuName.isEmpty()) {
+                            // create a sub menu containing all actions
+                            popup = new Q3PopupMenu();
+                            connect(popup, SIGNAL(activated(int)),
+                                    this, SLOT(startService(int)));
+
+                            QPushButton* button = new QPushButton(submenuName, m_actionBox);
+                            button->setFlat(true);
+                            button->setPopup(popup);
+                            button->show();
+                            m_actionWidgets.append(button);
+                        }
+
+                        Q3ValueList<KDEDesktopMimeType::Service> userServices =
+                            KDEDesktopMimeType::userDefinedServices(*dirIt + *entryIt, true);
+
+                        // iterate through all actions and add them to a widget
+                        Q3ValueList<KDEDesktopMimeType::Service>::Iterator serviceIt;
+                        for (serviceIt = userServices.begin(); serviceIt != userServices.end(); ++serviceIt) {
+                            KDEDesktopMimeType::Service service = (*serviceIt);
+                            if (popup == 0) {
+                                ServiceButton* button = new ServiceButton(SmallIcon(service.m_strIcon),
+                                                                          service.m_strName,
+                                                                          m_actionBox,
+                                                                          actionsIndex);
+                                connect(button, SIGNAL(requestServiceStart(int)),
+                                        this, SLOT(startService(int)));
+                                m_actionWidgets.append(button);
+                                button->show();
+                            }
+                            else {
+                                popup->insertItem(SmallIcon(service.m_strIcon), service.m_strName, actionsIndex);
+                            }
+
+                            m_actionsVector.append(service);
+                            ++actionsIndex;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+ServiceButton::ServiceButton(const QIcon& icon,
+                             const QString& text,
+                             QWidget* parent,
+                             int index) :
+    QPushButton(icon, text, parent),
+    m_hover(false),
+    m_index(index)
+{
+    setEraseColor(colorGroup().background());
+    setFocusPolicy(Qt::NoFocus);
+    connect(this, SIGNAL(released()),
+            this, SLOT(slotReleased()));
+}
+
+ServiceButton::~ServiceButton()
+{
+}
+
+void ServiceButton::drawButton(QPainter* painter)
+{
+    const int buttonWidth  = width();
+    const int buttonHeight = height();
+
+    QColor backgroundColor;
+    QColor foregroundColor;
+    if (m_hover) {
+        backgroundColor = KGlobalSettings::highlightColor();
+        foregroundColor = KGlobalSettings::highlightedTextColor();
+    }
+    else {
+        backgroundColor = colorGroup().background();
+        foregroundColor = KGlobalSettings::buttonTextColor();
+    }
+
+    // draw button background
+    painter->setPen(NoPen);
+    painter->setBrush(backgroundColor);
+    painter->drawRect(0, 0, buttonWidth, buttonHeight);
+
+    const int spacing = KDialog::spacingHint();
+
+    // draw icon
+    int x = spacing;
+    const int y = (buttonHeight - KIcon::SizeSmall) / 2;
+    const QIcon* set = iconSet();
+    if (set != 0) {
+        painter->drawPixmap(x, y, set->pixmap(QIcon::Small, QIcon::Normal));
+    }
+    x += KIcon::SizeSmall + spacing;
+
+    // draw text
+    painter->setPen(foregroundColor);
+
+    const int textWidth = buttonWidth - x;
+    QFontMetrics fontMetrics(font());
+    const bool clipped = fontMetrics.width(text()) >= textWidth;
+    //const int align = clipped ? Qt::AlignVCenter : Qt::AlignCenter;
+    painter->drawText(QRect(x, 0, textWidth, buttonHeight), Qt::AlignVCenter, text());
+
+    if (clipped) {
+        // Blend the right area of the text with the background, as the
+        // text is clipped.
+        // TODO #1: use alpha blending in Qt4 instead of drawing the text that often
+        // TODO #2: same code as in URLNavigatorButton::drawButton() -> provide helper class?
+        const int blendSteps = 16;
+
+        QColor blendColor(backgroundColor);
+        const int redInc   = (foregroundColor.red()   - backgroundColor.red())   / blendSteps;
+        const int greenInc = (foregroundColor.green() - backgroundColor.green()) / blendSteps;
+        const int blueInc  = (foregroundColor.blue()  - backgroundColor.blue())  / blendSteps;
+        for (int i = 0; i < blendSteps; ++i) {
+            painter->setClipRect(QRect(x + textWidth - i, 0, 1, buttonHeight));
+            painter->setPen(blendColor);
+            painter->drawText(QRect(x, 0, textWidth, buttonHeight), Qt::AlignVCenter, text());
+
+            blendColor.setRgb(blendColor.red()   + redInc,
+                              blendColor.green() + greenInc,
+                              blendColor.blue()  + blueInc);
+        }
+    }
+}
+
+void ServiceButton::enterEvent(QEvent* event)
+{
+    QPushButton::enterEvent(event);
+    m_hover = true;
+    update();
+}
+
+void ServiceButton::leaveEvent(QEvent* event)
+{
+    QPushButton::leaveEvent(event);
+    m_hover = false;
+    update();
+}
+
+void ServiceButton::slotReleased()
+{
+    emit requestServiceStart(m_index);
+}
+
diff --git a/src/infosidebarpage.h b/src/infosidebarpage.h
new file mode 100644 (file)
index 0000000..4b21527
--- /dev/null
@@ -0,0 +1,199 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef _INFOSIDEBARPAGE_H_
+#define _INFOSIDEBARPAGE_H_
+
+#include <sidebarpage.h>
+
+#include <q3valuevector.h>
+#include <qpushbutton.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <QEvent>
+#include <QLabel>
+#include <Q3PtrList>
+
+#include <kurl.h>
+#include <ksortablevaluelist.h>
+#include <kmimetype.h>
+
+namespace KIO {
+    class Job;
+};
+
+class QPixmap;
+class QIcon;
+class QString;
+class QPainter;
+class KFileItem;
+class QLabel;
+class Q3VBox;
+class Q3Grid;
+class PixmapViewer;
+
+/**
+ * @brief Prototype for a information sidebar.
+ *
+ * Will be exchanged in future releases by pluggable sidebar pages...
+ */
+class InfoSidebarPage : public SidebarPage
+{
+       Q_OBJECT
+
+public:
+    InfoSidebarPage(QWidget* parent);
+    virtual ~InfoSidebarPage();
+
+protected:
+    /** @see SidebarPage::activeViewChanged() */
+    virtual void activeViewChanged();
+
+private slots:
+    /**
+     * Does a delayed request of information for the item of the given URL and
+     * provides default actions.
+     *
+     * @see InfoSidebarPage::showItemInfo()
+     */
+    void requestDelayedItemInfo(const KURL& url);
+
+    /**
+     * Does a request of information for the item of the given URL and
+     * provides default actions.
+     *
+     * @see InfoSidebarPage::showItemInfo()
+     */
+    void requestItemInfo(const KURL& url);
+
+    /**
+     * Shows the information for the item of the URL which has been provided by
+     * InfoSidebarPage::requestItemInfo() and provides default actions.
+     */
+    void showItemInfo();
+
+    /**
+     * Triggered if the request for item information has timed out.
+     * @see InfoSidebarPage::requestDelayedItemInfo()
+     */
+    void slotTimeout();
+
+    /**
+     * Is invoked if no preview is available for the item. In this
+     * case the icon will be shown.
+     */
+    void slotPreviewFailed(const KFileItem* item);
+
+    /**
+     * Is invoked if a preview is available for the item. The preview
+     * \a pixmap is shown inside the info page.
+     */
+    void gotPreview(const KFileItem* item, const QPixmap& pixmap);
+
+    /**
+     * Starts the service of m_actionsVector with the index \index on
+     * the shown URL (or the selected items if available).
+     */
+    void startService(int index);
+
+private:
+    /**
+     * Connects to signals from the currently active Dolphin view to get
+     * informed about highlighting changes.
+     */
+    void connectToActiveView();
+
+    /**
+     * Checks whether the current URL is repesented by a bookmark. If yes,
+     * then the bookmark icon and name are shown instead of a preview.
+     * @return True, if the URL represents exactly a bookmark.
+     */
+    bool applyBookmark();
+
+    /** Assures that any pending item information request is cancelled. */
+    void cancelRequest();
+
+    // TODO: the following methods are just a prototypes for meta
+    // info generation...
+    void createMetaInfo();
+    void addInfoLine(const QString& labelText,
+                     const QString& infoText);
+    void beginInfoLines();
+    void endInfoLines();
+
+    /**
+     * Returns true, if the string \a key represents a meta information
+     * that should be shown.
+     */
+    bool showMetaInfo(const QString& key) const;
+
+    /**
+     * Inserts the available actions to the info page for the given item.
+     */
+    void insertActions();
+
+    bool m_multipleSelection;
+    bool m_pendingPreview;
+    QTimer* m_timer;
+    KURL m_shownURL;
+    KURL m_urlCandidate;
+
+    PixmapViewer* m_preview;
+    QLabel* m_name;
+
+    int m_currInfoLineIdx;
+    Q3Grid* m_infoGrid;
+    Q3PtrList<QLabel> m_infoWidgets;       // TODO: use children() from QObject instead
+
+    Q3VBox* m_actionBox;
+    Q3PtrList<QWidget> m_actionWidgets;    // TODO: use children() from QObject instead
+    Q3ValueVector<KDEDesktopMimeType::Service> m_actionsVector;
+};
+
+// TODO #1: move to SidebarPage?
+// TODO #2: quite same button from the optical point of view as URLNavigatorButton
+// -> provide helper class or common base class
+class ServiceButton : public QPushButton
+{
+    Q_OBJECT
+
+public:
+    ServiceButton(const QIcon& icon,
+                  const QString& text,
+                  QWidget* parent,
+                  int index);
+    virtual ~ServiceButton();
+
+signals:
+    void requestServiceStart(int index);
+
+protected:
+    virtual void drawButton(QPainter* painter);
+    virtual void enterEvent(QEvent* event);
+    virtual void leaveEvent(QEvent* event);
+
+private slots:
+    void slotReleased();
+
+private:
+    bool m_hover;
+    int m_index;
+};
+
+#endif // _INFOSIDEBARPAGE_H_
diff --git a/src/itemeffectsmanager.cpp b/src/itemeffectsmanager.cpp
new file mode 100644 (file)
index 0000000..f47c439
--- /dev/null
@@ -0,0 +1,191 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "itemeffectsmanager.h"
+#include <kiconeffect.h>
+#include <kapplication.h>
+#include <qobject.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <kglobalsettings.h>
+#include <qclipboard.h>
+#include <kurldrag.h>
+#include <klocale.h>
+
+#include "dolphin.h"
+#include "dolphinstatusbar.h"
+
+ItemEffectsManager::ItemEffectsManager()
+{
+    m_pixmapCopy = new QPixmap();
+}
+
+ItemEffectsManager::~ItemEffectsManager()
+{
+    delete m_pixmapCopy;
+    m_pixmapCopy = 0;
+
+    m_highlightedURL = 0;
+}
+
+void ItemEffectsManager::zoomIn()
+{
+    Dolphin::mainWin().refreshViews();
+}
+
+void ItemEffectsManager::zoomOut()
+{
+    Dolphin::mainWin().refreshViews();
+}
+
+void ItemEffectsManager::activateItem(void* context)
+{
+    KFileItem* fileInfo = contextFileInfo(context);
+    const KUrl itemURL(fileInfo->url());
+    if (m_highlightedURL == itemURL) {
+        // the item is already highlighted
+        return;
+    }
+
+    resetActivatedItem();
+
+    const QPixmap* itemPixmap = contextPixmap(context);
+    if (itemPixmap != 0) {
+        // remember the pixmap and item to be able to
+        // restore it to the old state later
+        *m_pixmapCopy = *itemPixmap;
+        m_highlightedURL = itemURL;
+
+        // apply an icon effect to the item below the mouse pointer
+        KIconEffect iconEffect;
+        QPixmap pixmap = iconEffect.apply(*itemPixmap,
+                                          KIcon::Desktop,
+                                          KIcon::ActiveState);
+        setContextPixmap(context, pixmap);
+    }
+
+    if (!Dolphin::mainWin().activeView()->hasSelection()) {
+        DolphinStatusBar* statusBar = Dolphin::mainWin().activeView()->statusBar();
+        statusBar->setMessage(statusBarText(fileInfo), DolphinStatusBar::Default);
+    }
+}
+
+void ItemEffectsManager::resetActivatedItem()
+{
+    if (m_highlightedURL.isEmpty()) {
+        return;
+    }
+
+    for (void* context = firstContext(); context != 0; context = nextContext(context)) {
+        KUrl itemURL(contextFileInfo(context)->url());
+        if (itemURL == m_highlightedURL) {
+            // the highlighted item has been found and is restored to the default state
+            KIconEffect iconEffect;
+            QPixmap pixmap = iconEffect.apply(*m_pixmapCopy,
+                                              KIcon::Desktop,
+                                              KIcon::DefaultState);
+
+            // TODO: KFileIconView does not emit any signal when the preview has been finished.
+            // Hence check the size to prevent that a preview is hidden by restoring a
+            // non-preview pixmap.
+            const QPixmap* highlightedPixmap = contextPixmap(context);
+            const bool restore = (pixmap.width() == highlightedPixmap->width()) &&
+                                 (pixmap.height() == highlightedPixmap->height());
+            if (restore) {
+                setContextPixmap(context, pixmap);
+            }
+            break;
+        }
+    }
+
+    m_highlightedURL = 0;
+
+    DolphinStatusBar* statusBar = Dolphin::mainWin().activeView()->statusBar();
+    statusBar->clear();
+}
+
+void ItemEffectsManager::updateDisabledItems()
+{
+    if (!m_disabledItems.isEmpty()) {
+        // restore all disabled items with their original pixmap
+        for (void* context = firstContext(); context != 0; context = nextContext(context)) {
+            const KFileItem* fileInfo = contextFileInfo(context);
+            const KUrl& fileURL = fileInfo->url();
+            Q3ValueListIterator<DisabledItem> it = m_disabledItems.begin();
+            while (it != m_disabledItems.end()) {
+                if (fileURL == (*it).url) {
+                    setContextPixmap(context, (*it).pixmap);
+                }
+                ++it;
+            }
+        }
+        m_disabledItems.clear();
+    }
+
+    if (!Dolphin::mainWin().clipboardContainsCutData()) {
+        return;
+    }
+
+    QClipboard* clipboard = QApplication::clipboard();
+    QMimeSource* data = clipboard->data();
+    if (!KUrlDrag::canDecode(data)) {
+        return;
+    }
+
+    // The clipboard contains items, which have been cutted. Change the pixmaps of all those
+    // items to the disabled state.
+    KUrl::List urls;
+    KUrlDrag::decode(data, urls);
+    for (void* context = firstContext(); context != 0; context = nextContext(context)) {
+        const KFileItem* fileInfo = contextFileInfo(context);
+        const KUrl& fileURL = fileInfo->url();
+        for(KUrl::List::ConstIterator it = urls.begin(); it != urls.end(); ++it) {
+            if (fileURL == (*it)) {
+                const QPixmap* itemPixmap = contextPixmap(context);
+                if (itemPixmap != 0) {
+                    // remember old pixmap
+                    DisabledItem disabledItem;
+                    disabledItem.url = fileURL;
+                    disabledItem.pixmap = *itemPixmap;
+                    m_disabledItems.append(disabledItem);
+
+                    KIconEffect iconEffect;
+                    QPixmap disabledPixmap = iconEffect.apply(*itemPixmap,
+                                                              KIcon::Desktop,
+                                                              KIcon::DisabledState);
+                    setContextPixmap(context, disabledPixmap);
+                }
+                break;
+            }
+        }
+    }
+}
+
+QString ItemEffectsManager::statusBarText(KFileItem* fileInfo) const
+{
+    if (fileInfo->isDir()) {
+        // KFileItem::getStatusBar() returns "MyDocuments/ Folder" as
+        // status bar text for a folder 'MyDocuments'. This is adjusted
+        // to "MyDocuments (Folder)" in Dolphin.
+        return i18n("%1 (Folder)").arg(fileInfo->name());
+    }
+
+    return fileInfo->getStatusBarInfo();
+}
diff --git a/src/itemeffectsmanager.h b/src/itemeffectsmanager.h
new file mode 100644 (file)
index 0000000..7f5f381
--- /dev/null
@@ -0,0 +1,120 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef ITEMEFFECTSMANAGER_H
+#define ITEMEFFECTSMANAGER_H
+
+#include <qobject.h>
+#include <qpixmap.h>
+#include <kurl.h>
+#include <q3valuelist.h>
+class KFileItem;
+
+/**
+ * @brief Abstract class to implement item effects for a Dolphin view.
+ *
+ * Derived classes must implement the following pure virtual methods:
+ * - ItemEffectsManager::setContextPixmap()
+ * - ItemEffectsManager::contextPixmap()
+ * - ItemEffectsManager::firstContext()
+ * - ItemEffectsManager::nextContext()
+ * - ItemEffectsManager::contextFileInfo()
+ *
+ * The item effects manager highlights currently active items and also
+ * respects cutted items. A 'context' is defined as abstract data type,
+ * which usually is represented by a KFileListViewItem or
+ * a KFileIconViewItem.
+ *
+ * In Qt4 the item effects manager should get integrated as part of Interview
+ * and hence no abstract context handling should be necessary anymore. The main
+ * purpose of the current interface is to prevent code duplication as there is
+ * no common model shared by QListView and QIconView of Qt3.
+ *
+ * @see DolphinIconsView
+ * @see DolphinDetailsView
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class ItemEffectsManager
+{
+public:
+    ItemEffectsManager();
+    virtual ~ItemEffectsManager();
+
+    /** Is invoked before the items get updated. */
+    virtual void beginItemUpdates() = 0;
+
+    /** Is invoked after the items have been updated. */
+    virtual void endItemUpdates() = 0;
+
+    /**
+     * Increases the size of the current set view mode and refreshes
+     * all views. Derived implementations must invoke the base implementation
+     * if zooming in had been done.
+     */
+    virtual void zoomIn();
+
+    /**
+     * Decreases the size of the current set view mode and refreshes
+     * all views. Derived implementations must invoke the base implementation
+     * if zooming out had been done.
+     */
+    virtual void zoomOut();
+
+    /**
+     * Returns true, if zooming in is possible. If false is returned,
+     * the minimal zoom size is possible.
+     */
+    virtual bool isZoomInPossible() const = 0;
+
+    /**
+     * Returns true, if zooming in is possible. If false is returned,
+     * the minimal zoom size is possible.
+     */
+    virtual bool isZoomOutPossible() const = 0;
+
+protected:
+    virtual void setContextPixmap(void* context,
+                                  const QPixmap& pixmap) = 0;
+    virtual const QPixmap* contextPixmap(void* context) = 0;
+    virtual void* firstContext() = 0;
+    virtual void* nextContext(void* context) = 0;
+    virtual KFileItem* contextFileInfo(void* context) = 0;
+
+    void activateItem(void* context);
+    void resetActivatedItem();
+    void updateDisabledItems();
+
+private:
+    struct DisabledItem {
+        KUrl url;
+        QPixmap pixmap;
+    };
+
+    QPixmap* m_pixmapCopy;
+    KUrl m_highlightedURL;
+
+    // contains all items which have been disabled by a 'cut' operation
+    Q3ValueList<DisabledItem> m_disabledItems;
+
+    /** Returns the text for the statusbar for an activated item. */
+    QString statusBarText(KFileItem* fileInfo) const;
+};
+
+#endif
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644 (file)
index 0000000..00e6aeb
--- /dev/null
@@ -0,0 +1,81 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006 by Stefan Monov <logixoul@gmail.com>               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "dolphin.h"
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <krun.h>
+
+static KCmdLineOptions options[] =
+{
+    { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+    KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+    KAboutData about("dolphin",
+                     I18N_NOOP("Dolphin"),
+                     "0.8.0",
+                     I18N_NOOP("File Manager"),
+                     KAboutData::License_GPL,
+                     "(C) 2006 Peter Penz");
+    about.setHomepage("http://enzosworld.gmxhome.de");
+    about.setBugAddress("peter.penz@gmx.at");
+    about.addAuthor("Peter Penz", I18N_NOOP("Maintainer and developer"), "peter.penz@gmx.at");
+    about.addAuthor("Cvetoslav Ludmiloff", I18N_NOOP("Developer"), "ludmiloff@gmail.com");
+    about.addAuthor("Stefan Monov", I18N_NOOP("Developer"), "logixoul@gmail.com");
+    about.addAuthor("Michael Austin", I18N_NOOP("Documentation"), "tuxedup@users.sourceforge.net");
+    about.addAuthor("Orville Bennett", I18N_NOOP("Documentation"), "obennett@hartford.edu");
+    about.addCredit("Aaron J. Seigo", I18N_NOOP("... for the great support and the amazing patches"));
+    about.addCredit("Patrice Tremblay and Gregor Kalisnik", I18N_NOOP("... for their patches"));
+    about.addCredit("Ain, Itai, Ivan, Stephane, Patrice, Piotr and Stefano",
+                    I18N_NOOP("... for their translations"));
+
+    KCmdLineArgs::init(argc, argv, &about);
+    KCmdLineArgs::addCmdLineOptions(options);
+
+    KApplication app;
+
+    Dolphin& mainWin = Dolphin::mainWin();
+    mainWin.show();
+
+    if (false /* KDE4-TODO: app.isRestored() */) {
+        int n = 1;
+        while (KMainWindow::canBeRestored(n)){
+            Dolphin::mainWin().restore(n);
+            ++n;
+        }
+    } else {
+        KCmdLineArgs* args = KCmdLineArgs::parsedArgs();
+        if (args->count() > 0) {
+            mainWin.activeView()->setURL(args->url(0));
+
+            for (int i = 1; i < args->count(); ++i) {
+                KRun::run("dolphin", args->url(i));
+            }
+        }
+        args->clear();
+    }
+
+    return app.exec();
+}
diff --git a/src/pics/128x128/CMakeLists.txt b/src/pics/128x128/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b5f6162
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  preview.png DESTINATION ${DATA_INSTALL_DIR}/dolphin/icons/hicolor/128x128/actions )
+
+
+
+#original Makefile.am contents follow:
+
+#iconsdir = $(kde_datadir)/dolphin/icons/hicolor/128x128/actions
+#icons_DATA = preview.png
+#
diff --git a/src/pics/128x128/preview.png b/src/pics/128x128/preview.png
new file mode 100644 (file)
index 0000000..d97c893
Binary files /dev/null and b/src/pics/128x128/preview.png differ
diff --git a/src/pics/16x16/CMakeLists.txt b/src/pics/16x16/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6c5745d
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  preview.png editurl.png DESTINATION ${DATA_INSTALL_DIR}/dolphin/icons/hicolor/16x16/actions )
+
+
+
+#original Makefile.am contents follow:
+
+#iconsdir = $(kde_datadir)/dolphin/icons/hicolor/16x16/actions
+#icons_DATA = preview.png editurl.png
+#
diff --git a/src/pics/16x16/editurl.png b/src/pics/16x16/editurl.png
new file mode 100644 (file)
index 0000000..5b4675b
Binary files /dev/null and b/src/pics/16x16/editurl.png differ
diff --git a/src/pics/16x16/preview.png b/src/pics/16x16/preview.png
new file mode 100644 (file)
index 0000000..b25d18b
Binary files /dev/null and b/src/pics/16x16/preview.png differ
diff --git a/src/pics/22x22/CMakeLists.txt b/src/pics/22x22/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4fa6b38
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  preview.png DESTINATION ${DATA_INSTALL_DIR}/dolphin/icons/hicolor/22x22/actions )
+
+
+
+#original Makefile.am contents follow:
+
+#iconsdir = $(kde_datadir)/dolphin/icons/hicolor/22x22/actions
+#icons_DATA = preview.png
+#
diff --git a/src/pics/22x22/preview.png b/src/pics/22x22/preview.png
new file mode 100644 (file)
index 0000000..3fa977a
Binary files /dev/null and b/src/pics/22x22/preview.png differ
diff --git a/src/pics/32x32/CMakeLists.txt b/src/pics/32x32/CMakeLists.txt
new file mode 100644 (file)
index 0000000..fac3d90
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  preview.png DESTINATION ${DATA_INSTALL_DIR}/dolphin/icons/hicolor/32x32/actions )
+
+
+
+#original Makefile.am contents follow:
+
+#iconsdir = $(kde_datadir)/dolphin/icons/hicolor/32x32/actions
+#icons_DATA = preview.png
+#
diff --git a/src/pics/32x32/preview.png b/src/pics/32x32/preview.png
new file mode 100644 (file)
index 0000000..93d736f
Binary files /dev/null and b/src/pics/32x32/preview.png differ
diff --git a/src/pics/48x48/CMakeLists.txt b/src/pics/48x48/CMakeLists.txt
new file mode 100644 (file)
index 0000000..334efd6
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  preview.png DESTINATION ${DATA_INSTALL_DIR}/dolphin/icons/hicolor/48x48/actions )
+
+
+
+#original Makefile.am contents follow:
+
+#iconsdir = $(kde_datadir)/dolphin/icons/hicolor/48x48/actions
+#icons_DATA = preview.png
+#
diff --git a/src/pics/48x48/preview.png b/src/pics/48x48/preview.png
new file mode 100644 (file)
index 0000000..b3bbf78
Binary files /dev/null and b/src/pics/48x48/preview.png differ
diff --git a/src/pics/64x64/CMakeLists.txt b/src/pics/64x64/CMakeLists.txt
new file mode 100644 (file)
index 0000000..da692c3
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  preview.png DESTINATION ${DATA_INSTALL_DIR}/dolphin/icons/hicolor/64x64/actions )
+
+
+
+#original Makefile.am contents follow:
+
+#iconsdir = $(kde_datadir)/dolphin/icons/hicolor/64x64/actions
+#icons_DATA = preview.png
+#
diff --git a/src/pics/64x64/preview.png b/src/pics/64x64/preview.png
new file mode 100644 (file)
index 0000000..200cb2a
Binary files /dev/null and b/src/pics/64x64/preview.png differ
diff --git a/src/pics/CMakeLists.txt b/src/pics/CMakeLists.txt
new file mode 100644 (file)
index 0000000..bfbe891
--- /dev/null
@@ -0,0 +1,19 @@
+
+add_subdirectory( 128x128 )
+add_subdirectory( 64x64 )
+add_subdirectory( 48x48 )
+add_subdirectory( 32x32 )
+add_subdirectory( 22x22 )
+add_subdirectory( 16x16 )
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+
+
+
+#original Makefile.am contents follow:
+
+#SUBDIRS = 128x128 64x64 48x48 32x32 22x22 16x16
diff --git a/src/pixmapviewer.cpp b/src/pixmapviewer.cpp
new file mode 100644 (file)
index 0000000..575f3ed
--- /dev/null
@@ -0,0 +1,59 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "pixmapviewer.h"
+
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <qpainter.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <QPaintEvent>
+
+PixmapViewer::PixmapViewer(QWidget* parent) :
+    QWidget(parent)
+{
+    setMinimumWidth(KIcon::SizeEnormous);
+    setMinimumWidth(KIcon::SizeEnormous);
+}
+
+PixmapViewer::~PixmapViewer()
+{
+}
+
+void PixmapViewer::setPixmap(const QPixmap& pixmap)
+{
+    m_pixmap = pixmap;
+    update();
+}
+
+void PixmapViewer::paintEvent(QPaintEvent* event)
+{
+    QWidget::paintEvent(event);
+
+    QPainter painter;
+    painter.begin(this);
+    const int x = (width() - m_pixmap.width()) / 2;
+    const int y = (height() - m_pixmap.height()) / 2;
+    painter.drawPixmap(x, y, m_pixmap);
+    painter.end();
+}
+
+#include "pixmapviewer.moc"
diff --git a/src/pixmapviewer.h b/src/pixmapviewer.h
new file mode 100644 (file)
index 0000000..5f9df88
--- /dev/null
@@ -0,0 +1,52 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef PIXMAPVIEWER_H
+#define PIXMAPVIEWER_H
+
+#include <qwidget.h>
+#include <qpixmap.h>
+//Added by qt3to4:
+#include <QPaintEvent>
+
+/**
+ * @brief Widget which shows a pixmap centered inside the boundaries.
+ *
+ * @see IconsViewSettingsPage
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class PixmapViewer : public QWidget
+{
+    Q_OBJECT
+public:
+    PixmapViewer(QWidget* parent);
+    virtual ~PixmapViewer();
+    void setPixmap(const QPixmap& pixmap);
+    const QPixmap& pixmap() const { return m_pixmap; }
+
+protected:
+    virtual void paintEvent(QPaintEvent* event);
+
+private:
+    QPixmap m_pixmap;
+};
+
+
+#endif
diff --git a/src/portinglog.txt b/src/portinglog.txt
new file mode 100644 (file)
index 0000000..bef5012
--- /dev/null
@@ -0,0 +1,445 @@
+Log for qt3to4 on Mo Nov 13 07:24:50 2006. Number of log entries: 101
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkselector.h at line 30 column 16: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkselector.h at line 67 column 14: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkselector.h: Added the following include directives:
+       #include <Q3PopupMenu> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.h at line 25 column 20: qvaluelist.h -> q3valuelist.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.h at line 29 column 19: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.h at line 46 column 48: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.h at line 54 column 42: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h at line 26 column 18: qlistbox.h -> q3listbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h at line 49 column 56: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h at line 52 column 46: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h at line 68 column 40: QListBox -> Q3ListBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h at line 82 column 42: QListBoxPixmap -> Q3ListBoxPixmap
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h at line 87 column 37: QListBox -> Q3ListBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.h: Added the following include directives:
+       #include <QPaintEvent>  #include <QPixmap> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.h at line 24 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.h at line 32 column 44: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.h at line 27 column 20: qvaluelist.h -> q3valuelist.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.h at line 29 column 22: qvaluevector.h -> q3valuevector.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.h at line 59 column 40: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.h at line 63 column 38: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h at line 69 column 41: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h at line 98 column 33: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h at line 155 column 47: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h at line 161 column 38: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h at line 171 column 37: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h at line 191 column 41: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.h: Added the following include directives:
+       #include <QPixmap>      #include <QResizeEvent>         #include <QEvent>       #include <QDropEvent>   #include <QMouseEvent>  #include <QDragMoveEvent>       #include <QPaintEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindirlister.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 33 column 20: qvaluelist.h -> q3valuelist.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 34 column 18: qptrlist.h -> q3ptrlist.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 45 column 11: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 46 column 19: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 78 column 18: QPtrList -> Q3PtrList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 315 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h at line 327 column 12: QPtrList -> Q3PtrList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.h: Added the following include directives:
+       #include <QCloseEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.h at line 113 column 23: QDragObject -> Q3DragObject
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.h at line 126 column 33: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.h at line 132 column 47: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.h at line 136 column 38: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.h: Added the following include directives:
+       #include <QDragEnterEvent>      #include <QDropEvent>   #include <QMouseEvent>  #include <QDragMoveEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettingsdialog.h
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinstatusbar.h at line 26 column 15: qhbox.h -> q3hbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinstatusbar.h at line 36 column 37: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinstatusbar.h: Added the following include directives:
+       #include <QLabel> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 42 column 19: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 43 column 19: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 44 column 17: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 52 column 17: QScrollView -> Q3ScrollView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 133 column 20: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 247 column 43: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 248 column 45: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 251 column 45: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 275 column 15: QScrollView -> Q3ScrollView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h at line 292 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.h: Added the following include directives:
+       #include <QDropEvent>   #include <Q3ValueList>  #include <QMouseEvent>  #include <Q3VBoxLayout> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/filterbar.h: Added the following include directives:
+       #include <QKeyEvent>    #include <QLabel> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.h at line 24 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.h at line 36 column 42: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 30 column 22: qvaluevector.h -> q3valuevector.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 42 column 14: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 47 column 11: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 48 column 11: QGrid -> Q3Grid
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 120 column 9: QGrid -> Q3Grid
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 121 column 12: QPtrList -> Q3PtrList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 123 column 9: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 124 column 12: QPtrList -> Q3PtrList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 125 column 16: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h at line 136 column 32: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.h: Added the following include directives:
+       #include <QPixmap>      #include <QEvent>       #include <QLabel>       #include <Q3PtrList> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/itemeffectsmanager.h at line 27 column 20: qvaluelist.h -> q3valuelist.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/itemeffectsmanager.h at line 77 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/pixmapviewer.h: Added the following include directives:
+       #include <QPaintEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/progressindicator.h
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/protocolcombo.h
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/renamedialog.h
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/settingspagebase.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebar.h at line 30 column 17: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebar.h at line 56 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebar.h: Added the following include directives:
+       #include <Q3VBoxLayout> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebarpage.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/statusbarmessagelabel.h: Added the following include directives:
+       #include <QPaintEvent>  #include <QResizeEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/statusbarspaceinfo.h: Added the following include directives:
+       #include <QPaintEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/undomanager.h at line 25 column 20: qvaluelist.h -> q3valuelist.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/undomanager.h at line 117 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.h: Added the following include directives:
+       #include <QEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigatorbutton.h: Added the following include directives:
+       #include <QEvent>       #include <QDragLeaveEvent>      #include <QDropEvent>   #include <QDragEnterEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 29 column 15: qhbox.h -> q3hbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 36 column 16: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 48 column 18: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 50 column 33: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 93 column 20: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 143 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h at line 150 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.h: Added the following include directives:
+       #include <QLabel>       #include <Q3ValueList>  #include <QKeyEvent>    #include <Q3PopupMenu> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.h at line 26 column 18: QButtonGroup -> Q3ButtonGroup
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewproperties.h
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewsettingspage.h
+
+Log for qt3to4 on Mo Nov 13 07:25:00 2006. Number of log entries: 301
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkselector.cpp at line 23 column 20: qpopupmenu.h -> q3popupmenu.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkselector.cpp at line 43 column 36: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 31 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 51 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 51 column 44: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 55 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 55 column 27: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 64 column 39: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 70 column 52: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 71 column 56: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 72 column 58: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 73 column 62: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 75 column 9: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 75 column 32: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 115 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 117 column 21: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 117 column 47: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 155 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 169 column 23: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 184 column 67: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 191 column 61: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 206 column 21: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 206 column 47: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 213 column 21: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 225 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 242 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 244 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 269 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 272 column 21: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 289 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp at line 291 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssettingspage.cpp: Added the following include directives:
+       #include <QPixmap>      #include <Q3VBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 26 column 18: qlistbox.h -> q3listbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 30 column 20: qpopupmenu.h -> q3popupmenu.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 46 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 46 column 41: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 51 column 72: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 52 column 63: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 53 column 69: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 54 column 60: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 93 column 74: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 104 column 64: QListBoxItem -> Q3ListBoxItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 112 column 14: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 112 column 38: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 251 column 12: QListBox -> Q3ListBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 265 column 18: QListBoxPixmap -> Q3ListBoxPixmap
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 273 column 39: QListBox -> Q3ListBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp at line 275 column 25: QListBoxPixmap -> Q3ListBoxPixmap
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/bookmarkssidebarpage.cpp: Added the following include directives:
+       #include <QPixmap>      #include <Q3VBoxLayout>         #include <QPaintEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 28 column 15: qgrid.h -> q3grid.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 30 column 22: qbuttongroup.h -> q3buttongroup.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 33 column 19: qgroupbox.h -> q3groupbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 34 column 19: qgroupbox.h -> q3groupbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 40 column 9: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 60 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 60 column 43: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 64 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 64 column 43: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 78 column 16: QButtonGroup -> Q3ButtonGroup
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 78 column 50: QButtonGroup -> Q3ButtonGroup
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 105 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/detailsviewsettingspage.cpp at line 105 column 40: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 97 column 20: QPtrListIterator -> Q3PtrListIterator
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 219 column 16: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 223 column 16: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 268 column 56: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 336 column 55: QValueVector -> Q3ValueVector
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 404 column 34: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 407 column 34: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp at line 442 column 26: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphincontextmenu.cpp: Added the following include directives:
+       #include <Q3ValueList> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp at line 59 column 21: qdragobject.h -> q3dragobject.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp at line 632 column 15: QDragObject -> Q3DragObject
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp at line 640 column 15: QDragObject -> Q3DragObject
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp at line 990 column 18: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp at line 991 column 24: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp at line 1452 column 20: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphin.cpp: Added the following include directives:
+       #include <Q3ValueList>  #include <QCloseEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 34 column 21: qobjectlist.h -> qobject.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 35 column 17: qheader.h -> q3header.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 66 column 33: QScrollView -> Q3ScrollView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 75 column 45: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 76 column 47: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 79 column 59: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 80 column 61: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 85 column 50: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 86 column 52: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 94 column 11: QHeader -> Q3Header
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 101 column 36: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 129 column 20: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 143 column 77: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 161 column 57: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 243 column 49: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 351 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 393 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 426 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 525 column 63: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 561 column 17: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 625 column 26: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 645 column 54: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 686 column 70: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 744 column 19: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 758 column 21: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 764 column 29: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 773 column 25: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 790 column 13: QListView -> Q3ListView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp at line 803 column 57: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindetailsview.cpp: Added the following include directives:
+       #include <Q3ValueList>  #include <QPixmap>      #include <QDragMoveEvent>       #include <QDropEvent>   #include <QResizeEvent>         #include <QMouseEvent>  #include <QEvent>       #include <QPaintEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphindirlister.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 32 column 21: qobjectlist.h -> qobject.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 59 column 45: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 60 column 47: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 63 column 59: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 64 column 61: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 69 column 50: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 70 column 52: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 129 column 20: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 144 column 19: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 145 column 56: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 145 column 81: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 146 column 19: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 146 column 68: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 147 column 52: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 148 column 52: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 238 column 75: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 308 column 11: QDragObject -> Q3DragObject
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 332 column 15: QDragObject -> Q3DragObject
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 420 column 47: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 435 column 61: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp at line 445 column 52: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphiniconsview.cpp: Added the following include directives:
+       #include <QDragMoveEvent>       #include <QDropEvent>   #include <Q3ValueList>  #include <QPixmap>      #include <QMouseEvent>  #include <QDragEnterEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 96 column 19: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 97 column 56: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 97 column 81: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 101 column 32: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 118 column 39: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 135 column 19: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 136 column 56: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 136 column 81: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 142 column 32: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettings.cpp at line 150 column 39: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettingsdialog.cpp at line 36 column 10: QFrame -> Q3Frame
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettingsdialog.cpp at line 42 column 10: QFrame -> Q3Frame
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettingsdialog.cpp at line 48 column 10: QFrame -> Q3Frame
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinsettingsdialog.cpp: Added the following include directives:
+       #include <Q3Frame> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinstatusbar.cpp at line 32 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 66 column 33: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 283 column 25: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 488 column 16: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 648 column 52: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 650 column 21: ButtonState -> Qt::ButtonState
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 651 column 64: ShiftButton -> Qt::ShiftModifier
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 652 column 66: ControlButton -> Qt::ControlModifier
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 661 column 54: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 680 column 54: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 849 column 58: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 850 column 61: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 851 column 63: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 852 column 61: QIconViewItem -> Q3IconViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 867 column 60: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 868 column 63: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 869 column 65: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 870 column 63: QListViewItem -> Q3ListViewItem
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 894 column 11: QScrollView -> Q3ScrollView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 896 column 60: QScrollView -> Q3ScrollView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp at line 897 column 60: QScrollView -> Q3ScrollView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/dolphinview.cpp: Added the following include directives:
+       #include <Q3ValueList>  #include <QDropEvent>   #include <QMouseEvent>  #include <Q3VBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 24 column 15: qgrid.h -> q3grid.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 34 column 15: qhbox.h -> q3hbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 68 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 68 column 44: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 70 column 9: QGrid -> Q3Grid
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 70 column 27: QGrid -> Q3Grid
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 90 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp at line 90 column 34: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/editbookmarkdialog.cpp: Added the following include directives:
+       #include <Q3VBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/filterbar.cpp at line 42 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/filterbar.cpp at line 42 column 38: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/filterbar.cpp at line 45 column 15: QHBoxLayout -> Q3HBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/filterbar.cpp at line 45 column 41: QHBoxLayout -> Q3HBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/filterbar.cpp: Added the following include directives:
+       #include <Q3VBoxLayout>         #include <QKeyEvent>    #include <Q3HBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 29 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 30 column 15: qgrid.h -> q3grid.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 31 column 19: qgroupbox.h -> q3groupbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 34 column 22: qbuttongroup.h -> q3buttongroup.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 50 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 50 column 44: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 58 column 9: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 58 column 27: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 65 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 65 column 40: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 69 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 69 column 33: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 80 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 80 column 32: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 91 column 16: QButtonGroup -> Q3ButtonGroup
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp at line 91 column 48: QButtonGroup -> Q3ButtonGroup
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/generalsettingspage.cpp: Added the following include directives:
+       #include <Q3VBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 25 column 22: qbuttongroup.h -> q3buttongroup.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 43 column 9: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 64 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 64 column 34: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 69 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 69 column 44: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 75 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 75 column 35: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 93 column 17: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 93 column 51: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 97 column 13: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 97 column 42: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 115 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 115 column 40: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 137 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 137 column 40: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/iconsviewsettingspage.cpp at line 141 column 77: QIconView -> Q3IconView
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 32 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 33 column 20: qvgroupbox.h -> q3vgroupbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 34 column 20: qpopupmenu.h -> q3popupmenu.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 37 column 15: qgrid.h -> q3grid.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 38 column 20: qhgroupbox.h -> q3hgroupbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 70 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 70 column 41: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 86 column 34: QHGroupBox -> Q3HGroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 90 column 26: QGrid -> Q3Grid
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 93 column 34: QHGroupBox -> Q3HGroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 97 column 27: QVBox -> Q3VBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 324 column 24: QPtrListIterator -> Q3PtrListIterator
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 414 column 20: QPtrListIterator -> Q3PtrListIterator
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 489 column 34: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 492 column 50: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 503 column 34: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 507 column 34: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 534 column 43: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 543 column 26: QWidget -> Qt
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 578 column 18: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 580 column 54: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp at line 580 column 71: QIconSet -> QIcon
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/infosidebarpage.cpp: Added the following include directives:
+       #include <Q3ValueList>  #include <QEvent>       #include <Q3VBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/itemeffectsmanager.cpp at line 26 column 21: qobjectlist.h -> qobject.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/itemeffectsmanager.cpp at line 131 column 30: QValueListIterator -> Q3ValueListIterator
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/itemeffectsmanager.cpp: Added the following include directives:
+       #include <QPixmap> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/main.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/pixmapviewer.cpp: Added the following include directives:
+       #include <QPixmap>      #include <QPaintEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/progressindicator.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/protocolcombo.cpp at line 20 column 20: qpopupmenu.h -> q3popupmenu.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/protocolcombo.cpp at line 33 column 13: qHeapSort -> qSort
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/protocolcombo.cpp at line 36 column 14: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/protocolcombo.cpp at line 36 column 37: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/renamedialog.cpp at line 27 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/renamedialog.cpp at line 37 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/renamedialog.cpp at line 37 column 44: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/renamedialog.cpp: Added the following include directives:
+       #include <Q3VBoxLayout> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/settingspagebase.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebar.cpp at line 43 column 30: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebar.cpp: Added the following include directives:
+       #include <Q3VBoxLayout> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/sidebarpage.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/statusbarmessagelabel.cpp at line 200 column 74: WordBreak -> TextWordWrap
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/statusbarmessagelabel.cpp: Added the following include directives:
+       #include <QPixmap>      #include <QResizeEvent>         #include <QPaintEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/statusbarspaceinfo.cpp: Added the following include directives:
+       #include <QPaintEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/undomanager.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 42 column 26: QWidget -> Qt
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 94 column 17: red -> Qt::red
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 94 column 29: red -> Qt::red
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 94 column 42: red -> Qt::red
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 95 column 19: green -> Qt::green
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 95 column 31: green -> Qt::green
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 95 column 44: green -> Qt::green
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 96 column 18: blue -> Qt::blue
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 96 column 30: blue -> Qt::blue
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 96 column 43: blue -> Qt::blue
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 97 column 21: red -> Qt::red
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 97 column 28: green -> Qt::green
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp at line 97 column 34: blue -> Qt::blue
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlbutton.cpp: Added the following include directives:
+       #include <QEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigatorbutton.cpp at line 338 column 14: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigatorbutton.cpp at line 338 column 41: QPopupMenu -> Q3PopupMenu
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigatorbutton.cpp: Added the following include directives:
+       #include <QDropEvent>   #include <QDragLeaveEvent>      #include <Q3PopupMenu>  #include <QEvent>       #include <QDragEnterEvent> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 32 column 18: qlistbox.h -> q3listbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 34 column 21: qobjectlist.h -> qobject.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 35 column 20: qpopupmenu.h -> q3popupmenu.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 81 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 164 column 28: QValueListIterator -> Q3ValueListIterator
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 202 column 16: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 271 column 9: QHBox -> Q3HBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 360 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp at line 443 column 14: QValueList -> Q3ValueList
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/urlnavigator.cpp: Added the following include directives:
+       #include <Q3ValueList>  #include <QKeyEvent> 
+No changes made to file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewproperties.cpp
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 27 column 15: qvbox.h -> q3vbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 28 column 22: qbuttongroup.h -> q3buttongroup.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 33 column 19: qgroupbox.h -> q3groupbox.h
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 57 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 57 column 44: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 60 column 13: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 60 column 41: QGroupBox -> Q3GroupBox
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 97 column 16: QButtonGroup -> Q3ButtonGroup
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp at line 97 column 48: QButtonGroup -> Q3ButtonGroup
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewpropertiesdialog.cpp: Added the following include directives:
+       #include <Q3VBoxLayout> 
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewsettingspage.cpp at line 38 column 15: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewsettingspage.cpp at line 38 column 44: QVBoxLayout -> Q3VBoxLayout
+In file /home/kde4peter/Temp/dolphin_svn/dolphin/src/viewsettingspage.cpp: Added the following include directives:
+       #include <Q3VBoxLayout> 
+
diff --git a/src/previewsmodesettings.kcfg b/src/previewsmodesettings.kcfg
new file mode 100644 (file)
index 0000000..70c6d8c
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg> 
+    <kcfgfile name="dolphinrc"/>
+    <include>kiconloader.h</include>
+    <group name="PreviewsMode">
+        <entry name="Arrangement" type="String">
+            <label>Arrangement</label>
+            <default>LeftToRight</default>
+        </entry>
+        <entry name="FontFamily" type="String">
+            <label>Font family</label>
+            <default code="true">KGlobalSettings::generalFont().family()</default>
+        </entry>
+        <entry name="FontSize" type="Int">
+            <label>Font size</label>
+            <default code="true">KGlobalSettings::generalFont().pointSize()</default>
+        </entry>
+        <entry name="GridHeight" type="Int">
+            <label>Grid height</label>
+        </entry>
+        <entry name="GridWidth" type="Int">
+            <label>Grid width</label>
+        </entry>
+        <entry name="GridSpacing" type="Int">
+            <label>Grid spacing</label>
+        </entry>
+        <entry name="IconSize" type="Int">
+            <label>Icon size</label>
+            <default code="true">KIcon::SizeMedium</default>
+        </entry>
+        <entry name="NumberOfTexlines" type="Int">
+            <label>Number of textlines</label>
+            <default>2</default>
+        </entry>
+        <entry name="PreviewSize" type="Int">
+            <label>Preview size</label>
+            <default code="true">KIcon::SizeMedium</default>
+        </entry>
+    </group>
+</kcfg>
\ No newline at end of file
diff --git a/src/previewsmodesettings.kcfgc b/src/previewsmodesettings.kcfgc
new file mode 100644 (file)
index 0000000..780a6d5
--- /dev/null
@@ -0,0 +1,4 @@
+File=previewsmodesettings.kcfg
+ClassName=PreviewsModeSettings
+Singleton=false 
+Mutators=true
\ No newline at end of file
diff --git a/src/progressindicator.cpp b/src/progressindicator.cpp
new file mode 100644 (file)
index 0000000..a09552c
--- /dev/null
@@ -0,0 +1,80 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "progressindicator.h"
+#include "dolphin.h"
+#include "dolphinstatusbar.h"
+
+ProgressIndicator::ProgressIndicator(const QString& progressText,
+                                     const QString& finishedText,
+                                     int operationsCount)
+ :  m_showProgress(false),
+    m_operationsCount(operationsCount),
+    m_operationsIndex(0),
+    m_startTime(QTime::currentTime()),
+    m_finishedText(finishedText)
+{
+    DolphinStatusBar* statusBar = Dolphin::mainWin().activeView()->statusBar();
+    statusBar->clear();
+    statusBar->setProgressText(progressText);
+    statusBar->setProgress(0);
+}
+
+
+ProgressIndicator::~ProgressIndicator()
+{
+    DolphinStatusBar* statusBar = Dolphin::mainWin().activeView()->statusBar();
+    statusBar->setProgressText(QString::null);
+    statusBar->setProgress(100);
+    statusBar->setMessage(m_finishedText, DolphinStatusBar::OperationCompleted);
+
+    if (m_showProgress) {
+        Dolphin::mainWin().setEnabled(true);
+    }
+}
+
+void ProgressIndicator::execOperation()
+{
+    ++m_operationsIndex;
+
+    if (!m_showProgress) {
+        const int elapsed = m_startTime.msecsTo(QTime::currentTime());
+        if (elapsed > 500) {
+            // the operations took already more than 500 milliseconds,
+            // therefore show a progress indication
+            Dolphin::mainWin().setEnabled(false);
+            m_showProgress = true;
+        }
+    }
+
+    if (m_showProgress) {
+        const QTime currentTime = QTime::currentTime();
+        if (m_startTime.msecsTo(currentTime) > 100) {
+            m_startTime = currentTime;
+
+            DolphinStatusBar* statusBar = Dolphin::mainWin().activeView()->statusBar();
+            statusBar->setProgress((m_operationsIndex * 100) / m_operationsCount);
+            kapp->processEvents();
+            statusBar->repaint();
+        }
+    }
+}
+
+
diff --git a/src/progressindicator.h b/src/progressindicator.h
new file mode 100644 (file)
index 0000000..cc5c64a
--- /dev/null
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef PROGRESSINDICATOR_H
+#define PROGRESSINDICATOR_H
+
+#include <qdatetime.h>
+
+/**
+ * Allows to show a progress of synchronous operations. Sample code:
+ * \code
+ * const int operationsCount = 100;
+ * ProgressIndicator progressIndicator(i18n("Loading..."),
+ *                                     i18n("Loading finished."),
+ *                                     operationsCount);
+ * for (int i = 0; i < operationsCount; ++i) {
+ *     progressIndicator.execOperation();
+ *     // do synchronous operation...
+ * }
+ * \endcode
+ * The progress indicator takes care to show the progress bar only after
+ * a delay of around 500 milliseconds. This means if all operations are
+ * executing within 500 milliseconds, no progress bar is shown at all.
+ * As soon as the progress bar is shown, the application still may process
+ * events, but the the Dolphin main widget is disabled.
+ *
+ *     @author Peter Penz <peter.penz@gmx.at>
+ */
+class ProgressIndicator
+{
+public:
+    /**
+     * @param progressText      Text for the progress bar (e. g. "Loading...").
+     * @param finishedText      Text which is displayed after the operations have been finished
+     *                          (e. g. "Loading finished.").
+     * @param operationsCount   Number of operations.
+     */
+    ProgressIndicator(const QString& progressText,
+                      const QString& finishedText,
+                      int operationsCount);
+
+    /**
+     * Sets the progress to 100 % and displays the 'finishedText' property
+     *  in the status bar.
+     */
+    ~ProgressIndicator();
+
+    /**
+     * Increases the progress and should be invoked
+     * before each operation.
+     */
+    void execOperation();
+
+private:
+    bool m_showProgress;
+    int m_operationsCount;
+    int m_operationsIndex;
+    QTime m_startTime;
+    QString m_finishedText;
+};
+
+#endif
diff --git a/src/protocolcombo.cpp b/src/protocolcombo.cpp
new file mode 100644 (file)
index 0000000..b91b102
--- /dev/null
@@ -0,0 +1,114 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include <q3popupmenu.h>
+
+#include <kdebug.h>
+#include <kprotocolinfo.h>
+
+#include "protocolcombo.h"
+
+const static int customProtocolIndex = 0;
+
+ProtocolCombo::ProtocolCombo(const QString& protocol, URLNavigator* parent)
+    : URLNavigatorButton(-1, parent),
+      m_protocols(KProtocolInfo::protocols())
+{
+    qSort(m_protocols);
+    QStringList::iterator it = m_protocols.begin();
+    QStringList::iterator itEnd = m_protocols.end();
+    Q3PopupMenu* menu = new Q3PopupMenu(this);
+    while (it != itEnd)
+    {
+        //kdDebug() << "info for " << *it << " "
+        //          << KProtocolInfo::protocolClass(*it) << endl;
+        //TODO: wow this is ugly. or .. is it? ;) we need a way to determine
+        //      if a protocol is appropriate for use in a file manager. hum!
+        //if (KProtocolInfo::capabilities(*it).findIndex("filemanager") == -1)
+        if (KProtocolInfo::protocolClass(*it) == ":" ||
+            !KProtocolInfo::supportsWriting(*it))
+        {
+        //kdDebug() << "!!! removing " << *it << endl;
+            QStringList::iterator tempIt = it;
+            ++tempIt;
+            m_protocols.remove(it);
+            it = tempIt;
+        }
+        else
+        {
+            ++it;
+        }
+    }
+
+//    setEditable(true);
+//    menu->insertItem("", customProtocolIndex);
+//    menu->insertStringList(m_protocols);
+    int i = 0;
+    for (QStringList::const_iterator it = m_protocols.constBegin();
+         it != m_protocols.constEnd();
+         ++it, ++i)
+    {
+        menu->insertItem(*it, i);
+    }
+    //menu->insertItems(m_protocols);
+    connect(menu, SIGNAL(activated(int)), this, SLOT(setProtocol(int)));
+    setText(protocol);
+    setPopup(menu);
+    setFlat(true);
+}
+
+
+// #include <kurl.h>
+// #include "urlnavigator.h"
+void ProtocolCombo::setProtocol(const QString& protocol)
+{
+    setText(protocol);
+//    if (KProtocolInfo::isKnownProtocol(protocol))
+//     int index = m_protocols.findIndex(protocol);
+//     if (index == -1)
+//     {
+//         changeItem(protocol, customProtocolIndex);
+//         setCurrentItem(customProtocolIndex);
+//     }
+//     else
+//     {
+//         setCurrentItem(index + 1);
+//     }
+}
+
+void ProtocolCombo::setProtocol(int index)
+{
+    if (index < 0 || index > m_protocols.count())
+    {
+        return;
+    }
+
+    QString protocol = m_protocols[index];
+kdDebug() << "setProtocol " << index << " " << protocol << endl;
+    setText(protocol);
+    emit activated(protocol);
+/*    */
+}
+
+QString ProtocolCombo::currentProtocol() const
+{
+    return text(); //currentText();
+}
+
+#include "protocolcombo.moc"
diff --git a/src/protocolcombo.h b/src/protocolcombo.h
new file mode 100644 (file)
index 0000000..b043cc4
--- /dev/null
@@ -0,0 +1,51 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef PROTOCOLCOMBO_H
+#define PROTOCOLCOMBO_H
+
+//#include <qcombobox.h>
+#include "urlbutton.h"
+#include "urlnavigatorbutton.h"
+
+class URLNavigator;
+
+/**
+ * A combobox listing available protocols
+ */
+class ProtocolCombo : public URLNavigatorButton
+{
+    Q_OBJECT
+
+    public:
+        ProtocolCombo(const QString& protocol, URLNavigator* parent = 0);
+
+        QString currentProtocol() const;
+
+    public slots:
+        void setProtocol(const QString& protocol);
+        void setProtocol(int index);
+
+    signals:
+        void activated(const QString& protocol);
+
+    private:
+        QStringList m_protocols;
+};
+
+#endif
diff --git a/src/renamedialog.cpp b/src/renamedialog.cpp
new file mode 100644 (file)
index 0000000..301c027
--- /dev/null
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "renamedialog.h"
+#include <klocale.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <q3vbox.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <assert.h>
+#include <klineedit.h>
+
+RenameDialog::RenameDialog(const KUrl::List& items) :
+    KDialogBase(Plain, i18n("Rename Items"),
+                Ok|Cancel, Ok)
+{
+    setButtonOK(KGuiItem(i18n("Rename"), "apply"));
+
+    Q3VBoxLayout* topLayout = new Q3VBoxLayout(plainPage(), 0, spacingHint());
+    topLayout->setMargin(KDialog::marginHint());
+
+    const int itemCount = items.count();
+    QLabel* editLabel = new QLabel(i18n("Rename the %1 selected items to:").arg(itemCount),
+                                   plainPage());
+
+    m_lineEdit = new KLineEdit(plainPage());
+    m_newName = i18n("New name #");
+    assert(itemCount > 1);
+    QString postfix(items[0].prettyURL().section('.',1));
+    if (postfix.length() > 0) {
+        // The first item seems to have a postfix (e. g. 'jpg' or 'txt'). Now
+        // check whether all other items have the same postfix. If this is the
+        // case, add this postfix to the name suggestion.
+        postfix.insert(0, '.');
+        for (int i = 1; i < itemCount; ++i) {
+            if (!items[i].prettyURL().contains(postfix)) {
+                // at least one item does not have the same postfix
+                postfix.truncate(0);
+                break;
+            }
+        }
+    }
+
+    const int selectionLength = m_newName.length();
+    if (postfix.length() > 0) {
+        m_newName.append(postfix);
+    }
+    m_lineEdit->setText(m_newName);
+    m_lineEdit->setSelection(0, selectionLength - 1);
+    m_lineEdit->setFocus();
+
+    QLabel* infoLabel = new QLabel(i18n("(# will be replaced by ascending numbers)"), plainPage());
+
+    topLayout->addWidget(editLabel);
+    topLayout->addWidget(m_lineEdit);
+    topLayout->addWidget(infoLabel);
+}
+
+RenameDialog::~RenameDialog()
+{
+}
+
+void RenameDialog::slotOk()
+{
+    m_newName = m_lineEdit->text();
+    if (m_newName.contains('#') != 1) {
+        m_newName.truncate(0);
+    }
+
+    KDialogBase::slotOk();
+}
+
+#include "renamedialog.moc"
diff --git a/src/renamedialog.h b/src/renamedialog.h
new file mode 100644 (file)
index 0000000..5686d1f
--- /dev/null
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef RENAMEDIALOG_H
+#define RENAMEDIALOG_H
+
+#include <kdialog.h>
+#include <kurl.h>
+#include <qstring.h>
+
+class KLineEdit;
+
+/**
+ * @brief Dialog for renaming a variable number of files.
+ *
+ * The renaming is not done by the dialog, the invoker
+ * must do this itself:
+ * \code
+ * RenameDialog dialog(...);
+ * if (dialog.exec() == QDialog::Accepted) {
+ *     const QString& newName = dialog.newName();
+ *     // ... rename items corresponding to the new name
+ * }
+ * \endcode
+ * @author Peter Penz
+ */
+class RenameDialog : public KDialog
+{
+    Q_OBJECT
+
+public:
+    RenameDialog(const KUrl::List& items);
+    virtual ~RenameDialog();
+
+    /**
+     * Returns the new name of the items. If the returned string is not empty,
+     * then it is assured that the string contains exactly one character #,
+     * which should be replaced by ascending numbers. An empty string indicates
+     * that the user has removed the # character.
+     */
+    const QString& newName() const { return m_newName; }
+
+protected slots:
+    virtual void slotOk();
+
+private:
+    KLineEdit* m_lineEdit;
+    QString m_newName;
+};
+
+#endif
diff --git a/src/servicemenus/CMakeLists.txt b/src/servicemenus/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1971196
--- /dev/null
@@ -0,0 +1,15 @@
+
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}  )
+
+
+########### install files ###############
+
+install( FILES  amarok_append.desktop ark_compress.desktop ark_extract.desktop floppy_format.desktop imageconverter.desktop installfont.desktop isoservice.desktop jpegorient.desktop k3b_create_audio_cd.desktop k3b_create_video_cd.desktop k3b_write_bin_image.desktop k3b_write_iso_image.desktop mail_as_attachment.desktop media_eject.desktop media_mount.desktop media_realfolder.desktop media_safelyremove.desktop media_unmount.desktop open_in_digikam.desktop dolphin_su.desktop DESTINATION ${DATA_INSTALL_DIR}/dolphin/servicemenus )
+
+
+
+#original Makefile.am contents follow:
+
+#servicemenusdir = $(kde_datadir)/dolphin/servicemenus
+#servicemenus_DATA = amarok_append.desktop ark_compress.desktop ark_extract.desktop floppy_format.desktop imageconverter.desktop installfont.desktop isoservice.desktop jpegorient.desktop k3b_create_audio_cd.desktop k3b_create_video_cd.desktop k3b_write_bin_image.desktop k3b_write_iso_image.desktop mail_as_attachment.desktop media_eject.desktop media_mount.desktop media_realfolder.desktop media_safelyremove.desktop media_unmount.desktop open_in_digikam.desktop dolphin_su.desktop
+#
diff --git a/src/servicemenus/amarok_append.desktop b/src/servicemenus/amarok_append.desktop
new file mode 100644 (file)
index 0000000..75fddf8
--- /dev/null
@@ -0,0 +1,93 @@
+[Desktop Entry]
+ServiceTypes=application/asx,audio/*
+Actions=appendToPlaylist;appendAndPlay;queueTrack;
+X-KDE-Submenu=Amarok
+X-KDE-Submenu[bn]=আমারক
+X-KDE-Submenu[pa]=ਅਮਰੋਕ
+X-KDE-Submenu[xx]=xxAmarokxx
+
+[Desktop Action appendToPlaylist]
+Name=Append to Playlist
+Name[bg]=Добавяне към списъка с песни
+Name[bn]=সঙ্গীত-তালিকাতে সংযোজন করো
+Name[br]=Ouzhpennañ d'ar roll tonioù
+Name[cs]=Přidat do seznamu skladeb
+Name[da]=Tilføj til spilleliste
+Name[de]=An Amarok-Wiedergabeliste anhängen
+Name[el]=Προσθήκη στη λίστα αναπαραγωγής
+Name[et]=Lisa lugude nimekirja
+Name[fi]=Lisää soittolistaan
+Name[fr]=Ajouter à la liste de lecture
+Name[ga]=Iarcheangail le Seinmliosta
+Name[it]=Aggiungi alla playlist
+Name[ja]=プレイリストに追加
+Name[km]=បន្ថែម​ទៅ​ខាង​ចុង​បញ្ជីចាក់
+Name[nl]=Toevoegen aanafspeellijst
+Name[pa]=ਸੰਗੀਤ-ਸੂਚੀ 'ਚ ਸ਼ਾਮਲ
+Name[pl]=Dołącz do listy odtwarzania
+Name[pt]=Adicionar à Lista do Amarok
+Name[pt_BR]=Anexar à Lista de Músicas
+Name[sv]=Lägg till i spellistan
+Name[uk]=Додати до списку композицій
+Name[uz]=Қўшиқ рўйхатига қўшиш
+Name[xx]=xxAppend to Playlistxx
+Name[zh_CN]=追加到播放列表
+Icon=amarok
+Exec=amarok -e %U
+
+[Desktop Action appendAndPlay]
+Name=Append & Play
+Name[bg]=Добавяне и възпроизвеждане
+Name[bn]=সংযোজন করো এবং বাজাও
+Name[br]=Ouzhpennañ ha seniñ
+Name[cs]=Připojit a hrát
+Name[da]=Tilføj og spil
+Name[de]=Anhängen und abspielen
+Name[el]=Προσθήκη & αναπαραγωγή
+Name[et]=Lisa ja esita
+Name[fi]=Lisää soittolistaan ja toista
+Name[fr]=Ajouter & Écouter
+Name[ga]=Iarcheangail & Seinn
+Name[it]=Aggiungi & Riproduci
+Name[ja]=追加して再生
+Name[km]=បន្ថែម​ខាង​ចុង & ចាក់
+Name[nl]=Toevoegen en afspelen
+Name[pa]=ਜੋੜੋ ਅਤੇ ਚਲਾਓ
+Name[pl]=Dołącz i odtwórz
+Name[pt]=Adicionar & Reproduzir
+Name[pt_BR]=Anexar & Reproduzir
+Name[sv]=Lägg till och spela
+Name[uk]=Додати і програти
+Name[uz]=Қўшиш ва ўйнаш
+Name[xx]=xxAppend & Playxx
+Name[zh_CN]=追加并播放
+Icon=amarok
+Exec=dcop amarok playlist playMedia %U
+
+[Desktop Action queueTrack]
+Name=Queue Track
+Name[bg]=Добавяне и възпроизвеждане
+Name[bn]=গান সারিবদ্ধ করো
+Name[cs]=Zařadit skladbu
+Name[da]=Sæt spor i kø
+Name[de]=Stück in Warteschlange einstellen
+Name[el]=Εισαγωγή του κομματιού στην ουρά
+Name[et]=Sea pala järjekorda
+Name[fi]=Lisää jonoon
+Name[fr]=Ajouter à la file d'attente
+Name[ga]=Ciúáil Amhrán
+Name[it]=Accoda traccia
+Name[ja]=トラックをキュー
+Name[km]=ដាក់​បទ​ក្នុង​ជួរ
+Name[nl]=Track in wachtrij plaatsen
+Name[pa]=ਟਰੈਕ ਕਤਾਰ 'ਚ
+Name[pl]=Wstaw utwór do kolejki
+Name[pt]=Pôr a Faixa na Fila
+Name[pt_BR]=Faixa para Fila
+Name[sv]=Köa spår
+Name[uk]=Додати доріжку в чергу
+Name[uz]=Навбатга қўйиш
+Name[xx]=xxQueue Trackxx
+Name[zh_CN]=音轨排队
+Icon=amarok
+Exec=amarok --queue %U
diff --git a/src/servicemenus/ark_compress.desktop b/src/servicemenus/ark_compress.desktop
new file mode 100644 (file)
index 0000000..d4c0680
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+X-SuSE-translate=true
+Encoding=UTF-8
+ServiceTypes=inode/directory
+Actions=compressHere
+
+[Desktop Action compressHere]
+Name=Compress Here
+Name[de]=Hierher komprimieren
+Exec=ark --add-to %u %u.tar.gz
+Icon=ark
diff --git a/src/servicemenus/ark_extract.desktop b/src/servicemenus/ark_extract.desktop
new file mode 100644 (file)
index 0000000..50c04e8
--- /dev/null
@@ -0,0 +1,13 @@
+[Desktop Entry]
+X-SuSE-translate=true
+Encoding=UTF-8
+ServiceTypes=application/x-tbz,application/x-tgz
+Actions=extractHere
+
+[Desktop Action extractHere]
+Name=Extract Here
+Name[de]=Hierher extrahieren
+Exec=ark --extract-to %d %u
+Icon=ark
+
+
diff --git a/src/servicemenus/dolphin_su.desktop b/src/servicemenus/dolphin_su.desktop
new file mode 100644 (file)
index 0000000..a2d8bd4
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+ServiceTypes=inode/directory
+Actions=DolphinSU;
+
+[Desktop Action DolphinSU]
+ServiceTypes=inode/directory
+Name=Open as Root
+Name[de]=Öffne als Root
+Icon=dolphin
+Exec=kdesu -c 'dolphin %U'
diff --git a/src/servicemenus/floppy_format.desktop b/src/servicemenus/floppy_format.desktop
new file mode 100644 (file)
index 0000000..b175347
--- /dev/null
@@ -0,0 +1,36 @@
+[Desktop Action Format]
+Exec=kfloppy %u
+Icon=kfloppy
+Name=Format
+Name[bg]=Форматиране
+Name[br]=Furmadiñ
+Name[ca]=Dona format
+Name[cs]=Formátovat
+Name[cy]=Fformat
+Name[de]=Formatieren
+Name[eo]=Formato
+Name[es]=Formatear
+Name[fr]=Formater
+Name[ga]=Formáid
+Name[it]=Formatta
+Name[ja]=フォーマット
+Name[lt]=Formatas
+Name[nl]=Formatteren
+Name[pa]=ਫਾਰਮਿਟ
+Name[pl]=Formatuj
+Name[pt]=Formatar
+Name[pt_BR]=Formatar
+Name[ru]=Форматирование дискет
+Name[rw]=Imiterere
+Name[sr]=Форматирај
+Name[sr@Latn]=Formatiraj
+Name[sv]=Formatera
+Name[uk]=Форматування
+Name[xx]=xxFormatxx
+Name[zh_CN]=格式化
+
+[Desktop Entry]
+Actions=Format;
+ServiceTypes=media/floppy_unmounted,media/floppy5_unmounted
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
diff --git a/src/servicemenus/imageconverter.desktop b/src/servicemenus/imageconverter.desktop
new file mode 100644 (file)
index 0000000..941a20b
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Servicemenu image converter, by Jens Benecke <jens-kde@spamfreemail.de>.
+# Released under the same license as the KDE core distribution (GPL 2.0).
+#
+[Desktop Entry]
+ServiceTypes=image/*
+Actions=convToJPEG;convToPNG;convToGIF;convToTIF;
+X-KDE-Submenu=Convert To
+X-KDE-Submenu[bg]=Конвертиране в
+X-KDE-Submenu[ca]=Converteix a
+X-KDE-Submenu[cs]=Převést na
+X-KDE-Submenu[da]=Konvertér til
+X-KDE-Submenu[de]=Konvertieren nach
+X-KDE-Submenu[es]=Convertir a
+X-KDE-Submenu[fi]=Muunna
+X-KDE-Submenu[fr]=Convertir en
+X-KDE-Submenu[hu]=Átalakítás
+X-KDE-Submenu[is]=Umbreyta í
+X-KDE-Submenu[it]=Converti in
+X-KDE-Submenu[nb]=Konverter til
+X-KDE-Submenu[nl]=Converteren naar
+X-KDE-Submenu[pl]=Konwertuj do
+X-KDE-Submenu[pt]=Converter Para
+X-KDE-Submenu[pt_BR]=Converter Para
+X-KDE-Submenu[ru]=Сохранить как
+X-KDE-Submenu[sr]=Претвори у
+X-KDE-Submenu[sr@Latn]=Pretvori u
+X-KDE-Submenu[sv]=Konvertera till
+X-KDE-Submenu[uk]=Перетворити в
+X-KDE-Submenu[xx]=xxConvert Toxx
+X-KDE-Submenu[zh_CN]=转换为
+TryExec=convert
+
+[Desktop Action convToJPEG]
+Name=JPEG
+Name[hi]=जेपीईजी
+Name[xx]=xxJPEGxx
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.jpg"
+
+[Desktop Action convToPNG]
+Name=PNG
+Name[hi]=पीएनजी
+Name[xx]=xxPNGxx
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.png"
+
+[Desktop Action convToTIF]
+Name=TIF
+Name[hi]=टिफ़
+Name[xx]=xxTIFxx
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.tif"
+
+[Desktop Action convToGIF]
+Name=GIF
+Name[hi]=जिफ़
+Name[xx]=xxGIFxx
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.gif"
+
diff --git a/src/servicemenus/installfont.desktop b/src/servicemenus/installfont.desktop
new file mode 100644 (file)
index 0000000..3ca14fa
--- /dev/null
@@ -0,0 +1,143 @@
+[Desktop Entry]
+ServiceTypes=application/x-font-ttf,application/x-font-type1,application/x-font-speedo,application/x-font-bdf,application/x-font-pcf,application/x-font-snf,application/x-font-otf,application/x-font-ttc,application/x-afm
+Actions=installFont;
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action installFont]
+Name=Install
+Name[af]=Installeer
+Name[be]=Усталяваць
+Name[bg]=Инсталиране
+Name[bn]=ইনস্টল
+Name[br]=Staliañ
+Name[bs]=Instaliraj
+Name[ca]=Instal·la
+Name[cs]=Instalovat
+Name[cy]=Gosod
+Name[da]=Installér
+Name[de]=Installieren
+Name[el]=Εγκατάσταση
+Name[eo]=Instalu
+Name[es]=Instalar
+Name[et]=Paigaldamine
+Name[eu]=Instalatu
+Name[fa]=نصب
+Name[fi]=Asenna
+Name[fr]=Installer
+Name[fy]=Ynstallearje
+Name[ga]=Suiteáil
+Name[gl]=Instalar
+Name[he]=התקנה
+Name[hi]=संस्थापित
+#SUSE-Overwrite Name[hr]=Instaliraj
+Name[hu]=Telepítő
+Name[is]=Setja upp
+Name[it]=Installa
+Name[ja]=インストール
+Name[km]=ដំឡើង
+Name[lt]=Įdiegti
+Name[lv]=Instalēt
+Name[mk]=Инсталирај
+Name[ms]=Pasang
+Name[mt]=Installa
+Name[nb]=Installer
+Name[nds]=Installeren
+Name[nl]=Installeren
+Name[nn]=Installer
+Name[pa]=ਇੰਸਟਾਲ
+#SUSE-Overwrite Name[pl]=Instaluj
+Name[pl]=Zainstaluj
+Name[pt]=Instalar
+Name[pt_BR]=Instalar
+Name[ro]=Instalare
+Name[ru]=Установка
+Name[rw]=Kwinjizaporogaramu
+Name[se]=Sajáiduhte
+Name[sk]=Inštalácia
+Name[sl]=Namesti
+Name[sr]=Инсталирај
+Name[sr@Latn]=Instaliraj
+Name[sv]=Installera
+Name[ta]=நிறுவி
+Name[tg]=Гузоштан
+Name[th]=ติดตั้ง
+Name[tr]=Kur
+Name[tt]=Quyu
+Name[uk]=Встановлення
+Name[uz]=Ўрнатиш
+#SUSE-Overwrite Name[vi]=Cài đặt
+Name[zh_CN]=安装
+Name[zh_TW]=安裝
+Icon=fonts
+Exec=kfmclient copy %U fonts:/
+
diff --git a/src/servicemenus/isoservice.desktop b/src/servicemenus/isoservice.desktop
new file mode 100644 (file)
index 0000000..c637edd
--- /dev/null
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Encoding=UTF-8
+Actions=OpenISO
+ServiceTypes=inode/blockdevice,application/x-iso
+
+[Desktop Action OpenISO]
+Comment=ISO9660 View
+Comment[hu]=ISO9660 Nézet
+Comment[fr]=Lecteur ISO9660
+Icon=cd
+Name=ISO9660 View
+Name[hu]=ISO9660 Nézet
+Name[fr]=Lecteur ISO9660
+Exec=
\ No newline at end of file
diff --git a/src/servicemenus/jpegorient.desktop b/src/servicemenus/jpegorient.desktop
new file mode 100644 (file)
index 0000000..5b25d24
--- /dev/null
@@ -0,0 +1,222 @@
+[Desktop Entry]
+ServiceTypes=image/jpeg
+Actions=jpegRot90;jpegRot270;jpegFlipV;jpegFlipH;
+X-KDE-Submenu=Transform Image
+X-KDE-Submenu[bg]=Конвертиране на изображението
+X-KDE-Submenu[ca]=Transforma la imatge
+X-KDE-Submenu[cs]=Převést obrázek
+X-KDE-Submenu[da]=Transformér billede
+X-KDE-Submenu[de]=Bild transformieren
+X-KDE-Submenu[es]=Transformar imagen
+X-KDE-Submenu[fi]=Muuta kuva
+X-KDE-Submenu[fr]=Transformer l'image
+X-KDE-Submenu[hu]=Képátalakítás
+X-KDE-Submenu[is]=Ummynda
+X-KDE-Submenu[it]=Trasforma immagine
+X-KDE-Submenu[nb]=Transformer bilde
+X-KDE-Submenu[nl]=Afbeelding transformeren
+X-KDE-Submenu[pl]=Przekształć obrazek
+X-KDE-Submenu[pt]=Transformar a Imagem
+X-KDE-Submenu[pt_BR]=Transformar Imagem
+X-KDE-Submenu[ru]=Преобразовать
+X-KDE-Submenu[sr]=Трансформиши слику
+X-KDE-Submenu[sr@Latn]=Transformiši sliku
+X-KDE-Submenu[sv]=Ändra bild
+X-KDE-Submenu[uk]=Перетворити зображення
+X-KDE-Submenu[xx]=xxTransform Imagexx
+X-KDE-Submenu[zh_CN]=图像变形
+X-KDE-Require=Write
+
+[Desktop Action jpegRot90]
+Name=Rotate Clockwise
+Name[ar]=تدوير في اتجاه الساعة
+Name[az]=Saat Əqrəbi İstiqamətində Fırlat
+Name[bg]=Завъртане по посока на часов. стрелка
+Name[ca]=Gira 90 graus
+Name[cs]=Rotovat ve směru hod. ručiček
+Name[cy]=Cylchdroi yn Glocwedd
+Name[da]=Rotér med uret
+Name[de]=Im Uhrzeigersinn drehen (nach rechts)
+Name[el]=Περιστροφή δεξιόστροφα
+Name[es]=Girar en el sentido de las agujas del reloj
+Name[et]=Pööra päripäeva
+Name[eu]=Biratu erloju orratzen norabidean
+Name[fi]=Käännä myötäpäivään
+Name[fr]=Tourner en sens horaire
+Name[ga]=Rothlaigh go Deisealach
+Name[he]=סובב עם כיוון השעון
+Name[hi]=घड़ी की दिशा में घुमाएँ
+Name[hu]=Forgatás jobbra
+Name[is]=Snúa réttsælis
+Name[it]=Ruota in senso orario
+Name[ja]=右回りに回転します
+Name[nb]=Roter medurs
+Name[nl]=Klokgewijs draaien
+Name[nn]=Roter med klokka
+Name[pa]=ਸੱਜਾ ਦਾਅ ਘੁੰਮਾਉ
+Name[pl]=Obróć zgodnie z ruchem wskazówek zegara
+Name[pt]=Rodar no Sentido Horário
+Name[pt_BR]=Rodar Relógio Sentido Horário
+Name[ro]=Roteşte la dreapta
+Name[ru]=Повернуть по часовой стрелке
+Name[sk]=Otočiť v smere hodinových ručičiek
+Name[sl]=Zasuči v smeri urinega kazalca
+Name[sr]=Ротирај у смеру казаљке на часовнику
+Name[sr@Latn]=Rotiraj u smeru kazaljke na časovniku
+Name[sv]=Rotera medurs
+Name[ta]=வலதுபுறமாக சுழற்று
+Name[tg]=Чархиш бо ақрабаки соат
+Name[tr]=Saat Yönünde Döndürme
+Name[uk]=Обернути за годинниковою стрілкою
+Name[uz]=Соат кўрсатгичи бўйича айлантириш
+Name[xx]=xxRotate Clockwisexx
+Name[zh_CN]=顺时针旋转
+Icon=rotate_cw
+Exec=jpegorient +90 %F
+
+[Desktop Action jpegRot270]
+Name=Rotate Counter-Clockwise
+Name[ar]=تدوير عكس اتجاه الساعة
+Name[az]=Saat Əqrəbinə Tərs İstiqamətdə Fırlat
+Name[bg]=Завъртане обратно на часов. стрелка
+Name[ca]=Gira 270 graus
+Name[cs]=Rotovat proti směru hod. ručiček
+Name[cy]=Cylchdroi yn Wrthglocwedd
+Name[da]=Rotér mod uret
+Name[de]=Gegen den Uhrzeigersinn drehen (nach links)
+Name[el]=Περιστροφή αριστερόστροφα
+Name[en_GB]=Rotate Anti-Clockwise
+Name[es]=Girar en el sentido contrario a las agujas del reloj
+Name[et]=Pööra vastupäeva
+Name[eu]=Biratu erloju orratzen aurkako norabidean
+Name[fi]=Käännä vastapäivään
+Name[fr]=Tourner en sens anti-horaire
+Name[ga]=Rothlaigh go Tuathalach
+Name[he]=סובב נגד כיוון השעון
+Name[hi]=घड़ी की उलटी दिशा में घुमाएँ
+Name[hu]=Forgatás balra
+Name[is]=Snúa rangsælis
+Name[it]=Ruota in senso anti-orario
+Name[ja]=左回りに回転します
+Name[nb]=Roter moturs
+Name[nl]=Anti-klokgewijs draaien
+Name[nn]=Roter mot klokka
+Name[pa]=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ
+Name[pl]=Obróć przeciwnie do ruchu wskazówek zegara
+Name[pt]=Rodar no Sentido Anti-horário
+Name[pt_BR]=Rodar Contador de Relógio
+Name[ro]=Roteşte la stînga
+Name[ru]=Повернуть против часовой стрелки
+Name[sk]=Otočiť proti smeru hodinových ručičiek
+Name[sl]=Zasuči v nasportni smeri urinega kazalca
+Name[sr]=Ротирај супротно смеру казаљке на часовнику
+Name[sr@Latn]=Rotiraj suprotno smeru kazaljke na časovniku
+Name[sv]=Rotera moturs
+Name[ta]=கடிகார ஓட்டத்திற்கெதிராக சுழற்று
+Name[tg]=Чархиш ба муқобили ақрабаки соат
+Name[tr]=Sayacı Saat Yönünde Döndürme
+Name[uk]=Обернути проти годинникової стрілки
+Name[uz]=Соат кўрсатгичига қарши айлантириш
+Name[xx]=xxRotate Counter-Clockwisexx
+Name[zh_CN]=逆时针旋转
+Icon=rotate_ccw
+Exec=jpegorient +270 %F
+
+#[Desktop Action jpegRot180]
+#Name=Rotate 180
+#Icon=misc
+#Exec=jpegorient +180 %F
+
+[Desktop Action jpegFlipV]
+Name=Flip Vertically
+Name[ar]=تدوير رأسي
+Name[az]=Şaquli Olaraq Çevir
+Name[bg]=Вертикално обръщане
+Name[ca]=Torna vertical
+Name[cs]=Převrátit svisle
+Name[cy]=Troi Drosodd yn Fertigol
+Name[da]=Flip lodret
+Name[de]=Vertikal kippen
+Name[el]=Αναστροφή κατακόρυφα
+Name[es]=Reflejar verticalmente
+Name[et]=Keera ümber vertikaalselt
+Name[eu]=Buruz behera ipini
+Name[fi]=Käännä pystysuorassa
+Name[fr]=Retourner verticalement
+Name[ga]=Smeach go hIngearach
+Name[he]=שקף אנכית
+Name[hi]=खड़ा पलटें
+Name[hu]=Tükrözés függőlegesen
+Name[is]=Snúa við um miðju lóðrétt
+Name[it]=Fletti verticalmente
+Name[ja]=縦のフリップ
+Name[nb]=Speilvend loddrett
+Name[nl]=Verticaal omdraaien
+Name[nn]=Snu loddrett
+Name[pa]=ਲੰਬਕਾਰੀ ਝਟਕੋ
+Name[pl]=Odwróć pionowo
+Name[pt]=Trocar Verticalmente
+Name[pt_BR]=Refletir Verticalmente
+Name[ro]=Întoarce pe verticală
+Name[ru]=Отразить вертикально
+Name[sk]=Preklopiť vertikálne
+Name[sl]=Obrni navpično
+Name[sr]=Преврни усправно
+Name[sr@Latn]=Prevrni uspravno
+Name[sv]=Vänd vertikalt
+Name[ta]=மேல்கீழாக திருப்பு
+Name[tg]=Баргардондан ба амудӣ
+Name[tr]=Dik Olarak Dağıtma
+Name[uk]=Перекинути вертикально
+Name[uz]=Эни бўйича айлантириш
+Name[xx]=xxFlip Verticallyxx
+Name[zh_CN]=上下翻转
+Icon=2uparrow
+Exec=jpegorient v %F
+
+[Desktop Action jpegFlipH]
+Name=Flip Horizontally
+Name[ar]=تدوير أفقي
+Name[az]=Üfüqi Olaraq Çevir
+Name[bg]=Хоризонтално обръщане
+Name[ca]=Torna horitzontal
+Name[cs]=Převrátit vodorovně
+Name[cy]=Troi Drosodd yn Llorweddol
+Name[da]=Flip vandret
+Name[de]=Horizontal kippen
+Name[el]=Αναστροφή οριζόντια
+Name[es]=Reflejar horizontalmente
+Name[et]=Keera ümber horisontaalselt
+Name[eu]=Biratu horizontalki
+Name[fi]=Käännä vaakasuorassa
+Name[fr]=Retourner horizontalement
+Name[ga]=Smeach go Cothrománach
+Name[he]=שקף אופקית
+Name[hi]=आड़ा पलटें
+Name[hu]=Tükrözés vízszintesen
+Name[is]=Snúa við um miðju lárétt
+Name[it]=Fletti orizzontalmente
+Name[ja]=水平にフリップ
+Name[nb]=Speilvend vannrett
+Name[nl]=Horizontaal omdraaien
+Name[nn]=Snu vassrett
+Name[pa]=ਖਿਤਿਜੀ ਝਟਕੋ
+Name[pl]=Odwróć poziomo
+Name[pt]=Trocar Horizontalmente
+Name[pt_BR]=Refletir Horizontalmente
+Name[ro]=Întoarce pe orizontală
+Name[ru]=Отразить горизонтально
+Name[sk]=Preklopiť horizontálne
+Name[sl]=Obrni vodoravno
+Name[sr]=Преврни водоравно
+Name[sr@Latn]=Prevrni vodoravno
+Name[sv]=Vänd horisontellt
+Name[ta]=இடம்வலமாக திருப்புக
+Name[tg]=Баргардондан ба уфуқӣ
+Name[tr]=Yatay Olarak Dağıtma
+Name[uk]=Перекинути горизонтально
+Name[uz]=Бўйи бўйича айлантириш
+Name[xx]=xxFlip Horizontallyxx
+Name[zh_CN]=左右翻转
+Icon=2rightarrow
+Exec=jpegorient h %F
diff --git a/src/servicemenus/k3b_create_audio_cd.desktop b/src/servicemenus/k3b_create_audio_cd.desktop
new file mode 100644 (file)
index 0000000..efc1a79
--- /dev/null
@@ -0,0 +1,124 @@
+[Desktop Entry]
+Actions=CreateK3bAudioProject;
+Encoding=UTF-8
+ServiceTypes=audio/x-mp3,audio/x-vorbis,application/x-ogg,audio/x-mp2,audio/x-mpegurl,audio/x-wav,media/blankcd
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action CreateK3bAudioProject]
+Exec=k3b --audiocd %U
+Name=Create Audio CD with K3b...
+Name[af]=Skep oudio CD met K3b...
+Name[bg]=Създаване на аудио CD с K3b...
+Name[bn]=কে-থ্রি-বি দিয়ে অডিও সিডি তৈরি করো...
+Name[br]=Krouiñ ur CD klevet gant K3b ...
+Name[bs]=Napravio audio CD koristeći K3b...
+Name[ca]=Crea CD d'àudio amb K3b...
+Name[cs]=Vytvořit zvukové CD...
+#SUSE-Overwrite Name[da]=Lav lyd-cd med K3b...
+Name[da]=Lav lyd-CD med K3b...
+Name[de]=Audio-CD mit K3b erstellen ...
+Name[el]=Δημιουργία μουσικού CD με το K3b...
+Name[es]=Crear CD de audio con K3b...
+Name[et]=Kirjuta audio-CD K3b abil...
+Name[eu]=Sortu audio cdak K3b-rekin...
+Name[fr]=Créer un CD audio avec K3b...
+Name[he]=צור תקליטור שמע בעזרת K3b...
+Name[hi]=के3बी के साथ ऑडियो सीडी बनाए...
+Name[hu]=Hang-CD létrehozása a K3b-vel...
+Name[is]=Búa til hljóðdisk með K3b...
+Name[it]=Crea CD audio con K3b...
+#SUSE-Overwrite Name[ja]=オーディオ CD を K3b で作成...
+Name[ja]=K3bによるオーディオCDの作成...
+Name[lt]=Kurkite audio CD su K3b...
+Name[mk]=Креирајте аудио-CD со K3b...
+#SUSE-Overwrite Name[nb]=Lag lyd-CD med K3b . . .
+Name[nb]=Brenn lyd-CD-er med K3b...
+Name[nl]=Audio-cd aanmaken met K3b...
+Name[pa]=K3b ਨਾਲ ਆਡੀਓ CD ਬਣਾਓ...
+Name[pl]=Stwórz płytę CD Audio za pomocą K3b...
+Name[pt]=Criar um CD de Áudio com o K3b...
+Name[pt_BR]=Criar CD de Áudio com K3b...
+Name[ru]=Записать аудио компакт-диск, используя K3b...
+Name[sl]=Ustvari avdio CD s K3b ...
+Name[sr]=Направи аудио CD помоћу K3b-а...
+Name[sr@Latn]=Napravi audio CD pomoću K3b-a...
+Name[sv]=Skapa ljud-cd med K3b...
+Name[ta]=ஒலிக் குறுந்தகட்டோடு K3bயை உருவாக்குக...
+Name[tr]=K3b ile Ses CD'si oluştur...
+Name[uk]=Створити аудіо-КД за допомогою K3b...
+Name[zh_CN]=用 K3b 创建音频 CD...
+Icon=k3b
+
+Name[fi]=Luo ääni-CD K3b:llä
+Name[km]=បង្កើត​ស៊ីឌី​អូឌីយ៉ូ​ជាមួយ K3b...
+Name[zh_TW]=以 K3b 建立音效 CD...
diff --git a/src/servicemenus/k3b_create_video_cd.desktop b/src/servicemenus/k3b_create_video_cd.desktop
new file mode 100644 (file)
index 0000000..45cca6a
--- /dev/null
@@ -0,0 +1,125 @@
+[Desktop Entry]
+Actions=CreateK3bVcdProject;
+Encoding=UTF-8
+ServiceTypes=video/mpeg
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action CreateK3bVcdProject]
+Exec=k3b --videocd %F
+Name=Create Video CD with K3b...
+Name[af]=Skep video CD met K3b...
+Name[bg]=Създаване на видео CD с K3b...
+Name[bn]=কে-থ্রি-বি দিয়ে ভিডিও সিডি তৈরি করো...
+Name[br]=Krouiñ ur CD video gant K3b ...
+Name[bs]=Napravi video CD koristeći K3b...
+Name[ca]=Crea CD de vídeo amb K3b...
+Name[cs]=Vytvořit video CD...
+#SUSE-Overwrite Name[da]=Lav video-cd med K3b...
+Name[da]=Lav Video CD med K3b...
+Name[de]=Video-CD mit K3b erstellen ...
+Name[el]=Δημιουργία Video CD με το K3b...
+Name[es]=Crear Video CD con K3b...
+Name[et]=Kirjuta video-CD K3b abil...
+Name[eu]=Sortu Bideo CDak K3b-rekin...
+Name[fr]=Créer un CD vidéo avec K3b...
+Name[he]=צור תקליטורי וידאו VCD בעזרת K3b...
+Name[hi]=के3बी के साथ वीडियो सीडी बनाए...
+Name[hu]=Video-CD létrehozása a K3b-vel...
+Name[is]=Búa til vídeódisk með K3b...
+Name[it]=Crea Video CD con K3b...
+#SUSE-Overwrite Name[ja]=Video CD を K3b で作成...
+Name[ja]=K3bによるビデオCDの作成...
+Name[lt]=Kurkite video CD su K3b...
+Name[mk]=Креирајте видео-CD со K3b...
+#SUSE-Overwrite Name[nb]=Lag video-CD med K3b . . .
+Name[nb]=Brenn video-CD-er med K3b...
+Name[nl]=Video-cd aanmaken K3b...
+#SUSE-Overwrite Name[pa]=K3b ਨਾਲ ਵੀਡਿਓ CD ਬਣਾਓ...
+Name[pa]=K3b ਨਾਲ ਵੀਡਿਓ CD ਬਣਾਓ
+Name[pl]=Stwórz płytę Video CD za pomocą K3b...
+Name[pt]=Criar um Video CD com o K3b...
+Name[pt_BR]=Criar CD de Vídeo com K3b...
+Name[ru]=Записать видео компакт-диск, используя K3b...
+Name[sl]=Ustvari video CD s K3b ...
+Name[sr]=Направи видео CD помоћу K3b-а...
+Name[sr@Latn]=Napravi video CD pomoću K3b-a...
+Name[sv]=Skapa video-cd med K3b...
+Name[ta]=ஒளிக் குறுந்தகட்டோடு K3bஐ உருவாக்குக...
+Name[tr]=K3b ile Video CD'si oluştur...
+Name[uk]=Створити відео-КД за допомогою K3b...
+Name[zh_CN]=用 K3b 创建视频 CD...
+Icon=k3b
+
+Name[fi]=Luo video-CD K3b:llä
+Name[km]=បង្កើត​ស៊ីឌី​វីដេអូ​ជាមួយ K3b...
+Name[zh_TW]=以 K3b 建立視訊 CD...
diff --git a/src/servicemenus/k3b_write_bin_image.desktop b/src/servicemenus/k3b_write_bin_image.desktop
new file mode 100644 (file)
index 0000000..aaf7967
--- /dev/null
@@ -0,0 +1,124 @@
+[Desktop Entry]
+Actions=WriteCdImage;
+Encoding=UTF-8
+ServiceTypes=application/x-cue
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action WriteCdImage]
+Exec=k3b --cdimage %F
+Name=Write CD Image with K3b...
+Name[af]=Skryf CD beeld met K3b...
+Name[bg]=Запис на CD образ с K3b...
+Name[bn]=কে-থ্রি-বি দিয়ে সিডি ইমেজ লেখো...
+Name[br]=srivañ ar skeudenn CD gant K3b ...
+Name[bs]=Zapiši CD image koristeći K3b...
+Name[ca]=Escriu imatge per a CD amb K3b...
+Name[cs]=Vypálit obraz CD...
+#SUSE-Overwrite Name[da]=Skriv cd-billede med K3b...
+Name[da]=Skriv CD-billede med K3b...
+Name[de]=CD-Abbild mit K3b brennen ...
+Name[el]=Εγγραφή εικόνας CD με το K3b...
+Name[es]=Escribir imagen de CD con K3b...
+Name[et]=Kirjuta tõmmis K3b abil plaadile...
+Name[eu]=Idatzi CD irudiak K3b-rekin...
+Name[fr]=Graver une image CD avec K3b...
+Name[he]=כתוב תבנית CD בעזרת K3b...
+Name[hi]=के3बी के साथ सीडी इमेज लिखें...
+Name[hu]=CD-képmásfájl írása a K3b-vel...
+Name[is]=Skrifa diskmynd með K3b...
+Name[it]=Scrivi immagine CD con K3b...
+#SUSE-Overwrite Name[ja]=CD イメージを K3b で書き込み...
+Name[ja]=K3bによるCDイメージの書込み...
+Name[lt]=Įrašykite CD atvaizdą su K3b...
+Name[mk]=Запишете CD-слика со K3b...
+#SUSE-Overwrite Name[nb]=Skriv CD-bilde med K3b . . .
+Name[nb]=Brenn diskbilde på CD med K3b...
+Name[nl]=CD-image schrijven met K3b...
+Name[pa]=K3b ਨਾਲ CD ਪ੍ਰਤੀਬਿੰਬ ਲਿਖੋ...
+Name[pl]=Stwórz obraz płyty CD za pomocą K3b...
+Name[pt]=Escrever uma Imagem de CD com o K3b...
+Name[pt_BR]=Gravar Imagem em CD com K3b...
+Name[ru]=Записать образ CD, используя K3b...
+Name[sl]=Zapiši sliko CD-ja s K3b ...
+Name[sr]=Направи одраз CD-а помоћу K3b-а...
+Name[sr@Latn]=Napravi odraz CD-a pomoću K3b-a...
+Name[sv]=Skriv cd-avbild med K3b...
+Name[ta]=குறுந்தகட்டு நிழலுடன் K3bஐ உருவாக்குக...
+Name[tr]=K3b ile CD Kalıbı yazdır...
+Name[uk]=Записати штамп КД за допомогою K3b...
+Name[zh_CN]=用 K3b 刻录 CD 映像...
+Icon=k3b
+
+Name[fi]=Kirjoita CD-levynkuva K3b:llä
+Name[km]=សរសេរ​រូបភាព​ស៊ីឌី​ជាមួយ K3b...
+Name[zh_TW]=以 K3b 燒錄 CD 映像...
diff --git a/src/servicemenus/k3b_write_iso_image.desktop b/src/servicemenus/k3b_write_iso_image.desktop
new file mode 100644 (file)
index 0000000..8808f80
--- /dev/null
@@ -0,0 +1,124 @@
+[Desktop Entry]
+Actions=WriteCdImage;
+Encoding=UTF-8
+ServiceTypes=application/x-iso,inode/ISO-image
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action WriteCdImage]
+Exec=k3b --image %F
+Name=Write CD Image with K3b...
+Name[af]=Skryf CD beeld met K3b...
+Name[bg]=Запис на CD образ с K3b...
+Name[bn]=কে-থ্রি-বি দিয়ে সিডি ইমেজ লেখো...
+Name[br]=srivañ ar skeudenn CD gant K3b ...
+Name[bs]=Zapiši CD image koristeći K3b...
+Name[ca]=Escriu imatge per a CD amb K3b...
+Name[cs]=Vypálit obraz CD...
+#SUSE-Overwrite Name[da]=Skriv cd-billede med K3b...
+Name[da]=Skriv CD-billede med K3b...
+Name[de]=CD-Abbild mit K3b brennen ...
+Name[el]=Εγγραφή εικόνας CD με το K3b...
+Name[es]=Escribir imagen de CD con K3b...
+Name[et]=Kirjuta tõmmis K3b abil plaadile...
+Name[eu]=Idatzi CD irudiak K3b-rekin...
+Name[fr]=Graver une image CD avec K3b...
+Name[he]=כתוב תבנית CD בעזרת K3b...
+Name[hi]=के3बी के साथ सीडी इमेज लिखें...
+Name[hu]=CD-képmásfájl írása a K3b-vel...
+Name[is]=Skrifa diskmynd með K3b...
+Name[it]=Scrivi immagine CD con K3b...
+#SUSE-Overwrite Name[ja]=CD イメージを K3b で書き込み...
+Name[ja]=K3bによるCDイメージの書込み...
+Name[lt]=Įrašykite CD atvaizdą su K3b...
+Name[mk]=Запишете CD-слика со K3b...
+#SUSE-Overwrite Name[nb]=Skriv CD-bilde med K3b . . .
+Name[nb]=Brenn diskbilde på CD med K3b...
+Name[nl]=CD-image schrijven met K3b...
+Name[pa]=K3b ਨਾਲ CD ਪ੍ਰਤੀਬਿੰਬ ਲਿਖੋ...
+Name[pl]=Stwórz obraz płyty CD za pomocą K3b...
+Name[pt]=Escrever uma Imagem de CD com o K3b...
+Name[pt_BR]=Gravar Imagem em CD com K3b...
+Name[ru]=Записать образ CD, используя K3b...
+Name[sl]=Zapiši sliko CD-ja s K3b ...
+Name[sr]=Направи одраз CD-а помоћу K3b-а...
+Name[sr@Latn]=Napravi odraz CD-a pomoću K3b-a...
+Name[sv]=Skriv cd-avbild med K3b...
+Name[ta]=குறுந்தகட்டு நிழலுடன் K3bஐ உருவாக்குக...
+Name[tr]=K3b ile CD Kalıbı yazdır...
+Name[uk]=Записати штамп КД за допомогою K3b...
+Name[zh_CN]=用 K3b 刻录 CD 映像...
+Icon=k3b
+
+Name[fi]=Kirjoita CD-levynkuva K3b:llä
+Name[km]=សរសេរ​រូបភាព​ស៊ីឌី​ជាមួយ K3b...
+Name[zh_TW]=以 K3b 燒錄 CD 映像...
diff --git a/src/servicemenus/mail_as_attachment.desktop b/src/servicemenus/mail_as_attachment.desktop
new file mode 100644 (file)
index 0000000..f8a7c23
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+ServiceTypes=all/allfiles
+Actions=mail_as_attachment
+
+[Desktop Action mail_as_attachment]
+Name=Mail as Attachment...
+Name[de]=Verschicken als Anhang...
+Icon=mail_send
+Exec=kmail --attach %U
diff --git a/src/servicemenus/media_eject.desktop b/src/servicemenus/media_eject.desktop
new file mode 100644 (file)
index 0000000..151790f
--- /dev/null
@@ -0,0 +1,158 @@
+[Desktop Entry]
+ServiceTypes=media/cdrom_mounted,media/cdrom_unmounted,media/cdwriter_mounted,media/cdwriter_unmounted,media/dvd_mounted,media/dvd_unmounted,media/audiocd,media/blankcd,media/blankdvd,media/dvdvideo,media/svcd,media/vcd
+Actions=MediaEject;
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action MediaEject]
+Name=Eject
+Name[af]=Uitskiet
+Name[ar]=اخراج
+Name[az]=Çıxart
+Name[be]=Выняць
+Name[bg]=Изваждане
+Name[bn]=ইজেক্ট
+Name[br]=Stlepel
+Name[bs]=Izbaci
+Name[ca]=Expulsa
+Name[cs]=Vysunout
+Name[cy]=Allfwrw
+Name[da]=Skub ud
+Name[de]=Auswerfen
+Name[el]=Εξαγωγή
+Name[eo]=Eligo
+Name[es]=Expulsar
+Name[et]=Väljastamine
+Name[eu]=Kanporatu
+Name[fa]=اخراج
+Name[fi]=Poista
+Name[fr]=Éjecter
+Name[fy]=Utsmytknop
+Name[ga]=Díchuir
+Name[gl]=Expulsar
+Name[he]=הוצא
+Name[hi]=बाहर
+Name[hr]=Izbaci
+#SUSE-Overwrite Name[hu]=Kidobás
+Name[hu]=Kiadás
+Name[is]=Henda út
+Name[it]=Espelli
+Name[ja]=取り出し
+#SUSE-Overwrite Name[km]=ច្រាន​ចេញ
+Name[km]=ច្រានចេញ
+Name[ko]=꺼내기
+Name[lo]=ເອົາແຜ່ນອອກ
+Name[lt]=Išmesti
+Name[lv]=Izņemt
+Name[mk]=Извади
+Name[mn]=Гаргах
+Name[ms]=Lenting
+Name[mt]=Iftaħ
+Name[nb]=Løs ut
+Name[nds]=Rutsmieten
+Name[nl]=Uitwerpen
+Name[nn]=Løys ut
+Name[nso]=Ntsha
+Name[oc]=Expulsa
+Name[pa]=ਬਾਹਰ ਕੱਢੋ
+Name[pl]=Wysuń
+Name[pt]=Ejectar
+Name[pt_BR]=Ejetar
+Name[ro]=Ejectează
+Name[ru]=Извлечь CD
+Name[rw]=Gusohora
+Name[se]=Bálkes olggos
+Name[sk]=Vysunúť
+Name[sl]=Izvrzi
+Name[sr]=Избаци
+Name[sr@Latn]=Izbaci
+Name[ss]=Khafuna
+Name[sv]=Mata ut
+Name[ta]=வெளித்தள்
+Name[tg]=Ихроҷ
+Name[th]=เอาแผ่นออก
+Name[tr]=Çıkart
+Name[tt]=Çığar
+Name[uk]=Виштовхнути
+Name[uz]=Чиқариш
+Name[ven]=Bvisa
+Name[vi]=Đẩy ra
+Name[wa]=Fé rexhe
+Name[xh]=Khuphela ngaphandle
+Name[zh_CN]=弹出
+Name[zh_TW]=退出
+Name[zu]=Khipha
+Exec=kio_media_mounthelper -e %u
+
+
diff --git a/src/servicemenus/media_mount.desktop b/src/servicemenus/media_mount.desktop
new file mode 100644 (file)
index 0000000..12fa545
--- /dev/null
@@ -0,0 +1,155 @@
+[Desktop Entry]
+ServiceTypes=media/cdrom_unmounted,media/cdwriter_unmounted,media/dvd_unmounted,media/floppy5_unmounted,media/floppy_unmounted,media/hdd_unmounted,media/nfs_unmounted,media/removable_unmounted,media/smb_unmounted,media/zip_unmounted,media/camera_unmounted
+Actions=MediaMount;
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action MediaMount]
+Name=Mount
+Name[af]=Koppel
+Name[ar]=حمّل
+Name[az]=Bağla
+Name[bg]=Монтиране
+Name[bn]=মাউন্ট
+Name[br]=Marc'hañ
+Name[bs]=Montiraj
+Name[ca]=Munta
+Name[cs]=Připojit
+Name[cy]=Gosod
+Name[da]=Montér
+Name[de]=Laufwerk einbinden
+Name[el]=Προσάρτηση
+Name[eo]=Kroĉo
+Name[es]=Montar
+Name[et]=Ühenda
+Name[eu]=Muntatu
+Name[fa]=سوارکردن
+Name[fi]=Liitä
+Name[fr]=Monter
+Name[fy]=Oankeppelje (mount)
+Name[ga]=Feistigh
+Name[gl]=Montar
+Name[he]=חבר
+Name[hi]=माउन्ट
+Name[hr]=Montiraj
+Name[hsb]=montować
+Name[hu]=Csatlakoztatás
+Name[is]=Tengja
+Name[it]=Monta
+Name[ja]=マウント
+#SUSE-Overwrite Name[km]=រៀបចំ
+Name[km]=ម៉ោន
+Name[lo]=ຈໍພາບ
+Name[lt]=Montuoti
+Name[lv]=Piemontēt
+Name[mk]=Монтирај
+Name[mn]=Залгах
+Name[ms]=Lekap
+Name[mt]=Immonta
+Name[nb]=Monter
+Name[nds]=Inhangen
+Name[nl]=Aankoppelen (mount)
+Name[nn]=Monter
+Name[nso]=Nameletsa
+#SUSE-Overwrite Name[pa]=ਮਾਊਟ
+Name[pa]=ਮਾਊਂਟ
+Name[pl]=Zamontuj
+Name[pt]=Montar
+Name[pt_BR]=Montar
+Name[ro]=Montează
+Name[ru]=Монтировать
+Name[rw]=Gushyiramo
+Name[se]=Čana
+Name[sk]=Pripojiť
+Name[sl]=Priklopi
+Name[sr]=Монтирај
+Name[sr@Latn]=Montiraj
+Name[sv]=Montera
+Name[ta]=ஏற்று
+Name[tg]=Васл кунӣ
+Name[th]=เม้าทน์
+Name[tr]=Bağla
+Name[tt]=Bäyläp quy
+Name[uk]=Змонтувати
+Name[uz]=Улаш
+Name[ven]=Gonya
+Name[vi]=Gắn kết
+Name[wa]=Monter
+Name[xh]=Layisha
+Name[zh_CN]=挂载
+Name[zh_TW]=掛載
+Name[zu]=Yenyusa
+Exec=kio_media_mounthelper -m %u
+
+
diff --git a/src/servicemenus/media_realfolder.desktop b/src/servicemenus/media_realfolder.desktop
new file mode 100644 (file)
index 0000000..b53f546
--- /dev/null
@@ -0,0 +1,114 @@
+[Desktop Entry]
+ServiceTypes=media/cdrom_mounted,media/cdwriter_mounted,media/dvd_mounted,media/floppy5_mounted,media/floppy_mounted,media/hdd_mounted,media/nfs_mounted,media/smb_mounted,media/removable_mounted,media/zip_mounted
+Actions=MediaRealFolder
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action MediaRealFolder]
+Name=Open Medium System Folder
+Name[ca]=Obre la carpeta de mitjans del sistema
+Name[cs]=Otevřít systémovou složku média
+Name[da]=Åbn medium-system-mappen
+Name[de]=Systemordner des Mediums öffnen
+Name[el]=Άνοιγμα του φακέλου συστήματος του μέσου
+Name[es]=Abrir la carpeta del administrador de medios...
+Name[et]=Ava andmekandja süsteemi kataloog
+Name[eu]=Ireki euskarriaren kudeatzailea
+Name[fi]=Avaa mediajärjestelmän kansio
+Name[fr]=Dossier système d'ouverture de média
+Name[he]=פתח את תיקיית מדיית המערכת
+Name[hu]=A médiaanyagok rendszerkönyvtárának megnyitása
+Name[is]=Opin miðils kerfismappa
+Name[it]=Cartella di sistema per l'apertura di supporti
+Name[lt]=Atverti sisteminį įrenginio aplanką
+Name[nb]=Åpne systemmappe for medie
+Name[nl]=Systeemmap medium openen
+#SUSE-Overwrite Name[pa]=ਮੀਡੀਅਮ ਸਿਸਟਮ ਫੋਲਡਰ ਖੋਲੋ
+Name[pa]=ਮੀਡਿਅਮ ਸਿਸਟਮ ਫੋਲਡਰ ਖੋਲੋ
+Name[pl]=Otwórz folder systemowy mediów
+Name[pt]=Pasta de Sistema Média Aberto
+Name[pt_BR]=Abrir a Pasta de Mídias do Sistema
+Name[ru]=Открыть системную папку
+Name[sr]=Отвори системску фасциклу медијума
+Name[sr@Latn]=Otvori sistemsku fasciklu medijuma
+Name[sv]=Öppna mediumsystemkatalog
+Name[uk]=Відкрити системну теку носія
+Name[zh_CN]=打开介质系统文件夹
+Exec=kio_media_realfolder %u
+
+
+Name[bg]=Системна папка на Open Medium
+Name[ja]=オープン メディアシステムフォルダ
+Name[km]=បើក​ថត​ប្រព័ន្ធ​មេឌៀ
+Name[zh_TW]=開啟媒體系統資料夾
diff --git a/src/servicemenus/media_safelyremove.desktop b/src/servicemenus/media_safelyremove.desktop
new file mode 100644 (file)
index 0000000..7d1ccc2
--- /dev/null
@@ -0,0 +1,132 @@
+[Desktop Entry]
+ServiceTypes=media/removable_mounted,media/removable_unmounted,media/camera_mounted,media/camera_unmounted
+Actions=MediaSafelyRemove;
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action MediaSafelyRemove]
+Name=Safely Remove
+Name[af]=Verwyder veilig
+Name[bg]=Безопасно изваждане
+Name[bn]=নিরাপদভাবে সরাও
+Name[ca]=Extreu amb seguretat
+Name[cs]=Bezpečně odstranit
+Name[da]=Fjern sikkert
+Name[de]=Sicher entfernen
+Name[el]=Ασφαλής αφαίρεση
+Name[es]=Extracción segura
+Name[et]=Eemalda turvaliselt
+Name[eu]=Atera arriskurik gabe
+Name[fi]=Poista turvallisesti
+Name[fr]=Enlever en toute sécurité
+Name[fy]=Feilich ferwiderje
+Name[gl]=Eliminar de Maneira Segura
+Name[he]=שליפה בבטחה
+Name[hu]=Biztonságos leválasztás
+Name[is]=Fjarlægja öruggt
+Name[it]=Rimozione sicura
+Name[ja]=安全に取り除く
+#SUSE-Overwrite Name[km]=យកចេញ​ដោយ​សុវត្ថិភាព
+Name[km]=យក​ចេញ​ដោយ​សុវត្ថិភាព
+Name[lt]=Saugiai pašalinti
+Name[mk]=Отстрани безбедно
+Name[ms]=Buang Dengan Selamat
+Name[nb]=Sikker fjerning
+Name[nds]=Seker rutnehmen
+Name[nl]=Veilig verwijderen
+Name[nn]=Trygg fjerning
+#SUSE-Overwrite Name[pa]=ਸੁਰੱਖਿਅਤ ਹਟਾਓ
+Name[pa]=ਸੁਰੱਖਿਅਤ ਰੂਪ 'ਚ ਹਟਾਓ
+Name[pl]=Usuń w sposób bezpieczny
+Name[pt]=Retirar com Segurança
+Name[pt_BR]=Remover de Modo Seguro
+Name[ro]=Scoate în siguranţă
+Name[ru]=Безопасно извлечь
+Name[rw]=Gukuramo Neza
+Name[se]=Dorvvošlaš eretváldin
+Name[sl]=Varno odstrani
+Name[sr]=Безбедно уклони
+Name[sr@Latn]=Bezbedno ukloni
+Name[sv]=Säker urkoppling
+Name[ta]=பாதுகாப்பாக நீக்கு
+Name[th]=ถอดออกได้อย่างปลอดภัย
+Name[tr]=Güvenli Kaldır
+Name[tt]=İmin Çığaru
+Name[uk]=Безпечно вилучити
+Name[uz]=Эҳтиётлик билан узиш
+Name[zh_CN]=安全删除
+Name[zh_TW]=安全的移除
+Exec=kio_media_mounthelper -s %u
+
+
diff --git a/src/servicemenus/media_unmount.desktop b/src/servicemenus/media_unmount.desktop
new file mode 100644 (file)
index 0000000..b70e3a5
--- /dev/null
@@ -0,0 +1,155 @@
+[Desktop Entry]
+ServiceTypes=media/cdrom_mounted,media/cdwriter_mounted,media/dvd_mounted,media/floppy5_mounted,media/floppy_mounted,media/hdd_mounted,media/nfs_mounted,media/smb_mounted,media/zip_mounted,media/vcd,media/svcd,media/dvdvideo
+Actions=MediaUnmount;
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
+
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+X-SuSE-translate=true
+[Desktop Action MediaUnmount]
+Name=Unmount
+Name[af]=Ontkoppel
+Name[ar]=أزل التحميل
+Name[az]=Ayır
+Name[bg]=Демонтиране
+Name[bn]=আনমাউন্ট
+Name[br]=Divarc'hañ
+Name[bs]=Demontiraj
+Name[ca]= Desmunta
+Name[cs]=Odpojit
+Name[cy]=Dadosod
+Name[da]=Afmontér
+Name[de]=Laufwerkeinbindung lösen
+Name[el]=Αποπροσάρτηση
+Name[eo]=Malkroĉo
+Name[es]=Desmontar
+Name[et]=Lahuta
+Name[eu]=Desmuntatu
+Name[fa]=پیاده کردن
+Name[fi]=Irrota
+Name[fr]=Démonter (enlever de l'arborescence Linux)
+Name[fy]=Ofkeppelje (unmount)
+Name[ga]=Dífheistigh
+Name[gl]=Desmontar
+Name[he]=נתק
+Name[hi]=अनमाउन्ट
+Name[hr]=Demontiraj
+Name[hsb]=Wotmontować
+Name[hu]=Leválasztás
+Name[is]=Aftengja
+Name[it]=Smonta
+Name[ja]=マウント解除
+#SUSE-Overwrite Name[km]=មិន​រៀបចំ
+Name[km]=មិន​ម៉ោន
+Name[lo]=ຫັງກາລີ
+Name[lt]=Išmontuoti
+Name[lv]=Nomontēt
+Name[mk]=Демонтирај
+Name[mn]=Салгах
+Name[ms]=Nyahlekap
+Name[mt]=Żmonta
+Name[nb]=Avmonter
+Name[nds]=Afhangen
+Name[nl]=Afkoppelen (unmount)
+Name[nn]=Avmonter
+Name[nso]=Theosa
+#SUSE-Overwrite Name[pa]=ਅਨਮਾਉਟ
+Name[pa]=ਅਣ-ਮਾਊਂਟ
+Name[pl]=Odmontuj
+Name[pt]=Desmontar
+Name[pt_BR]=Desmontar
+Name[ro]=Demontează
+Name[ru]=Отмонтировать
+Name[rw]=Gukuramo
+Name[se]=Gálgga
+Name[sk]=Odpojiť
+Name[sl]=Odklopi
+Name[sr]=Демонтирај
+Name[sr@Latn]=Demontiraj
+Name[sv]=Avmontera
+Name[ta]=வெளியேற்று
+Name[tg]=Ҷудо кунӣ
+Name[th]=ยกเลิกเม้าทน์
+Name[tr]=Ayır
+Name[tt]=Bäyläwne çiş
+Name[uk]=Демонтувати
+Name[uz]=Узиш
+Name[ven]=Usa gonya
+Name[vi]=Gỡ
+Name[wa]=Dismonter
+Name[xh]=Sukuyilayisha
+Name[zh_CN]=卸载
+Name[zh_TW]=未掛載
+Name[zu]=Yehlisa
+Exec=kio_media_mounthelper -u %u
+
+
diff --git a/src/servicemenus/open_in_digikam.desktop b/src/servicemenus/open_in_digikam.desktop
new file mode 100644 (file)
index 0000000..658df91
--- /dev/null
@@ -0,0 +1,29 @@
+[Desktop Action OpenDigikam]
+Exec=digikam --download-from %u
+Icon=digikam
+Name=Open in Digikam
+
+Name[bg]=Отваряне в digiKam
+Name[cs]=Otevřít v digiKamu
+Name[el]=Άνοιξε στο Digikam
+Name[es]=Abrir en digiKam
+Name[fi]=Avaa digiKamissa
+Name[fr]=Ouvert dans Digikam
+Name[hu]=Megnyitás Digikammel
+Name[ja]=Digikamでオープン
+Name[km]=បើក​ក្នុង Digikam
+Name[nb]=Åpne i digiKam
+Name[nl]=Openen in digiKam
+Name[pa]=ਡਿਜ਼ੀਕੈਮ 'ਚ ਖੋਲੋ
+Name[pl]=Otwórz w Digikam
+Name[pt]=Abrir no DigiKam
+Name[pt_BR]=Aberto no Digikam
+Name[sv]=Öppna med Digikam
+Name[uk]=Відкрити в Digikam
+Name[zh_CN]=在 Digikam 中打开
+Name[zh_TW]=在 Digikam 中開啟
+[Desktop Entry]
+Actions=OpenDigikam;
+ServiceTypes=media/gphoto2camera,media/camera_mounted,media/camera_unmounted
+
+X-SuSE-translate=true
diff --git a/src/settingspagebase.cpp b/src/settingspagebase.cpp
new file mode 100644 (file)
index 0000000..40821c1
--- /dev/null
@@ -0,0 +1,33 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "settingspagebase.h"
+
+SettingsPageBase::SettingsPageBase(QWidget* parent) :
+    QWidget(parent)
+{
+}
+
+SettingsPageBase::~SettingsPageBase()
+{
+}
+
+
+#include "settingspagebase.moc"
diff --git a/src/settingspagebase.h b/src/settingspagebase.h
new file mode 100644 (file)
index 0000000..953be02
--- /dev/null
@@ -0,0 +1,46 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef SETTINGSPAGEBASE_H
+#define SETTINGSPAGEBASE_H
+
+#include <qwidget.h>
+
+/**
+ * @brief Base class for the settings pages of the Dolphin settings dialog.
+ *
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class SettingsPageBase : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SettingsPageBase(QWidget* parent);
+    virtual ~SettingsPageBase();
+
+    /**
+     * Must be implemented by a derived class to
+     * persistently store the settings.
+     */
+    virtual void applySettings() = 0;
+};
+
+#endif
diff --git a/src/sidebar.cpp b/src/sidebar.cpp
new file mode 100755 (executable)
index 0000000..de5b7be
--- /dev/null
@@ -0,0 +1,110 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "sidebar.h"
+
+#include <qlayout.h>
+#include <qpixmap.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <qcombobox.h>
+
+#include "dolphinsettings.h"
+#include "sidebarsettings.h"
+#include "bookmarkssidebarpage.h"
+#include "infosidebarpage.h"
+
+#include <assert.h>
+
+Sidebar::Sidebar(QWidget* parent) :
+    QWidget(parent),
+    m_pagesSelector(0),
+    m_page(0),
+    m_layout(0)
+{
+    m_layout = new Q3VBoxLayout(this);
+
+    m_pagesSelector = new QComboBox(this);
+    m_pagesSelector->insertItem(i18n("Information"));
+    m_pagesSelector->insertItem(i18n("Bookmarks"));
+
+    // Assure that the combo box has the same height as the URL navigator for
+    // a clean layout.
+    // TODO: the following 2 lines have been copied from the URLNavigator
+    // constructor (-> provide a shared height setting?)
+    QFontMetrics fontMetrics(font());
+    m_pagesSelector->setMinimumHeight(fontMetrics.height() + 8);
+
+    SidebarSettings* settings = DolphinSettings::instance().sidebarSettings();
+    const int selectedIndex = indexForName(settings->selectedPage());
+    m_pagesSelector->setCurrentItem(selectedIndex);
+    m_layout->addWidget(m_pagesSelector);
+
+    createPage(selectedIndex);
+
+    connect(m_pagesSelector, SIGNAL(activated(int)),
+            this, SLOT(createPage(int)));
+}
+
+Sidebar::~Sidebar()
+{
+}
+
+QSize Sidebar::sizeHint() const
+{
+    QSize size(QWidget::sizeHint());
+
+    SidebarSettings* settings = DolphinSettings::instance().sidebarSettings();
+    size.setWidth(settings->width());
+    return size;
+}
+
+void Sidebar::createPage(int index)
+{
+    if (m_page != 0) {
+        m_page->deleteLater();
+        m_page = 0;
+    }
+
+    switch (index) {
+        case 0: m_page = new InfoSidebarPage(this); break;
+        case 1: m_page = new BookmarksSidebarPage(this); break;
+        default: break;
+    }
+
+    m_layout->addWidget(m_page);
+    m_page->show();
+
+    SidebarSettings* settings = DolphinSettings::instance().sidebarSettings();
+    settings->setSelectedPage(m_pagesSelector->text(index));
+}
+
+int Sidebar::indexForName(const QString& name) const
+{
+    const int count = m_pagesSelector->count();
+    for (int i = 0; i < count; ++i) {
+        if (m_pagesSelector->text(i) == name) {
+            return i;
+        }
+    }
+
+    return 0;
+}
diff --git a/src/sidebar.h b/src/sidebar.h
new file mode 100755 (executable)
index 0000000..2ba984e
--- /dev/null
@@ -0,0 +1,66 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef _SIDEBAR_H_
+#define _SIDEBAR_H_
+
+#include <qwidget.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+
+class KURL;
+class QComboBox;
+class Q3VBoxLayout;
+class SidebarPage;
+
+/**
+ * @brief The sidebar allows to access bookmarks, history items and TODO...
+ *
+ * TODO
+ */
+class Sidebar : public QWidget
+{
+       Q_OBJECT
+
+public:
+    Sidebar(QWidget* parent);
+    virtual ~Sidebar();
+
+    virtual QSize sizeHint() const;
+
+signals:
+       /**
+        * The user selected an item on sidebar widget and item has
+        * URL property, so inform the parent togo to this URL;
+        */
+       void urlChanged(const KURL& url);
+
+private slots:
+    void createPage(int index);
+
+private:
+    int indexForName(const QString& name) const;
+
+    QComboBox* m_pagesSelector;
+    SidebarPage* m_page;
+    Q3VBoxLayout* m_layout;
+};
+
+#endif // _SIDEBAR_H_
diff --git a/src/sidebarpage.cpp b/src/sidebarpage.cpp
new file mode 100644 (file)
index 0000000..c58025c
--- /dev/null
@@ -0,0 +1,36 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "sidebarpage.h"
+#include "dolphin.h"
+
+SidebarPage::SidebarPage(QWidget* parent) :
+    QWidget(parent)
+{
+    connect(&Dolphin::mainWin(), SIGNAL(activeViewChanged()),
+            this, SLOT(activeViewChanged()));
+}
+
+SidebarPage::~SidebarPage()
+{
+}
+
+void SidebarPage::activeViewChanged()
+{
+}
diff --git a/src/sidebarpage.h b/src/sidebarpage.h
new file mode 100644 (file)
index 0000000..50a7b59
--- /dev/null
@@ -0,0 +1,49 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
+ *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef _SIDEBARPAGE_H_
+#define _SIDEBARPAGE_H_
+
+#include <qwidget.h>
+
+class Sidebar;
+
+/**
+ * @brief Base widget for all pages that can be embedded into the Sidebar.
+ *
+ * TODO
+ */
+class SidebarPage : public QWidget
+{
+       Q_OBJECT
+
+public:
+    SidebarPage(QWidget* parent);
+    virtual ~SidebarPage();
+
+protected slots:
+    /**
+     * Is invoked whenever the active view from Dolphin has been changed.
+     * The active view can be retrieved by Dolphin::mainWin().activeView();
+     */
+    virtual void activeViewChanged();
+};
+
+#endif // _SIDEBARPAGE_H_
diff --git a/src/sidebarsettings.kcfg b/src/sidebarsettings.kcfg
new file mode 100644 (file)
index 0000000..e3f7211
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg> 
+    <kcfgfile name="dolphinrc"/>
+    <group name="Sidebar">
+        <entry name="SelectedPage" type="String">
+            <label>Selected page</label>
+            <default>Information</default>
+        </entry>
+        <entry name="Visible" type="Bool">
+            <label>Is the sidebar visible</label>
+            <default>true</default>
+        </entry>
+        <entry name="Width" type="Int">
+            <label>Sidebar with</label>
+            <default>150</default>
+        </entry>
+    </group>
+</kcfg>
\ No newline at end of file
diff --git a/src/sidebarsettings.kcfgc b/src/sidebarsettings.kcfgc
new file mode 100644 (file)
index 0000000..2b6e078
--- /dev/null
@@ -0,0 +1,4 @@
+File=sidebarsettings.kcfg
+ClassName=SidebarSettings
+Singleton=false 
+Mutators=true
\ No newline at end of file
diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp
new file mode 100644 (file)
index 0000000..9465f6d
--- /dev/null
@@ -0,0 +1,219 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "statusbarmessagelabel.h"
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qfontmetrics.h>
+//Added by qt3to4:
+#include <QPixmap>
+#include <QResizeEvent>
+#include <QPaintEvent>
+#include <kiconloader.h>
+#include <kglobalsettings.h>
+
+StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) :
+    QWidget(parent),
+    m_type(DolphinStatusBar::Default),
+    m_state(Default),
+    m_illumination(0),
+    m_minTextHeight(-1),
+    m_timer(0)
+{
+    setMinimumHeight(KIcon::SizeSmall);
+
+    m_timer = new QTimer(this);
+    connect(m_timer, SIGNAL(timeout()),
+            this, SLOT(timerDone()));
+}
+
+StatusBarMessageLabel::~StatusBarMessageLabel()
+{
+}
+
+void StatusBarMessageLabel::setType(DolphinStatusBar::Type type)
+{
+    if (type != m_type) {
+        m_type = type;
+
+        m_timer->stop();
+        m_illumination = 0;
+        m_state = Default;
+
+        const char* iconName = 0;
+        QPixmap pixmap;
+        switch (type) {
+            case DolphinStatusBar::OperationCompleted:
+                iconName = "ok";
+                break;
+
+            case DolphinStatusBar::Information:
+                iconName = "info";
+                break;
+
+            case DolphinStatusBar::Error:
+                iconName = "error";
+                m_timer->start(100);
+                m_state = Illuminate;
+                break;
+
+            case DolphinStatusBar::Default:
+            default: break;
+        }
+
+        m_pixmap = (iconName == 0) ? QPixmap() : SmallIcon(iconName);
+        assureVisibleText();
+        update();
+    }
+}
+
+void StatusBarMessageLabel::setText(const QString& text)
+{
+    if (text != m_text) {
+        if (m_type == DolphinStatusBar::Error) {
+            m_timer->start(100);
+            m_illumination = 0;
+            m_state = Illuminate;
+        }
+        m_text = text;
+        assureVisibleText();
+        update();
+    }
+}
+
+void StatusBarMessageLabel::setMinimumTextHeight(int min)
+{
+    if (min != m_minTextHeight) {
+        m_minTextHeight = min;
+        setMinimumHeight(min);
+    }
+}
+
+void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */)
+{
+    QPixmap buffer(size());
+    QPainter painter(&buffer);
+
+    // draw background
+    QColor backgroundColor(colorGroup().background());
+    QColor foregroundColor(KGlobalSettings::textColor());
+    if (m_illumination > 0) {
+        backgroundColor = mixColors(backgroundColor, QColor(255, 255, 64), m_illumination);
+        foregroundColor = mixColors(foregroundColor, QColor(0, 0, 0), m_illumination);
+    }
+    painter.setBrush(backgroundColor);
+    painter.setPen(backgroundColor);
+    painter.drawRect(QRect(0, 0, width(), height()));
+
+    // draw pixmap
+    int x = pixmapGap();
+    int y = (height() - m_pixmap.height()) / 2;
+
+    if (!m_pixmap.isNull()) {
+        painter.drawPixmap(x, y, m_pixmap);
+        x += m_pixmap.width() + pixmapGap();
+    }
+
+    // draw text
+    painter.setPen(foregroundColor);
+    painter.drawText(QRect(x, 0, width() - x, height()), Qt::AlignVCenter | Qt::WordBreak, m_text);
+    painter.end();
+
+    bitBlt(this, 0, 0, &buffer);
+}
+
+void StatusBarMessageLabel::resizeEvent(QResizeEvent* event)
+{
+    QWidget::resizeEvent(event);
+    QTimer::singleShot(0, this, SLOT(assureVisibleText()));
+}
+
+void StatusBarMessageLabel::timerDone()
+{
+    switch (m_state) {
+        case Illuminate: {
+            // increase the illumination
+            if (m_illumination < 100) {
+                m_illumination += 20;
+                update();
+            }
+            else {
+                m_state = Illuminated;
+                m_timer->start(1000);
+            }
+            break;
+        }
+
+        case Illuminated: {
+            // start desaturation
+            m_state = Desaturate;
+            m_timer->start(100);
+            break;
+        }
+
+        case Desaturate: {
+            // desaturate
+            if (m_illumination > 0) {
+                m_illumination -= 5;
+                update();
+            }
+            else {
+                m_state = Default;
+                m_timer->stop();
+            }
+            break;
+        }
+
+        default:
+            break;
+    }
+}
+
+void StatusBarMessageLabel::assureVisibleText()
+{
+    if (m_text.isEmpty()) {
+        return;
+    }
+
+
+    int availableWidth = width() - m_pixmap.width() - pixmapGap() * 2;
+
+    QFontMetrics fontMetrics(font());
+    QRect bounds(fontMetrics.boundingRect(0, 0, availableWidth, height(),
+                                          Qt::AlignVCenter | Qt::TextWordWrap,
+                                          m_text));
+    int requiredHeight = bounds.height();
+    if (requiredHeight < m_minTextHeight) {
+        requiredHeight = m_minTextHeight;
+    }
+    setMinimumHeight(requiredHeight);
+    updateGeometry();
+}
+
+QColor StatusBarMessageLabel::mixColors(const QColor& c1,
+                                        const QColor& c2,
+                                        int percent) const
+{
+    const int recip = 100 - percent;
+    const int red   = (c1.red()   * recip + c2.red()   * percent) / 100;
+    const int green = (c1.green() * recip + c2.green() * percent) / 100;
+    const int blue  = (c1.blue()  * recip + c2.blue()  * percent) / 100;
+    return QColor(red, green, blue);
+}
diff --git a/src/statusbarmessagelabel.h b/src/statusbarmessagelabel.h
new file mode 100644 (file)
index 0000000..456dab8
--- /dev/null
@@ -0,0 +1,95 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef STATUSBARMESSAGELABEL_H
+#define STATUSBARMESSAGELABEL_H
+
+#include <qwidget.h>
+#include <qpixmap.h>
+#include <qstring.h>
+//Added by qt3to4:
+#include <QPaintEvent>
+#include <QResizeEvent>
+#include <dolphinstatusbar.h>
+class QTimer;
+
+/**
+ * @brief Represents a message text label as part of the status bar.
+ *
+ * Dependant from the given type automatically a corresponding icon
+ * is shown in front of the text. For message texts having the type
+ * DolphinStatusBar::Error a dynamic color blending is done to get the
+ * attention from the user.
+ *
+ * @author Peter Penz
+ */
+class StatusBarMessageLabel : public QWidget
+{
+    Q_OBJECT
+
+public:
+    StatusBarMessageLabel(QWidget* parent);
+    virtual ~StatusBarMessageLabel();
+
+    void setType(DolphinStatusBar::Type type);
+    DolphinStatusBar::Type type() const { return m_type; }
+
+    void setText(const QString& text);
+    const QString& text() const { return m_text; }
+
+    // TODO: maybe a better approach is possible with the size hint
+    void setMinimumTextHeight(int min);
+    int minimumTextHeight() const { return m_minTextHeight; }
+
+protected:
+    /** @see QWidget::paintEvent */
+    virtual void paintEvent(QPaintEvent* event);
+
+    /** @see QWidget::resizeEvent */
+    virtual void resizeEvent(QResizeEvent* event);
+
+private slots:
+    void timerDone();
+    void assureVisibleText();
+
+private:
+    enum State {
+        Default,
+        Illuminate,
+        Illuminated,
+        Desaturate
+    };
+
+    DolphinStatusBar::Type m_type;
+    State m_state;
+    int m_illumination;
+    int m_minTextHeight;
+    QTimer* m_timer;
+    QString m_text;
+    QPixmap m_pixmap;
+
+    QColor mixColors(const QColor& c1,
+                     const QColor& c2,
+                     int percent) const;
+
+    int pixmapGap() const { return 3; }
+};
+
+#endif
diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp
new file mode 100644 (file)
index 0000000..ddcf1b7
--- /dev/null
@@ -0,0 +1,195 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at) and              *
+ *   and Patrice Tremblay                                                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "statusbarspaceinfo.h"
+
+#include <qpainter.h>
+#include <qtimer.h>
+//Added by qt3to4:
+#include <QPaintEvent>
+#include <kglobalsettings.h>
+#include <kdiskfreesp.h>
+#include <klocale.h>
+#include <kio/job.h>
+
+StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) :
+    QWidget(parent),
+    m_gettingSize(false),
+    m_kBSize(0),
+    m_kBAvailable(0)
+{
+    setMinimumWidth(200);
+
+    // Update the space information each 10 seconds. Polling is useful
+    // here, as files can be deleted/added outside the scope of Dolphin.
+    QTimer* timer = new QTimer(this);
+    connect(timer, SIGNAL(timeout()), this, SLOT(refresh()));
+    timer->start(10000);
+}
+
+StatusBarSpaceInfo::~StatusBarSpaceInfo()
+{
+}
+
+void StatusBarSpaceInfo::setURL(const KUrl& url)
+{
+    m_url = url;
+    refresh();
+    update();
+}
+
+void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* event */)
+{
+    QPainter painter(this);
+    const int barWidth = width();
+    const int barTop = 2;
+    const int barHeight = height() - 4;
+
+    QString text;
+
+    const int widthDec = 3;  // visual decrement for the available width
+
+    const QColor c1 = colorGroup().background();
+    const QColor c2 = KGlobalSettings::buttonTextColor();
+    const QColor frameColor((c1.red()   + c2.red())   / 2,
+                            (c1.green() + c2.green()) / 2,
+                            (c1.blue()  + c2.blue())  / 2);
+    painter.setPen(frameColor);
+
+    const QColor backgrColor = KGlobalSettings::baseColor();
+    painter.setBrush(backgrColor);
+
+    painter.drawRect(QRect(0, barTop + 1 , barWidth - widthDec, barHeight));
+
+    if ((m_kBSize > 0) && (m_kBAvailable > 0)) {
+        // draw 'used size' bar
+        painter.setPen(Qt::NoPen);
+        painter.setBrush(progressColor(backgrColor));
+        int usedWidth = barWidth - static_cast<int>((m_kBAvailable *
+                                                    static_cast<float>(barWidth)) / m_kBSize);
+        const int left = 1;
+        int right = usedWidth - (widthDec + 1);
+        if (right < left) {
+            right = left;
+        }
+        painter.drawRect(QRect(left, barTop + 2, right, barHeight - 2));
+
+        text = i18n("%1% of %2 used")
+               .arg( 100 - (int)(100.0 * m_kBAvailable / m_kBSize))
+               .arg(KIO::convertSizeFromKB(m_kBSize));
+    }
+    else {
+        if (m_gettingSize) {
+            text = i18n("Getting size...");
+        }
+        else {
+            text = "";
+            QTimer::singleShot(0, this, SLOT(hide()));
+        }
+    }
+
+    // draw text (usually 'X% of Y GB used')
+    painter.setPen(KGlobalSettings::textColor());
+    painter.drawText(QRect(1, 1, barWidth - 2, barHeight + 4),
+                     Qt::AlignHCenter | Qt::AlignVCenter | Qt::WordBreak,
+                     text);
+}
+
+
+void StatusBarSpaceInfo::slotFoundMountPoint(const unsigned long& kBSize,
+                                             const unsigned long& /* kBUsed */,
+                                             const unsigned long& kBAvailable,
+                                             const QString& /* mountPoint */)
+{
+    m_gettingSize = false;
+    m_kBSize = kBSize;
+    m_kBAvailable = kBAvailable;
+
+    // Bypass a the issue (?) of KDiskFreeSp that for protocols like
+    // FTP, SMB the size of root partition is returned.
+    // TODO: check whether KDiskFreeSp is buggy or Dolphin uses it in a wrong way
+    const QString protocol(m_url.protocol());
+    if (!protocol.isEmpty() && (protocol != "file")) {
+        m_kBSize = 0;
+        m_kBAvailable = 0;
+    }
+
+    update();
+}
+
+void StatusBarSpaceInfo::slotDone()
+{
+    m_gettingSize = false;
+    if ((m_kBSize > 0) && (m_kBAvailable > 0)) {
+       show();
+    }
+
+    update();
+}
+
+void StatusBarSpaceInfo::refresh()
+{
+    m_gettingSize = true;
+    m_kBSize = 0;
+    m_kBAvailable = 0;
+
+    const QString mountPoint(KIO::findPathMountPoint(m_url.path()));
+
+    KDiskFreeSp* job = new KDiskFreeSp(this);
+    connect(job, SIGNAL(foundMountPoint(const unsigned long&,
+                                        const unsigned long&,
+                                        const unsigned long&,
+                                        const QString& )),
+            this, SLOT(slotFoundMountPoint(const unsigned long&,
+                                           const unsigned long&,
+                                           const unsigned long&,
+                                           const QString& )));
+    connect(job, SIGNAL(done()),
+            this, SLOT(slotDone()));
+
+    job->readDF(mountPoint);
+}
+
+QColor StatusBarSpaceInfo::progressColor(const QColor& bgColor) const
+{
+    QColor color = KGlobalSettings::buttonBackground();
+
+    // assure that enough contrast is given between the background color
+    // and the progressbar color
+    int bgRed   = bgColor.red();
+    int bgGreen = bgColor.green();
+    int bgBlue  = bgColor.blue();
+
+    const int backgrBrightness = qGray(bgRed, bgGreen, bgBlue);
+    const int progressBrightness = qGray(color.red(), color.green(), color.blue());
+
+    const int limit = 32;
+    const int diff = backgrBrightness - progressBrightness;
+    bool adjustColor = ((diff >= 0) && (diff <  limit)) ||
+                       ((diff  < 0) && (diff > -limit));
+    if (adjustColor) {
+        const int inc = (backgrBrightness < 2 * limit) ? (2 * limit) : -limit;
+        color = QColor(bgRed + inc, bgGreen + inc, bgBlue + inc);
+    }
+
+    return color;
+}
+
+#include "statusbarspaceinfo.moc"
diff --git a/src/statusbarspaceinfo.h b/src/statusbarspaceinfo.h
new file mode 100644 (file)
index 0000000..195c197
--- /dev/null
@@ -0,0 +1,81 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at) and              *
+ *   and Patrice Tremblay                                                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef STATUSBARSPACEINFO_H
+#define STATUSBARSPACEINFO_H
+
+#include <qwidget.h>
+#include <qstring.h>
+//Added by qt3to4:
+#include <QPaintEvent>
+#include <kurl.h>
+#include <qcolor.h>
+
+class KDiskFreeSp;
+
+/**
+ * @short Shows the available space for the current volume as part
+ *        of the status bar.
+ */
+class StatusBarSpaceInfo : public QWidget
+{
+    Q_OBJECT
+
+public:
+    StatusBarSpaceInfo(QWidget* parent);
+    virtual ~StatusBarSpaceInfo();
+
+    void setURL(const KUrl& url);
+    const KUrl& url() const { return m_url; }
+
+protected:
+    /** @see QWidget::paintEvent */
+    virtual void paintEvent(QPaintEvent* event);
+
+private slots:
+    /**
+     * The strange signature of this method is due to a compiler
+     * bug (?). More details are given inside the class KDiskFreeSp (see
+     * KDE Libs documentation).
+     */
+    void slotFoundMountPoint(const unsigned long& kBSize,
+                             const unsigned long& kBUsed,
+                             const unsigned long& kBAvailable,
+                             const QString& mountPoint);
+    void slotDone();
+
+    /** Refreshs the space information for the current set URL. */
+    void refresh();
+
+private:
+    /**
+     * Returns a color for the progress bar by respecting
+     * the given background color \a bgColor. It is assured
+     * that enough contrast is given to have a visual indication.
+     */
+    QColor progressColor(const QColor& bgColor) const;
+
+    KUrl m_url;
+    bool m_gettingSize;
+    unsigned long m_kBSize;
+    unsigned long m_kBAvailable;
+
+};
+
+#endif
diff --git a/src/undomanager.cpp b/src/undomanager.cpp
new file mode 100644 (file)
index 0000000..4173b3c
--- /dev/null
@@ -0,0 +1,402 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "undomanager.h"
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <qtimer.h>
+#include <assert.h>
+
+#include "dolphin.h"
+#include "dolphinstatusbar.h"
+#include "progressindicator.h"
+
+DolphinCommand::DolphinCommand() :
+    m_type(Copy),
+    m_macroIndex(-1)
+{
+    // Implementation note: DolphinCommands are stored in a QValueList, whereas
+    // QValueList requires a default constructor of the added class.
+    // Instead of expressing this implementation detail to the interface by adding a
+    // Type::Undefined just Type::Copy is used to assure that all members have
+    // a defined state.
+}
+
+DolphinCommand::DolphinCommand(Type type,
+                              const KUrl::List& source,
+                              const KUrl& dest) :
+    m_type(type),
+    m_macroIndex(-1),
+    m_source(source),
+    m_dest(dest)
+{
+}
+
+DolphinCommand::~DolphinCommand()
+{
+}
+
+DolphinCommand& DolphinCommand::operator = (const DolphinCommand& command)
+{
+    m_type = command.m_type;
+    m_source = command.m_source;
+    m_dest = command.m_dest;
+    return *this;
+}
+
+UndoManager& UndoManager::instance()
+{
+    static UndoManager* instance = 0;
+    if (instance == 0) {
+        instance = new UndoManager();
+    }
+    return *instance;
+}
+
+void UndoManager::addCommand(const DolphinCommand& command)
+{
+    ++m_historyIndex;
+
+    if (m_recordMacro) {
+        DolphinCommand macroCommand = command;
+        macroCommand.m_macroIndex = m_macroCounter;
+        m_history.insert(m_history.at(m_historyIndex), macroCommand);
+    }
+    else {
+        m_history.insert(m_history.at(m_historyIndex), command);
+    }
+
+    emit undoAvailable(true);
+    emit undoTextChanged(i18n("Undo: %1").arg(commandText(command)));
+
+    // prevent an endless growing of the Undo history
+    if (m_historyIndex > 10000) {
+        m_history.erase(m_history.begin());
+        --m_historyIndex;
+    }
+}
+
+void UndoManager::beginMacro()
+{
+    assert(!m_recordMacro);
+    m_recordMacro = true;
+    ++m_macroCounter;
+}
+
+void UndoManager::endMacro()
+{
+    assert(m_recordMacro);
+    m_recordMacro = false;
+}
+
+void UndoManager::undo()
+{
+    if (m_recordMacro) {
+        endMacro();
+    }
+
+    if (m_historyIndex < 0) {
+        return;
+    }
+
+    int progressCount = 0;
+    int macroCount = 1;
+    calcStepsCount(macroCount, progressCount);
+
+    m_progressIndicator = new ProgressIndicator(i18n("Executing undo operation..."),
+                                                i18n("Executed undo operation."),
+                                                progressCount);
+
+    for (int i = 0; i < macroCount; ++i) {
+        const DolphinCommand command = m_history[m_historyIndex];
+        --m_historyIndex;
+        if (m_historyIndex < 0) {
+            emit undoAvailable(false);
+            emit undoTextChanged(i18n("Undo"));
+        }
+        else {
+            emit undoTextChanged(i18n("Undo: %1").arg(commandText(m_history[m_historyIndex])));
+        }
+
+        if (m_historyIndex < static_cast<int>(m_history.count()) - 1) {
+            emit redoAvailable(true);
+            emit redoTextChanged(i18n("Redo: %1").arg(commandText(command)));
+        }
+        else {
+            emit redoAvailable(false);
+            emit redoTextChanged(i18n("Redo"));
+        }
+
+        KUrl::List sourceURLs = command.source();
+        KUrl::List::Iterator it = sourceURLs.begin();
+        const KUrl::List::Iterator end = sourceURLs.end();
+        const QString destURL(command.destination().prettyURL(+1));
+
+        KIO::Job* job = 0;
+        switch (command.type()) {
+            case DolphinCommand::Link:
+            case DolphinCommand::Copy: {
+                KUrl::List list;
+                while (it != end) {
+                    const KUrl deleteURL(destURL + (*it).filename());
+                    list.append(deleteURL);
+                    ++it;
+                }
+                job = KIO::del(list, false, false);
+                break;
+            }
+
+            case DolphinCommand::Move: {
+                KUrl::List list;
+                const KUrl newDestURL((*it).directory());
+                while (it != end) {
+                    const KUrl newSourceURL(destURL + (*it).filename());
+                    list.append(newSourceURL);
+                    ++it;
+                }
+                job = KIO::move(list, newDestURL, false);
+                break;
+            }
+
+            case DolphinCommand::Rename: {
+                assert(sourceURLs.count() == 1);
+                KIO::NetAccess::move(command.destination(), (*it));
+                break;
+            }
+
+            case DolphinCommand::Trash: {
+                while (it != end) {
+                    // TODO: use KIO::special for accessing the trash protocol. See
+                    // also Dolphin::slotJobResult() for further details.
+                    const QString originalFileName((*it).filename().section('-', 1));
+                    KUrl newDestURL(destURL + originalFileName);
+                    KIO::NetAccess::move(*it, newDestURL);
+                    ++it;
+
+                    m_progressIndicator->execOperation();
+                }
+                break;
+            }
+
+            case DolphinCommand::CreateFolder:
+            case DolphinCommand::CreateFile: {
+                KIO::NetAccess::del(command.destination(), &Dolphin::mainWin());
+                break;
+            }
+        }
+
+        if (job != 0) {
+            // Execute the jobs in a synchronous manner and forward the progress
+            // information to the Dolphin statusbar.
+            connect(job, SIGNAL(percent(KIO::Job*, unsigned long)),
+                    this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+            KIO::NetAccess::synchronousRun(job, &Dolphin::mainWin());
+        }
+
+        m_progressIndicator->execOperation();
+    }
+
+    delete m_progressIndicator;
+    m_progressIndicator = 0;
+}
+
+void UndoManager::redo()
+{
+    if (m_recordMacro) {
+        endMacro();
+    }
+
+    const int maxHistoryIndex = m_history.count() - 1;
+    if (m_historyIndex >= maxHistoryIndex) {
+        return;
+    }
+    ++m_historyIndex;
+
+    int progressCount = 0;
+    int macroCount = 1;
+    calcStepsCount(macroCount, progressCount);
+
+    m_progressIndicator = new ProgressIndicator(i18n("Executing redo operation..."),
+                                                i18n("Executed redo operation."),
+                                                progressCount);
+
+    for (int i = 0; i < macroCount; ++i) {
+        const DolphinCommand command = m_history[m_historyIndex];
+        if (m_historyIndex >= maxHistoryIndex) {
+            emit redoAvailable(false);
+            emit redoTextChanged(i18n("Redo"));
+        }
+        else {
+            emit redoTextChanged(i18n("Redo: %1").arg(commandText(m_history[m_historyIndex + 1])));
+        }
+
+        emit undoAvailable(true);
+        emit undoTextChanged(i18n("Undo: %1").arg(commandText(command)));
+
+        Dolphin& dolphin = Dolphin::mainWin();
+
+        KUrl::List sourceURLs = command.source();
+        KUrl::List::Iterator it = sourceURLs.begin();
+        const KUrl::List::Iterator end = sourceURLs.end();
+
+        KIO::Job* job = 0;
+        switch (command.type()) {
+            case DolphinCommand::Link: {
+                job = KIO::link(sourceURLs, command.destination(), false);
+                break;
+            }
+
+            case DolphinCommand::Copy: {
+                job = KIO::copy(sourceURLs, command.destination(), false);
+                break;
+            }
+
+            case DolphinCommand::Rename:
+            case DolphinCommand::Move: {
+                job = KIO::move(sourceURLs, command.destination(), false);
+                break;
+            }
+
+            case DolphinCommand::Trash: {
+                const QString destURL(command.destination().prettyURL());
+                while (it != end) {
+                   // TODO: use KIO::special for accessing the trash protocol. See
+                    // also Dolphin::slotJobResult() for further details.
+                    const QString originalFileName((*it).filename().section('-', 1));
+                    KUrl originalSourceURL(destURL + "/" + originalFileName);
+                    KIO::Job* moveToTrashJob = KIO::trash(originalSourceURL);
+                    KIO::NetAccess::synchronousRun(moveToTrashJob, &dolphin);
+                    ++it;
+
+                    m_progressIndicator->execOperation();
+                 }
+                break;
+            }
+
+            case DolphinCommand::CreateFolder: {
+                KIO::NetAccess::mkdir(command.destination(), &dolphin);
+                break;
+            }
+
+            case DolphinCommand::CreateFile: {
+                m_progressIndicator->execOperation();
+                KUrl::List::Iterator it = sourceURLs.begin();
+                assert(sourceURLs.count() == 1);
+                KIO::CopyJob* copyJob = KIO::copyAs(*it, command.destination(), false);
+                copyJob->setDefaultPermissions(true);
+                job = copyJob;
+                break;
+            }
+        }
+
+        if (job != 0) {
+            // Execute the jobs in a synchronous manner and forward the progress
+            // information to the Dolphin statusbar.
+            connect(job, SIGNAL(percent(KIO::Job*, unsigned long)),
+                    this, SLOT(slotPercent(KIO::Job*, unsigned long)));
+            KIO::NetAccess::synchronousRun(job, &dolphin);
+        }
+
+        ++m_historyIndex;
+        m_progressIndicator->execOperation();
+    }
+
+    --m_historyIndex;
+
+    delete m_progressIndicator;
+    m_progressIndicator = 0;
+}
+
+UndoManager::UndoManager() :
+    m_recordMacro(false),
+    m_historyIndex(-1),
+    m_macroCounter(0),
+    m_progressIndicator(0)
+{
+}
+
+UndoManager::~UndoManager()
+{
+    delete m_progressIndicator;
+    m_progressIndicator = 0;
+}
+
+QString UndoManager::commandText(const DolphinCommand& command) const
+{
+    QString text;
+    switch (command.type()) {
+        case DolphinCommand::Copy:         text = i18n("Copy"); break;
+        case DolphinCommand::Move:         text = i18n("Move"); break;
+        case DolphinCommand::Link:         text = i18n("Link"); break;
+        case DolphinCommand::Rename:       text = i18n("Rename"); break;
+        case DolphinCommand::Trash:        text = i18n("Move to Trash"); break;
+        case DolphinCommand::CreateFolder: text = i18n("Create New Folder"); break;
+        case DolphinCommand::CreateFile:   text = i18n("Create New File"); break;
+        default: break;
+    }
+    return text;
+}
+
+void UndoManager::slotPercent(KIO::Job* /* job */, unsigned long /* percent */)
+{
+    // It is not allowed to update the progress indicator in the context
+    // of this slot, hence do an asynchronous triggering.
+    QTimer::singleShot(0, this, SLOT(updateProgress()));
+}
+
+void UndoManager::updateProgress()
+{
+    m_progressIndicator->execOperation();
+}
+
+void UndoManager::calcStepsCount(int& macroCount, int& progressCount)
+{
+    progressCount = 0;
+    macroCount = 0;
+
+    const int macroIndex = m_history[m_historyIndex].m_macroIndex;
+    if (macroIndex < 0) {
+        // default use case: no macro has been recorded
+        macroCount = 1;
+        progressCount = m_history[m_historyIndex].source().count();
+        return;
+    }
+
+    // iterate backward for undo...
+    int i = m_historyIndex;
+    while ((i >= 0) && (m_history[i].m_macroIndex == macroIndex)) {
+        ++macroCount;
+        progressCount += m_history[i].source().count();
+        --i;
+    }
+
+    // iterate forward for redo...
+    const int max = m_history.count() - 1;
+    i = m_historyIndex + 1;
+    while ((i <= max) && (m_history[i].m_macroIndex == macroIndex)) {
+        ++macroCount;
+        progressCount += m_history[i].source().count();
+        ++i;
+    }
+}
+
+#include "undomanager.moc"
+
+
diff --git a/src/undomanager.h b/src/undomanager.h
new file mode 100644 (file)
index 0000000..30a4aba
--- /dev/null
@@ -0,0 +1,196 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef UNDOMANAGER_H
+#define UNDOMANAGER_H
+
+#include <qobject.h>
+#include <q3valuelist.h>
+#include <kurl.h>
+#include <kio/jobclasses.h>
+
+class ProgressIndicator;
+
+/**
+ * @short Represents a file manager command which can be undone and redone.
+ *
+ * A command is specified by a type, a list of source URLs and a
+ * destination URL.
+ *
+ * Due to the fixed set of commands a file manager offers this class is
+ * a very simplified version of the classic command pattern.
+ *
+ * @see UndoManager
+ * @author Peter Penz <peter.penz@gmx.at>
+ */
+class DolphinCommand
+{
+public:
+    enum Type {
+        Copy,
+        Move,
+        Link,
+        Rename,
+        Trash,
+        CreateFolder,
+        CreateFile
+    };
+
+    DolphinCommand();
+    DolphinCommand(Type type, const KUrl::List& source, const KUrl& dest);
+    ~DolphinCommand(); // non-virtual
+
+    DolphinCommand& operator = (const DolphinCommand& command);
+    Type type() const { return m_type; }
+    void setSource(const KUrl::List source) { m_source = source; }
+    const KUrl::List& source() const { return m_source; }
+    const KUrl& destination() const { return m_dest; }
+
+private:
+    Type m_type;
+    int m_macroIndex;
+    KUrl::List m_source;
+    KUrl m_dest;
+
+    friend class UndoManager;   // allow to modify m_macroIndex
+};
+
+/**
+ * @short Stores all file manager commands which can be undone and redone.
+ *
+ * During the undo and redo operations a progress information is
+ * shown in the status bar.
+ *
+ *     @author Peter Penz <peter.penz@gmx.at>
+ */
+class UndoManager : public QObject
+{
+    Q_OBJECT
+
+public:
+    static UndoManager& instance();
+
+    /**
+     * Adds the command \a command to the undo list. The command
+     * can be undone by invoking UndoManager::undo().
+     */
+    void addCommand(const DolphinCommand& command);
+
+    /**
+     * Allows to summarize several commands into one macro, which
+     * can be undo in one stop by UndoManager::undo(). Example
+     * \code
+     * UndoManager& undoMan = UndoManager.instance();
+     * undoMan.beginMacro();
+     * undoMan.addCommand(...);
+     * undoMan.addCommand(...);
+     * undoMan.addCommand(...);
+     * undoMan.endMacro();
+     * \endcode
+     * It is not allowed to do nested macro recordings.
+     */
+    void beginMacro();
+
+    /**
+     * Marks the end of a macro command. See UndoManager::beginMacro()
+     * for sample code.
+     */
+    void endMacro();
+
+public slots:
+    /**
+     * Performs an undo operation on the last command which has
+     * been added by UndoManager::addCommand().
+     */
+    void undo();
+
+    /**
+     * Performs a redo operation on the last command where an undo
+     * operation has been applied.
+     */
+    void redo();
+
+signals:
+    /**
+     * Is emitted if whenever the availability state
+     * of the current undo operation changes.
+     */
+    void undoAvailable(bool available);
+
+    /**
+     * Is emitted whenever the text of the current
+     * undo operation changes
+     * (e. g. from 'Undo: Delete' to 'Undo: Copy')
+     */
+    void undoTextChanged(const QString& text);
+
+    /**
+     * Is emitted if whenever the availability state
+     * of the current redo operation changes.
+     */
+    void redoAvailable(bool available);
+
+    /**
+     * Is emitted whenever the text of the current
+     * redo operation changes
+     * (e. g. from 'Redo: Delete' to 'Redo: Copy')
+     */
+    void redoTextChanged(const QString& text);
+
+protected:
+    UndoManager();
+    virtual ~UndoManager();
+    QString commandText(const DolphinCommand& command) const;
+
+private slots:
+    /**
+     * Slot for the percent information of the I/O slaves.
+     * Delegates the updating of the progress information
+     * to UndoManager::updateProgress().
+     */
+    void slotPercent(KIO::Job* job, unsigned long percent);
+
+    /**
+     * Updates the progress information of the statusbar
+     * by accessing the progress indicator information.
+     */
+    void updateProgress();
+
+private:
+    bool m_recordMacro;
+    int m_historyIndex;
+    int m_macroCounter;
+    Q3ValueList<DolphinCommand> m_history;
+    ProgressIndicator* m_progressIndicator;
+
+    /**
+     * Dependent from the current history index \a m_historyIndex
+     * the number of macro commands is written to the output
+     * parameter \a macroCount. The number of steps for all macro
+     * commands is written to the output parameter \a progressCount.
+     *
+     * Per default \a macroCount is 1 and \a progressCount represents
+     * the number of operations for one command.
+     */
+    void calcStepsCount(int& macroCount,
+                        int& progressCount);
+};
+
+#endif
diff --git a/src/urlbutton.cpp b/src/urlbutton.cpp
new file mode 100644 (file)
index 0000000..d441ab1
--- /dev/null
@@ -0,0 +1,98 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at)                  *
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "urlnavigatorbutton.h"
+#include <kurl.h>
+#include <qtooltip.h>
+#include <qcursor.h>
+#include <qfontmetrics.h>
+//Added by qt3to4:
+#include <QEvent>
+#include <kurldrag.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "urlnavigator.h"
+#include "dolphin.h"
+
+
+URLButton::URLButton(URLNavigator* parent)
+: QPushButton(parent),
+  m_displayHint(0),
+  m_urlNavigator(parent)
+{
+    setFocusPolicy(Qt::NoFocus);
+    setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
+    setMinimumHeight(parent->minimumHeight());
+
+    connect(this, SIGNAL(clicked()), parent, SLOT(slotRequestActivation()));
+    connect(&Dolphin::mainWin(), SIGNAL(activeViewChanged()),
+            this, SLOT(update()));
+}
+
+URLButton::~URLButton()
+{
+}
+
+URLNavigator* URLButton::urlNavigator() const
+{
+    return m_urlNavigator;
+}
+
+void URLButton::setDisplayHintEnabled(DisplayHint hint,
+                                      bool enable)
+{
+    if (enable) {
+        m_displayHint = m_displayHint | hint;
+    }
+    else {
+        m_displayHint = m_displayHint & ~hint;
+    }
+    update();
+}
+
+bool URLButton::isDisplayHintEnabled(DisplayHint hint) const
+{
+    return (m_displayHint & hint) > 0;
+}
+
+void URLButton::enterEvent(QEvent* event)
+{
+    QPushButton::enterEvent(event);
+    setDisplayHintEnabled(EnteredHint, true);
+    update();
+}
+
+void URLButton::leaveEvent(QEvent* event)
+{
+    QPushButton::leaveEvent(event);
+    setDisplayHintEnabled(EnteredHint, false);
+    update();
+}
+
+QColor URLButton::mixColors(const QColor& c1,
+                            const QColor& c2) const
+{
+    const int Qt::red   = (c1.Qt::red()   + c2.Qt::red())   / 2;
+    const int Qt::green = (c1.Qt::green() + c2.Qt::green()) / 2;
+    const int Qt::blue  = (c1.Qt::blue()  + c2.Qt::blue())  / 2;
+    return QColor(Qt::red, Qt::green, Qt::blue);
+}
diff --git a/src/urlbutton.h b/src/urlbutton.h
new file mode 100644 (file)
index 0000000..c1833b2
--- /dev/null
@@ -0,0 +1,71 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at)                  *
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef URLBUTTON_H
+#define URLBUTTON_H
+
+#include <qpushbutton.h>
+//Added by qt3to4:
+#include <QEvent>
+
+class KURL;
+class URLNavigator;
+class QPainter;
+
+/**
+ * @brief Base class for buttons of the URL navigator.
+ *
+ * Each button of the URL navigator contains an URL, which
+ * is set as soon as the button has been clicked.
+*
+ * @author Peter Penz
+ */
+class URLButton : public QPushButton
+{
+    Q_OBJECT
+
+public:
+    URLButton(URLNavigator* parent);
+    virtual ~URLButton();
+
+    URLNavigator* urlNavigator() const;
+
+protected:
+    enum DisplayHint {
+        ActivatedHint = 1,
+        EnteredHint = 2,
+        DraggedHint = 4,
+        PopupActiveHint = 8
+    };
+
+    void setDisplayHintEnabled(DisplayHint hint, bool enable);
+    bool isDisplayHintEnabled(DisplayHint hint) const;
+
+    virtual void enterEvent(QEvent* event);
+    virtual void leaveEvent(QEvent* event);
+
+    QColor mixColors(const QColor& c1, const QColor& c2) const;
+
+private:
+    int m_displayHint;
+    URLNavigator* m_urlNavigator;
+};
+
+#endif
diff --git a/src/urlnavigator.cpp b/src/urlnavigator.cpp
new file mode 100644 (file)
index 0000000..e1afa3f
--- /dev/null
@@ -0,0 +1,611 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at)                  *
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *   Copyright (C) 2006 by Patrice Tremblay                                *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "urlnavigator.h"
+
+#include <assert.h>
+
+#include <qcombobox.h>
+#include <qfont.h>
+#include <qlabel.h>
+#include <q3listbox.h>
+#include <qlineedit.h>
+#include <qobject.h>
+#include <q3popupmenu.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qtooltip.h>
+//Added by qt3to4:
+#include <Q3ValueList>
+#include <QKeyEvent>
+#include <QCheckBox>
+
+#include <kaction.h>
+#include <kactioncollection.h>
+#include <kiconloader.h>
+#include <kio/job.h>
+#include <klocale.h>
+#include <kprotocolinfo.h>
+#include <kurl.h>
+#include <kurlcombobox.h>
+#include <kurlcompletion.h>
+#include <kbookmarkmanager.h>
+
+#include "bookmarkselector.h"
+#include "dolphin.h"
+#include "dolphinsettings.h"
+#include "dolphinstatusbar.h"
+#include "dolphinview.h"
+#include "generalsettings.h"
+#include "protocolcombo.h"
+#include "urlnavigatorbutton.h"
+
+URLNavigator::HistoryElem::HistoryElem()
+ :  m_url(),
+    m_currentFileName(),
+    m_contentsX(0),
+    m_contentsY(0)
+{
+}
+
+URLNavigator::HistoryElem::HistoryElem(const KUrl& url)
+ :  m_url(url),
+    m_currentFileName(),
+    m_contentsX(0),
+    m_contentsY(0)
+{
+}
+
+URLNavigator::HistoryElem::~HistoryElem()
+{
+}
+
+URLNavigator::URLNavigator(const KUrl& url,
+                           DolphinView* dolphinView) :
+    Q3HBox(dolphinView),
+    m_historyIndex(0),
+    m_dolphinView(dolphinView),
+    m_protocols(0),
+    m_protocolSeparator(0),
+    m_host(0)
+{
+    m_history.prepend(HistoryElem(url));
+
+    QFontMetrics fontMetrics(font());
+    setMinimumHeight(fontMetrics.height() + 8);
+
+    m_toggleButton = new QCheckBox(this);
+    //m_toggleButton->setFlat(true);
+    //m_toggleButton->setToggleButton(true);
+    m_toggleButton->setFocusPolicy(Qt::NoFocus);
+    m_toggleButton->setMinimumHeight(minimumHeight());
+    connect(m_toggleButton, SIGNAL(clicked()),
+            this, SLOT(slotClicked()));
+    if (DolphinSettings::instance().generalSettings()->editableURL()) {
+        m_toggleButton->toggle();
+    }
+
+    m_bookmarkSelector = new BookmarkSelector(this);
+    connect(m_bookmarkSelector, SIGNAL(bookmarkActivated(int)),
+            this, SLOT(slotBookmarkActivated(int)));
+
+    m_pathBox = new KUrlComboBox(KUrlComboBox::Directories, true, this);
+
+    KUrlCompletion* kurlCompletion = new KUrlCompletion(KUrlCompletion::DirCompletion);
+    m_pathBox->setCompletionObject(kurlCompletion);
+    m_pathBox->setAutoDeleteCompletionObject(true);
+
+    connect(m_pathBox, SIGNAL(returnPressed(const QString&)),
+            this, SLOT(slotReturnPressed(const QString&)));
+    connect(m_pathBox, SIGNAL(urlActivated(const KUrl&)),
+            this, SLOT(slotURLActivated(const KUrl&)));
+
+    connect(dolphinView, SIGNAL(contentsMoved(int, int)),
+            this, SLOT(slotContentsMoved(int, int)));
+    connect(dolphinView, SIGNAL(redirection(const KUrl&, const KUrl&)),
+            this, SLOT(slotRedirection(const KUrl&, const KUrl&)));
+/*    connect(dolphinView, SIGNAL(redirection(const KUrl&)),
+            this, SLOT(slotRedirection(const KUrl&)));*/
+    updateContent();
+}
+
+URLNavigator::~URLNavigator()
+{
+}
+
+void URLNavigator::setURL(const KUrl& url)
+{
+    QString urlStr(url.pathOrUrl());
+    //kdDebug() << "setURL(" << url << ")" << endl;
+    if (urlStr.at(0) == '~') {
+        // replace '~' by the home directory
+        urlStr.remove(0, 1);
+        urlStr.insert(0, QDir::home().path());
+    }
+
+    const KUrl transformedURL(urlStr);
+
+    if (m_historyIndex > 0) {
+        // Check whether the previous element of the history has the same URL.
+        // If yes, just go forward instead of inserting a duplicate history
+        // element.
+        const KUrl& nextURL = m_history[m_historyIndex - 1].url();
+        if (transformedURL == nextURL) {
+            goForward();
+//             kdDebug() << "goin' forward in history" << endl;
+            return;
+        }
+    }
+
+    const KUrl& currURL = m_history[m_historyIndex].url();
+    if (currURL == transformedURL) {
+        // don't insert duplicate history elements
+//         kdDebug() << "currURL == transformedURL" << endl;
+        return;
+    }
+
+    updateHistoryElem();
+
+    const Q3ValueListIterator<URLNavigator::HistoryElem> it = m_history.at(m_historyIndex);
+    m_history.insert(it, HistoryElem(transformedURL));
+
+    updateContent();
+
+    emit urlChanged(transformedURL);
+    emit historyChanged();
+
+    // Prevent an endless growing of the history: remembering
+    // the last 100 URLs should be enough...
+    if (m_historyIndex > 100) {
+        m_history.erase(m_history.begin());
+        --m_historyIndex;
+    }
+
+/*    kdDebug() << "history starting ====================" << endl;
+    int i = 0;
+    for (QValueListIterator<URLNavigator::HistoryElem> it = m_history.begin();
+         it != m_history.end();
+         ++it, ++i)
+    {
+        kdDebug() << i << ": " << (*it).url() << endl;
+    }
+    kdDebug() << "history done ========================" << endl;*/
+}
+
+const KUrl& URLNavigator::url() const
+{
+    assert(!m_history.empty());
+    return m_history[m_historyIndex].url();
+}
+
+KUrl URLNavigator::url(int index) const
+{
+    assert(index >= 0);
+    QString path(url().pathOrUrl());
+    path = path.section('/', 0, index);
+
+    if (path.at(path.length()) != '/')
+    {
+        path.append('/');
+    }
+
+    return path;
+}
+
+const Q3ValueList<URLNavigator::HistoryElem>& URLNavigator::history(int& index) const
+{
+    index = m_historyIndex;
+    return m_history;
+}
+
+void URLNavigator::goBack()
+{
+    updateHistoryElem();
+
+    const int count = m_history.count();
+    if (m_historyIndex < count - 1) {
+        ++m_historyIndex;
+        updateContent();
+        emit urlChanged(url());
+        emit historyChanged();
+    }
+}
+
+void URLNavigator::goForward()
+{
+    if (m_historyIndex > 0) {
+        --m_historyIndex;
+        updateContent();
+        emit urlChanged(url());
+        emit historyChanged();
+    }
+}
+
+void URLNavigator::goUp()
+{
+    setURL(url().upUrl());
+}
+
+void URLNavigator::goHome()
+{
+    setURL(DolphinSettings::instance().generalSettings()->homeURL());
+}
+
+void URLNavigator::setURLEditable(bool editable)
+{
+    if (isURLEditable() != editable) {
+        m_toggleButton->toggle();
+        slotClicked();
+    }
+}
+
+bool URLNavigator::isURLEditable() const
+{
+    return m_toggleButton->isChecked();
+}
+
+void URLNavigator::editURL(bool editOrBrowse)
+{
+    setURLEditable(editOrBrowse);
+
+    if (editOrBrowse)
+    {
+        m_pathBox->setFocus();
+    }
+}
+
+DolphinView* URLNavigator::dolphinView() const
+{
+    return m_dolphinView;
+}
+
+void URLNavigator::keyReleaseEvent(QKeyEvent* event)
+{
+    Q3HBox::keyReleaseEvent(event);
+    if (isURLEditable() && (event->key() == Qt::Key_Escape)) {
+        setURLEditable(false);
+    }
+}
+
+void URLNavigator::slotReturnPressed(const QString& text)
+{
+    // Parts of the following code have been taken
+    // from the class KateFileSelector located in
+    // kate/app/katefileselector.hpp of Kate.
+    // Copyright (C) 2001 Christoph Cullmann <cullmann@kde.org>
+    // Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
+    // Copyright (C) 2001 Anders Lund <anders.lund@lund.tdcadsl.dk>
+
+    KUrl typedURL(text);
+    if (typedURL.hasPass()) {
+        typedURL.setPass(QString::null);
+    }
+
+    QStringList urls = m_pathBox->urls();
+    urls.remove(typedURL.url());
+    urls.prepend(typedURL.url());
+    m_pathBox->setUrls(urls, KUrlComboBox::RemoveBottom);
+
+    setURL(typedURL);
+    // The URL might have been adjusted by URLNavigator::setURL(), hence
+    // synchronize the result in the path box.
+    m_pathBox->setUrl(url());
+}
+
+void URLNavigator::slotURLActivated(const KUrl& url)
+{
+    setURL(url);
+}
+
+void URLNavigator::slotRemoteHostActivated()
+{
+    KUrl u = url();
+
+    QString host = m_host->text();
+    QString user;
+
+    int marker = host.find("@");
+    if (marker != -1)
+    {
+        user = host.left(marker);
+        u.setUser(user);
+        host = host.right(host.length() - marker - 1);
+    }
+
+    marker = host.find("/");
+    if (marker != -1)
+    {
+        u.setPath(host.right(host.length() - marker));
+        host.truncate(marker);
+    }
+    else
+    {
+        u.setPath("");
+    }
+
+    if (m_protocols->currentProtocol() != u.protocol() ||
+        host != u.host() ||
+        user != u.user())
+    {
+        u.setProtocol(m_protocols->currentProtocol());
+        u.setHost(m_host->text());
+
+        //TODO: get rid of this HACK for file:///!
+        if (u.protocol() == "file")
+        {
+            u.setHost("");
+            if (u.path().isEmpty())
+            {
+                u.setPath("/");
+            }
+        }
+
+        setURL(u);
+    }
+}
+
+void URLNavigator::slotProtocolChanged(const QString& protocol)
+{
+    KUrl url;
+    url.setProtocol(protocol);
+    //url.setPath(KProtocolInfo::protocolClass(protocol) == ":local" ? "/" : "");
+    url.setPath("/");
+    Q3ValueList<QWidget*>::const_iterator it = m_navButtons.constBegin();
+    while (it != m_navButtons.constEnd()) {
+        (*it)->close();
+        (*it)->deleteLater();
+        ++it;
+    }
+    m_navButtons.clear();
+
+    if (KProtocolInfo::protocolClass(protocol) == ":local") {
+        setURL(url);
+    }
+    else {
+        if (!m_host) {
+            m_protocolSeparator = new QLabel("://", this);
+            m_host = new QLineEdit(this);
+
+            connect(m_host, SIGNAL(lostFocus()),
+                    this, SLOT(slotRemoteHostActivated()));
+            connect(m_host, SIGNAL(returnPressed()),
+                    this, SLOT(slotRemoteHostActivated()));
+        }
+        else {
+            m_host->setText("");
+        }
+        m_protocolSeparator->show();
+        m_host->show();
+        m_host->setFocus();
+    }
+}
+
+void URLNavigator::slotRequestActivation()
+{
+    m_dolphinView->requestActivation();
+}
+
+void URLNavigator::slotBookmarkActivated(int index)
+{
+    m_dolphinView->statusBar()->clear();
+    m_dolphinView->requestActivation();
+
+    KBookmark bookmark = DolphinSettings::instance().bookmark(index);
+    m_dolphinView->setURL(bookmark.url());
+}
+
+void URLNavigator::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl)
+{
+// kdDebug() << "received redirection to " << newUrl << endl;
+kdDebug() << "received redirection from " << oldUrl << " to " << newUrl << endl;
+/*    UrlStack::iterator it = m_urls.find(oldUrl);
+    if (it != m_urls.end())
+    {
+        m_urls.erase(++it, m_urls.end());
+    }
+
+    m_urls.append(newUrl);*/
+}
+
+void URLNavigator::slotContentsMoved(int x, int y)
+{
+    m_history[m_historyIndex].setContentsX(x);
+    m_history[m_historyIndex].setContentsY(y);
+}
+
+void URLNavigator::slotClicked()
+{
+    if (isURLEditable()) {
+        m_pathBox->setFocus();
+        updateContent();
+    }
+    else {
+        setURL(m_pathBox->currentText());
+        m_dolphinView->setFocus();
+    }
+}
+
+void URLNavigator::updateHistoryElem()
+{
+    assert(m_historyIndex >= 0);
+    const KFileItem* item = m_dolphinView->currentFileItem();
+    if (item != 0) {
+        m_history[m_historyIndex].setCurrentFileName(item->name());
+    }
+    m_history[m_historyIndex].setContentsX(m_dolphinView->contentsX());
+    m_history[m_historyIndex].setContentsY(m_dolphinView->contentsY());
+}
+
+void URLNavigator::updateContent()
+{
+    // delete all existing URL navigator buttons
+    Q3ValueList<QWidget*>::const_iterator it = m_navButtons.constBegin();
+    while (it != m_navButtons.constEnd()) {
+        (*it)->close();
+        (*it)->deleteLater();
+        ++it;
+    }
+    m_navButtons.clear();
+
+    m_bookmarkSelector->updateSelection(url());
+
+    QToolTip::remove(m_toggleButton);
+    QString path(url().pathOrUrl());
+    const KAction* action = Dolphin::mainWin().actionCollection()->action("editable_location");
+    // TODO: registry of default shortcuts
+    QString shortcut = action? action->shortcutText() : "Ctrl+L";
+    if (m_toggleButton->isChecked()) {
+        delete m_protocols; m_protocols = 0;
+        delete m_protocolSeparator; m_protocolSeparator = 0;
+        delete m_host; m_host = 0;
+
+        QToolTip::add(m_toggleButton, i18n("Browse (%1, Escape)").arg(shortcut));
+
+        setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+        m_pathBox->show();
+        m_pathBox->setUrl(url());
+    }
+    else {
+        QToolTip::add(m_toggleButton, i18n("Edit location (%1)").arg(shortcut));
+
+        setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+        m_pathBox->hide();
+        QString dir_name;
+
+        // get the data from the currently selected bookmark
+        KBookmark bookmark = m_bookmarkSelector->selectedBookmark();
+        //int bookmarkIndex = m_bookmarkSelector->selectedIndex();
+
+        QString bookmarkPath;
+        if (bookmark.isNull()) {
+            // No bookmark is a part of the current URL.
+            // The following code tries to guess the bookmark
+            // path. E. g. "fish://root@192.168.0.2/var/lib" writes
+            // "fish://root@192.168.0.2" to 'bookmarkPath', which leads to the
+            // navigation indication 'Custom Path > var > lib".
+            int idx = path.find(QString("//"));
+            idx = path.find("/", (idx < 0) ? 0 : idx + 2);
+            bookmarkPath = (idx < 0) ? path : path.left(idx);
+        }
+        else {
+            bookmarkPath = bookmark.url().pathOrUrl();
+        }
+        const uint len = bookmarkPath.length();
+
+        // calculate the start point for the URL navigator buttons by counting
+        // the slashs inside the bookmark URL
+        int slashCount = 0;
+        for (uint i = 0; i < len; ++i) {
+            if (bookmarkPath.at(i) == QChar('/')) {
+                ++slashCount;
+            }
+        }
+        if ((len > 0) && bookmarkPath.at(len - 1) == QChar('/')) {
+            assert(slashCount > 0);
+            --slashCount;
+        }
+
+        if (!url().isLocalFile() && bookmark.isNull()) {
+            QString protocol = url().protocol();
+            if (!m_protocols) {
+                m_protocols = new ProtocolCombo(protocol, this);
+                connect(m_protocols, SIGNAL(activated(const QString&)),
+                        this, SLOT(slotProtocolChanged(const QString&)));
+            }
+            else {
+                m_protocols->setProtocol(protocol);
+            }
+            m_protocols->show();
+
+            if (KProtocolInfo::protocolClass(protocol) != ":local")
+            {
+                QString hostText = url().host();
+
+                if (!url().user().isEmpty())
+                {
+                    hostText = url().user() + "@" + hostText;
+                }
+
+                if (!m_host) {
+                    m_protocolSeparator = new QLabel("://", this);
+                    m_host = new QLineEdit(hostText, this);
+
+                    connect(m_host, SIGNAL(lostFocus()),
+                            this, SLOT(slotRemoteHostActivated()));
+                    connect(m_host, SIGNAL(returnPressed()),
+                            this, SLOT(slotRemoteHostActivated()));
+                }
+                else {
+                    m_host->setText(hostText);
+                }
+                m_protocolSeparator->show();
+                m_host->show();
+            }
+            else {
+                delete m_protocolSeparator; m_protocolSeparator = 0;
+                delete m_host; m_host = 0;
+            }
+        }
+        else if (m_protocols) {
+            m_protocols->hide();
+
+            if (m_host) {
+                m_protocolSeparator->hide();
+                m_host->hide();
+            }
+        }
+
+        // create URL navigator buttons
+        int idx = slashCount;
+        bool hasNext = true;
+        do {
+            dir_name = path.section('/', idx, idx);
+            const bool isFirstButton = (idx == slashCount);
+            hasNext = isFirstButton || !dir_name.isEmpty();
+            if (hasNext) {
+                URLNavigatorButton* button = new URLNavigatorButton(idx, this);
+                if (isFirstButton) {
+                    // the first URL navigator button should get the name of the
+                    // bookmark instead of the directory name
+                    QString text = bookmark.text();
+                    if (text.isEmpty()) {
+                        if (url().isLocalFile())
+                        {
+                            text = i18n("Custom Path");
+                        }
+                        else
+                        {
+                            delete button;
+                            ++idx;
+                            continue;
+                        }
+                    }
+                    button->setText(text);
+                }
+                button->show();
+                m_navButtons.append(button);
+                ++idx;
+            }
+        } while (hasNext);
+    }
+}
+
+#include "urlnavigator.moc"
diff --git a/src/urlnavigator.h b/src/urlnavigator.h
new file mode 100644 (file)
index 0000000..35ae545
--- /dev/null
@@ -0,0 +1,233 @@
+/***************************************************************************
+*   Copyright (C) 2006 by Peter Penz   *
+*   peter.penz@gmx.at   *
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+*   This program is distributed in the hope that it will be useful,       *
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+*   GNU General Public License for more details.                          *
+*                                                                         *
+*   You should have received a copy of the GNU General Public License     *
+*   along with this program; if not, write to the                         *
+*   Free Software Foundation, Inc.,                                       *
+*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+***************************************************************************/
+
+#ifndef URLNAVIGATOR_H
+#define URLNAVIGATOR_H
+
+#include <q3hbox.h>
+//Added by qt3to4:
+#include <QLabel>
+#include <Q3ValueList>
+#include <QKeyEvent>
+#include <Q3PopupMenu>
+#include <kurl.h>
+#include <qstring.h>
+
+class QComboBox;
+class QLabel;
+class QLineEdit;
+class Q3PopupMenu;
+class QCheckBox;
+
+class KUrl;
+class KFileItem;
+class KUrlComboBox;
+
+class BookmarkSelector;
+class DolphinView;
+class ProtocolCombo;
+
+/**
+ * @brief Navigation bar which contains the current shown URL.
+ *
+ * The URL navigator offers two modes:
+ * - Editable:     Represents the 'classic' mode, where the current URL
+ *                 is editable inside a line editor.
+ * - Non editable: The URL is represented by a number of buttons, where
+ *                 clicking on a button results in activating the URL
+ *                 the button represents. This mode also supports drag
+ *                 and drop of items.
+ *
+ * The mode can be changed by a toggle button located on the left side of
+ * the navigator.
+ *
+ * The URL navigator also remembers the URL history and allows to go
+ * back and forward within this history.
+ *
+ * @author Peter Penz
+*/
+
+typedef Q3ValueList<KUrl> UrlStack;
+
+class URLNavigator : public Q3HBox
+{
+    Q_OBJECT
+
+public:
+    /**
+     * @brief Represents the history element of an URL.
+     *
+     * A history element contains the URL, the name of the current file
+     * (the 'current file' is the file where the cursor is located) and
+     * the x- and y-position of the content.
+     */
+    class HistoryElem {
+    public:
+        HistoryElem();
+        HistoryElem(const KUrl& url);
+        ~HistoryElem(); // non virtual
+
+        const KUrl& url() const { return m_url; }
+
+        void setCurrentFileName(const QString& name) { m_currentFileName = name; }
+        const QString& currentFileName() const { return m_currentFileName; }
+
+        void setContentsX(int x) { m_contentsX = x; }
+        int contentsX() const { return m_contentsX; }
+
+        void setContentsY(int y) { m_contentsY = y; }
+        int contentsY() const { return m_contentsY; }
+
+    private:
+        KUrl m_url;
+        QString m_currentFileName;
+        int m_contentsX;
+        int m_contentsY;
+    };
+
+    URLNavigator(const KUrl& url, DolphinView* dolphinView);;
+    virtual ~URLNavigator();
+
+    /**
+     * Sets the current active URL.
+     * The signals URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void setURL(const KUrl& url);
+
+    /** Returns the current active URL. */
+    const KUrl& url() const;
+
+    /** Returns the portion of the current active URL up to the button at index. */
+    KUrl url(int index) const;
+
+    /**
+     * Returns the complete URL history. The index 0 indicates the oldest
+     * history element.
+     * @param index     Output parameter which indicates the current
+     *                  index of the location.
+     */
+    const Q3ValueList<HistoryElem>& history(int& index) const;
+
+    /**
+     * Goes back one step in the URL history. The signals
+     * URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void goBack();
+
+    /**
+     * Goes forward one step in the URL history. The signals
+     * URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void goForward();
+
+    /**
+     * Goes up one step of the URL path. The signals
+     * URLNavigator::urlChanged and URLNavigator::historyChanged
+     * are submitted.
+     */
+    void goUp();
+
+    /**
+     * Goes to the home URL. The signals URLNavigator::urlChanged
+     * and URLNavigator::historyChanged are submitted.
+     */
+    void goHome();
+
+    /**
+     * @return True, if the URL is editable by the user within a line editor.
+     *         If false is returned, each part of the URL is presented by a button
+     *         for fast navigation.
+     */
+    bool isURLEditable() const;
+
+    /**
+     * Switches to the edit mode and assures that the keyboard focus
+     * is assigned.
+     */
+    void editURL(bool editOrBrowse); //TODO: switch to an enum
+
+    DolphinView* dolphinView() const;
+
+signals:
+    void urlChanged(const KUrl& url);
+    void historyChanged();
+
+protected:
+    /** If the Escape key is pressed, the navigation bar should switch
+        to the browse mode. */
+    virtual void keyReleaseEvent(QKeyEvent* event);
+
+private slots:
+    void slotReturnPressed(const QString& text);
+    void slotURLActivated(const KUrl& url);
+    void slotRemoteHostActivated();
+    void slotProtocolChanged(const QString& protocol);
+
+    void slotRequestActivation();
+    void slotBookmarkActivated(int index);
+
+    void slotRedirection(const KUrl&, const KUrl&);
+
+    /**
+     * Stores the coordinates of the moved content into
+     * the current history element. Is usually triggered
+     * by the signal 'contentsMoved' emitted by DolphinView.
+     */
+    void slotContentsMoved(int x, int y);
+
+    /**
+     * Switches the navigation bar between the editable and noneditable
+     * state (see setURLEditable()) and is connected to the clicked signal
+     * of the navigation bar button.
+     */
+    void slotClicked();
+
+private:
+    int m_historyIndex;
+    DolphinView* m_dolphinView;
+    Q3ValueList<HistoryElem> m_history;
+    QCheckBox* m_toggleButton;
+    BookmarkSelector* m_bookmarkSelector;
+    KUrlComboBox* m_pathBox;
+    ProtocolCombo* m_protocols;
+    QLabel* m_protocolSeparator;
+    QLineEdit* m_host;
+    Q3ValueList<QWidget*> m_navButtons;
+    //UrlStack m_urls;
+
+    /**
+     * Allows to edit the URL of the navigation bar if \a editable
+     * is true. If \a editable is false, each part of
+     * the URL is presented by a button for a fast navigation.
+     */
+    void setURLEditable(bool editable);
+
+    /**
+     * Updates the history element with the current file item
+     * and the contents position.
+     */
+    void updateHistoryElem();
+    void updateContent();
+};
+
+#endif
diff --git a/src/urlnavigatorbutton.cpp b/src/urlnavigatorbutton.cpp
new file mode 100644 (file)
index 0000000..cd13ca5
--- /dev/null
@@ -0,0 +1,387 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at)                  *
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "urlnavigatorbutton.h"
+#include <qcursor.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+//Added by qt3to4:
+#include <QDropEvent>
+#include <QDragLeaveEvent>
+#include <Q3PopupMenu>
+#include <QEvent>
+#include <QDragEnterEvent>
+
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <kio/jobclasses.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <assert.h>
+
+#include "urlnavigator.h"
+#include "dolphinview.h"
+#include "dolphin.h"
+
+URLNavigatorButton::URLNavigatorButton(int index, URLNavigator* parent) :
+    URLButton(parent),
+    m_index(-1),
+    m_listJob(0)
+{
+    setAcceptDrops(true);
+    setMinimumWidth(arrowWidth());
+    setIndex(index);
+    connect(this, SIGNAL(clicked()), this, SLOT(updateNavigatorURL()));
+
+    m_popupDelay = new QTimer(this);
+    connect(m_popupDelay, SIGNAL(timeout()), this, SLOT(startListJob()));
+    connect(this, SIGNAL(pressed()), this, SLOT(startPopupDelay()));
+}
+
+URLNavigatorButton::~URLNavigatorButton()
+{
+}
+
+void URLNavigatorButton::setIndex(int index)
+{
+    m_index = index;
+
+    if (m_index < 0) {
+        return;
+    }
+
+    QString path(urlNavigator()->url().pathOrUrl());
+    setText(path.section('/', index, index));
+
+    // Check whether the button indicates the full path of the URL. If
+    // this is the case, the button is marked as 'active'.
+    ++index;
+    QFont adjustedFont(font());
+    if (path.section('/', index, index).isEmpty()) {
+        setDisplayHintEnabled(ActivatedHint, true);
+        adjustedFont.setBold(true);
+    }
+    else {
+        setDisplayHintEnabled(ActivatedHint, false);
+        adjustedFont.setBold(false);
+    }
+
+    setFont(adjustedFont);
+    update();
+}
+
+int URLNavigatorButton::index() const
+{
+    return m_index;
+}
+
+void URLNavigatorButton::drawButton(QPainter* painter)
+{
+    const int buttonWidth  = width();
+    const int buttonHeight = height();
+
+    QColor backgroundColor;
+    QColor foregroundColor;
+    const bool isHighlighted = isDisplayHintEnabled(EnteredHint) ||
+                               isDisplayHintEnabled(DraggedHint) ||
+                               isDisplayHintEnabled(PopupActiveHint);
+    if (isHighlighted) {
+        backgroundColor = KGlobalSettings::highlightColor();
+        foregroundColor = KGlobalSettings::highlightedTextColor();
+    }
+    else {
+        backgroundColor = colorGroup().background();
+        foregroundColor = KGlobalSettings::buttonTextColor();
+    }
+
+    // dimm the colors if the parent view does not have the focus
+    const DolphinView* parentView = urlNavigator()->dolphinView();
+    const Dolphin& dolphin = Dolphin::mainWin();
+
+    const bool isActive = (dolphin.activeView() == parentView);
+    if (!isActive) {
+        QColor dimmColor(colorGroup().background());
+        foregroundColor = mixColors(foregroundColor, dimmColor);
+        if (isHighlighted) {
+            backgroundColor = mixColors(backgroundColor, dimmColor);
+        }
+    }
+
+    // draw button background
+    painter->setPen(Qt::NoPen);
+    painter->setBrush(backgroundColor);
+    painter->drawRect(0, 0, buttonWidth, buttonHeight);
+
+    int textWidth = buttonWidth;
+    if (isDisplayHintEnabled(ActivatedHint) && isActive || isHighlighted) {
+        painter->setPen(foregroundColor);
+    }
+    else {
+        // dimm the foreground color by mixing it with the background
+        foregroundColor = mixColors(foregroundColor, backgroundColor);
+        painter->setPen(foregroundColor);
+    }
+
+    if (!isDisplayHintEnabled(ActivatedHint)) {
+        // draw arrow
+        const int border = 2;  // horizontal border
+        const int middleY = height() / 2;
+        const int width = arrowWidth();
+        const int startX = (buttonWidth - width) - (2 * border);
+        const int startTopY = middleY - (width - 1);
+        const int startBottomY = middleY + (width - 1);
+        for (int i = 0; i < width; ++i) {
+            painter->drawLine(startX, startTopY + i, startX + i, startTopY + i);
+            painter->drawLine(startX, startBottomY - i, startX + i, startBottomY - i);
+        }
+
+        textWidth = startX - border;
+    }
+
+    const bool clipped = isTextClipped();
+    const int align = clipped ? Qt::AlignVCenter : Qt::AlignCenter;
+    painter->drawText(QRect(0, 0, textWidth, buttonHeight), align, text());
+
+    if (clipped) {
+        // Blend the right area of the text with the background, as the
+        // text is clipped.
+        // TODO: use alpha blending in Qt4 instead of drawing the text that often
+        const int blendSteps = 16;
+
+        QColor blendColor(backgroundColor);
+        const int redInc   = (foregroundColor.red()   - backgroundColor.red())   / blendSteps;
+        const int greenInc = (foregroundColor.green() - backgroundColor.green()) / blendSteps;
+        const int blueInc  = (foregroundColor.blue()  - backgroundColor.blue())  / blendSteps;
+        for (int i = 0; i < blendSteps; ++i) {
+            painter->setClipRect(QRect(textWidth - i, 0, 1, buttonHeight));
+            painter->setPen(blendColor);
+            painter->drawText(QRect(0, 0, textWidth, buttonHeight), align, text());
+
+            blendColor.setRgb(blendColor.red()   + redInc,
+                              blendColor.green() + greenInc,
+                              blendColor.blue()  + blueInc);
+        }
+    }
+}
+
+void URLNavigatorButton::enterEvent(QEvent* event)
+{
+    URLButton::enterEvent(event);
+
+    // if the text is clipped due to a small window width, the text should
+    // be shown as tooltip
+    if (isTextClipped()) {
+        QToolTip::add(this, text());
+    }
+}
+
+void URLNavigatorButton::leaveEvent(QEvent* event)
+{
+    URLButton::leaveEvent(event);
+    QToolTip::remove(this);
+}
+
+void URLNavigatorButton::dropEvent(QDropEvent* event)
+{
+    if (m_index < 0) {
+        return;
+    }
+
+    KUrl::List urls;
+    /* KDE4-TODO:
+    if (KUrlDrag::decode(event, urls) && !urls.isEmpty()) {
+        setDisplayHintEnabled(DraggedHint, true);
+
+        QString path(urlNavigator()->url().prettyURL());
+        path = path.section('/', 0, m_index);
+
+        Dolphin::mainWin().dropURLs(urls, KUrl(path));
+
+        setDisplayHintEnabled(DraggedHint, false);
+        update();
+    }*/
+}
+
+void URLNavigatorButton::dragEnterEvent(QDragEnterEvent* event)
+{
+    /* KDE4-TODO:
+    event->accept(KUrlDrag::canDecode(event));
+
+    setDisplayHintEnabled(DraggedHint, true);*/
+    update();
+}
+
+void URLNavigatorButton::dragLeaveEvent(QDragLeaveEvent* event)
+{
+    URLButton::dragLeaveEvent(event);
+
+    setDisplayHintEnabled(DraggedHint, false);
+    update();
+}
+
+
+void URLNavigatorButton::updateNavigatorURL()
+{
+    if (m_index < 0) {
+        return;
+    }
+
+    URLNavigator* navigator = urlNavigator();
+    assert(navigator != 0);
+    navigator->setURL(navigator->url(m_index));
+}
+
+void URLNavigatorButton::startPopupDelay()
+{
+    if (m_popupDelay->isActive() || m_listJob || m_index < 0) {
+        return;
+    }
+
+    m_popupDelay->start(300, true);
+}
+
+void URLNavigatorButton::stopPopupDelay()
+{
+    m_popupDelay->stop();
+    if (m_listJob) {
+        m_listJob->kill();
+        m_listJob = 0;
+    }
+}
+
+void URLNavigatorButton::startListJob()
+{
+    if (m_listJob) {
+        return;
+    }
+
+    KUrl url = urlNavigator()->url(m_index);
+    m_listJob = KIO::listDir(url, false, false);
+    m_subdirs.clear(); // just to be ++safe
+
+    connect(m_listJob, SIGNAL(entries(KIO::Job*, const KIO::UDSEntryList &)),
+            this, SLOT(entriesList(KIO::Job*, const KIO::UDSEntryList&)));
+    connect(m_listJob, SIGNAL(result(KIO::Job*)), this, SLOT(listJobFinished(KIO::Job*)));
+}
+
+void URLNavigatorButton::entriesList(KIO::Job* job, const KIO::UDSEntryList& entries)
+{
+    if (job != m_listJob) {
+        return;
+    }
+
+    KIO::UDSEntryList::const_iterator it = entries.constBegin();
+    KIO::UDSEntryList::const_iterator itEnd = entries.constEnd();
+    while (it != itEnd) {
+        QString name;
+        bool isDir = false;
+        KIO::UDSEntry entry = *it;
+
+        /* KDE3 reference:
+            KIO::UDSEntry::const_iterator atomIt = entry.constBegin();
+            KIO::UDSEntry::const_iterator atomEndIt = entry.constEnd();
+
+            while (atomIt != atomEndIt) {
+            switch ((*atomIt).m_uds) {
+                case KIO::UDS_NAME:
+                    name = (*atomIt).m_str;
+                    break;
+                case KIO::UDS_FILE_TYPE:
+                    isDir = S_ISDIR((*atomIt).m_long);
+                    break;
+                default:
+                    break;
+            }
+            ++atomIt;
+         }
+         if (isDir) {
+             m_subdirs.append(name);
+         }
+        */
+
+        if (entry.isDir()) {
+            m_subdirs.append(entry.stringValue(KIO::UDS_NAME));
+        }
+
+        ++it;
+    }
+
+    m_subdirs.sort();
+}
+
+void URLNavigatorButton::listJobFinished(KIO::Job* job)
+{
+    if (job != m_listJob) {
+        return;
+    }
+
+    if (job->error() || m_subdirs.isEmpty()) {
+        // clear listing
+        return;
+    }
+
+    setDisplayHintEnabled(PopupActiveHint, true);
+    update(); // ensure the button is drawn highlighted
+    Q3PopupMenu* dirsMenu = new Q3PopupMenu(this);
+    //setPopup(dirsMenu);
+    QStringList::const_iterator it = m_subdirs.constBegin();
+    QStringList::const_iterator itEnd = m_subdirs.constEnd();
+    int i = 0;
+    while (it != itEnd) {
+        dirsMenu->insertItem(*it, i);
+        ++i;
+        ++it;
+    }
+
+    int result = dirsMenu->exec(urlNavigator()->mapToGlobal(geometry().bottomLeft()));
+
+    if (result != -1) {
+        KUrl url = urlNavigator()->url(m_index);
+        url.addPath(m_subdirs[result]);
+        urlNavigator()->setURL(url);
+    }
+
+    m_listJob = 0;
+    m_subdirs.clear();
+    delete dirsMenu;
+    setDisplayHintEnabled(PopupActiveHint, false);
+}
+
+int URLNavigatorButton::arrowWidth() const
+{
+    int width = (height() / 2) - 7;
+    if (width < 4) {
+        width = 4;
+    }
+    return width;
+}
+
+bool URLNavigatorButton::isTextClipped() const
+{
+    int availableWidth = width();
+    if (!isDisplayHintEnabled(ActivatedHint)) {
+        availableWidth -= arrowWidth() + 1;
+    }
+
+    QFontMetrics fontMetrics(font());
+    return fontMetrics.width(text()) >= availableWidth;
+}
diff --git a/src/urlnavigatorbutton.h b/src/urlnavigatorbutton.h
new file mode 100644 (file)
index 0000000..f7d2c54
--- /dev/null
@@ -0,0 +1,87 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at)                  *
+ *   Copyright (C) 2006 by Aaron J. Seigo (<aseigo@kde.org>)               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef URLNAVIGATORBUTTON_H
+#define URLNAVIGATORBUTTON_H
+
+#include <qstringlist.h>
+//Added by qt3to4:
+#include <QEvent>
+#include <QDragLeaveEvent>
+#include <QDropEvent>
+#include <QDragEnterEvent>
+
+#include <kio/global.h>
+
+#include <urlbutton.h>
+
+class KUrl;
+class URLNavigator;
+class QPainter;
+
+namespace KIO
+{
+    class Job;
+}
+
+/**
+ * @brief Button of the URL navigator which contains one part of an URL.
+ *
+ * It is possible to drop a various number of items to an URL button. In this case
+ * a context menu is opened where the user must select whether he wants
+ * to copy, move or link the dropped items to the URL part indicated by
+ * the button.
+ */
+class URLNavigatorButton : public URLButton
+{
+    Q_OBJECT
+
+public:
+    URLNavigatorButton(int index, URLNavigator* parent = 0);
+    virtual ~URLNavigatorButton();
+    void setIndex(int index);
+    int index() const;
+
+protected:
+    virtual void drawButton(QPainter* painter);
+    virtual void enterEvent(QEvent* event);
+    virtual void leaveEvent(QEvent* event);
+    virtual void dropEvent(QDropEvent* event);
+    virtual void dragEnterEvent(QDragEnterEvent* event);
+    virtual void dragLeaveEvent(QDragLeaveEvent* event);
+
+private slots:
+    void updateNavigatorURL();
+    void startPopupDelay();
+    void stopPopupDelay();
+    void startListJob();
+    void entriesList(KIO::Job* job, const KIO::UDSEntryList& entries);
+    void listJobFinished(KIO::Job* job);
+
+private:
+    int arrowWidth() const;
+    bool isTextClipped() const;
+
+    int m_index;
+    QTimer* m_popupDelay;
+    KIO::Job* m_listJob;
+    QStringList m_subdirs;
+};
+
+#endif
diff --git a/src/viewproperties.cpp b/src/viewproperties.cpp
new file mode 100644 (file)
index 0000000..52129bd
--- /dev/null
@@ -0,0 +1,208 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include <assert.h>
+
+#include <qdatetime.h>
+#include <qdir.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kurl.h>
+
+#include "viewproperties.h"
+
+#include "dolphinsettings.h"
+
+#define FILE_NAME "/.directory"
+
+ViewProperties::ViewProperties(KUrl url) :
+      m_changedProps(false),
+      m_autoSave(true),
+      m_subDirValidityHidden(false),
+      m_node(0)
+{
+    url.cleanPath(true);
+    m_filepath = url.path();
+
+    if ((m_filepath.length() < 1) || (m_filepath.at(0) != QChar('/'))) {
+        m_node = new ViewPropertySettings();
+        return;
+    }
+
+    // we try and save it to a file in the directory being viewed
+    // if the directory is not writable by the user or the directory is not local
+    // we store the properties information in a local file
+    QString rootDir("/"); // TODO: should this be set to the root of the bookmark, if any?
+    if (url.isLocalFile()) {
+        QFileInfo info(m_filepath);
+
+        if (!info.isWritable()) {
+            QString basePath = KGlobal::instance()->instanceName();
+            basePath.append("/view_properties/local");
+            rootDir = locateLocal("data", basePath);
+            m_filepath = rootDir + m_filepath;
+        }
+    }
+    else {
+        QString basePath = KGlobal::instance()->instanceName();
+        basePath.append("/view_properties/remote/").append(url.host());
+        rootDir = locateLocal("data", basePath);
+        m_filepath = rootDir + m_filepath;
+    }
+
+    m_node = new ViewPropertySettings(KSharedConfig::openConfig(m_filepath + FILE_NAME));
+
+    QDir dir(m_filepath);
+    const bool isValidForSubDirs = m_node->validForSubDirs();
+    while ((dir.path() != rootDir) && dir.cdUp()) {
+        QString parentPath(dir.path() + FILE_NAME);
+
+        if (!QFile::exists(parentPath))
+        {
+            continue;
+        }
+
+        ViewPropertySettings parentNode(KSharedConfig::openConfig(dir.path() + FILE_NAME));
+        const bool inheritProps = parentNode.validForSubDirs() &&
+                                  (parentNode.timestamp() > m_node->timestamp());
+
+        if (inheritProps) {
+            *m_node = parentNode;
+            break;
+        }
+    }
+
+    if (isValidForSubDirs) {
+        m_subDirValidityHidden = true;
+    }
+}
+
+ViewProperties::~ViewProperties()
+{
+    if (m_changedProps && m_autoSave) {
+        save();
+    }
+
+    delete m_node;
+}
+
+void ViewProperties::setViewMode(DolphinView::Mode mode)
+{
+    if (m_node->viewMode() != mode) {
+        m_node->setViewMode(mode);
+        updateTimeStamp();
+    }
+}
+
+DolphinView::Mode ViewProperties::viewMode() const
+{
+    return static_cast<DolphinView::Mode>(m_node->viewMode());
+}
+
+void ViewProperties::setShowHiddenFilesEnabled(bool show)
+{
+    if (m_node->showHiddenFiles() != show) {
+        m_node->setShowHiddenFiles(show);
+        updateTimeStamp();
+    }
+}
+
+bool ViewProperties::isShowHiddenFilesEnabled() const
+{
+    return m_node->showHiddenFiles();
+}
+
+void ViewProperties::setSorting(DolphinView::Sorting sorting)
+{
+    if (m_node->sorting() != sorting) {
+        m_node->setSorting(sorting);
+        updateTimeStamp();
+    }
+}
+
+DolphinView::Sorting ViewProperties::sorting() const
+{
+    return static_cast<DolphinView::Sorting>(m_node->sorting());
+}
+
+void ViewProperties::setSortOrder(Qt::SortOrder sortOrder)
+{
+    if (m_node->sortOrder() != sortOrder) {
+        m_node->setSortOrder(sortOrder);
+        updateTimeStamp();
+    }
+}
+
+Qt::SortOrder ViewProperties::sortOrder() const
+{
+    return static_cast<Qt::SortOrder>(m_node->sortOrder());
+}
+
+void ViewProperties::setValidForSubDirs(bool valid)
+{
+    if (m_node->validForSubDirs() != valid) {
+        m_node->setValidForSubDirs(valid);
+        updateTimeStamp();
+    }
+}
+
+bool ViewProperties::isValidForSubDirs() const
+{
+    return m_node->validForSubDirs();
+}
+
+void ViewProperties::setAutoSaveEnabled(bool autoSave)
+{
+    m_autoSave = autoSave;
+}
+
+bool ViewProperties::isAutoSaveEnabled() const
+{
+    return m_autoSave;
+}
+
+void ViewProperties::updateTimeStamp()
+{
+    m_changedProps = true;
+    m_node->setTimestamp(QDateTime::currentDateTime());
+}
+
+void ViewProperties::save()
+{
+    KStandardDirs::makeDir(m_filepath);
+    m_node->writeConfig();
+    m_changedProps = false;
+}
+
+ViewProperties& ViewProperties::operator = (const ViewProperties& props)
+{
+    if (&props != this) {
+        m_changedProps = props.m_changedProps;
+        m_autoSave = props.m_autoSave;
+        m_subDirValidityHidden = props.m_subDirValidityHidden;
+        m_filepath = props.m_filepath;
+        m_node = new ViewPropertySettings();
+        //*m_node = *(props.m_node);
+    }
+
+    return *this;
+}
diff --git a/src/viewproperties.h b/src/viewproperties.h
new file mode 100644 (file)
index 0000000..1524707
--- /dev/null
@@ -0,0 +1,87 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#ifndef VIEWPROPERTIES_H
+#define VIEWPROPERTIES_H
+
+#include <dolphinview.h>
+#include <kurl.h>
+#include <qdatetime.h>
+
+#include "directoryviewpropertysettings.h"
+
+class QFile;
+
+/**
+ * @short Maintains the view properties like 'view mode' or 'show hidden files' for a directory.
+ *
+ * The view properties are automatically stored inside
+ * the directory as hidden file called '.dolphinview'. To read out the view properties
+ * just construct an instance by passing the URL of the directory:
+ * \code
+ * ViewProperties props(KUrl("/home/peter/Documents"));
+ * const DolphinView::Mode mode = props.viewMode();
+ * const bool showHiddenFiles = props.isShowHiddenFilesEnabled();
+ * \endcode
+ * When modifying a view property, the '.dolphinview' file is automatically updated
+ * inside the destructor.
+ *
+ * @author Peter Penz
+ */
+// TODO: provide detailed design description, as mapping the user model to
+// the physical modal is not trivial.
+class ViewProperties
+{
+public:
+    ViewProperties(KUrl url);
+    virtual ~ViewProperties();
+
+    void setViewMode(DolphinView::Mode mode);
+    DolphinView::Mode viewMode() const;
+
+    void setShowHiddenFilesEnabled(bool show);
+    bool isShowHiddenFilesEnabled() const;
+
+    void setSorting(DolphinView::Sorting sorting);
+    DolphinView::Sorting sorting() const;
+
+    void setSortOrder(Qt::SortOrder sortOrder);
+    Qt::SortOrder sortOrder() const;
+
+    void setValidForSubDirs(bool valid);
+    bool isValidForSubDirs() const;
+
+    void setAutoSaveEnabled(bool autoSave);
+    bool isAutoSaveEnabled() const;
+
+    void updateTimeStamp();
+    void save();
+
+    ViewProperties& operator = (const ViewProperties& props);
+
+private:
+    bool m_changedProps;
+    bool m_autoSave;
+    bool m_subDirValidityHidden;
+    QString m_filepath;
+    ViewPropertySettings* m_node;
+};
+
+#endif
diff --git a/src/viewpropertiesdialog.cpp b/src/viewpropertiesdialog.cpp
new file mode 100644 (file)
index 0000000..f72e6fc
--- /dev/null
@@ -0,0 +1,236 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "viewpropertiesdialog.h"
+#include <klocale.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <q3vbox.h>
+#include <q3buttongroup.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <q3groupbox.h>
+#include <qcombobox.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <assert.h>
+
+#include "viewproperties.h"
+#include "dolphinview.h"
+
+ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) :
+    KDialog(dolphinView, static_cast<Qt::WFlags>(Ok /* KDE4-TODO: Apply | Cancel*/)),
+    m_isDirty(false),
+    m_dolphinView(dolphinView)
+{
+    assert(dolphinView != 0);
+
+    const int margin = KDialog::marginHint();
+    const QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+    const KUrl& url = dolphinView->url();
+    m_viewProps = new ViewProperties(url);
+    m_viewProps->setAutoSaveEnabled(false);
+
+    Q3VBoxLayout* topLayout = new Q3VBoxLayout(mainWidget(), 0, spacingHint());
+
+    // create 'Properties' group containing view mode, sorting, sort order and show hidden files
+    Q3GroupBox* propsGroup = new Q3GroupBox(2, Qt::Horizontal, i18n("Properties"), mainWidget());
+    propsGroup->setSizePolicy(sizePolicy);
+    propsGroup->setMargin(margin);
+
+    new QLabel(i18n("View mode:"), propsGroup);
+    m_viewMode = new QComboBox(propsGroup);
+    m_viewMode->insertItem(SmallIcon("view_icon"), i18n("Icons"));
+    m_viewMode->insertItem(SmallIcon("view_text"), i18n("Details"));
+    m_viewMode->insertItem(SmallIcon("gvdirpart"), i18n("Previews"));
+    const int index = static_cast<int>(m_viewProps->viewMode());
+    m_viewMode->setCurrentItem(index);
+
+    new QLabel(i18n("Sorting:"), propsGroup);
+    m_sorting = new QComboBox(propsGroup);
+    m_sorting->insertItem("By Name");
+    m_sorting->insertItem("By Size");
+    m_sorting->insertItem("By Date");
+    int sortingIdx = 0;
+    switch (m_viewProps->sorting()) {
+        case DolphinView::SortByName: sortingIdx = 0; break;
+        case DolphinView::SortBySize: sortingIdx = 1; break;
+        case DolphinView::SortByDate: sortingIdx = 2; break;
+        default: break;
+    }
+    m_sorting->setCurrentItem(sortingIdx);
+
+    new QLabel(i18n("Sort order:"), propsGroup);
+    m_sortOrder = new QComboBox(propsGroup);
+    m_sortOrder->insertItem(i18n("Ascending"));
+    m_sortOrder->insertItem(i18n("Descending"));
+    const int sortOrderIdx = (m_viewProps->sortOrder() == Qt::Ascending) ? 0 : 1;
+    m_sortOrder->setCurrentItem(sortOrderIdx);
+
+    m_showHiddenFiles = new QCheckBox(i18n("Show hidden files"), propsGroup);
+    m_showHiddenFiles->setChecked(m_viewProps->isShowHiddenFilesEnabled());
+
+    // create 'Apply view properties to:' group
+    Q3ButtonGroup* buttonGroup = new Q3ButtonGroup(3,
+                                                 Qt::Vertical,
+                                                 i18n("Apply view properties to:"),
+                                                 mainWidget());
+    buttonGroup->setSizePolicy(sizePolicy);
+    buttonGroup->setMargin(margin);
+
+    m_applyToCurrentFolder = new QRadioButton(i18n("Current folder"), buttonGroup);
+    buttonGroup->insert(m_applyToCurrentFolder);
+
+    m_applyToSubFolders = new QRadioButton(i18n("Current folder including all sub folders"), buttonGroup);
+    buttonGroup->insert(m_applyToSubFolders);
+
+    m_applyToAllFolders = new QRadioButton(i18n("All folders"), buttonGroup);
+    buttonGroup->insert(m_applyToAllFolders);
+
+    if (m_viewProps->isValidForSubDirs()) {
+        m_applyToSubFolders->setChecked(true);
+    }
+    else {
+        m_applyToCurrentFolder->setChecked(true);
+    }
+
+    topLayout->addWidget(propsGroup);
+    topLayout->addWidget(buttonGroup);
+
+    connect(m_viewMode, SIGNAL(activated(int)),
+            this, SLOT(slotViewModeChanged(int)));
+    connect(m_sorting, SIGNAL(activated(int)),
+            this, SLOT(slotSortingChanged(int)));
+    connect(m_sortOrder, SIGNAL(activated(int)),
+            this, SLOT(slotSortOrderChanged(int)));
+    connect(m_showHiddenFiles, SIGNAL(clicked()),
+            this, SLOT(slotShowHiddenFilesChanged()));
+    connect(m_applyToCurrentFolder, SIGNAL(clicked()),
+            this, SLOT(slotApplyToCurrentFolder()));
+    connect(m_applyToSubFolders, SIGNAL(clicked()),
+            this, SLOT(slotApplyToSubFolders()));
+    connect(m_applyToAllFolders, SIGNAL(clicked()),
+            this, SLOT(slotApplyToAllFolders()));
+}
+
+ViewPropertiesDialog::~ViewPropertiesDialog()
+{
+    m_isDirty = false;
+    delete m_viewProps;
+    m_viewProps = 0;
+}
+
+void ViewPropertiesDialog::slotOk()
+{
+    applyViewProperties();
+    // KDE4-TODO: KDialog::slotOk();
+}
+
+void ViewPropertiesDialog::slotApply()
+{
+    applyViewProperties();
+    // KDE4-TODO: KDialog::slotApply();
+}
+
+void ViewPropertiesDialog::slotViewModeChanged(int index)
+{
+    assert((index >= 0) && (index <= 2));
+    m_viewProps->setViewMode(static_cast<DolphinView::Mode>(index));
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::slotSortingChanged(int index)
+{
+    DolphinView::Sorting sorting = DolphinView::SortByName;
+    switch (index) {
+        case 1: sorting = DolphinView::SortBySize; break;
+        case 2: sorting = DolphinView::SortByDate; break;
+        default: break;
+    }
+    m_viewProps->setSorting(sorting);
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::slotSortOrderChanged(int index)
+{
+    Qt::SortOrder sortOrder = (index == 0) ? Qt::Ascending : Qt::Descending;
+    m_viewProps->setSortOrder(sortOrder);
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::slotShowHiddenFilesChanged()
+{
+    const bool show = m_showHiddenFiles->isChecked();
+    m_viewProps->setShowHiddenFilesEnabled(show);
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::slotApplyToCurrentFolder()
+{
+    m_viewProps->setValidForSubDirs(false);
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::slotApplyToSubFolders()
+{
+    m_viewProps->setValidForSubDirs(true);
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::slotApplyToAllFolders()
+{
+    m_isDirty = true;
+}
+
+void ViewPropertiesDialog::applyViewProperties()
+{
+    if (m_applyToAllFolders->isChecked()) {
+        if (m_isDirty) {
+            const QString text(i18n("The view properties of all folders will be replaced. Do you want to continue?"));
+            if (KMessageBox::questionYesNo(this, text) == KMessageBox::No) {
+                return;
+            }
+        }
+
+        ViewProperties props(QDir::homeDirPath());
+        props.setViewMode(m_viewProps->viewMode());
+        props.setSorting(m_viewProps->sorting());
+        props.setSortOrder(m_viewProps->sortOrder());
+        props.setShowHiddenFilesEnabled(m_viewProps->isShowHiddenFilesEnabled());
+        props.setValidForSubDirs(true);
+    }
+    else if (m_applyToSubFolders->isChecked() && m_isDirty) {
+        const QString text(i18n("The view properties of all sub folders will be replaced. Do you want to continue?"));
+        if (KMessageBox::questionYesNo(this, text) == KMessageBox::No) {
+            return;
+        }
+    }
+
+    m_viewProps->save();
+    m_dolphinView->setViewProperties(*m_viewProps);
+    m_isDirty = false;
+}
+
+#include "viewpropertiesdialog.moc"
diff --git a/src/viewpropertiesdialog.h b/src/viewpropertiesdialog.h
new file mode 100644 (file)
index 0000000..103a93b
--- /dev/null
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef VIEWPROPERTIESDIALOG_H
+#define VIEWPROPERTIESDIALOG_H
+
+#include <kdialog.h>
+
+class QCheckBox;
+class Q3ButtonGroup;
+class QComboBox;
+class QRadioButton;
+class ViewProperties;
+class DolphinView;
+
+/**
+ * @brief Dialog for changing the current view properties of a directory.
+ *
+ * It is possible to specify the view mode and whether hidden files
+ * should be shown. The properties can be assigned to the current folder,
+ * recursively to all sub folders or to all folders.
+ *
+ * @author Peter Penz
+ */
+class ViewPropertiesDialog : public KDialog
+{
+    Q_OBJECT
+
+public:
+    ViewPropertiesDialog(DolphinView* dolphinView);
+    virtual ~ViewPropertiesDialog();
+
+protected slots:
+    virtual void slotOk();
+    virtual void slotApply();
+
+private slots:
+    void slotViewModeChanged(int index);
+    void slotSortingChanged(int index);
+    void slotSortOrderChanged(int index);
+    void slotShowHiddenFilesChanged();
+    void slotApplyToCurrentFolder();
+    void slotApplyToSubFolders();
+    void slotApplyToAllFolders();
+
+private:
+    bool m_isDirty;
+    DolphinView* m_dolphinView;
+    ViewProperties* m_viewProps;
+
+    QComboBox* m_viewMode;
+    QComboBox* m_sorting;
+    QComboBox* m_sortOrder;
+    QCheckBox* m_showHiddenFiles;
+    QRadioButton* m_applyToCurrentFolder;
+    QRadioButton* m_applyToSubFolders;
+    QRadioButton* m_applyToAllFolders;
+
+    void applyViewProperties();
+};
+
+#endif
diff --git a/src/viewsettingspage.cpp b/src/viewsettingspage.cpp
new file mode 100644 (file)
index 0000000..2ad44d1
--- /dev/null
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include "viewsettingspage.h"
+#include <qtabwidget.h>
+#include <qlayout.h>
+#include <qlabel.h>
+//Added by qt3to4:
+#include <Q3VBoxLayout>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include "iconsviewsettingspage.h"
+#include "detailsviewsettingspage.h"
+
+ViewSettingsPage::ViewSettingsPage(QWidget *parent) :
+    SettingsPageBase(parent),
+    m_iconsPage(0),
+    m_detailsPage(0),
+    m_previewsPage(0)
+{
+    Q3VBoxLayout* topLayout = new Q3VBoxLayout(parent, 0, KDialog::spacingHint());
+
+    QTabWidget* tabWidget = new QTabWidget(parent);
+
+    // initialize 'Icons' tab
+    m_iconsPage = new IconsViewSettingsPage(DolphinIconsView::Icons, tabWidget);
+    tabWidget->addTab(m_iconsPage, SmallIcon("view_icon"), i18n("Icons"));
+
+    // initialize 'Details' tab
+    m_detailsPage = new DetailsViewSettingsPage(tabWidget);
+    tabWidget->addTab(m_detailsPage, SmallIcon("view_text"), i18n("Details"));
+
+    // initialize 'Previews' tab
+    m_previewsPage = new IconsViewSettingsPage(DolphinIconsView::Previews, tabWidget);
+    tabWidget->addTab(m_previewsPage, SmallIcon("gvdirpart"), i18n("Previews"));
+
+    topLayout->addWidget(tabWidget, 0, 0 );
+}
+
+ViewSettingsPage::~ViewSettingsPage()
+{
+}
+
+void ViewSettingsPage::applySettings()
+{
+    m_iconsPage->applySettings();
+    m_detailsPage->applySettings();
+    m_previewsPage->applySettings();
+}
+
+#include "viewsettingspage.moc"
diff --git a/src/viewsettingspage.h b/src/viewsettingspage.h
new file mode 100644 (file)
index 0000000..786abf0
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Peter Penz                                      *
+ *   peter.penz@gmx.at                                                     *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef VIEWSETTINGSPAGE_H
+#define VIEWSETTINGSPAGE_H
+
+#include <qwidget.h>
+#include <settingspagebase.h>
+
+class IconsViewSettingsPage;
+class DetailsViewSettingsPage;
+
+/**
+ * @brief Page for the 'View' settings of the Dolphin settings dialog.
+ *
+ * The views settings allow to set the properties for the icons mode,
+ * the details mode and the previews mode.
+ *
+ *  @author Peter Penz <peter.penz@gmx.at>
+ */
+class ViewSettingsPage : public SettingsPageBase
+{
+    Q_OBJECT
+
+public:
+    ViewSettingsPage(QWidget* parent);
+
+    virtual ~ViewSettingsPage();
+
+    /** @see SettingsPageBase::applySettings */
+    virtual void applySettings();
+
+private:
+    IconsViewSettingsPage* m_iconsPage;
+    DetailsViewSettingsPage* m_detailsPage;
+    IconsViewSettingsPage* m_previewsPage;
+};
+
+#endif