Added abandoned KDE3 version of kdirstat

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kdirstat@1088039 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 14 years ago
commit b6e09a3a8e

@ -0,0 +1 @@
Stefan Hundhammer <sh@suse.de>

@ -0,0 +1,280 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, 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.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

@ -0,0 +1,482 @@
GNU LIBRARY GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 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.
[This is the first released version of the library GPL. It is
numbered 2 because it goes with version 2 of the ordinary GPL.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it. You can use it for
your libraries, 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 library, or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.
Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library. If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, 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 companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software. To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.
Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs. This
license, the GNU Library General Public License, applies to certain
designated libraries. This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.
The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it. Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program. However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.
Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries. We
concluded that weaker conditions might promote sharing better.
However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves. This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them. (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.) The hope is that this
will lead to faster development of free libraries.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, while the latter only
works together with the library.
Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.
GNU LIBRARY GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License"). Each licensee is
addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, 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 library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete 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 distribute a copy of this License along with the
Library.
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 Library or any portion
of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
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 Library, 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 Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you 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.
If distribution of 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 satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
c) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
d) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. 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.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library 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.
9. 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 Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
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.
11. 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 Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library 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 Library.
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.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library 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.
13. The Free Software Foundation may publish revised and/or new
versions of the Library 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 Library
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 Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
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
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "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
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. 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 LIBRARY 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
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

@ -0,0 +1,18 @@
We would like to thank the following people:
- Alexander Rawass <alexannika@users.sourceforge.net> for implementing the
first version of treemaps for KDirStat (this version has been completely
replaced beginning May 2002).
- Ben Shneiderman for his ingenious idea of treemaps as an alternative and
truly intuitive way of visualizing trees.
- All the people at the TU Eindhoven who worked on SequoiaView that gave us the
inspiration for including treemaps in KDirStat and numerous papers describing
the algorithms behind it.
- Harald Fernengel (harry1701@users.sourceforge.net) for continued support for
integrating KDirStat with new Qt versions.
- Toyohiro Asukai <toyohiro@ksmplus.com> for Asian support patches.

@ -0,0 +1,684 @@
2005-01-07 Stefan Hundhammer <sh@suse.de>
* Improved handling of sparse files:
Now adding up only allocated size
* Improved handling of regular files with multiple links:
Now adding up size / no_links per occurence.
This is much closer to what "du" reports.
* Extended "own size" column context menu to show sparse files
and regular files with multiple links
* Reordered "own size" column context menu for consistency: xxx MB (yyy Bytes)
* Removed currently read path from status line while reading:
Much less flicker, no more constant window resizing, improved performance
* Added explanations for sparse files and multiple links to online help
* Bumped version to 2.4.4
2004-12-06 Stefan Hundhammer <sh@suse.de>
* Added "Open with" cleanup upon request by Jarl Friis <jarl@softace.dk>
* Bumped version to 2.4.3
2004-11-23 Stefan Hundhammer <sh@suse.de>
* Migration to KIO slave trash:/ for "move to trash" cleanup
(querying KDE version >= 3.4 at runtime)
* Added configuration update for safer transition from old-style
fixed "*/Trash" paths to "%t" placeholder
* Fixed lots of KDE libs "deprecated" warnings
* Reimported admin/ subdir from a recent KDE version (3.3.0)
* Bumped version to 2.4.2
2004-03-30 Stefan Hundhammer <sh@suse.de>
* Fixed KPacMan rendering in toolbar (thanks to Coolo)
2004-03-01 Stefan Hundhammer <sh@suse.de>
* Updated German translation
2003-11-13 Stefan Hundhammer <sh@suse.de>
* Added Italian translation by Giuliano Colla <colla@copeca.it>
2003-10-29 Stefan Hundhammer <sh@suse.de>
* Applied i18n patch by Toyohiro Asukai <toyohiro@ksmplus.com>
* Updated Japanese translation by Toyohiro Asukai <toyohiro@ksmplus.com>
2003-10-20 Stefan Hundhammer <sh@suse.de>
* Fixed some SuSE-internal Autobuild complaints
* Fixed treemap context menu popup location
* Bumped version to 2.4.1
2003-09-15 Stefan Hundhammer <sh@suse.de>
* Added Hungarian translation contributed by
Marcel Hilzinger <hili@suselinux.hu>
2003-08-26 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.4.0
* Fixed crash on program end while reading directories
* Fixed crash on open dir while still reading another directory
* Added "stop reading" action
* Added German translation contributed by
Christoph Eckert <fmchristoph.eckert@t-online.de>
2003-05-25 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.3.7
* Performance boost: Directory reading is now 16-20 times faster
because much fewer KDirTreeViewItems are cloned during reading
* Using QListViewItem::compare() instead of QListViewItem::key()
for better performance: less string operations / numeric formatting
2003-04-28 Stefan Hundhammer <sh@suse.de>
* Added French translation by Michel Grentzinger <mic.grentz@online.fr>
* Don't add up special files (char/block devices, sockets, FIFOs)
2003-02-03 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.3.6
* Fixed crash on startup when no config file present
2003-02-02 Stefan Hundhammer <sh@suse.de>
* Fixed crash in treemap when deleting subtree with cleanup
* Improved treemap action enabled/disabled state update
2003-01-30 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.3.5
* Colorize treemap tiles (by fixed rules, not customizable yet)
* Added new '%t' cleanup placeholder for the KDE trash directory
* Read jobs are now displayed in the percentage bar column
2003-01-28 Stefan Hundhammer <sh@suse.de>
* User cleanups now have an applicaton-wide keyboard shortcut
(Ctrl-0, Ctrl-1, Ctrl-2, ...)
* Prevent some treemap segfaults when re-reading directories
2003-01-14 Stefan Hundhammer <sh@suse.de>
* Synchronize treemap selection with dir tree after treemap rebuild
2003-01-08 Stefan Hundhammer <sh@suse.de>
* Changed activity point handling: The user was prompted far to
early to send feedback mail.
* Changed treemap double click handling:
Now double clicking the middle button zooms out,
double clicking the right button does nothing
(it pops up the context menu before receiving the second click
anyway)
* Changed help file accordingly
2003-01-07 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.3.4
* Updated admin subdir to latest KDE autoconf / automake stuff
* Gcc 3.x fixes
2003-01-06 Stefan Hundhammer <sh@suse.de>
* Tweaked treemap cushion ridges:
Squarified layout row now gets its own ridge,
no more double /triple ridges for directories
* Changed treemap cushion light source direction from bottom right
to top left
* Moved min/max/default for treemap settings to central header file
* Changed max/default treemap setting values
* Reduced settings dialogs outer borders:
No more accumulated borders
2003-01-04 Stefan Hundhammer <sh@suse.de>
* Added "general" settings page; now user configurable:
- cross file system boundaries
- use local dir read methods
- PacMan animation in toolbar
- PacMan animation ("PacMan armada") in dir tree
* Added "treemap" settings page: now user configurable:
- plain vs. cushion treemap
- squarified vs. simple treemap
- ambient light
- height scale factor
- force grid
- draw lines upon low contrast
- plain (non-cushioned) treemap colors
- highlight rectangle color
- minimum tile size
- auto-resize treemap
* Added "open URL" in "file" menu for easier access to remote URLs
* Bumped version to 2.3.3
2003-01-01 Stefan Hundhammer <sh@suse.de>
* Added treemap actions
* Added treemap menu
* Added treemap context menu
* Improved treemap integration into main application
* Added online help for treemaps
2002-12-31 Stefan Hundhammer <sh@suse.de>
* Lots of small fiddling with treemaps
2002-12-28 Stefan Hundhammer <sh@suse.de>
* Implemented cushion treemaps
* Bumped version to 2.3.2-devel
* Changed treemap selection mechanism:
Now using a transparent separate rectangle so even the outline
of entire directories can clearly be seen.
2002-12-27 Stefan Hundhammer <sh@suse.de>
* Added treemap mouse operations:
- select item in tree view (single click left)
- zoom in (double-click left)
- zoom out (double-click right)
- rebuild treemap in visible area (double-click middle)
* Added visible selection in treemap
* Select treemap tile when tree item is selected
2002-12-26 Stefan Hundhammer <sh@suse.de>
* Implemented squarified treemaps.
Now there are no longer lots of elongated, thin rectangles that
are hard to compare against each other and hard to point at.
2002-12-23 Stefan Hundhammer <sh@suse.de>
* Changed treemap handling completely: Now using QCanvas.
* Bumped version to 2.3.1-devel
2002-05-12 Stefan Hundhammer <sh@suse.de>
* Initial version of new treemaps
* Communication between treemap view and tree view
* Bumped version to 2.3.0-devel
2002-05-10 Stefan Hundhammer <sh@suse.de>
* Removed support for old treemaps
* Updated build-howto.html
2002-05-09 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.2.0
The KDE3 port proved stable enough to warrant a new stable
version.
2002-04-23 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.1.1-beta
* Added Japanese translation by
Toyohiro Asukai <toyohiro@ksmplus.com>
* Applied another Asian lang support patch by
Toyohiro Asukai <toyohiro@ksmplus.com>:
QString::sprintf() -> QString::arg()
2002-04-22 Stefan Hundhammer <sh@suse.de>
* Applied Asian language support patch by
Toyohiro Asukai <toyohiro@ksmplus.com>:
Somme missing QString::fromLocal8Bit() issues
2002-04-18 Stefan Hundhammer <sh@suse.de>
* KDE-3 migration:
- Replaced admin/ subdirectory completely
* Bumped version to 2.1.0-beta
2002-03-01 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.0.1
* Added large file (>2GB) support
2002-02-24 Stefan Hundhammer <sh@suse.de>
* Bumped version to 2.0.0 - the real release version
* Completed help texts
* Added "Help" button to feedback dialog
* Added "Help" button to settings dialog
* Drastically reduced logging to stdout
2002-02-11 Stefan Hundhammer <sh@suse.de>
* Prevent crash: Disable cleanups that modify the subtree while it
is still being read
2002-02-10 Stefan Hundhammer <sh@suse.de>
* Fixed double slashes in URLs when opening with file selection box
* Bumped version to 1.8.7-rc2
2002-02-09 Stefan Hundhammer <sh@suse.de>
* Fixed huge numbers overflow in details context popup
* Fixed huge numbers sorting
* Added new action "continue reading at mount point".
This is essentially the same as "refreshing selected branch",
but it's more intuitive to use.
2002-02-02 Stefan Hundhammer <sh@suse.de>
* Initial help documentation
* Bumped version to 1.8.6-rc1
This is the first release candidate.
The final version will be released as 2.0
2002-01-27 Stefan Hundhammer <sh@suse.de>
* Fixed update bug upon "refresh branch" and executing cleanups
* Embed cleanup %p / %n parameters in double quotes
* Added keyboard accelerators for standard cleanups
* (Partial) fix for PacMan animation display error on some KDE themes
* Bumped version to 1.8.5-beta
2002-01-19 Stefan Hundhammer <sh@suse.de>
* Added feedback mail facility
* Bumped version to 1.8.4-beta
2002-01-10 Stefan Hundhammer <sh@suse.de>
* Fixed repaint error in percentage bar column when scrolling
* Fixed repaint error when resizing percentage bar column
2002-01-04 Stefan Hundhammer <sh@suse.de>
* Bumped version to 1.8.3-beta
The new KDirStat is now as complete as the old one ever was!
* Added simple 'mail to owner' report
* Implemented cleanup configuration
* Added 'ask for confirmation' flag to cleanups
* Added 'works for local files only' flag to cleanups
* Fixed URL handling: Always strip off trailing slash
* Fixed app icon
* Fixed .desktop file - KDirStat is now in 'Utilities'
2002-01-03 Stefan Hundhammer <sh@suse.de>
* Implemented save/read configuration
* Updated TODO list - gosh, was this thing outdated!
* kdDebug() operator << for KCleanup
* kdDebug() operator << for KDirTreeViewItem
2002-01-02 Stefan Hundhammer <sh@suse.de>
* Implemented 'settings' dialog
* Implemented 'tree colors' settings
2002-01-01 Stefan Hundhammer <sh@suse.de>
* Implemented / completed KCleanupCollection
* Fixed some core dumps (oops)
2001-12-31 Stefan Hundhammer <sh@suse.de>
* kdDebug() operator<< for KFileInfo
2001-12-30 Stefan Hundhammer <sh@suse.de>
* Bumped version to 1.8.2-beta
* Cleanups are back!
2001-12-26 Stefan Hundhammer <sh@suse.de>
* Mount point remains marked as mount point even after
"refresh selected branch"
* KFileInfo / KDirInfo now have direct access to their
KDirTree (i.e. they now have their own pointer)
=> transparent access from outside easier
2001-12-08 Stefan Hundhammer <sh@suse.de>
* Tree colors are back again
* Transparently handle selections in the KDirTree;
all kinds of views should benefit from that.
2001-11-25 Stefan Hundhammer <sh@suse.de>
* Bumped version to 1.8.0-beta
* Added "Refresh selected" to main + context menu
* Implemented refreshing a single branch
* Many internal changes to enable deleting subtrees
(this is a requirement for cleanups)
* Internal cleanup: Got rid of that statRoot() mess,
clean ??::stat() implementation for all directory readers
2001-11-18 Stefan Hundhammer <sh@suse.de>
* Bumped version to 1.7.11-devel
* Improved mount point handling:
* Different icon,
* New read status KDirOnRequestOnly
* Prepared for explicit reading of mounted file systems
* Created infrastructure for context menu in tree view
* Simple context menu (cleanup actions will follow)
2001-11-17 Stefan Hundhammer <sh@suse.de>
* Moved treemap sources to separate subdirectory to prevent that
too-clever admin/am_edit script from breaking things: It always
uses all available sources rather than just those in
Makefile.am.
* Changed default from --enable-treemaps to --disable-treemaps
since treemaps don't compile and link for more than 6 weeks now.
* Updated build-howto.html
2001-10-22 Harald Fernengel (harry1701@users.sourceforge.net)
* make it work with Qt 3 / KDE 3
2001-09-26 Alexander Rawass <alexannika@users.sourceforge.net>
* committed Makefile.am from kdirstat-1-7-10-devel
2001-09-26 Alexander Rawass <alexannika@users.sourceforge.net>
* debugging output in kparts
2001-09-25 Alexander Rawass <alexannika@users.sourceforge.net>
* added files kdirstat_{part,factory}.{cpp,h,rc}
* trying to make a kpart of kdirstat
* libtool does not work for me yet
2001-08-20 Alexander Rawass <alexannika@users.sourceforge.net>
* modified configure.in.in to test for libqtreemap
test may not work on some/most systems
2001-08-18 Alexander Rawass <alexannika@users.sourceforge.net>
* V1.7.8-devel
* added kdirstat.spec (to build rpms)
* released kdirstat-1.7.8-1.i386.rpm
2001-08-17 Alexander Rawass <alexannika@users.sourceforge.net>
* removed files q*{cpp,h} from cvs
* removed doc/treemaps from cvs
* modified configure.in and kdirstat/Makefile.am
* QTreeMap is now in it's own cvs qtreemap.sourceforge.net
2001-08-11 Alexander Rawass <alexannika@users.sourceforge.net>
* QTreeMap can write data files for 'HypView',
a hyperbolic tree browser
2001-08-09 Alexander Rawass <alexannika@users.sourceforge.net>
* changed all size-functions from int to asize/float
* qxmltreemap: if a node has got an empty attribute 'size',
the size is calculated recursively
* new files & classes
qlistviewtreemapwindow.cpp
qlistviewtreemapwindow.h
qlistviewtreemaparea.cpp
qlistviewtreemap.h
qxmltreemapviewer.cpp
* files q*treemap* are built as a library libqtreemap
* new qxmltreemapviewer binary:
stand-alone QT/Xml Treemap Viewer
* QTreeMap/QListViewTreeMapArea works fine with KProf
2001-08-09 Stefan Hundhammer <sh@suse.de>
* Added "credits" section in about box
2001-08-08 Stefan Hundhammer <sh@suse.de>
* Implemented iterator classes: KFileInfoIterator and
KFileInfoSortedIterator
* Added CREDITS file
2001-08-06 Stefan Hundhammer <sh@suse.de>
* Fixed segfaults due to bad dot entry cleanup (huh? ;-) ) that
had caused core dumps after finishing reading small trees
2001-08-05 Alexander Rawass <alexannika@users.sourceforge.net>
* compiler warnings removed
* using List of Objects (instead List of KDirInfo)
* Bug: regexps not working in xml-window
selection not working in xml-window
* removed dependencies to KDirStat from QTreeMap
2001-07-29 Alexander Rawass <alexannika@users.sourceforge.net>
* load XML working (with memory hole)
2001-07-28 Alexander Rawass <alexannika@users.sourceforge.net>
* new sort of treemap/drawing mode: piemap
added file qtreemaparea_piemap.cpp
will not get checked in until legal problems solved
* checkmarks work also for paintmode
* new options for piemap mode
* bitmap can be saved to a file
* tree can be saved as xml file
* new files & classes
qxmltreemapwindow.cpp
qxmltreemapwindow.h
qxmltreemaparea.cpp
qxmltreemap.h
(don't work yet)
* new defines for compilation:
HAVE_PIEMAP if you have the piemap source
EXPERIMENTAL if you want to see more options
2001-07-17 Alexander Rawass <alexannika@users.sourceforge.net>
* user can use keywords instead of numbers for options
* checkmarks start working
* yet only with drawmode
2001-07-16 Alexander Rawass <alexannika@users.sourceforge.net>
* user can now use regexps or wildcards in config
* regexps are now compiled only once at startup
* wildcards are working correctly
* regexps need 3 /// backslashes in kdirstatrc
* Feature: the color list is parsed in alphabetic sort
2001-07-14 Alexander Rawass <alexannika@users.sourceforge.net>
* KDirTreeMapWindow reads out configuration with KConfig
* Bug: regexps are not working correctly
2001-07-13 Alexander Rawass <alexannika@users.sourceforge.net>
* user can click on rectangles and select/deselect them
* those rectangles are stored in a list and appear
at the bottom of the right-button popupmenu
2001-07-12 Alexander Rawass <alexannika@users.sourceforge.net>
* user can search for regexp, matches get highlighted
* current_dir_display working again
2001-07-11 Alexander Rawass <alexannika@users.sourceforge.net>
* new shading: image (sensible only with squarify)
displays pictures, can be used as picture browser
* removed most warnings
2001-07-11 Alexander Rawass <alexannika@users.sourceforge.net>
* various bugs fixed in squarified treemaps:
correct end of recursion
using floats rather than ints to prevent miscalc.
should work now????
* new hierarchical shadings
2001-07-10 Alexander Rawass <alexannika@users.sourceforge.net>
* implemented squarified treemaps (experimental, buggy)
* new file added: qtreemaparea_squarify.cpp
* Bug: when zooming in too much, the paintarea takes up too much
memory -> X swaps till death
2001-07-05 Alexander Rawass <alexannika@users.sourceforge.net>
* more options and exp. shadings
* experimental dynamic shading (not working)
* user can watch treemap build up
* paintEntry moved to qtreemaparea_paint.cpp
* drawTreeMap,drawDuTree,CTM moved to qtreemaparea_recursion.cpp
* renamed some of the shadings and
* wrote some Documentation how to use Shadings and Options
2001-07-03 Alexander Rawass <alexannika@users.sourceforge.net>
* QTreeMapWindow is now an abstract class
* KDirTreeMapWindow implements makeTreeMapWidget()
* experimental hierach. cushion
* new menu options (experimental & debugging)
* new way to make a border (border_step)
* CTM (Cushion Treemap) test routine added (not working yet)
* new Bug: I'm getting warnings about wrong RGB parameters,
even in flat mode
2001-07-01 Alexander Rawass <alexannika@users.sourceforge.net>
* QTreeMapArea is now a general abstract class to display hierarchies of any kind (not connected to KDirStat anymore)
* KDirTreeMapArea is the implementation for KDirStat
* new Bug: signals/slot not working correctly
* Bug fixed: crashed when telling kdirstat to display a directory which does not exist
2001-06-29 Stefan Hundhammer <sh@suse.de>
* Moved CVS to SourceForge
2001-06-24 Alexander Rawass <alexannika@users.sourceforge.net>
* V1.7.6-Devel
* Removed Zoom Bug
* Removed DM_FILES Bug
* Faster shading (dirs are always drawn flat)
* New directory coloring (shades of grey)
* Options for start direction, border width, draw text
* Removed most compiler warnings
2001-06-18 Stefan Hundhammer <sh@suse.de>
* V1.7.3-Devel
* Applied first treemap patch from
Alexander Rawass <alexannika@users.sourceforge.net>
* Added Alexander Rawass to authors list
* Improved treemap repaint behaviour (not perfect yet)
2001-06-17 Stefan Hundhammer <sh@suse.de>
* V1.7.2-Alpha
* Implemented support for all of KDE's IO protocols (ftp, smb, ...)
* Fixed PacMan warnings on premature exit

@ -0,0 +1,167 @@
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. Type `make install' to install the programs and any data files and
documentation.
4. You can remove the program binaries and object files from the
source code directory by typing `make clean'.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made.
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.

@ -0,0 +1,48 @@
# Toplevel Makefile.am for KDirStat
#
# Originally generated by KDevelop, modified by sh@suse.de
#
SUBDIRS = kdirstat po doc
EXTRA_DIST = \
AUTHORS \
COPYING \
COPYING.LIB \
CREDITS \
ChangeLog \
INSTALL \
README \
TODO \
admin \
build-howto.html \
kdirstat.kdevprj \
kdirstat.lsm
# This is not a GNU package. You can remove this line
# if have all needed files a GNU package needs.
AUTOMAKE_OPTIONS = foreign
CLEANFILES = $(wildcard autom4te.cache/*)
$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ;
$(top_srcdir)/subdirs:
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs
$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in
@cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4
MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files
package-messages:
$(MAKE) -f admin/Makefile.common package-messages
$(MAKE) -C po merge
dist-hook:
cd $(top_distdir) && perl admin/am_edit -padmin
cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs

@ -0,0 +1,14 @@
all:
@echo "This Makefile is only for the CVS repository"
@echo "This will be deleted before making the distribution"
@echo ""
@if test ! -d admin; then \
echo "Please recheckout this module!" ;\
echo "for cvs: use checkout once and after that update again" ;\
echo "for cvsup: checkout kde-common from cvsup and" ;\
echo " link kde-common/admin to ./admin" ;\
exit 1 ;\
fi
$(MAKE) -f admin/Makefile.common cvs
.SILENT:

@ -0,0 +1,14 @@
all:
@echo "This Makefile is only for the CVS repository"
@echo "This will be deleted before making the distribution"
@echo ""
@if test ! -d admin; then \
echo "Please recheckout this module!" ;\
echo "for cvs: use checkout once and after that update again" ;\
echo "for cvsup: checkout kde-common from cvsup and" ;\
echo " link kde-common/admin to ./admin" ;\
exit 1 ;\
fi
$(MAKE) -f admin/Makefile.common cvs
.SILENT:

@ -0,0 +1,20 @@
This is a graphical "du" (disk usage) display.
What you see here is a 90% rewrite - GUI, engine, everything. The one thing it
can do a whole lot better than the old version is stay on one file system - the
single most most requested feature. Plus, it's way faster for large directory
trees - scanning an entire Linux file system no longer takes 30+
minutes. Rather, it's about 2-3 minutes: The old version seemed to have
problems with system buffer thrashing due to too many directories open for
reading at one time - the new version uses an internal queue and keeps only one
directory open.
For more details, see the KDirStat home page at
http://kdirstat.sourceforge.net/
Stefan Hundhammer <sh@suse.de>
2002-05-10

52
TODO

@ -0,0 +1,52 @@
TODO list for KDirStat
========================
Updated: 2005-01-07
- help text for "treemap" settings
- help text for "general" settings
- update screen shots in online help (no treemaps yet)
- make KDirStat a KPart
Maybe:
======
- German help file
- Animation other than pacman (optional?)
- configure mail report texts (the user gets an editor in the mailer anyway)
- 'kdf' like 'disk free' display for file system of current tree - pie, bar graph?
Steal that thing from the SuSE YaST2 package manager UI I wrote?
(which, in turn, I stole in large parts from KDirStat)
- Filter on tree view: by user, by mtime, by size
- Select items in the tree view as "special interest" for further processing in mail reports
- Manually mark dir subtrees as "static" - e.g., for system directories that
almost never change anyway; scan them just once and save their sizes to file;
only rescan those subtrees on explicit user request
- Automagically mark such subtrees by mtime and/or a hardwired list
Postponed until further notice:
===============================
- write scanned trees to cache file for later reuse;
use this cache file first and then begin scanning the dir tree.
Since the Linux 2.4 kernel is great at caching directory entries,
this isn't really necessary for Linux - and I am a Linux guy...
;-)

File diff suppressed because it is too large Load Diff

1045
aclocal.m4 vendored

File diff suppressed because it is too large Load Diff

@ -0,0 +1,191 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>Building KDirStat for KDE 3.x</title>
</head>
<body bgcolor=#F0F0F0>
<table width=100%>
<tr>
<td width=50% align=left>
Last modified: 23 Nov 2004
</td>
<td width=50% align=right>
Contact: <a href="mailto:sh@suse.de?subject=KDirStat build-howto">Stefan Hundhammer</a>
</td>
</tr>
</table>
<h1 align=center>Building KDirStat for KDE 3.x</h1>
<table width=100% bgcolor=#B0B0F0>
<tr><td><h2>Note:</h2></td></tr>
<tr><td>
If you are using the
latest
<a href="http://www.suse.com/">SuSE Linux</a>
, you may not have to build it at all.
There usually is an RPM package you can use at the
<a href="http://kdirstat.sourceforge.net/download/">download area</a>.
See also the <a href="http://kdirstat.sourceforge.net/">KDirStat home page</a>.
</td></tr>
</table>
<ul>
<li>
Get the latest sources - either the
<a href="http://kdirstat.sourceforge.net/download/">tarball from the download area</a>
or via
<a href="http://sourceforge.net/cvs/?group_id=30290">anonymous CVS from SourceForge.</a>
<p><br></p>
</li>
<li>
Make sure you have a development system up and running.
<p>
You'll need at least:
<ul>
<li>A C++ compiler
<li>Header files for the system libs
<li>X11 development environment (libs and header files)
<li>Qt 3.0 (or later) development environment
<li>KDE 3.x development environment
</ul>
<p>
- maybe more. If you are unsure and you are running SuSE Linux, it might be
a good idea to install the <em>development system</em> selection.
</p>
<p>
Please understand that I cannot and will not fix everybody's broken development
systems any more - this had taken me quite some time with KDirStat 0.8x. Please
make sure you can compile simple KDE programs like <em>kless</em> or
<em>kexample</em> before contacting me about build problems.
</p>
</li>
<br>
<li>Unpack the sources:
<br>
<pre>
tar xjvf kdirstat-2.4.2.tar.bz2
</pre>
<p>
(or whatever version you downloaded)
</p>
<p><br></p>
</li>
<li>
Go to this directory:
<br>
<pre>
cd kdirstat-2.4.2
</pre>
</li>
<li>
Make sure I didn't accidentially include a <em>config.cache</em> file in the
tarball - remove it to make sure. This is a neverending cause of trouble.
<br>
<pre>
rm -f config.cache
</pre>
</li>
<li>
Let the <em>configure</em> script figure out where everything required is on
your system.
<p>
Watch out for error messages and <b>fix them</b> before reporting
errors!
</p>
<p>On SuSE Linux systems, KDE 3.x is installed to <em>/opt/kde3</em> which is a
good idea if you want to keep some KDE 1.x/2.x programs around. So use that
<em>/opt/kde3</em> prefix for KDirStat, too - otherwise it will be installed to
<em>/opt/kde</em> and clutter up a working KDE 1.x/2.x environment.
<br>
<pre>
./configure --prefix=/opt/kde3
</pre>
<p>
If you don't care about that or if you set up KDE 3.x in <em>/opt/kde</em>
anyway, simply type
</p>
<pre>
./configure
</pre>
</li>
<li>
Compile everything:
<br>
<pre>
make
</pre>
<p>
Again, watch out for error messages.
</p>
<p>
<br>
</p>
</li>
<li>
If everything worked out allright, become <em>root</em> and install the program
and everything it needs:
<br>
<pre>
su
make install
</pre>
<p>
<b>Don't do this if the previous step reported errors!</b>
</p>
</li>
</ul>
<p>
That's it.
</p>
</body>
</html>
<!-- --- Emacs Customization --- -->
<!-- -->
<!-- Local Variables: -->
<!-- time-stamp-format: "%02d %3b %04y" -->
<!-- time-stamp-start: "Last modified:[ \t]+" -->
<!-- time-stamp-end: "$" -->
<!-- End: -->

@ -0,0 +1,243 @@
/* config.h.in. Generated from configure.in by autoheader. */
/* Define if you have the CoreAudio API */
#undef HAVE_COREAUDIO
/* Define to 1 if you have the <crt_externs.h> header file. */
#undef HAVE_CRT_EXTERNS_H
/* Defines if your system has the crypt function */
#undef HAVE_CRYPT
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define if you have libjpeg */
#undef HAVE_LIBJPEG
/* Define if you have libpng */
#undef HAVE_LIBPNG
/* Define if you have a working libpthread (will enable threaded code) */
#undef HAVE_LIBPTHREAD
/* Define if you have libz */
#undef HAVE_LIBZ
/* Define if you have long long as datatype */
#undef HAVE_LONG_LONG
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define if your system needs _NSGetEnviron to set up the environment */
#undef HAVE_NSGETENVIRON
/* Define if you have res_init */
#undef HAVE_RES_INIT
/* Define if you have the res_init prototype */
#undef HAVE_RES_INIT_PROTO
/* Define if you have a STL implementation by SGI */
#undef HAVE_SGI_STL
/* Define to 1 if you have the `snprintf' function. */
#undef HAVE_SNPRINTF
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define if you have strlcat */
#undef HAVE_STRLCAT
/* Define if you have the strlcat prototype */
#undef HAVE_STRLCAT_PROTO
/* Define if you have strlcpy */
#undef HAVE_STRLCPY
/* Define if you have the strlcpy prototype */
#undef HAVE_STRLCPY_PROTO
/* Define to 1 if you have the <sys/bitypes.h> header file. */
#undef HAVE_SYS_BITYPES_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `vsnprintf' function. */
#undef HAVE_VSNPRINTF
/* Suffix for lib directories */
#undef KDELIBSUFF
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* The size of a `char *', as computed by sizeof. */
#undef SIZEOF_CHAR_P
/* The size of a `int', as computed by sizeof. */
#undef SIZEOF_INT
/* The size of a `long', as computed by sizeof. */
#undef SIZEOF_LONG
/* The size of a `short', as computed by sizeof. */
#undef SIZEOF_SHORT
/* The size of a `size_t', as computed by sizeof. */
#undef SIZEOF_SIZE_T
/* The size of a `unsigned long', as computed by sizeof. */
#undef SIZEOF_UNSIGNED_LONG
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Version number of package */
#undef VERSION
/* Defined if compiling without arts */
#undef WITHOUT_ARTS
/*
* 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
/* Number of bits in a file offset, on hosts where this is settable. */
#undef _FILE_OFFSET_BITS
#if !defined(HAVE_RES_INIT_PROTO)
#ifdef __cplusplus
extern "C" {
#endif
int res_init(void);
#ifdef __cplusplus
}
#endif
#endif
#if !defined(HAVE_STRLCAT_PROTO)
#ifdef __cplusplus
extern "C" {
#endif
unsigned long strlcat(char*, const char*, unsigned long);
#ifdef __cplusplus
}
#endif
#endif
#if !defined(HAVE_STRLCPY_PROTO)
#ifdef __cplusplus
extern "C" {
#endif
unsigned long strlcpy(char*, const char*, unsigned long);
#ifdef __cplusplus
}
#endif
#endif
/* Define for large files, on AIX-style hosts. */
#undef _LARGE_FILES
/*
* 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 */
#undef kde_socklen_t
/* type to use in place of socklen_t if not defined (deprecated, use
kde_socklen_t) */
#undef ksize_t

@ -0,0 +1,2 @@
./admin/configure.in.min
configure.in.in

@ -0,0 +1,109 @@
dnl =======================================================
dnl FILE: ./admin/configure.in.min
dnl =======================================================
dnl This file is part of the KDE libraries/packages
dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org)
dnl This file is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Library General Public
dnl License as published by the Free Software Foundation; either
dnl version 2 of the License, or (at your option) any later version.
dnl This library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl Library General Public License for more details.
dnl You should have received a copy of the GNU Library General Public License
dnl along with this library; see the file COPYING.LIB. If not, write to
dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
dnl Boston, MA 02110-1301, USA.
# Original Author was Kalle@kde.org
# I lifted it in some mater. (Stephan Kulow)
# I used much code from Janos Farkas
dnl Process this file with autoconf to produce a configure script.
AC_INIT(acinclude.m4) dnl a source file from your sub dir
dnl This is so we can use kde-common
AC_CONFIG_AUX_DIR(admin)
dnl This ksh/zsh feature conflicts with `cd blah ; pwd`
unset CDPATH
dnl Checking host/target/build systems, for make, install etc.
AC_CANONICAL_SYSTEM
dnl Perform program name transformation
AC_ARG_PROGRAM
dnl Automake doc recommends to do this only here. (Janos)
AM_INIT_AUTOMAKE(kdirstat, 2.4.4) dnl searches for some needed programs
KDE_SET_PREFIX
dnl generate the config header
AM_CONFIG_HEADER(config.h) dnl at the distribution this done
dnl Checks for programs.
AC_CHECK_COMPILERS
AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)
KDE_PROG_LIBTOOL
dnl for NLS support. Call them in this order!
dnl WITH_NLS is for the po files
AM_KDE_WITH_NLS
dnl KDE_USE_QT
AC_PATH_KDE
dnl =======================================================
dnl FILE: configure.in.in
dnl =======================================================
#MIN_CONFIG
dnl PACKAGE set before
AC_SYS_LARGEFILE
KDE_CHECK_LONG_LONG
KDE_CREATE_SUBDIRSLIST
AC_CONFIG_FILES([ Makefile ])
AC_CONFIG_FILES([ doc/Makefile ])
AC_CONFIG_FILES([ doc/en/Makefile ])
AC_CONFIG_FILES([ kdirstat/Makefile ])
AC_CONFIG_FILES([ kdirstat/pics/Makefile ])
AC_CONFIG_FILES([ po/Makefile ])
AC_OUTPUT
# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure
if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then
# And if so, warn when they don't match
if test "$kde_libs_prefix" != "$given_prefix"; then
# And if kde doesn't know about the prefix yet
echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null
if test $? -ne 0; then
echo ""
echo "Warning: you chose to install this package in $given_prefix,"
echo "but KDE was found in $kde_libs_prefix."
echo "For this to work, you will need to tell KDE about the new prefix, by ensuring"
echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix"
echo "Then restart KDE."
echo ""
fi
fi
fi
if test "$all_tests" = "bad"; then
if test ! "$cache_file" = "/dev/null"; then
echo ""
echo "Please remove the file $cache_file after changing your setup"
echo "so that configure will find the changes next time."
echo ""
fi
else
echo ""
echo "Good - your configure finished. Start make now"
echo ""
fi

@ -0,0 +1,6 @@
#MIN_CONFIG
AM_INIT_AUTOMAKE(kdirstat,2.4.4)
AC_SYS_LARGEFILE
KDE_CHECK_LONG_LONG

@ -0,0 +1,2 @@
SUBDIRS = en

@ -0,0 +1,11 @@
EXTRA_DIST = \
index.docbook \
kdirstat-main.png \
kdirstat-config-cleanups.png \
kdirstat-config-tree-colors.png \
feedback-mail.png
KDE_LANG = en
KDE_DOCS = kdirstat

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -0,0 +1,153 @@
[AUTHORS]
dist=true
install=false
install_location=
type=DATA
[COPYING]
dist=true
install=false
install_location=
type=DATA
[ChangeLog]
dist=true
install=false
install_location=
type=DATA
[Config for BinMakefileAm]
bin_program=kdirstat
cxxflags=-O0 -g3 -Wall
ldadd=$(LIB_KFILE) -lkdeui -lkdecore $(LIB_QT)
ldflags=
[General]
AMChanged=false
author=Stefan Hundhammer
configure_args=--with-qt-dir=/usr/lib/qt2 --prefix=/opt/kde2
email=sh@suse.de
kdevprj_version=1.3
lfv_open_groups=
makefiles=Makefile.am,kdirstat/Makefile.am,doc/Makefile.am,doc/en/Makefile.am,po/Makefile.am
project_name=KDirStat
project_type=normal_kde2
sgml_file=/work/home/sh/kde2/kdirstat/doc/en/index.docbook
sub_dir=kdirstat/
version=1.1
version_control=None
workspace=1
[INSTALL]
dist=true
install=false
install_location=
type=DATA
[LFV Groups]
GNU=AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,NEWS
Headers=*.h,*.hh,*.hxx,*.hpp,*.H
Others=*
Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l
Translations=*.po
B_KFILEUser Interface=*.kdevdlg,*.ui,*.rc
groups=Headers,Sources,User Interface,Translations,GNU,Others
[Makefile.am]
files=kdirstat.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,kdirstat.lsm
sub_dirs=kdirstat,po,doc
type=normal
[README]
dist=true
install=false
install_location=
type=DATA
[TODO]
dist=true
install=false
install_location=
type=DATA
[Workspace_1]
browser_file=file:/opt/kde2/share/doc/HTML/default/kdevelop/kde_libref/index.html
cpp_file=/work/home/sh/kde2/kdirstat/kdirstat/kdirstat.cpp
header_file=/work/home/sh/kde2/kdirstat/AUTHORS
openfiles=Untitled.h,Untitled.cpp,/work/home/sh/kde2/kdirstat/kdirstat/kdirstat.h,/work/home/sh/kde2/kdirstat/COPYING,/work/home/sh/kde2/kdirstat/COPYING.LIB,/work/home/sh/kde2/kdirstat/AUTHORS,/work/home/sh/kde2/kdirstat/kdirstat/kdirstat.cpp,/work/home/sh/kde2/kdirstat/kdirstat/kdirtree.cpp
show_outputview=true
show_treeview=true
[doc/Makefile.am]
sub_dirs=en
type=normal
[doc/en/Makefile.am]
files=doc/en/index.docbook
sub_dirs=
type=normal
[doc/en/index.docbook]
dist=true
install=false
install_location=$$(kde_icondir)/locolor/16x16/apps/kdirstat.png
type=DATA
[kdirstat.kdevprj]
dist=true
install=false
install_location=
type=DATA
[kdirstat.lsm]
dist=true
install=false
install_location=
type=DATA
[kdirstat/Makefile.am]
files=kdirstat/main.cpp,kdirstat/kdirstat.cpp,kdirstat/kdirstat.h,kdirstat/kdirstatdoc.cpp,kdirstat/kdirstatdoc.h,kdirstat/kdirstatview.cpp,kdirstat/kdirstatview.h,kdirstat/kdirstatui.rc,kdirstat/kdirstat.desktop,kdirstat/lo32-app-kdirstat.png,kdirstat/lo16-app-kdirstat.png
sub_dirs=
type=prog_main
[kdirstat/kdirstat.cpp]
dist=true
install=false
install_location=
type=SOURCE
[kdirstat/kdirstat.desktop]
dist=true
install=true
install_location=$$(kde_appsdir)/Applications/kdirstat.desktop
type=DATA
[kdirstat/kdirstat.h]
dist=true
install=false
install_location=
type=HEADER
[kdirstat/kdirstatdoc.cpp]
dist=true
install=false
install_location=
type=SOURCE
[kdirstat/kdirstatdoc.h]
dist=true
install=false
install_location=
type=HEADER
[kdirstat/kdirstatui.rc]
dist=true
install=false
install_location=
type=DATA
[kdirstat/kdirstatview.cpp]
dist=true
install=false
install_location=
type=SOURCE
[kdirstat/kdirstatview.h]
dist=true
install=false
install_location=
type=HEADER
[kdirstat/lo16-app-kdirstat.png]
dist=true
install=true
install_location=$$(kde_icondir)/locolor/16x16/apps/kdirstat.png
type=DATA
[kdirstat/lo32-app-kdirstat.png]
dist=true
install=true
install_location=$$(kde_icondir)/locolor/32x32/apps/kdirstat.png
type=DATA
[kdirstat/main.cpp]
dist=true
install=false
install_location=
type=SOURCE
[po/Makefile.am]
sub_dirs=
type=po

@ -0,0 +1,14 @@
Begin3
Title: KDirStat
Version: 1.8.6-rc1
Entered-date: 2001-06-29
Description: Grapical 'du' (disk usage) utility for KDE 2.x
Keywords: disk usage, file system, cleanup
Author: Stefan Hundhammer <sh@suse.de>
Maintained-by: Stefan Hundhammer <sh@suse.de>
Primary-site: http://kdirstat.sourceforge.net/
Home-page: http://kdirstat.sourceforge.net/
Original-site: http://kdirstat.sourceforge.net/
Platforms: Linux and other Unices
Copying-policy: GNU Public License
End

@ -0,0 +1,70 @@
#
# spec file for package kdirstat (Version 2.4.4)
#
# Copyright (c) 2005 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
# Please submit bugfixes or comments via http://www.suse.de/feedback/
#
# norootforbuild
# neededforbuild kde3-devel-packages
BuildRequires: aaa_base acl attr bash bind-utils bison bzip2 coreutils cpio cpp cracklib cvs cyrus-sasl db devs diffutils e2fsprogs file filesystem fillup findutils flex gawk gdbm-devel glibc glibc-devel glibc-locale gpm grep groff gzip info insserv klogd less libacl libattr libgcc libnscd libselinux libstdc++ libxcrypt libzio m4 make man mktemp module-init-tools ncurses ncurses-devel net-tools netcfg openldap2-client openssl pam pam-modules patch permissions popt procinfo procps psmisc pwdutils rcs readline sed strace syslogd sysvinit tar tcpd texinfo timezone unzip util-linux vim zlib zlib-devel arts arts-devel autoconf automake binutils expat fam fam-devel fontconfig fontconfig-devel freeglut freeglut-devel freetype2 freetype2-devel gcc gcc-c++ gdbm gettext glib2 glib2-devel gnome-filesystem jack jack-devel kdelibs3 kdelibs3-devel kdelibs3-doc libart_lgpl libart_lgpl-devel libgcrypt libgcrypt-devel libgpg-error libgpg-error-devel libidn libidn-devel libjpeg libjpeg-devel liblcms liblcms-devel libmng libmng-devel libpng libpng-devel libstdc++-devel libtiff libtiff-devel libtool libxml2 libxml2-devel libxslt libxslt-devel openssl-devel pcre pcre-devel perl python qt3 qt3-devel rpm unsermake update-desktop-files xorg-x11-Mesa xorg-x11-Mesa-devel xorg-x11-devel xorg-x11-libs
Name: kdirstat
URL: http://kdirstat.sourceforge.net
License: GPL
Group: Productivity/File utilities
Summary: Graphical Directory Statistics for Used Disk Space
Version: 2.4.4
Release: 0
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Source0: kdirstat-%{version}.tar.bz2
%description
KDirStat (KDE Directory Statistics) is a utility program that sums up
disk usage for directory trees - very much like the Unix 'du' command.
It can also help you clean up used space.
Authors:
--------
Stefan Hundhammer <sh@suse.de>
%prep
%setup -q
. /etc/opt/kde3/common_options
update_admin --no-unsermake
%build
. /etc/opt/kde3/common_options
./configure $configkde --disable-final
make
%install
. /etc/opt/kde3/common_options
make DESTDIR=$RPM_BUILD_ROOT $INSTALL_TARGET
%suse_update_desktop_file %name Filesystem
%find_lang %name
%files -f %name.lang
%defattr(-,root,root)
%doc COPYING AUTHORS ChangeLog TODO README
/opt/kde3/bin/kdirstat
/opt/kde3/share/apps/kdirstat
/opt/kde3/share/appl*/*/kdirstat*
/opt/kde3/share/doc/HTML/*/kdirstat/
%dir /opt/kde3/share/icons/hicolor/16x16
%dir /opt/kde3/share/icons/hicolor/16x16/apps
%dir /opt/kde3/share/icons/hicolor/32x32
%dir /opt/kde3/share/icons/hicolor/32x32/apps
%dir /opt/kde3/share/icons/locolor/16x16/apps
%dir /opt/kde3/share/icons/locolor/32x32/apps
/opt/kde3/share/icons/??color/??x??/*/kdirstat*
%dir /opt/kde3/share/apps/kconf_update
/opt/kde3/share/apps/kconf_update/kdirstat.upd
/opt/kde3/share/apps/kconf_update/fix_move_to_trash_bin.pl

@ -0,0 +1,98 @@
# Makefile.am for kdirstat/kdirstat
#
# Initially generated by KDevelop, cleaned up by <sh@suse.de>
SUBDIRS = pics
bin_PROGRAMS = kdirstat
kdirstat_SOURCES = \
kdirstatmain.cpp \
kdirstatapp.cpp \
kdirstatfeedback.cpp \
kfeedback.cpp \
kdirtreeview.cpp \
kdirtreeiterators.cpp \
kdirtree.cpp \
ktreemapview.cpp \
ktreemaptile.cpp \
kcleanup.cpp \
kstdcleanup.cpp \
kcleanupcollection.cpp \
kdirstatsettings.cpp \
kdirsaver.cpp \
kactivitytracker.cpp \
kpacman.cpp
noinst_HEADERS = \
kdirstatapp.h \
kfeedback.h \
kdirtreeview.h \
kdirtreeiterators.h \
kdirtree.h \
ktreemapview.h \
ktreemaptile.h \
kcleanup.h \
kstdcleanup.h \
kcleanupcollection.h \
kdirstatsettings.h \
kdirsaver.h \
kactivitytracker.h \
kpacman.h
EXTRA_DIST = \
kdirstatui.rc \
kdirstat.desktop \
lo32-app-kdirstat.png \
lo16-app-kdirstat.png \
hi32-app-kdirstat.png \
hi16-app-kdirstat.png
updatedir = $(kde_datadir)/kconf_update
update_DATA = kdirstat.upd
update_SCRIPTS = fix_move_to_trash_bin.pl
kdirstat_LDADD = $(LIB_KFILE)
KDE_ICON = kdirstat
applnkdir = $(kde_appsdir)/Utilities
applnk_DATA = kdirstat.desktop
####### kdevelop will overwrite this part!!! (end)############
# this 10 paths are KDE specific. Use them:
# kde_htmldir Where your docs should go to. (contains lang subdirs)
# kde_appsdir Where your application file (.kdelnk) should go to.
# kde_icondir Where your icon should go to.
# kde_minidir Where your mini icon should go to.
# kde_datadir Where you install application data. (Use a subdir)
# kde_locale Where translation files should go to.(contains lang subdirs)
# kde_cgidir Where cgi-bin executables should go to.
# kde_confdir Where config files should go to.
# kde_mimedir Where mimetypes should go to.
# kde_toolbardir Where general toolbar icons should go to.
# kde_wallpaperdir Where general wallpapers should go to.
# set the include path for X, qt and KDE
INCLUDES= $(all_includes)
METASOURCES = AUTO
# the library search path.
kdirstat_LDFLAGS = $(all_libraries) $(KDE_RPATH)
rcdir = $(kde_datadir)/kdirstat
rc_DATA = kdirstatui.rc
messages: rc.cpp
LIST=`find . -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.ecpp -o -name \*.C`; \
if test -n "$$LIST"; then \
$(XGETTEXT) $$LIST -o $(podir)/kdirstat.pot; \
fi

@ -0,0 +1,9 @@
#!/usr/bin/perl
#
# Replace ~/KDesktop/Trash to %t
#
while( <> )
{
s:~?\S*/\S*Trash\S*:%t: if ( /^\s*command\s*=\s*kfmclient\s+move/ );
print $_;
}

Binary file not shown.

Binary file not shown.

@ -0,0 +1,93 @@
/*
* File name: kactivitytracker.cpp
* Summary: Utility object to track user activity
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#include <kapp.h>
#include <kdebug.h>
#include <kconfig.h>
#include "kactivitytracker.h"
KActivityTracker::KActivityTracker( QObject * parent,
const QString & id,
long initialThreshold )
: QObject( parent )
{
_id = id;
KConfig * config = kapp->config();
config->setGroup( _id );
_sum = config->readNumEntry( "activityPoints", 0 );
_lastSignal = config->readNumEntry( "lastSignal" , 0 );
_threshold = config->readNumEntry( "threshold", initialThreshold );
}
KActivityTracker::~KActivityTracker()
{
// NOP
}
void
KActivityTracker::setThreshold( long threshold )
{
_threshold = threshold;
KConfig * config = kapp->config();
config->setGroup( _id );
config->writeEntry( "threshold", _threshold );
checkThreshold();
}
void
KActivityTracker::trackActivity( int points )
{
_sum += points;
if ( _sum < 0 ) // handle long int overflow
_sum = 0;
#if 0
kdDebug() << "Adding " << points << " activity points."
<< " Total: " << _sum << " threshold: " << _threshold
<< endl;
#endif
KConfig * config = kapp->config();
config->setGroup( _id );
config->writeEntry( "activityPoints", _sum );
checkThreshold();
}
void
KActivityTracker::checkThreshold()
{
if ( _sum > _threshold && _lastSignal < _threshold )
{
// kdDebug() << "Activity threshold reached for " << _id << endl;
_lastSignal = _sum;
KConfig * config = kapp->config();
config->setGroup( _id );
config->writeEntry( "lastSignal", _lastSignal );
emit thresholdReached();
}
}
// EOF

@ -0,0 +1,109 @@
/*
* File name: kactivitytracker.h
* Summary: Utility object to track user activity
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KActivityTracker_h
#define KActivityTracker_h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <qobject.h>
/**
* Helper class to track user activity of any kind: When the user uses an
* application's actions (menu items etc.), those actions notify this object of
* that fact. Each action has an amount of "activity points" assigned
* (i.e. what this action is "worth"). Those points are summed up here, and
* when a certain number of points is reached, a signal is triggered. This
* signal can be used for example to ask the user if he wouldn't like to rate
* this program - or register it if this is a shareware program.
*
* @short User activity tracker
**/
class KActivityTracker: public QObject
{
Q_OBJECT
public:
/**
* Constructor. The ID is a name for the KConfig object to look in for
* accumulated activity points so far. 'initialThreshold' is only used if
* the application's @ref KConfig object doesn't contain a corresponding
* entry yet.
**/
KActivityTracker( QObject * parent,
const QString & id,
long initialThreshold );
/**
* Destructor.
**/
virtual ~KActivityTracker();
/**
* Returns the number of activity points accumulated so far.
**/
long sum() const { return _sum; }
/**
* Sets the activity threshold, i.e. when a signal will be sent.
**/
void setThreshold( long threshold );
/**
* Returns the current threshold.
**/
long threshold() const { return _threshold; }
/**
* Check the sum of activity points accumulated so far against the current
* threshold and emit a signal if appropriate.
**/
void checkThreshold();
public slots:
/**
* Track an activity, i.e. add the specified amount of activity points to
* the accumulated sum.
**/
void trackActivity( int points );
/**
* Set the threshold to its double value.
**/
void doubleThreshold() { setThreshold( 2 * threshold() ); }
signals:
/**
* Emitted when the activity threshold is reached.
*
* You might want to set the threshold to a new value when this signal is
* emitted. You can simply connect it to @ref doubleThreshold().
**/
void thresholdReached( void );
protected:
long _sum;
long _threshold;
long _lastSignal;
QString _id;
};
#endif // KActivityTracker_h
// EOF

@ -0,0 +1,432 @@
/*
* File name: kcleanup.cpp
* Summary: Support classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2004-11-23
*/
#include <stdlib.h>
#include <qapplication.h>
#include <qregexp.h>
#include <kapp.h>
#include <kprocess.h>
#include <kdebug.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kglobalsettings.h>
#include "kcleanup.h"
#include "kdirsaver.h"
#define VERBOSE_RUN_COMMAND 1
#define SIMULATE_COMMAND 0
using namespace KDirStat;
KCleanup::KCleanup( QString id,
QString command,
QString title,
KActionCollection * parent )
: KAction( title,
0, // accel
parent,
id )
, _id ( id )
, _command ( command )
, _title ( title )
{
_selection = 0;
_enabled = true;
_worksForDir = true;
_worksForFile = false;
_worksForDotEntry = false;
_worksLocalOnly = true;
_recurse = false;
_askForConfirmation = false;
_refreshPolicy = noRefresh;
KAction::setEnabled( false );
}
KCleanup::KCleanup( const KCleanup &src )
: KAction()
{
copy( src );
}
KCleanup &
KCleanup::operator= ( const KCleanup &src )
{
copy( src );
return *this;
}
void
KCleanup::copy( const KCleanup &src )
{
setTitle( src.title() );
_selection = src.selection();
_id = src.id();
_command = src.command();
_enabled = src.enabled();
_worksForDir = src.worksForDir();
_worksForFile = src.worksForFile();
_worksForDotEntry = src.worksForDotEntry();
_worksLocalOnly = src.worksLocalOnly();
_recurse = src.recurse();
_askForConfirmation = src.askForConfirmation();
_refreshPolicy = src.refreshPolicy();
}
void
KCleanup::setTitle( const QString &title )
{
_title = title;
KAction::setText( _title );
}
bool
KCleanup::worksFor( KFileInfo *item ) const
{
if ( ! _enabled || ! item )
return false;
if ( worksLocalOnly() && ! item->tree()->isFileProtocol() )
return false;
if ( item->isDotEntry() ) return worksForDotEntry();
if ( item->isDir() ) return worksForDir();
return worksForFile();
}
void
KCleanup::selectionChanged( KFileInfo *selection )
{
bool enabled = false;
_selection = selection;
if ( selection )
{
enabled = worksFor( selection );
if ( ! selection->isFinished() )
{
// This subtree isn't finished reading yet
switch ( _refreshPolicy )
{
// Refresh policies that would cause this subtree to be deleted
case refreshThis:
case refreshParent:
case assumeDeleted:
// Prevent premature deletion of this tree - this would
// cause a core dump for sure.
enabled = false;
break;
default:
break;
}
}
}
KAction::setEnabled( enabled );
}
void
KCleanup::executeWithSelection()
{
if ( _selection )
execute( _selection );
}
bool
KCleanup::confirmation( KFileInfo * item )
{
QString msg;
if ( item->isDir() || item->isDotEntry() )
{
msg = i18n( "%1\nin directory %2" ).arg( cleanTitle() ).arg( item->url() );
}
else
{
msg = i18n( "%1\nfor file %2" ).arg( cleanTitle() ).arg( item->url() );
}
if ( KMessageBox::warningContinueCancel( 0, // parentWidget
msg, // message
i18n( "Please Confirm" ), // caption
i18n( "Confirm" ) // confirmButtonLabel
) == KMessageBox::Continue )
return true;
else
return false;
}
void
KCleanup::execute( KFileInfo *item )
{
if ( worksFor( item ) )
{
if ( _askForConfirmation && ! confirmation( item ) )
return;
KDirTree * tree = item->tree();
executeRecursive( item );
switch ( _refreshPolicy )
{
case noRefresh:
// Do nothing.
break;
case refreshThis:
tree->refresh( item );
break;
case refreshParent:
tree->refresh( item->parent() );
break;
case assumeDeleted:
// Assume the cleanup action has deleted the item.
// Modify the KDirTree accordingly.
tree->deleteSubtree( item );
// Don't try to figure out a reasonable next selection - the
// views have to do that while handling the subtree
// deletion. Only the views have any knowledge about a
// reasonable strategy for choosing a next selection. Unlike
// the view items, the KFileInfo items don't have an order that
// makes any sense to the user.
break;
}
}
emit executed();
}
void
KCleanup::executeRecursive( KFileInfo *item )
{
if ( worksFor( item ) )
{
if ( _recurse )
{
// Recurse into all subdirectories.
KFileInfo * subdir = item->firstChild();
while ( subdir )
{
if ( subdir->isDir() )
{
/**
* Recursively execute in this subdirectory, but only if it
* really is a directory: File children might have been
* reparented to the directory (normally, they reside in
* the dot entry) if there are no real subdirectories on
* this directory level.
**/
executeRecursive( subdir );
}
subdir = subdir->next();
}
}
// Perform cleanup for this directory.
runCommand( item, _command );
}
}
const QString
KCleanup::itemDir( const KFileInfo *item ) const
{
QString dir = item->url();
if ( ! item->isDir() && ! item->isDotEntry() )
{
dir.replace ( QRegExp ( "/[^/]*$" ), "" );
}
return dir;
}
QString
KCleanup::cleanTitle() const
{
// Use the cleanup action's title, if possible.
QString title = _title;
if ( title.isEmpty() )
{
title = _id;
}
// Get rid of any "&" characters in the text that denote keyboard
// shortcuts in menus.
title.replace( QRegExp( "&" ), "" );
return title;
}
QString
KCleanup::expandVariables( const KFileInfo * item,
const QString & unexpanded ) const
{
QString expanded = unexpanded;
expanded.replace( QRegExp( "%p" ),
"\"" + QString::fromLocal8Bit( item->url() ) + "\"" );
expanded.replace( QRegExp( "%n" ),
"\"" + QString::fromLocal8Bit( item->name() ) + "\"" );
if ( KDE::versionMajor() >= 3 && KDE::versionMinor() >= 4 )
expanded.replace( QRegExp( "%t" ), "trash:/" );
else
expanded.replace( QRegExp( "%t" ), KGlobalSettings::trashPath() );
return expanded;
}
#include <qtextcodec.h>
void
KCleanup::runCommand ( const KFileInfo * item,
const QString & command ) const
{
KProcess proc;
KDirSaver dir( itemDir( item ) );
QString cmd( expandVariables( item, command ));
#if VERBOSE_RUN_COMMAND
printf( "\ncd " );
fflush( stdout );
system( "pwd" );
QTextCodec * codec = QTextCodec::codecForLocale();
printf( "%s\n", (const char *) codec->fromUnicode( cmd ) );
fflush( stdout );
#endif
#if ! SIMULATE_COMMAND
proc << "sh";
proc << "-c";
proc << cmd;
switch ( _refreshPolicy )
{
case noRefresh:
case assumeDeleted:
// In either case it is no use waiting for the command to
// finish, so we are starting the command as a pure
// background process.
proc.start( KProcess::DontCare );
break;
case refreshThis:
case refreshParent:
// If a display refresh is due after the command, we need to
// wait for the command to be finished in order to avoid
// performing the update prematurely, so we are starting this
// process in blocking mode.
QApplication::setOverrideCursor( waitCursor );
proc.start( KProcess::Block );
QApplication::restoreOverrideCursor();
break;
}
#endif
}
void
KCleanup::readConfig()
{
KConfig *config = kapp->config();
KConfigGroupSaver saver( config, _id );
bool valid = config->readBoolEntry( "valid", false );
// If the config section requested exists, it should contain a
// "valid" field with a true value. If not, there is no such
// section within the config file. In this case, just leave this
// cleanup action undisturbed - we'd rather have a good default
// value (as provided - hopefully - by our application upon
// startup) than a generic empty cleanup action.
if ( valid )
{
_command = config->readEntry ( "command" );
_enabled = config->readBoolEntry ( "enabled" );
_worksForDir = config->readBoolEntry ( "worksForDir" );
_worksForFile = config->readBoolEntry ( "worksForFile" );
_worksForDotEntry = config->readBoolEntry ( "worksForDotEntry" );
_worksLocalOnly = config->readBoolEntry ( "worksLocalOnly" );
_recurse = config->readBoolEntry ( "recurse" , false );
_askForConfirmation = config->readBoolEntry ( "askForConfirmation" , false );
_refreshPolicy = (KCleanup::RefreshPolicy) config->readNumEntry( "refreshPolicy" );
setTitle( config->readEntry( "title" ) );
}
}
void
KCleanup::saveConfig() const
{
KConfig *config = kapp->config();
KConfigGroupSaver saver( config, _id );
config->writeEntry( "valid", true );
config->writeEntry( "command", _command );
config->writeEntry( "title", _title );
config->writeEntry( "enabled", _enabled );
config->writeEntry( "worksForDir", _worksForDir );
config->writeEntry( "worksForFile", _worksForFile );
config->writeEntry( "worksForDotEntry", _worksForDotEntry );
config->writeEntry( "worksLocalOnly", _worksLocalOnly );
config->writeEntry( "recurse", _recurse );
config->writeEntry( "askForConfirmation", _askForConfirmation );
config->writeEntry( "refreshPolicy", (int) _refreshPolicy );
}
// EOF

@ -0,0 +1,360 @@
/*
* File name: kcleanup.h
* Summary: Support classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KCleanup_h
#define KCleanup_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <qdict.h>
#include <qptrlist.h>
#include <qintdict.h>
#include <kaction.h>
#include <kdebug.h>
#include "kdirtree.h"
namespace KDirStat
{
/**
* Cleanup action to be performed for @ref KDirTree items.
*
* @short KDirStat cleanup action
**/
class KCleanup: public KAction
{
Q_OBJECT
public:
enum RefreshPolicy { noRefresh, refreshThis, refreshParent, assumeDeleted };
/**
* Constructor.
*
* 'id' is the name of this cleanup action as used in the XML UI file
* and config files, 'title' is the human readable menu title.
* 'command' is the shell command to execute.
*
* Most applications will want to pass KMainWindow::actionCollection()
* for 'parent' so the menus and toolbars can be created using the XML
* UI description ('kdirstatui.rc' for KDirStat).
**/
KCleanup( QString id = "",
QString command = "",
QString title = "",
KActionCollection * parent = 0 );
/**
* Copy Constructor.
*
* Notice that this is a not quite complete copy constructor: Since
* there is no KAction copy constructor, the inherited KAction members
* will be constructed with the KAction default constructor. Thus, an
* object created with this copy constructor can rely only on its
* KCleanup members. This is intended for save/restore operations only,
* not for general use. In particular, DO NOT connect an object thus
* constructed with signals. The results will be undefined (at best).
**/
KCleanup( const KCleanup &src );
/**
* Assignment operator.
*
* This will not modify the KAction members, just the KCleanup
* members. Just like the copy constructor, this is intended for
* save/restore operations, not for general use.
**/
KCleanup & operator= ( const KCleanup &src );
/**
* Return the ID (name) of this cleanup action as used for setup files
* and the XML UI description. This ID should be unique within the
* application.
**/
const QString & id() const { return _id; }
/**
* Return the command line that will be executed upon calling @ref
* KCleanup::execute(). This command line may contain %p for the
* complete path of the directory or file concerned or %n for the pure
* file or directory name without path.
**/
const QString & command() const { return _command; }
/**
* Return the user title of this command as displayed in menus.
* This may include '&' characters for keyboard shortcuts.
* See also @ref cleanTitle() .
**/
const QString & title() const { return _title; }
/**
* Returns the cleanup action's title without '&' keyboard shortcuts.
* Uses the ID as fallback if the name is empty.
**/
QString cleanTitle() const;
/**
* Return whether or not this cleanup action is generally enabled.
**/
bool enabled() const { return _enabled; }
/**
* Return this cleanup's internally stored @ref KDirTree
* selection. Important only for copy constructor etc.
**/
KFileInfo * selection() const { return _selection; }
/**
* Return whether or not this cleanup action works for this particular
* KFileInfo. Checks all the other conditions (enabled(),
* worksForDir(), worksForFile(), ...) accordingly.
**/
bool worksFor( KFileInfo *item ) const;
/**
* Return whether or not this cleanup action works for directories,
* i.e. whether or not @ref KCleanup::execute() will be successful if
* the object passed is a directory.
**/
bool worksForDir() const { return _worksForDir; }
/**
* Return whether or not this cleanup action works for plain files.
**/
bool worksForFile() const { return _worksForFile; }
/**
* Return whether or not this cleanup action works for KDirStat's
* special 'Dot Entry' items, i.e. the pseudo nodes created in most
* directories that hold the plain files.
**/
bool worksForDotEntry() const { return _worksForDotEntry; }
/**
* Return whether or not this cleanup action works for simple local
* files and directories only ('file:/' protocol) or network
* transparent, i.e. all protocols KDE supports ('ftp', 'smb' - but
* even 'tar', even though it is - strictly spoken - local).
**/
bool worksLocalOnly() const { return _worksLocalOnly; }
/**
* Return whether or not the cleanup action should be performed
* recursively in subdirectories of the initial KFileInfo.
**/
bool recurse() const { return _recurse; }
/**
* Return whether or not this cleanup should ask the user for
* confirmation when it is executed.
*
* The default is 'false'. Use with caution - not only can this become
* very annoying, people also tend to automatically click on 'OK' when
* too many confirmation dialogs pop up!
**/
bool askForConfirmation() const { return _askForConfirmation; }
/**
* Return the refresh policy of this cleanup action - i.e. the action
* to perform after each call to KCleanup::execute(). This is supposed
* to bring the corresponding KDirTree back into sync after the cleanup
* action - the underlying file tree might have changed due to that
* cleanup action.
*
* noRefresh: Don't refresh anything. Assume nothing has changed.
* This is the default.
*
* refreshThis: Refresh the KDirTree from the item on that was passed
* to KCleanup::execute().
*
* refreshParent: Refresh the KDirTree from the parent of the item on
* that was passed to KCleanup::execute(). If there is no such parent,
* refresh the entire tree.
*
* assumeDeleted: Do not actually refresh the KDirTree. Instead,
* blindly assume the cleanup action has deleted the item that was
* passed to KCleanup::execute() and delete the corresponding subtree
* in the KDirTree accordingly. This will work well for most deleting
* actions as long as they can be performed without problems. If there
* are any problems, however, the KDirTree might easily run out of sync
* with the directory tree: The KDirTree will show the subtree as
* deleted (i.e. it will not show it any more), but it still exists on
* disk. This is the tradeoff to a very quick response. On the other
* hand, the user can easily at any time hit one of the explicit
* refresh buttons and everything will be back into sync again.
**/
enum RefreshPolicy refreshPolicy() const { return _refreshPolicy; }
void setTitle ( const QString &title );
void setId ( const QString &id ) { _id = id; }
void setCommand ( const QString &command) { _command = command; }
void setEnabled ( bool enabled ) { _enabled = enabled; }
void setWorksForDir ( bool canDo ) { _worksForDir = canDo; }
void setWorksForFile ( bool canDo ) { _worksForFile = canDo; }
void setWorksForDotEntry ( bool canDo ) { _worksForDotEntry = canDo; }
void setWorksLocalOnly ( bool canDo ) { _worksLocalOnly = canDo; }
void setRecurse ( bool recurse ) { _recurse = recurse; }
void setAskForConfirmation ( bool ask ) { _askForConfirmation = ask; }
void setRefreshPolicy ( enum RefreshPolicy refreshPolicy ) { _refreshPolicy = refreshPolicy; }
public slots:
/**
* The heart of the matter: Perform the cleanup with the KFileInfo
* specified.
**/
void execute( KFileInfo *item );
/**
* Perform the cleanup with the current KDirTree selection if there is
* any.
**/
void executeWithSelection();
/**
* Set enabled/disabled status according to 'selection' and internally
* store 'selection' - this will also be used upon calling
* @ref executeWithSelection() . '0' means "nothing selected".
**/
void selectionChanged( KFileInfo *selection );
/**
* Read configuration.
**/
void readConfig();
/**
* Save configuration.
**/
void saveConfig() const;
signals:
/**
* Emitted after the action is executed.
*
* Please note that there intentionally is no reference as to which
* object the action was executed upon since this object very likely
* doesn't exist any more.
**/
void executed();
protected slots:
/**
* Inherited from @ref KAction : Perform the action.
* In this case, execute the cleanup with the current selection.
**/
virtual void slotActivated() { executeWithSelection(); }
protected:
/**
* Recursively perform the cleanup.
**/
void executeRecursive( KFileInfo *item );
/**
* Ask user for confirmation to execute this cleanup action for
* 'item'. Returns 'true' if user accepts, 'false' otherwise.
**/
bool confirmation( KFileInfo *item );
/**
* Retrieve the directory part of a KFileInfo's path.
**/
const QString itemDir( const KFileInfo *item ) const;
/**
* Expand some variables in string 'unexpanded' to information from
* within 'item'. Multiple expansion is performed as needed, i.e. the
* string may contain more than one variable to expand. The resulting
* string is returned.
*
* %p expands to item->path(), i.e. the item's full path name.
*
* /usr/local/bin for that directory
* /usr/local/bin/doit for a file within it
*
* %n expands to item->name(), i.e. the last component of the pathname.
* The examples above would expand to:
*
* bin
* doit
*
* For commands that are to be executed from within the 'Clean up'
* menu, you might specify something like:
*
* "kfmclient openURL %p"
* "tar czvf %{name}.tgz && rm -rf %{name}"
**/
QString expandVariables ( const KFileInfo * item,
const QString & unexpanded ) const;
/**
* Run a command with 'item' as base to expand variables.
**/
void runCommand ( const KFileInfo * item,
const QString & command ) const;
/**
* Internal implementation of the copy constructor and assignment
* operator: Copy all data members from 'src'.
**/
void copy ( const KCleanup &src );
//
// Data members
//
KFileInfo * _selection;
QString _id;
QString _command;
QString _title;
bool _enabled;
bool _worksForDir;
bool _worksForFile;
bool _worksForDotEntry;
bool _worksLocalOnly;
bool _recurse;
bool _askForConfirmation;
enum RefreshPolicy _refreshPolicy;
};
inline kdbgstream & operator<< ( kdbgstream & stream, const KCleanup * cleanup )
{
if ( cleanup )
stream << cleanup->id();
else
stream << "<NULL>";
return stream;
}
} // namespace KDirStat
#endif // ifndef KCleanup_h
// EOF

@ -0,0 +1,283 @@
/*
* File name: kcleanupcollection.cpp
* Summary: Support classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2004-11-23
*/
#include <klocale.h>
#include "kcleanup.h"
#include "kstdcleanup.h"
#include "kcleanupcollection.h"
using namespace KDirStat;
KCleanupCollection::KCleanupCollection( KActionCollection * actionCollection )
: QObject()
, _actionCollection( actionCollection )
{
/**
* All cleanups beloningt to this collection are stored in two separate Qt
* collections, a QList and a QDict. Make _one_ of them manage the cleanup
* objects, i.e. have them clear the KCleanup objects upon deleting. The
* QList is the master collection, the QDict the slave.
**/
_cleanupList.setAutoDelete( true );
_cleanupDict.setAutoDelete( false );
_nextUserCleanupNo = 0;
}
KCleanupCollection::KCleanupCollection( const KCleanupCollection &src )
: QObject()
{
deepCopy( src );
// Keep consistent with the KCleanup copy constructor: It explicitly uses a
// zero KActionCollecton to make sure no duplicates of cleanups get into
// the action collection.
_actionCollection = 0;
}
KCleanupCollection::~KCleanupCollection()
{
// No need to delete the cleanups: _cleanupList takes care of that
// (autoDelete!).
}
KCleanupCollection &
KCleanupCollection::operator= ( const KCleanupCollection &src )
{
if ( size() != src.size() )
{
/**
* If the sizes are different, we really need to make a deep copy -
* i.e. discard all the existing cleanups in this collection and create
* new ones with the KCleanup copy constructor.
**/
// kdDebug() << k_funcinfo << "Sizes different - deep copy" << endl;
deepCopy( src );
}
else
{
/**
* If the sizes are the same, we'd rather just use the KCleanup
* assignment operator to individually assign each cleanup in the
* source collection to the corresponding one in this collection.
*
* The background of this seemingly awkward solution are (again) the
* limitations of the KCleanup copy constructor: It doesn't make a
* truly identical copy of the entire KCleanup object. Rather, it
* copies only the KCleanup members and leaves most of the KAction
* members (the parent class) untouched.
*
* The behaviour implemented here comes handy in the most common
* situation where this assignment operator is used:
*
* KCleanupCollection tmpCollection( origCollection );
* ...
* ... // let use change settings in settings dialog
* ...
* origCollection = tmpCollection;
*
* 'tmpCollection' here is an incomplete copy of 'origCollection' -
* which represents what the user really can see in the menus, i.e. all
* the KAction stuff in there really needs to work.
*
* During changing preferences in the 'settings' dialog, the user only
* changes 'tmpCollection' - if he chooses to abandon his changes
* (e.g., he clicks on the 'cancel' button), no harm is done -
* 'tmpCollection' is simply not copied back to
* 'origCollection'. Anyway, since 'tmpCollection' is merely a
* container for the true KCleanup members, the KAction members don't
* matter here: There is no representation of 'tmpCollection' in any
* menu or tool bar.
*
* As soon as the user clicks on 'apply' or 'ok' in the 'settings'
* dialog, however, 'tmpCollection' is copied back to 'origCollection'
* - that is, its KCleanup members. Most of the KAction members (other
* than 'text()' which is explicitly copied back) remain untouched,
* thus maintaining consistency with the user interface is guaranteed.
**/
// kdDebug() << k_funcinfo << "Same sizes - individual assignment" << endl;
KCleanupList srcList = src.cleanupList();
KCleanupListIterator srcIt( srcList );
KCleanupListIterator destIt( _cleanupList );
while ( *srcIt && *destIt )
{
// kdDebug() << "Assigning " << *srcIt << endl;
**destIt = **srcIt;
++srcIt;
++destIt;
}
}
// Intentionally leaving '_actionCollection' untouched!
return *this;
}
void
KCleanupCollection::deepCopy( const KCleanupCollection &src )
{
// Copy simple values
_nextUserCleanupNo = src.nextUserCleanupNo();
// Just to make sure - clear the internal collections
_cleanupList.clear();
_cleanupDict.clear();
// Make a deep copy of all the cleanups in the source collection
KCleanupList srcList = src.cleanupList();
KCleanupListIterator it( srcList );
while ( *it )
{
// kdDebug() << k_funcinfo << "Creating new " << *it << endl;
add( new KCleanup( **it ) );
++it;
}
}
void
KCleanupCollection::add( KCleanup *newCleanup )
{
CHECK_PTR( newCleanup );
if ( _cleanupDict[ newCleanup->id() ] ) // Already there?
{
// Delete any old instance in the list.
//
// The instance in the dict will be deleted automatically by inserting
// the new one.
_cleanupList.first(); // Moves _cleanupList.current() to beginning
while ( _cleanupList.current() )
{
if ( _cleanupList.current()->id() == newCleanup->id() )
{
// Found a cleanup with the same ID -
// remove the current list item, delete it (autoDelete!) and
// move _cleanupList.current() to the next item.
_cleanupList.remove();
}
else
_cleanupList.next();
}
}
_cleanupList.append( newCleanup );
_cleanupDict.insert( newCleanup->id(), newCleanup );
connect( this, SIGNAL( selectionChanged( KFileInfo * ) ),
newCleanup, SLOT ( selectionChanged( KFileInfo * ) ) );
connect( this, SIGNAL( readConfig() ),
newCleanup, SLOT ( readConfig() ) );
connect( this, SIGNAL( saveConfig() ),
newCleanup, SLOT ( saveConfig() ) );
connect( newCleanup, SIGNAL( executed() ),
this, SLOT ( cleanupExecuted() ) );
}
void
KCleanupCollection::addStdCleanups()
{
add( KStdCleanup::openInKonqueror ( _actionCollection ) );
add( KStdCleanup::openInTerminal ( _actionCollection ) );
add( KStdCleanup::compressSubtree ( _actionCollection ) );
add( KStdCleanup::makeClean ( _actionCollection ) );
add( KStdCleanup::deleteTrash ( _actionCollection ) );
add( KStdCleanup::moveToTrashBin ( _actionCollection ) );
add( KStdCleanup::hardDelete ( _actionCollection ) );
}
void
KCleanupCollection::addUserCleanups( int number )
{
for ( int i=0; i < number; i++ )
{
QString id;
id.sprintf( "cleanup_user_defined_%d", _nextUserCleanupNo );
QString title;
if ( _nextUserCleanupNo <= 9 )
// Provide a keyboard shortcut for cleanup #0..#9
title=i18n( "User Defined Cleanup #&%1" ).arg(_nextUserCleanupNo);
else
// No keyboard shortcuts for cleanups #10.. - they would be duplicates
title=i18n( "User Defined Cleanup #%1" ).arg(_nextUserCleanupNo);
_nextUserCleanupNo++;
KCleanup *cleanup = new KCleanup( id, "", title, _actionCollection );
CHECK_PTR( cleanup );
cleanup->setEnabled( false );
if ( i <= 9 )
{
// Provide an application-wide keyboard accelerator for cleanup #0..#9
cleanup->setShortcut( Qt::CTRL + Qt::Key_0 + i );
}
add( cleanup );
}
}
KCleanup *
KCleanupCollection::cleanup( const QString & id )
{
return _cleanupDict[ id ];
}
void
KCleanupCollection::clear()
{
_cleanupList.clear();
_cleanupDict.clear();
_nextUserCleanupNo = 0;
}
void
KCleanupCollection::slotReadConfig()
{
emit readConfig();
}
void
KCleanupCollection::cleanupExecuted()
{
emit userActivity( 10 );
}
// EOF

@ -0,0 +1,225 @@
/*
* File name: kcleanupcollection.h
* Summary: Support classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KCleanupCollection_h
#define KCleanupCollection_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "kcleanup.h"
// Forward declarations
class KActionCollection;
namespace KDirStat
{
typedef QDict<KCleanup> KCleanupDict;
typedef QDictIterator<KCleanup> KCleanupDictIterator;
typedef QPtrList<KCleanup> KCleanupList;
typedef QPtrListIterator<KCleanup> KCleanupListIterator;
/**
* Set of @ref KCleanup actions to be performed for @ref KDirTree items,
* consisting of a number of predefined and a number of user-defined
* cleanups. The prime purpose of this is to make save/restore operations
* with a number of cleanups easier. Thus, it provides a copy constructor,
* an assignment operator and various methods to directly access individual
* cleanups.
*
* @short KDirStat cleanup action collection
**/
class KCleanupCollection: public QObject
{
Q_OBJECT
public:
/**
* Constructor.
*
* Most applications will want to pass KMainWindow::actionCollection()
* for 'actionCollection' so the menus and toolbars can be created
* using the XML UI description ('kdirstatui.rc' for KDirStat).
*
* All @ref KCleanup actions ever added to this collection will get
* this as their parent.
**/
KCleanupCollection( KActionCollection * actionCollection = 0 );
/**
* Copy Constructor.
*
* Makes a deep copy of this collection with 'actionCollection' set to
* 0 for all copied cleanups. Please note that since there is no
* complete copy constructor for @ref KCleanup, all restrictions to the
* @ref KCleanup copy constructor apply to the KCleanupCollection, too:
* This copy constructor is intended for save/restore operations only,
* not for general use. In particular, DO NOT connect an object thus
* constructed with signals. The results will be undefined (at best).
**/
KCleanupCollection( const KCleanupCollection &src );
/**
* Assignment operator.
*
* This operator has the same restrictions as the copy constructor:
* Just like the copy constructor, this is intended for save/restore
* operations, not for general use.
*
* For details, see the extensive comments in the source file.
**/
KCleanupCollection & operator= ( const KCleanupCollection &src );
/**
* Destructor
**/
virtual ~KCleanupCollection();
/**
* Add the standard cleanups to this collection.
**/
void addStdCleanups();
/**
* Add 'number' user-defined cleanups to this collection.
**/
void addUserCleanups( int number );
/**
* Add one single cleanup to this collection. The collection assumes
* ownerwhip of this cleanup - don't delete it!
**/
void add( KCleanup *cleanup );
/**
* Retrieve a cleanup by its ID (internal name).
* Returns 0 if there is no such cleanup.
**/
KCleanup * cleanup( const QString & id );
/**
* An alias to @ref cleanup() for convenience: Thus, you can use
* collection[ "cleanup_id" ] to access any particular cleanup.
**/
KCleanup * operator[] ( const QString & id )
{ return cleanup( id ); }
/**
* Remove all cleanups from this collection.
**/
void clear();
/**
* Return (a shallow copy of) the internal cleanup list.
*
* Use this and a KCleanupListIterator to iterate over all cleanups in
* this collection. Remember to keep the list until you no longer need
* the iterator!
*
* KCleanupCollection *coll = ...
* KCleanupList cleanup_list = coll->cleanupList();
* KCleanupListIterator it( cleanup_list );
*
* while ( *it )
* {
* kdDebug() << "Found cleanup " << *it << endl;
* ++it;
* }
**/
KCleanupList cleanupList() const { return _cleanupList; }
/**
* Return the number of cleanup actions in this collection.
**/
int size() const { return _cleanupList.count(); }
/**
* For internal use only: Returns the number to be assigned to the next
* user cleanup that may be added.
**/
int nextUserCleanupNo() const { return _nextUserCleanupNo; }
public slots:
/**
* Emit the readConfig() signal for all cleanups.
**/
void slotReadConfig();
signals:
/**
* Emitted when the currently selected item changes.
* 'item' may be 0 when the selection is cleared.
*
* Connect a view's selectionChanged() signal to this
* selectionChanged() signal to have the cleanup collection pass this
* signal to its cleanups.
**/
void selectionChanged( KFileInfo *item );
/**
* Read collection for all cleanups.
**/
void readConfig();
/**
* Save configuration for all cleanups.
**/
void saveConfig();
/**
* Emitted at user activity, i.e. when the user executes a cleanup.
* This is intended for use together with a @ref KActivityTracker.
**/
void userActivity( int points );
protected slots:
/**
* Connected to each cleanup's @ref executed() signal to track user
* activity.
**/
void cleanupExecuted();
protected:
/**
* Internal implementation of copy constructor and assignment operator:
* Make a deep copy of the collection.
**/
void deepCopy( const KCleanupCollection &src );
// Data members
KActionCollection * _actionCollection;
int _nextUserCleanupNo;
KCleanupList _cleanupList;
KCleanupDict _cleanupDict;
};
} // namespace KDirStat
#endif // ifndef KCleanupCollection_h
// EOF

@ -0,0 +1,71 @@
/*
* File name: kdirsaver.cpp
* Summary: Utility object to save current working directory
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#include <unistd.h>
#include <kdebug.h>
#include "kdirsaver.h"
KDirSaver::KDirSaver( const QString & newPath )
{
/*
* No need to actually save the current working directory: This object
* includes a QDir whose default constructor constructs a directory object
* that contains the current working directory. Just what is needed here.
*/
cd( newPath );
}
KDirSaver::KDirSaver( const KURL & url )
{
if ( url.isLocalFile() )
{
cd( url.path() );
}
else
{
kdError() << k_funcinfo << "Can't change dir to remote location " << url.url() << endl;
}
}
KDirSaver::~KDirSaver()
{
restore();
}
void
KDirSaver::cd( const QString & newPath )
{
if ( ! newPath.isEmpty() )
{
chdir( newPath );
}
}
QString
KDirSaver::currentDirPath() const
{
return QDir::currentDirPath();
}
void
KDirSaver::restore()
{
chdir( oldWorkingDir.path() );
}
// EOF

@ -0,0 +1,75 @@
/*
* File name: kdirsaver.h
* Summary: Utility object to save current working directory
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KDirSaver_h
#define KDirSaver_h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <kurl.h>
#include <qdir.h>
/**
* Helper class to change directories without losing the current context.
* Will change back to the old working directory when destroyed.
*
* @short Directory changer with automatic restore
**/
class KDirSaver
{
public:
/**
* Constructor. Will save the current working directory and change to the
* path supplied. The old working directory will be restored when this
* object is destroyed.
**/
KDirSaver( const QString & newPath = "" );
/**
* Constructor from a KURL. Will issue error messages on stdout for
* non-local objects.
**/
KDirSaver( const KURL & url );
/**
* Destructor. Restores the original working directory.
**/
virtual ~KDirSaver();
/**
* Change directory. Unlike @ref QDir::cd(), this method really performs a
* system chdir() so subsequent system calls will have the directory
* specified as the new current working directory.
**/
void cd( const QString & newPath );
/**
* Obtain the current working directory's absolute path.
* This is useful for resolving/simplifying relative paths.
**/
QString currentDirPath() const;
/**
* (Prematurely) restore the working directory. Unnecessary when this
* object will be destroyed anyway since the destructor does exactly that.
**/
void restore();
protected:
QDir oldWorkingDir;
};
#endif // KDirSaver_h
// EOF

@ -0,0 +1,20 @@
# KDE Config File
[Desktop Entry]
Type=Application
Exec=kdirstat -caption "%c" %i %m
Icon=kdirstat.png
MiniIcon=kdirstat.png
DocPath=kdirstat/index.html
Encoding=UTF-8
Comment=Directory statistics and disk usage
Comment[de]=Verzeichnisstatistik und Platzverbrauch
Comment[hu]=Könyvtárstatisztikák és szabad hely
Terminal=0
Name=KDirStat - Directory Statistics
Name[de]=KDirStat - Verzeichnisstatistik
Name[hu]=KDirStat könyvtárstatisztika
MimeType=inode/directory

@ -0,0 +1,6 @@
# Update for KDirStat configuration
Id=kdirstat_2004_11_24_11_36
File=kdirstatrc
Group=cleanup_move_to_trash_bin
Options=overwrite
Script=fix_move_to_trash_bin.pl,perl

@ -0,0 +1,14 @@
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
<kpartgui name="KDirStatPart" version="1">
<MenuBar>
<Menu name="Edit"><Text>&amp;Edit</Text>
<Action name="selectall"/>
</Menu>
</MenuBar>
<StatusBar/>
</kpartgui>

@ -0,0 +1,847 @@
/*
* File name: kdirstatapp.cpp
* Summary: The KDirStat application - menu bar, tool bar, ...
* License: GPL - See file COPYING for details.
*
* Author: Stefan Hundhammer <sh@suse.de>
* Parts auto-generated by KDevelop
*
* Updated: 2004-12-06
*/
#include <qclipboard.h>
#include <qpopupmenu.h>
#include <qsplitter.h>
#include <kaccel.h>
#include <kaction.h>
#include <kapp.h>
#include <kconfig.h>
#include <kfiledialog.h>
#include <kiconloader.h>
#include <klocale.h>
#include <kmenubar.h>
#include <kmessagebox.h>
#include <krun.h>
#include <kstatusbar.h>
#include <kstdaction.h>
#include <kurlrequesterdlg.h>
#include "kdirstatapp.h"
#include "kcleanupcollection.h"
#include "kdirtree.h"
#include "kpacman.h"
#include "ktreemapview.h"
#include "ktreemaptile.h"
#include "kcleanupcollection.h"
#include "kactivitytracker.h"
#include "kdirtreeview.h"
#include "kdirstatsettings.h"
#define USER_CLEANUPS 10 // Number of user cleanup actions
#define ID_STATUS_MSG 1
#define ID_PACMAN 42
#define PACMAN_WIDTH 350
#define PACMAN_INTERVAL 75 // millisec
#define INITIAL_FEEDBACK_REMINDER 2000L
#define FEEDBACK_REMINDER_INTERVAL 1000L
using namespace KDirStat;
KDirStatApp::KDirStatApp( QWidget* , const char* name )
: KMainWindow( 0, name )
{
// Simple inits
_activityTracker = 0; // Might or might not be needed
// Those will be created delayed, only when needed
_settingsDialog = 0;
_feedbackDialog = 0;
_treemapView = 0;
_pacMan = 0;
_pacManDelimiter = 0;
// Set up internal (mainWin -> mainWin) connections
connect( this, SIGNAL( readConfig ( void ) ),
this, SLOT ( readMainWinConfig( void ) ) );
connect( this, SIGNAL( saveConfig ( void ) ),
this, SLOT ( saveMainWinConfig( void ) ) );
// Create main window
_splitter = new QSplitter( QSplitter::Vertical, this );
setCentralWidget( _splitter );
_treeView = new KDirTreeView( _splitter );
connect( _treeView, SIGNAL( progressInfo( const QString & ) ),
this, SLOT ( statusMsg ( const QString & ) ) );
connect( _treeView, SIGNAL( selectionChanged( KFileInfo * ) ),
this, SLOT ( selectionChanged( KFileInfo * ) ) );
connect( _treeView, SIGNAL( contextMenu( KDirTreeViewItem *, const QPoint & ) ),
this, SLOT ( contextMenu( KDirTreeViewItem *, const QPoint & ) ) );
connect( this, SIGNAL( readConfig() ), _treeView, SLOT ( readConfig() ) );
connect( this, SIGNAL( saveConfig() ), _treeView, SLOT ( saveConfig() ) );
connect( _treeView, SIGNAL( finished() ), this, SLOT( createTreemapView() ) );
connect( _treeView, SIGNAL( aborted() ), this, SLOT( createTreemapView() ) );
connect( _treeView, SIGNAL( startingReading() ), this, SLOT( deleteTreemapView() ) );
connect( _treeView, SIGNAL( startingReading() ), this, SLOT( updateActions() ) );
connect( _treeView, SIGNAL( finished() ), this, SLOT( updateActions() ) );
connect( _treeView, SIGNAL( aborted() ), this, SLOT( updateActions() ) );
// Call inits to invoke all other construction parts
initStatusBar();
initActions();
initCleanups();
createGUI();
initActivityTracker();
_treeViewContextMenu = (QPopupMenu *) factory()->container( "treeViewContextMenu", this );
_treemapContextMenu = (QPopupMenu *) factory()->container( "treemapContextMenu", this );
readMainWinConfig();
// Disable certain actions at startup
_editCopy->setEnabled( false );
_reportMailToOwner->setEnabled( false );
_fileRefreshAll->setEnabled( false );
_fileRefreshSelected->setEnabled( false );
updateActions();
}
KDirStatApp::~KDirStatApp()
{
delete _cleanupCollection;
}
void
KDirStatApp::initActions()
{
_fileAskOpenDir = KStdAction::open ( this, SLOT( fileAskOpenDir() ), actionCollection() );
_fileAskOpenUrl = new KAction( i18n( "Open &URL..." ), "konqueror", 0,
this, SLOT( fileAskOpenUrl() ),
actionCollection(), "file_open_url" );
_fileOpenRecent = KStdAction::openRecent ( this, SLOT( fileOpenRecent( const KURL& ) ), actionCollection() );
_fileCloseDir = KStdAction::close ( this, SLOT( fileCloseDir() ), actionCollection() );
_fileRefreshAll = new KAction( i18n( "Refresh &All" ), "reload", 0,
this, SLOT( refreshAll() ),
actionCollection(), "file_refresh_all" );
_fileRefreshSelected = new KAction( i18n( "Refresh &Selected" ), 0,
this, SLOT( refreshSelected() ),
actionCollection(), "file_refresh_selected" );
_fileContinueReadingAtMountPoint = new KAction( i18n( "Continue Reading at &Mount Point" ), "hdd_mount", 0,
this, SLOT( refreshSelected() ), actionCollection(),
"file_continue_reading_at_mount_point" );
_fileStopReading = new KAction( i18n( "Stop Rea&ding" ), "stop", 0,
this, SLOT( stopReading() ), actionCollection(),
"file_stop_reading" );
_fileQuit = KStdAction::quit ( kapp, SLOT( quit() ), actionCollection() );
_editCopy = KStdAction::copy ( this, SLOT( editCopy() ), actionCollection() );
_showToolBar = KStdAction::showToolbar ( this, SLOT( toggleToolBar() ), actionCollection() );
_showStatusBar = KStdAction::showStatusbar ( this, SLOT( toggleStatusBar() ), actionCollection() );
_cleanupOpenWith = new KAction( i18n( "Open With" ), 0,
this, SLOT( cleanupOpenWith() ),
actionCollection(), "cleanup_open_with" );
_treemapZoomIn = new KAction( i18n( "Zoom in" ), "viewmag+", Key_Plus,
this, SLOT( treemapZoomIn() ),
actionCollection(), "treemap_zoom_in" );
_treemapZoomOut = new KAction( i18n( "Zoom out" ), "viewmag-", Key_Minus,
this, SLOT( treemapZoomOut() ),
actionCollection(), "treemap_zoom_out" );
_treemapSelectParent= new KAction( i18n( "Select Parent" ), "up", Key_Asterisk,
this, SLOT( treemapSelectParent() ),
actionCollection(), "treemap_select_parent" );
_treemapRebuild = new KAction( i18n( "Rebuild Treemap" ), 0,
this, SLOT( treemapRebuild() ),
actionCollection(), "treemap_rebuild" );
_showTreemapView = new KToggleAction( i18n( "Show Treemap" ), Key_F9,
this, SLOT( toggleTreemapView() ),
actionCollection(), "options_show_treemap" );
new KAction( i18n( "Help about Treemaps" ), "help", 0,
this, SLOT( treemapHelp() ),
actionCollection(), "treemap_help" );
KAction * pref = KStdAction::preferences( this, SLOT( preferences() ), actionCollection() );
_reportMailToOwner = new KAction( i18n( "Send &Mail to Owner" ), "mail_generic", 0,
_treeView, SLOT( sendMailToOwner() ),
actionCollection(), "report_mail_to_owner" );
_helpSendFeedbackMail = new KAction( i18n( "Send &Feedback Mail..." ), 0,
this, SLOT( sendFeedbackMail() ),
actionCollection(), "help_send_feedback_mail" );
_fileAskOpenDir->setStatusText ( i18n( "Opens a directory" ) );
_fileAskOpenUrl->setStatusText ( i18n( "Opens a (possibly remote) directory" ) );
_fileOpenRecent->setStatusText ( i18n( "Opens a recently used directory" ) );
_fileCloseDir->setStatusText ( i18n( "Closes the current directory" ) );
_fileRefreshAll->setStatusText ( i18n( "Re-reads the entire directory tree" ) );
_fileRefreshSelected->setStatusText ( i18n( "Re-reads the selected subtree" ) );
_fileContinueReadingAtMountPoint->setStatusText( i18n( "Scan mounted file systems" ) );
_fileStopReading->setStatusText ( i18n( "Stops directory reading" ) );
_fileQuit->setStatusText ( i18n( "Quits the application" ) );
_editCopy->setStatusText ( i18n( "Copies the URL of the selected item to the clipboard" ) );
_showToolBar->setStatusText ( i18n( "Enables/disables the toolbar" ) );
_showStatusBar->setStatusText ( i18n( "Enables/disables the statusbar" ) );
_cleanupOpenWith->setStatusText ( i18n( "Open file or directory with arbitrary application" ) );
_showTreemapView->setStatusText ( i18n( "Enables/disables the treemap view" ) );
_treemapZoomIn->setStatusText ( i18n( "Zoom treemap in" ) );
_treemapZoomOut->setStatusText ( i18n( "Zoom treemap out" ) );
_treemapSelectParent->setStatusText ( i18n( "Select parent" ) );
_treemapRebuild->setStatusText ( i18n( "Rebuild treemap to fit into available space" ) );
pref->setStatusText ( i18n( "Opens the preferences dialog" ) );
_reportMailToOwner->setStatusText ( i18n( "Sends a mail to the owner of the selected subtree" ) );
}
void
KDirStatApp::initCleanups()
{
_cleanupCollection = new KCleanupCollection( actionCollection() );
CHECK_PTR( _cleanupCollection );
_cleanupCollection->addStdCleanups();
_cleanupCollection->addUserCleanups( USER_CLEANUPS );
_cleanupCollection->slotReadConfig();
connect( _treeView, SIGNAL( selectionChanged( KFileInfo * ) ),
_cleanupCollection, SIGNAL( selectionChanged( KFileInfo * ) ) );
connect( this, SIGNAL( readConfig( void ) ),
_cleanupCollection, SIGNAL( readConfig( void ) ) );
connect( this, SIGNAL( saveConfig( void ) ),
_cleanupCollection, SIGNAL( saveConfig( void ) ) );
}
void
KDirStatApp::revertCleanupsToDefaults()
{
KCleanupCollection defaultCollection;
defaultCollection.addStdCleanups();
defaultCollection.addUserCleanups( USER_CLEANUPS );
*_cleanupCollection = defaultCollection;
}
void
KDirStatApp::initPacMan( bool enablePacMan )
{
if ( enablePacMan )
{
if ( ! _pacMan )
{
_pacMan = new KPacMan( toolBar(), 16, false, "kde toolbar widget" );
_pacMan->setInterval( PACMAN_INTERVAL ); // millisec
int id = ID_PACMAN;
toolBar()->insertWidget( id, PACMAN_WIDTH, _pacMan );
toolBar()->setItemAutoSized( id, false );
_pacManDelimiter = new QWidget( toolBar() );
toolBar()->insertWidget( ++id, 1, _pacManDelimiter );
connect( _treeView, SIGNAL( startingReading() ), _pacMan, SLOT( start() ) );
connect( _treeView, SIGNAL( finished() ), _pacMan, SLOT( stop () ) );
connect( _treeView, SIGNAL( aborted() ), _pacMan, SLOT( stop () ) );
}
}
else
{
if ( _pacMan )
{
delete _pacMan;
_pacMan = 0;
}
if ( _pacManDelimiter )
{
delete _pacManDelimiter;
_pacManDelimiter = 0;
}
}
}
void
KDirStatApp::initStatusBar()
{
statusBar()->insertItem( i18n( "Ready." ), ID_STATUS_MSG );
}
void
KDirStatApp::initActivityTracker()
{
if ( ! doFeedbackReminder() )
return;
_activityTracker = new KActivityTracker( this, "Feedback",
INITIAL_FEEDBACK_REMINDER );
connect( _activityTracker, SIGNAL( thresholdReached() ),
this, SLOT ( askForFeedback() ) );
connect( _treeView, SIGNAL( userActivity( int ) ),
_activityTracker, SLOT ( trackActivity( int ) ) );
connect( _cleanupCollection, SIGNAL( userActivity( int ) ),
_activityTracker, SLOT ( trackActivity( int ) ) );
}
void
KDirStatApp::openURL( const KURL& url )
{
statusMsg( i18n( "Opening directory..." ) );
_treeView->openURL( url );
_fileOpenRecent->addURL( url );
_fileRefreshAll->setEnabled( true );
setCaption( url.fileName(), false );
statusMsg( i18n( "Ready." ) );
}
void KDirStatApp::readMainWinConfig()
{
KConfig * config = kapp->config();
config->setGroup( "General Options" );
// Status settings of the various bars and views
_showToolBar->setChecked( config->readBoolEntry( "Show Toolbar", true ) );
toggleToolBar();
_showStatusBar->setChecked( config->readBoolEntry( "Show Statusbar", true ) );
toggleStatusBar();
_showTreemapView->setChecked( config->readBoolEntry( "Show Treemap", true ) );
toggleTreemapView();
// Position settings of the various bars
KToolBar::BarPosition toolBarPos;
toolBarPos = ( KToolBar::BarPosition ) config->readNumEntry( "ToolBarPos", KToolBar::Top );
toolBar( "mainToolBar" )->setBarPos( toolBarPos );
_treemapViewHeight = config->readNumEntry( "TreemapViewHeight", 250 );
// initialize the recent file list
_fileOpenRecent->loadEntries( config,"Recent Files" );
QSize size = config->readSizeEntry( "Geometry" );
if( ! size.isEmpty() )
resize( size );
config->setGroup( "Animation" );
initPacMan( config->readBoolEntry( "ToolbarPacMan", true ) );
_treeView->enablePacManAnimation( config->readBoolEntry( "DirTreePacMan", false ) );
}
void
KDirStatApp::saveMainWinConfig()
{
KConfig * config = kapp->config();
config->setGroup( "General Options" );
config->writeEntry( "Geometry", size() );
config->writeEntry( "Show Toolbar", _showToolBar->isChecked() );
config->writeEntry( "Show Statusbar", _showStatusBar->isChecked() );
config->writeEntry( "Show Treemap", _showTreemapView->isChecked() );
config->writeEntry( "ToolBarPos", (int) toolBar( "mainToolBar" )->barPos() );
if ( _treemapView )
config->writeEntry( "TreemapViewHeight", _treemapView->height() );
_fileOpenRecent->saveEntries( config,"Recent Files" );
}
void
KDirStatApp::saveProperties( KConfig *config )
{
(void) config;
// TODO
}
void
KDirStatApp::readProperties( KConfig *config )
{
(void) config;
// TODO
}
bool
KDirStatApp::queryClose()
{
return true;
}
bool
KDirStatApp::queryExit()
{
emit saveConfig();
return true;
}
//============================================================================
// Slots
//============================================================================
void
KDirStatApp::fileAskOpenDir()
{
statusMsg( i18n( "Opening directory..." ) );
KURL url = KFileDialog::getExistingDirectory( QString::null, this, i18n( "Open Directory..." ) );
if( ! url.isEmpty() )
openURL( fixedUrl( url.url() ) );
statusMsg( i18n( "Ready." ) );
}
void
KDirStatApp::fileAskOpenUrl()
{
statusMsg( i18n( "Opening URL..." ) );
KURL url = KURLRequesterDlg::getURL( QString::null, // startDir
this, i18n( "Open URL..." ) );
if( ! url.isEmpty() )
openURL( fixedUrl( url.url() ) );
statusMsg( i18n( "Ready." ) );
}
void
KDirStatApp::fileOpenRecent( const KURL& url )
{
statusMsg( i18n( "Opening directory..." ) );
if( ! url.isEmpty() )
openURL( fixedUrl( url.url() ) );
statusMsg( i18n( "Ready." ) );
}
void
KDirStatApp::fileCloseDir()
{
statusMsg( i18n( "Closing directory..." ) );
_treeView->clear();
_fileRefreshAll->setEnabled( false );
close();
statusMsg( i18n( "Ready." ) );
}
void
KDirStatApp::refreshAll()
{
statusMsg( i18n( "Refreshing directory tree..." ) );
_treeView->refreshAll();
statusMsg( i18n( "Ready." ) );
}
void
KDirStatApp::refreshSelected()
{
if ( ! _treeView->selection() )
return;
statusMsg( i18n( "Refreshing selected subtree..." ) );
_treeView->refreshSelected();
statusMsg( i18n( "Ready." ) );
}
void
KDirStatApp::stopReading()
{
_treeView->abortReading();
}
void
KDirStatApp::editCopy()
{
if ( _treeView->selection() )
kapp->clipboard()->setText( QString::fromLocal8Bit(_treeView->selection()->orig()->url()) );
#if 0
#warning debug
if ( _activityTracker )
_activityTracker->trackActivity( 800 );
#endif
}
void
KDirStatApp::cleanupOpenWith()
{
if ( ! _treeView->selection() )
return;
KFileInfo * sel = _treeView->selection()->orig();
if ( sel->isDotEntry() )
return;
KURL::List urlList( KURL( sel->url() ) );
KRun::displayOpenWithDialog( urlList, false );
}
void
KDirStatApp::selectionChanged( KFileInfo *selection )
{
if ( selection )
{
_editCopy->setEnabled( true );
_reportMailToOwner->setEnabled( true );
_fileRefreshSelected->setEnabled( ! selection->isDotEntry() );
_cleanupOpenWith->setEnabled( ! selection->isDotEntry() );
if ( selection->isMountPoint() &&
selection->readState() == KDirOnRequestOnly )
{
_fileContinueReadingAtMountPoint->setEnabled( true );
}
else
_fileContinueReadingAtMountPoint->setEnabled( false );
statusMsg( QString::fromLocal8Bit(selection->url()) );
}
else
{
_editCopy->setEnabled( false );
_reportMailToOwner->setEnabled( false );
_fileRefreshSelected->setEnabled( false );
_fileContinueReadingAtMountPoint->setEnabled( false );
_cleanupOpenWith->setEnabled( false );
statusMsg( "" );
}
updateActions();
}
void
KDirStatApp::updateActions()
{
_treemapZoomIn->setEnabled ( _treemapView && _treemapView->canZoomIn() );
_treemapZoomOut->setEnabled( _treemapView && _treemapView->canZoomOut() );
_treemapRebuild->setEnabled( _treemapView && _treemapView->rootTile() );
_treemapSelectParent->setEnabled( _treemapView && _treemapView->canSelectParent() );
if ( _treeView->tree() && _treeView->tree()->isBusy() )
_fileStopReading->setEnabled( true );
else
_fileStopReading->setEnabled( false );
}
void
KDirStatApp::treemapZoomIn()
{
if ( _treemapView )
{
_treemapView->zoomIn();
updateActions();
}
}
void
KDirStatApp::treemapZoomOut()
{
if ( _treemapView )
{
_treemapView->zoomOut();
updateActions();
}
}
void
KDirStatApp::treemapSelectParent()
{
if ( _treemapView )
{
_treemapView->selectParent();
updateActions();
}
}
void
KDirStatApp::treemapRebuild()
{
if ( _treemapView )
{
_treemapView->rebuildTreemap();
updateActions();
}
}
void
KDirStatApp::treemapHelp()
{
kapp->invokeHelp( "treemap_intro" );
}
void
KDirStatApp::toggleToolBar()
{
if ( _showToolBar->isChecked() ) toolBar( "mainToolBar" )->show();
else toolBar( "mainToolBar" )->hide();
}
void
KDirStatApp::toggleStatusBar()
{
if ( _showStatusBar->isChecked() ) statusBar()->show();
else statusBar()->hide();
}
void
KDirStatApp::toggleTreemapView()
{
if ( _showTreemapView->isChecked() )
{
if ( ! _treemapView )
createTreemapView();
}
else
{
if ( _treemapView )
deleteTreemapView();
}
}
void
KDirStatApp::preferences()
{
if ( ! _settingsDialog )
{
_settingsDialog = new KDirStat::KSettingsDialog( this );
CHECK_PTR( _settingsDialog );
}
if ( ! _settingsDialog->isVisible() )
_settingsDialog->show();
}
void
KDirStatApp::askForFeedback()
{
if ( ! doFeedbackReminder() )
return;
KConfig * config = kapp->config();
switch ( KMessageBox::warningYesNoCancel( this,
i18n( "Now that you know this program for some time,\n"
"wouldn't you like to tell the authors your opinion about it?\n"
"\n"
"Open Source software depends on user feedback.\n"
"Your opinion can help us make the software better." ),
i18n( "Please tell us your opinion!" ), // caption
i18n( "Open &Feedback Form..." ), // yesButton
i18n( "&No, and don't ask again!" ) // noButton
)
)
{
case KMessageBox::Yes:
sendFeedbackMail();
break;
case KMessageBox::No: // ...and don't ask again
config->setGroup( "Feedback" );
config->writeEntry( "dontAsk", true );
config->sync(); // make sure this doesn't get lost even if the app is killed or crashes
break;
case KMessageBox::Cancel:
break;
}
config->setGroup( "Feedback" );
int remindersCount = config->readNumEntry ( "remindersCount", 0 );
config->writeEntry( "remindersCount", ++remindersCount );
if ( _activityTracker )
{
_activityTracker->setThreshold( _activityTracker->threshold()
+ FEEDBACK_REMINDER_INTERVAL );
}
}
void
KDirStatApp::feedbackMailSent()
{
KConfig * config = kapp->config();
config->setGroup( "Feedback" );
config->writeEntry( "mailSent", true );
config->sync();
}
bool
KDirStatApp::doFeedbackReminder()
{
KConfig * config = kapp->config();
config->setGroup( "Feedback" );
bool mailSent = config->readBoolEntry( "mailSent", false );
bool dontAsk = config->readBoolEntry( "dontAsk", false );
int remindersCount = config->readNumEntry ( "remindersCount", 0 );
return !mailSent && !dontAsk && remindersCount < 5;
}
void
KDirStatApp::statusMsg( const QString &text )
{
// Change status message permanently
statusBar()->clear();
statusBar()->changeItem( text, ID_STATUS_MSG );
}
void
KDirStatApp::contextMenu( KDirTreeViewItem * item, const QPoint &pos )
{
NOT_USED( item );
if ( _treeViewContextMenu )
_treeViewContextMenu->popup( pos );
}
void
KDirStatApp::contextMenu( KTreemapTile * tile, const QPoint &pos )
{
NOT_USED( tile );
if ( _treemapContextMenu )
_treemapContextMenu->popup( pos );
}
void
KDirStatApp::createTreemapView()
{
if ( ! _showTreemapView->isChecked() || ! _treeView->tree() )
return;
if ( _treemapView )
delete _treemapView;
_treemapView = new KTreemapView( _treeView->tree(), _splitter,
QSize( _splitter->width(), _treemapViewHeight ) );
CHECK_PTR( _treemapView );
connect( _treemapView, SIGNAL( contextMenu( KTreemapTile *, const QPoint & ) ),
this, SLOT ( contextMenu( KTreemapTile *, const QPoint & ) ) );
connect( _treemapView, SIGNAL( treemapChanged() ),
this, SLOT ( updateActions() ) );
connect( _treemapView, SIGNAL( selectionChanged( KFileInfo * ) ),
this, SLOT ( selectionChanged( KFileInfo * ) ) );
if ( _activityTracker )
{
connect( _treemapView, SIGNAL( userActivity ( int ) ),
_activityTracker, SLOT ( trackActivity( int ) ) );
}
_treemapView->show(); // QSplitter needs explicit show() for new children
updateActions();
}
void
KDirStatApp::deleteTreemapView()
{
if ( _treemapView )
{
_treemapViewHeight = _treemapView->height();
delete _treemapView;
}
_treemapView = 0;
updateActions();
}
// EOF

@ -0,0 +1,421 @@
/*
* File name: kdirstatapp.h
* Summary: The KDirStat application - menu bar, tool bar, ...
* License: GPL - See file COPYING for details.
*
* Author: Stefan Hundhammer <sh@suse.de>
* Parts auto-generated by KDevelop
*
* Updated: 2004-12-06
*/
#ifndef KDirStatApp_h
#define KDirStatApp_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <kapp.h>
#include <kmainwindow.h>
#include "kdirtree.h"
// Forward declarations
class QPopupMenu;
class QSplitter;
class KAction;
class KActivityTracker;
class KFeedbackDialog;
class KFeedbackDialog;
class KFeedbackQuestion;
class KPacMan;
class KPacMan;
class KRecentFilesAction;
class KToggleAction;
namespace KDirStat
{
class KCleanupCollection;
class KDirTreeView;
class KDirTreeViewItem;
class KFileInfo;
class KSettingsDialog;
class KTreemapView;
class KTreemapTile;
}
using namespace KDirStat;
/**
* The base class for KDirStat application windows. It sets up the main window
* and reads the config file as well as providing a menubar, toolbar and
* statusbar. An instance of KDirStatView creates your center view, which is
* connected to the window's Doc object. KDirStatApp reimplements the methods
* that KMainWindow provides for main window handling and supports full
* session management as well as using KActions.
*
* @see KMainWindow
* @see KApplication
* @see KConfig
*
* @author Source Framework Automatically Generated by KDevelop,
* (c) The KDevelop Team.
*
* @version KDevelop version 1.2 code generation
**/
class KDirStatApp : public KMainWindow
{
Q_OBJECT
public:
/**
* Construtor of KDirStatApp, calls all init functions to create the
* application.
**/
KDirStatApp( QWidget* parent=0, const char* name=0 );
/**
* Destructor.
**/
virtual ~KDirStatApp();
/**
* Open an URL specified by command line argument.
**/
void openURL( const KURL & url );
/**
* Return the main window's @ref KDirTreeView.
**/
KDirTreeView * treeView() const { return _treeView; }
/**
* Returns the main window's @ref KTreemapView or 0 if there is none.
*
* Caution: Do not try to cache this value. The treemap view is destroyed
* and re-created frequently!
**/
KTreemapView * treemapView() const { return _treemapView; }
public slots:
/**
* Open a directory tree.
**/
void fileAskOpenDir();
/**
* Open a (possibly remote) directory tree.
**/
void fileAskOpenUrl();
/**
* Refresh the entire directory tree, i.e. re-read everything from disk.
**/
void refreshAll();
/**
* Refresh the selected subtree, i.e. re-read it from disk.
**/
void refreshSelected();
/**
* Refresh the entire directory tree, i.e. re-read everything from disk.
**/
void stopReading();
/**
* Open a directory tree from the "recent" menu.
**/
void fileOpenRecent( const KURL& url );
/**
* asks for saving if the file is modified, then closes the current file
* and window
**/
void fileCloseDir();
/**
* put the marked text/object into the clipboard
**/
void editCopy();
/**
* Notification that the view's selection has changed.
* Enable/disable user actions as appropriate.
**/
void selectionChanged( KFileInfo *selection );
/**
* Ask user what application to open a file or directory with
**/
void cleanupOpenWith();
/**
* Toggle tool bar
**/
void toggleToolBar();
/**
* Toggle status bar
**/
void toggleStatusBar();
/**
* Toggle treemap view
**/
void toggleTreemapView();
/**
* Zoom in the treemap at the currently selected tile.
**/
void treemapZoomIn();
/**
* Zoom out the treemap after zooming in.
**/
void treemapZoomOut();
/**
* Select the parent of the currently selected treemap tile.
**/
void treemapSelectParent();
/**
* Rebuild the treemap.
**/
void treemapRebuild();
/**
* Invoke online help about treemaps.
**/
void treemapHelp();
/**
* Open settings dialog
**/
void preferences();
/**
* Changes the statusbar contents for the standard label permanently, used
* to indicate current actions.
*
* @param text the text that is displayed in the statusbar
**/
void statusMsg( const QString &text );
/**
* Opens a context menu for tree view items.
**/
void contextMenu( KDirTreeViewItem * item, const QPoint &pos );
/**
* Opens a context menu for treemap tiles.
**/
void contextMenu( KTreemapTile * tile, const QPoint &pos );
/**
* Create a treemap view. This makes only sense after a directory tree is
* completely read.
**/
void createTreemapView();
/**
* Delete an existing treemap view if there is one.
**/
void deleteTreemapView();
/**
* Sends a user feedback mail.
**/
void sendFeedbackMail();
/**
* Read configuration for the main window.
**/
void readMainWinConfig();
/**
* Save the main window's configuration.
**/
void saveMainWinConfig();
/**
* Revert all cleanups to default values.
**/
void revertCleanupsToDefaults();
/**
* For the settings dialog only: Return the internal cleanup collection.
**/
KCleanupCollection * cleanupCollection() { return _cleanupCollection; }
/**
* Initialize @ref KPacMan animation in the tool bar.
**/
void initPacMan( bool enablePacMan = true );
/**
* Returns true if the pacman animation in the tool bar is enabled, false
* otherwise.
**/
bool pacManEnabled() const { return _pacMan != 0; }
/**
* Ask user if he wouldn't like to rate this program.
**/
void askForFeedback();
/**
* Notification that a feedback mail has been sent, thus don't remind
* the user any more.
**/
void feedbackMailSent();
/**
* Update enabled/disabled state of the user actions.
**/
void updateActions();
signals:
/**
* Emitted when the configuration is to be read - other than at program
* startup / object creation where each object is responsible for reading
* its configuraton at an appropriate time.
**/
void readConfig();
/**
* Emitted when the configuration is to be saved.
**/
void saveConfig();
protected:
/**
* Initialize the KActions of the application.
**/
void initActions();
/**
* Initialize @ref KCleanup actions.
**/
void initCleanups();
/**
* Set up status bar for the main window by initializing a status label.
**/
void initStatusBar();
/**
* Set up the activity tracker.
**/
void initActivityTracker();
/**
* Called when a main window is to be closed.
*
* Returns "true" when closing this window is OK, "false" to abort closing.
**/
virtual bool queryClose();
/**
* Called when the application is to be shut down alltogether, i.e. when
* all windows are to be closed.
*
* Returns "true" when exiting is OK, "false" otherwise.
**/
virtual bool queryExit();
/**
* Save the window properties for each open window during session end to
* the session config file, including saving the currently opened file by a
* temporary filename provided by KApplication.
*
* @see KTMainWindow#saveProperties
**/
virtual void saveProperties( KConfig * config );
/**
* Reads session config file and restore application state including the
* last opened files and documents by reading the temporary files saved by
* saveProperties().
*
* @see KTMainWindow#readProperties
**/
virtual void readProperties( KConfig * config );
/**
* Add a list of features of this program to a feedback question
**/
void addFeatureList( KFeedbackQuestion * question );
/**
* Check if the user should be reminded to submit feedback.
**/
bool doFeedbackReminder();
//
// Data members
//
// Widgets
QSplitter * _splitter;
KDirTreeView * _treeView;
KTreemapView * _treemapView;
KPacMan * _pacMan;
QWidget * _pacManDelimiter;
QPopupMenu * _treeViewContextMenu;
QPopupMenu * _treemapContextMenu;
KDirStat::KSettingsDialog * _settingsDialog;
KFeedbackDialog * _feedbackDialog;
KActivityTracker * _activityTracker;
// Actions
KAction * _fileAskOpenDir;
KAction * _fileAskOpenUrl;
KRecentFilesAction * _fileOpenRecent;
KAction * _fileCloseDir;
KAction * _fileRefreshAll;
KAction * _fileRefreshSelected;
KAction * _fileContinueReadingAtMountPoint;
KAction * _fileStopReading;
KAction * _fileQuit;
KAction * _editCopy;
KAction * _cleanupOpenWith;
KAction * _treemapZoomIn;
KAction * _treemapZoomOut;
KAction * _treemapSelectParent;
KAction * _treemapRebuild;
KAction * _reportMailToOwner;
KAction * _helpSendFeedbackMail;
KToggleAction * _showToolBar;
KToggleAction * _showStatusBar;
KToggleAction * _showTreemapView;
KCleanupCollection * _cleanupCollection;
// Misc
int _treemapViewHeight;
};
#endif // KDirStatApp_h

@ -0,0 +1,184 @@
/*
* File name: kdirstatfeedback.cpp
* Summary: User feedback questions for KDirStat
* License: GPL - See file COPYING for details.
*
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#include <klocale.h>
#include "kdirstatapp.h"
#include "kfeedback.h"
void
KDirStatApp::sendFeedbackMail()
{
if ( ! _feedbackDialog )
{
_feedbackDialog = new KFeedbackDialog( "sh@suse.de", "feedback_mail" );
CHECK_PTR( _feedbackDialog );
connect( _feedbackDialog->form(), SIGNAL( mailSent() ),
this, SLOT( feedbackMailSent() ) );
KFeedbackQuestionList * list = _feedbackDialog->form()->questionList();
KFeedbackQuestion * question =
list->addQuestion( i18n( "What is your general opinion about this program?" ), "general_opinion", true, true );
question->addAnswer( i18n( "It's one of my favourites" ), "1/8_favourite" );
question->addAnswer( i18n( "I like it" ), "2/8_like_it" );
question->addAnswer( i18n( "It's sometimes useful" ), "3/8_sometimes_useful" );
question->addAnswer( i18n( "It's average" ), "4/8_average" );
question->addAnswer( i18n( "Nice try, but this could be done better" ), "5/8_nice_try" );
question->addAnswer( i18n( "It's poor" ), "6/8_poor" );
question->addAnswer( i18n( "It's useless" ), "7/8_useless" );
question->addAnswer( i18n( "It's crap" ), "8/8_crap" );
question = list->addQuestion( i18n( "Which features of this program do you like?" ), "features_liked", false );
addFeatureList( question );
question = list->addQuestion( i18n( "Which features don't you like?" ), "features_not_liked", false );
addFeatureList( question );
question = list->addQuestion( i18n( "Which features do you never use?" ), "features_never_used", false );
addFeatureList( question );
question = list->addQuestion( i18n( "What is your favourite feature?" ), "favourite_feature", true );
addFeatureList( question );
question = list->addQuestion( i18n( "Are there features you are missing?" ), "features_missing", true );
question->addAnswer( i18n( "Yes, a lot! (please add comment below)" ), "1/4_lots" );
question->addAnswer( i18n( "Some (please add comment below)" ), "2/4_some" );
question->addAnswer( i18n( "None" ), "3/4_none" );
question->addAnswer( i18n( "It has too many features already!" ), "4/4_too_many_already" );
question = list->addQuestion( i18n( "How do you rate the stability of this program?" ), "stability", true, true );
question->addAnswer( i18n( "Rock solid" ), "1/5_rock_solid" );
question->addAnswer( i18n( "Good" ), "2/5_good" );
question->addAnswer( i18n( "Average" ), "3/5_average" );
question->addAnswer( i18n( "Poor" ), "4/5_poor" );
question->addAnswer( i18n( "It keeps crashing all the time" ), "5/5_keeps_crashing" );
question = list->addQuestion( i18n( "How do you rate the performance of this program?" ), "performance", true );
question->addAnswer( i18n( "Great" ), "1/5_great" );
question->addAnswer( i18n( "Good" ), "2/5_good" );
question->addAnswer( i18n( "Average" ), "3/5_average" );
question->addAnswer( i18n( "Poor" ), "4/5_poor" );
question->addAnswer( i18n( "It's so slow it drives me nuts" ), "5/5_drives_me_nuts" );
question = list->addQuestion( i18n( "What is your experience with computers in general?" ), "computer_experience", true );
question->addAnswer( i18n( "Expert" ), "1/5_expert" );
question->addAnswer( i18n( "Fair" ), "2/5_fair" );
question->addAnswer( i18n( "Average" ), "3/5_average" );
question->addAnswer( i18n( "Learning" ), "4/5_learning" );
question->addAnswer( i18n( "Newbie" ), "5/5_newbie" );
question = list->addQuestion( i18n( "What is your experience with Unix/Linux systems?" ), "unix_experience", true );
question->addAnswer( i18n( "Expert" ), "1/5_expert" );
question->addAnswer( i18n( "Fair" ), "2/5_fair" );
question->addAnswer( i18n( "Average" ), "3/5_average" );
question->addAnswer( i18n( "Learning" ), "4/5_learning" );
question->addAnswer( i18n( "Newbie" ), "5/5_newbie" );
question = list->addQuestion( i18n( "Did you have trouble figuring out how to work with this program in general?" ),
"learning_curve", true, true );
question->addAnswer( i18n( "No problem" ), "1/5_no_problem" );
question->addAnswer( i18n( "Some" ), "2/5_some_problems" );
question->addAnswer( i18n( "I'm still learning" ), "3/5_still_learing" );
question->addAnswer( i18n( "I didn't have a clue what to do at first" ), "4/5_no_clue_at_first" );
question->addAnswer( i18n( "I still don't have a clue what to do" ), "5/5_still_no_clue" );
question = list->addQuestion( i18n( "Where do you use this program most?" ), "usage_where", true );
question->addAnswer( i18n( "At work" ), "at_work" );
question->addAnswer( i18n( "At home" ), "at_home" );
question->addAnswer( i18n( "At university / school" ), "university" );
question = list->addQuestion( i18n( "What is your primary role there?" ), "primary_role", true );
question->addAnswer( i18n( "Home user" ), "home_user" );
question->addAnswer( i18n( "Student" ), "student" );
question->addAnswer( i18n( "Educational (teacher / professor)" ), "educational" );
question->addAnswer( i18n( "Non-computer related work" ), "non_computer" );
question->addAnswer( i18n( "Developer" ), "developer" );
question->addAnswer( i18n( "System administrator" ), "sysadmin" );
question = list->addQuestion( i18n( "Do you have any other roles there?" ), "other_roles", false );
question->addAnswer( i18n( "Home user" ), "home_user" );
question->addAnswer( i18n( "Student" ), "student" );
question->addAnswer( i18n( "Educational (teacher / professor)" ), "educational" );
question->addAnswer( i18n( "Non-computer related work" ), "non_computer" );
question->addAnswer( i18n( "Developer" ), "developer" );
question->addAnswer( i18n( "System administrator" ), "sysadmin" );
question = list->addQuestion( i18n( "How did you get to know this program?" ), "first_contact", true );
question->addAnswer( i18n( "In a menu on my machine" ), "menu" );
question->addAnswer( i18n( "Somebody told me about it" ), "told" );
question->addAnswer( i18n( "On the internet" ), "internet" );
question->addAnswer( i18n( "Printed magazine / book" ), "print_media" );
question->addAnswer( i18n( "Other (please add comment below)" ), "other" );
list->addYesNoQuestion( i18n( "Did you ever get a KDirStat mail report telling you to clean up disk space?" ),
"got_mail_report" );
question = list->addQuestion( i18n( "Could you figure yet out how to work with the treemaps?" ), "learning_treemaps", true );
question->addAnswer( i18n( "I became an expert at it" ), "1/5_expert" );
question->addAnswer( i18n( "I got a fairly good idea of it" ), "2/5_ok" );
question->addAnswer( i18n( "I'm still learning" ), "3/5_still_learing" );
question->addAnswer( i18n( "I still don't have a clue what to do" ), "4/5_no_clue" );
question->addAnswer( i18n( "Treemaps? Huh? What the hell is that?" ), "5/5_say_what" );
question = list->addQuestion( i18n( "What do you think about the treemaps?" ), "treemaps", false );
question->addAnswer( i18n( "They are useless" ), "useless" );
question->addAnswer( i18n( "The display is confusing" ), "display_confusing" );
question->addAnswer( i18n( "They look ugly" ), "look_ugly" );
question->addAnswer( i18n( "They look nice" ), "look_nice" );
question->addAnswer( i18n( "They help finding large files" ), "good_for_large_files" );
question->addAnswer( i18n( "I could do with the treemap view alone" ), "treemaps_alone" );
question->addAnswer( i18n( "The combination of tree view and treemaps is great" ), "like_combined_views");
question->addAnswer( i18n( "I want more info inside the treemap view" ), "more_info" );
question->addAnswer( i18n( "Leave the treemaps as they are right now" ), "leave_like_this" );
list->addYesNoQuestion( i18n( "Would you recommend this program to a friend?" ), "recommend", true );
}
if ( ! _feedbackDialog->isVisible() )
_feedbackDialog->show();
}
void
KDirStatApp::addFeatureList( KFeedbackQuestion * question )
{
question->addAnswer( i18n( "The directory tree display in general" ), "tree_view" );
question->addAnswer( i18n( "Percentage bars as graphical display of relative sizes" ), "percentage_bars" );
question->addAnswer( i18n( "Files apart from directories in a separate <Files> item"), "files_item" );
question->addAnswer( i18n( "Treemaps in general" ), "treemaps" );
question->addAnswer( i18n( "The cushioned treemap rendering" ), "treemap_cushions" );
question->addAnswer( i18n( "Cleanup actions in general" ), "cleanups_general" );
question->addAnswer( i18n( "Predefined cleanup actions" ), "predefined_cleanups" );
question->addAnswer( i18n( "User defined cleanup actions" ), "user_cleanups" );
question->addAnswer( i18n( "Cleanup action configuration" ), "cleanup_config" );
question->addAnswer( i18n( "Different colors in percentage bars" ), "tree_colors" );
question->addAnswer( i18n( "Tree color configuration" ), "tree_color_config" );
question->addAnswer( i18n( "Staying on one file system" ), "stay_on_one_filesys" );
question->addAnswer( i18n( "The \"mail to owner\" facility" ), "mail_to_owner" );
question->addAnswer( i18n( "This \"feedback mail\" facility" ), "feedback" );
question->addAnswer( i18n( "Human readable sizes (kB, MB, ...)" ), "human_readable_sizes" );
question->addAnswer( i18n( "All the numbers in the tree display" ), "numeric_display" );
question->addAnswer( i18n( "Last change time of an entire directory tree" ), "last_change_time" );
question->addAnswer( i18n( "The PacMan animation" ), "pacman" );
}
// EOF

@ -0,0 +1,115 @@
/*
* File name: kdirstatmain.cpp
* Summary: Main program for KDirStat
* License: GPL - See file COPYING for details.
*
* Author: Stefan Hundhammer <sh@suse.de>
* Parts auto-generated by KDevelop
*
* Updated: 2003-01-07
*/
#include <kcmdlineargs.h>
#include <kaboutdata.h>
#include <klocale.h>
#include "kdirstatapp.h"
static const char *description =
I18N_NOOP("KDirStat - Directory statistics.\n"
"\n"
"Shows where all your disk space has gone\n"
"and helps you clean it up."
"\n"
"\n"
"\n"
"If you have any comments or if you would simply like to tell your opinion\n"
"about this program, please use \"Send Feedback Mail\" from the \"Help\" menu.\n"
"\n"
"Any feedback (even negative!) is appreciated."
);
static KCmdLineOptions options[] =
{
{ "+[Dir/URL]", I18N_NOOP("Directory or URL to open"), 0 },
{ 0, 0, 0 }
};
int main(int argc, char *argv[])
{
KAboutData aboutData( "kdirstat", I18N_NOOP("KDirStat"),
VERSION, description, KAboutData::License_GPL,
"(c) 1999-2003 Stefan Hundhammer", 0, 0,
"sh@suse.de" );
aboutData.addAuthor( "Stefan Hundhammer",
I18N_NOOP("\n"
"If you have any comments or if you would simply like to tell\n"
"your opinion about this program, please use \n"
"\"Send Feedback Mail\" from the \"Help\" menu.\n"
"\n"
"Any feedback (even negative!) is appreciated." ),
"sh@suse.de", "http://kdirstat.sourceforge.net/" );
aboutData.addCredit( I18N_NOOP( "All the people who worked on SequoiaView" ),
I18N_NOOP( "for showing just how useful treemaps really can be.\n" ),
0, // e-mail
"http://www.win.tue.nl/sequoiaview" );
aboutData.addCredit( I18N_NOOP( "Jarke J. van Wijk, Huub van de Wetering, and Mark Bruls" ),
I18N_NOOP( "for their papers about treemaps.\n" ),
"vanwijk@win.tue.nl",
"http://www.win.tue.nl/~vanwijk/" );
aboutData.addCredit( "Ben Shneiderman",
I18N_NOOP( "for his ingenious idea of treemaps -\n"
"a truly intuitive way of visualizing tree contents.\n" ),
"", // E-Mail
"http://www.cs.umd.edu/hcil/treemaps/" );
aboutData.addCredit( "All the users who gave feedback of any kind",
I18N_NOOP( "for showing that all the work involved with such a project\n"
"is really appreciated out there.\n" ) );
KCmdLineArgs::init( argc, argv, &aboutData );
KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
KApplication app;
if ( app.isRestored() )
{
RESTORE(KDirStatApp);
}
else
{
KDirStatApp *kdirstat = new KDirStatApp();
kdirstat->show();
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if ( args->count() )
{
// Process command line arguments as URLs or paths to scan
KURL url = fixedUrl( args->arg( 0 ) );
// kdDebug() << "Opening " << url.url() << endl;
kdirstat->openURL( url );
}
else
{
kdirstat->fileAskOpenDir();
}
args->clear();
}
// kdDebug() << "Entering main loop" << endl;
return app.exec();
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,744 @@
/*
* File name: kdirstatsettings.h
* Summary: Settings dialog for KDirStat
* License: GPL - See file COPYING for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KDirStatSettings_h
#define KDirStatSettings_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <qlistbox.h>
#include <kdialogbase.h>
#include "kcleanup.h"
#include "kcleanupcollection.h"
#include "kdirstatapp.h"
class QCheckBox;
class QComboBox;
class QHGroupBox;
class QLabel;
class QLineEdit;
class QRadioButton;
class QSlider;
class QSpinBox;
class QVGroupBox;
class QWidget;
class KColorButton;
#define KDirStatSettingsMaxColorButton 12
namespace KDirStat
{
class KCleanupListBox;
class KCleanupPropertiesPage;
class KDirTreeView;
class KTreemapView;
/**
* Settings dialog for KDirStat
*
* @short Settings dialog for KDirStat
**/
class KSettingsDialog: public KDialogBase
{
Q_OBJECT
public:
/**
* Constructor.
*
* Notice there is no parent widget passed but the application's main
* window so its functions can be accessed. The parent of this widget
* is always 0 since this is a dialog.
**/
KSettingsDialog( KDirStatApp * mainWin );
/**
* Destructor.
**/
virtual ~KSettingsDialog();
/**
* Overwritten from @ref QDialog() to get any chance to set up the
* dialog contents when the dialog gets shown - every time, not just at
* program startup when the settings dialog is created (!).
*
* QTabDialog used to have 'aboutToShow()' for a good reason, but the
* creators of @ref KDialogBase in their infinite wisdom chose not to
* include anything similar. How is that supposed to work, anyway?
* Everything I saw in any other KDE sources looked to me like ugly
* hacks to work around this. Am I really supposed to destroy my
* settings dialog and create a new one every time it pops up? This can
* certainly not be the way to go.
*
* This overwritten show() method sends that @ref aboutToShow() signal
* before calling the parent class show() method.
**/
virtual void show();
public slots:
/**
* Reimplemented from @ref KDialogBase to ask for confirmation.
* Emits signal @ref defaultClicked() when the user confirms.
**/
virtual void slotDefault();
/**
* Reimplemented from @ref KDialogBase to set the appropriate help
* topic prior to invoking online help.
**/
virtual void slotHelp();
signals:
/**
* Emitted when (you might have guessed it) the dialog is about to be
* shown. Connect this to slots that fill the individual dialog pages'
* widgets contents (input fields etc.)
**/
void aboutToShow();
protected:
KDirStatApp * _mainWin;
int _cleanupsPageIndex;
int _treeColorsPageIndex;
int _treemapPageIndex;
int _generalSettingsPageIndex;
}; // class KSettingsDialog
/**
* Abstract base class for all settings pages. Contains stubs for methods
* that all settings pages have in common: setup(), apply(),
* revertToDefaults().
*
* Note: This class contains pure virtuals - it cannot be
* instantiated. Rather, derive your own classes from this one.
**/
class KSettingsPage: public QWidget
{
Q_OBJECT
public:
/**
* Constructor.
*
* Sets up standard connections to the methods defined in this class,
* e.g., apply(), setup(), revertToDefaults().
**/
KSettingsPage( KSettingsDialog * dialog,
QWidget * parent );
/**
* Destructor.
**/
virtual ~KSettingsPage();
public slots:
/**
* Apply the changes.
*
* Derived classes need to reimplement this method.
**/
virtual void apply() = 0;
/**
* Revert all values to their defaults.
*
* Derived classes need to reimplement this method.
**/
virtual void revertToDefaults() = 0;
/**
* Set up all fields prior to displaying the dialog.
*
* Derived classes need to reimplement this method.
**/
virtual void setup() = 0;
public:
/**
* Returns the page index of this page.
* This seems to be the only way to find out which settings page is in
* the foreground for a @ref KDialogBase page.
**/
int pageIndex() { return _pageIndex; }
protected:
int _pageIndex;
}; // class KSettingsPage
/**
* Settings tab page for the tree colors.
*
* Uses a vertical slider on the left side and a column of color
* selection buttons on the right side. The slider enables/disables
* the color buttons from top to bottom (at least one button is always
* enabled). Each button represents the percentage fill color of one
* directory level within the tree. When the tree widget runs out of
* colors (i.e. there are more directory levels than different
* colors), it will wrap around to the first color.
*
* @short settings page for tree colors
* @author Stefan Hundhammer <sh@suse.de>
**/
class KTreeColorsPage: public KSettingsPage
{
Q_OBJECT
public:
/**
* Constructor
**/
KTreeColorsPage( KSettingsDialog * dialog,
QWidget * parent,
KDirStatApp * mainWin );
/**
* Destructor
**/
virtual ~KTreeColorsPage();
public slots:
/**
* Apply the changes.
*
* Inherited from @ref KSettingsPage.
**/
virtual void apply();
/**
* Revert all values to their defaults.
*
* Inherited from @ref KSettingsPage.
**/
virtual void revertToDefaults();
/**
* Set up all fields prior to displaying the dialog.
*
* Inherited from @ref KSettingsPage.
**/
virtual void setup();
protected slots:
/**
* Enable all colors up to color no. 'maxColors'.
**/
void enableColors( int maxColors );
protected:
KDirStatApp * _mainWin;
KDirTreeView * _treeView;
QSlider * _slider;
KColorButton * _colorButton [ KDirStatSettingsMaxColorButton ];
QLabel * _colorLabel [ KDirStatSettingsMaxColorButton ];
int _maxButtons;
}; // class KTreeColorsPage
/**
* Settings tab page for cleanup actions.
*
* Uses a KCleanupListBox for selection of one cleanup action and a
* KCleanupPropertiesPage for editing this cleanup action's
* properties. This class handles just the switching between the individual
* cleanups. It copies the cleanup actions inserted and works with the
* copies only until it is requested to save the changes or revert all
* values to their defaults.
*
* @short settings page for cleanup actions
**/
class KCleanupPage: public KSettingsPage
{
Q_OBJECT
public:
/**
* Constructor
**/
KCleanupPage( KSettingsDialog * dialog,
QWidget * parent,
KDirStatApp * mainWin );
/**
* Destructor
**/
virtual ~KCleanupPage();
/**
* Insert an entry for a cleanup action. This is the original value
* that will be changed only when receiving the apply() or
* defaultValues() signals.
**/
void insert( KCleanup *cleanup );
/**
* Import all cleanup actions from the originals (from the main
* window) to internal working copies.
**/
void importCleanups();
/**
* Copy the internal working copies of the cleanup actions back to
* the main window's originals. Take care of pending changes within
* the current properties page's fields prior to that.
**/
void exportCleanups();
public slots:
/**
* Apply the changes.
*
* Inherited from @ref KSettingsPage.
**/
virtual void apply();
/**
* Revert all values to their defaults.
*
* Inherited from @ref KSettingsPage.
**/
virtual void revertToDefaults();
/**
* Set up all fields prior to displaying the dialog.
*
* Inherited from @ref KSettingsPage.
**/
virtual void setup();
/**
* Switch back and forth between all the cleanup actions very much
* like in a tab dialog: Exchange field contents of the cleanup
* properties page with the cleanup specified. Store the old
* properties page contents in the working copies of the cleanups.
**/
void changeCleanup( KCleanup * cleanup );
protected:
/**
* Retrieve any pending changes from the properties page and store
* them in the cleanup specified.
**/
void storeProps( KCleanup * cleanup );
//
// Data members
//
KCleanupListBox * _listBox;
KCleanupPropertiesPage * _props;
KDirStatApp * _mainWin;
KCleanupCollection _workCleanupCollection;
KCleanup * _currentCleanup;
}; // class KCleanupPage
/**
* List box for cleanup actions.
*
* This is meant as a substitute for a tabbed dialog inside the tabbed
* dialog which would be much too wide and possibly confusing. Plus, this
* list box is supposed to take care of its own geometry - the normal
* dumbass list box obviously cannot do that. It just uses some random
* geometry, relying on scroll bars for everything else. But in this
* special case we want all items to be visible at all times without scroll
* bars.
*
* @short cleanup list box
**/
class KCleanupListBox: public QListBox
{
Q_OBJECT
public:
/**
* Constructor.
**/
KCleanupListBox( QWidget * parent = 0 );
/**
* Destructor.
**/
virtual ~KCleanupListBox() {};
/**
* Reimplemented so we can make sure all items are visible at all times
* without scrolling. In fact, we never want to see a scroll bar with
* this kind of list box.
**/
virtual QSize sizeHint() const;
/**
* Insert an entry for a cleanup action into the list box. Uses the
* cleanup action's internally stored title for display.
**/
void insert( KCleanup * cleanup );
/**
* Returns the currently selected cleanup of 0 if nothing is selected.
**/
KCleanup * selection() { return _selection; }
/**
* Update the list item's text that corresponds to 'cleanup' - the user
* may have entered a new cleanup name. '0' means "check all items".
**/
void updateTitle( KCleanup * cleanup = 0 );
signals:
/**
* Emitted when the user selects a list item, i.e. a cleanup action.
**/
void selectCleanup( KCleanup * cleanup );
protected slots:
/**
* Select an item.
**/
void selectCleanup( QListBoxItem * item );
protected:
KCleanup * _selection;
}; // class KCleanupListBox
/**
* List box item for a KCleanupListBox.
**/
class KCleanupListBoxItem: public QListBoxText
{
public:
/**
* Constructor.
**/
KCleanupListBoxItem( KCleanupListBox * listBox,
KCleanup * cleanup );
/**
* Returns the corresponding cleanup.
**/
KCleanup * cleanup() { return _cleanup; }
/**
* Update the list box display with the cleanup's name which may have
* changed - the user may have entered a new one.
**/
void updateTitle();
protected:
// Data members
KCleanup * _cleanup;
}; // class KCleanupListBoxItem
/**
* Properties page for one cleanup action.
**/
class KCleanupPropertiesPage: public QWidget
{
Q_OBJECT
public:
/**
* Constructor
**/
KCleanupPropertiesPage( QWidget * parent,
KDirStatApp * mainWin );
/**
* Retrieve the page's fields' values and store them in the cleanup
* action.
**/
KCleanup fields( void ) const;
public slots:
/**
* Set the page's fields' values with the cleanup action's
* contents.
**/
void setFields( const KCleanup * cleanup );
/**
* Enable / disable all of the properties page's fields except the
* 'enabled' check box.
**/
void enableFields( bool active );
protected:
QString _id;
QCheckBox * _enabled;
QWidget * _fields;
QLineEdit * _title;
QLineEdit * _command;
QCheckBox * _recurse;
QCheckBox * _askForConfirmation;
QCheckBox * _worksForDir;
QCheckBox * _worksForFile;
QCheckBox * _worksForDotEntry;
QComboBox * _worksForProtocols;
QComboBox * _refreshPolicy;
KDirStatApp * _mainWin;
}; // class KCleanupPropertiesPage
/**
* Settings tab page for general/misc settings.
**/
class KGeneralSettingsPage: public KSettingsPage
{
Q_OBJECT
public:
/**
* Constructor
**/
KGeneralSettingsPage( KSettingsDialog * dialog,
QWidget * parent,
KDirStatApp * mainWin );
/**
* Destructor
**/
virtual ~KGeneralSettingsPage();
public slots:
/**
* Apply the changes.
*
* Inherited from @ref KSettingsPage.
**/
virtual void apply();
/**
* Revert all values to their defaults.
*
* Inherited from @ref KSettingsPage.
**/
virtual void revertToDefaults();
/**
* Set up all fields prior to displaying the dialog.
*
* Inherited from @ref KSettingsPage.
**/
virtual void setup();
/**
* Check the enabled state of all widgets depending on the value of
* other widgets.
**/
void checkEnabledState();
protected:
// Data members
KDirStatApp * _mainWin;
KDirTreeView * _treeView;
QCheckBox * _crossFileSystems;
QCheckBox * _enableLocalDirReader;
QCheckBox * _enableToolBarAnimation;
QCheckBox * _enableTreeViewAnimation;
}; // class KGeneralSettingsPage
/**
* Settings tab page for treemap settings.
**/
class KTreemapPage: public KSettingsPage
{
Q_OBJECT
public:
/**
* Constructor
**/
KTreemapPage( KSettingsDialog * dialog,
QWidget * parent,
KDirStatApp * mainWin );
/**
* Destructor
**/
virtual ~KTreemapPage();
public slots:
/**
* Apply the changes.
*
* Inherited from @ref KSettingsPage.
**/
virtual void apply();
/**
* Revert all values to their defaults.
*
* Inherited from @ref KSettingsPage.
**/
virtual void revertToDefaults();
/**
* Set up all fields prior to displaying the dialog.
*
* Inherited from @ref KSettingsPage.
**/
virtual void setup();
/**
* Check the enabled state of all widgets depending on the value of
* other widgets.
**/
void checkEnabledState();
protected:
/**
* Returns the main window's current treemap view or 0 if there is
* none. Don't cache this value, it changes frequently!
**/
KTreemapView * treemapView() const { return _mainWin->treemapView(); }
/**
* Convenience method to read a color from 'config'.
**/
QColor readColorEntry( KConfig * config,
const char * entryName,
QColor defaultColor );
// Data members
KDirStatApp * _mainWin;
// Widgets
QCheckBox * _squarify;
QCheckBox * _doCushionShading;
QVGroupBox * _cushionParams;
QSlider * _ambientLight;
QSpinBox * _ambientLightSB;
QSlider * _heightScalePercent;
QSpinBox * _heightScalePercentSB;
QCheckBox * _ensureContrast;
QCheckBox * _forceCushionGrid;
KColorButton * _cushionGridColor;
QLabel * _cushionGridColorL;
QHGroupBox * _plainTileParams;
KColorButton * _fileFillColor;
KColorButton * _dirFillColor;
KColorButton * _outlineColor;
KColorButton * _highlightColor;
QSpinBox * _minTileSize;
QCheckBox * _autoResize;
}; // class KTreemapPage
} // namespace KDirStat
/**
* Add a horizontal stretch widget to take all excess space.
**/
void addHStretch( QWidget * parent );
/**
* Add a vertical stretch widget to take all excess space.
**/
void addVStretch( QWidget * parent );
#endif // ifndef KDirStatSettings_h
// EOF

@ -0,0 +1,189 @@
<!-- Emacs: -*-xml-*- [must remain in first line!] -->
<!-- -->
<!-- XML GUI description file for KDirStat -->
<!-- -->
<!-- Author: Stefan Hundhammer (sh@suse.de) -->
<!-- Updated: 2004-12-06 -->
<!DOCTYPE kpartgui>
<!-- DOCTYPE kpartgui SYSTEM "kpartgui.dtd" would be correct, but -->
<!-- unfortunately, the DTD isn't installed anywhere, so this only confuses any -->
<!-- XML/SGML tools like Emacs PSGML mode :-( -->
<kpartgui name="kdirstat" version="1.8.2">
<MenuBar>
<Menu name="file" noMerge="1"> <text>&amp;File</text>
<Action name="file_open" />
<Action name="file_open_url" />
<Action name="file_open_recent" />
<Action name="file_refresh_all"/>
<Action name="file_refresh_selected"/>
<Action name="file_continue_reading_at_mount_point"/>
<Action name="file_stop_reading"/>
<Separator/>
<Action name="file_close"/>
<Action name="file_quit"/>
</Menu>
<Menu name="cleanup" noMerge="1"> <text>Clean &amp;Up</text>
<TearOffHandle/>
<Action name="cleanup_open_with"/>
<Separator/>
<Action name="cleanup_open_in_konqueror"/>
<Action name="cleanup_open_in_terminal"/>
<Action name="cleanup_compress_subtree"/>
<Action name="cleanup_make_clean"/>
<Action name="cleanup_delete_trash"/>
<Action name="cleanup_move_to_trash_bin"/>
<Action name="cleanup_hard_delete"/>
<Separator/>
<Action name="cleanup_user_defined_0"/>
<Action name="cleanup_user_defined_1"/>
<Action name="cleanup_user_defined_2"/>
<Action name="cleanup_user_defined_3"/>
<Action name="cleanup_user_defined_4"/>
<Action name="cleanup_user_defined_5"/>
<Action name="cleanup_user_defined_6"/>
<Action name="cleanup_user_defined_7"/>
<Action name="cleanup_user_defined_8"/>
<Action name="cleanup_user_defined_9"/>
</Menu>
<Menu name="treemap" noMerge="1"> <text>&amp;Treemap</text>
<TearOffHandle/>
<Action name="options_show_treemap"/>
<Separator/>
<Action name="treemap_zoom_in"/>
<Action name="treemap_zoom_out"/>
<Action name="treemap_select_parent"/>
<Action name="treemap_rebuild"/>
<Separator/>
<Action name="treemap_help"/>
</Menu>
<Menu name="settings" noMerge="1"> <text>&amp;Settings</text>
<Action name="options_show_treemap"/>
<Action name="options_show_toolbar"/>
<Action name="options_show_statusbar"/>
<Action name="options_configure"/>
</Menu>
<Menu name="report" noMerge="1"> <text>&amp;Report</text>
<Action name="report_mail_to_owner"/>
</Menu>
<Menu name="help" noMerge="1"> <text>&amp;Help</text>
<Action name="help_contents"/>
<Action name="help_whats_this"/>
<Separator/>
<Action name="help_report_bug"/>
<Action name="help_send_feedback_mail"/>
<Separator/>
<Action name="help_about_app"/>
<Action name="help_about_kde"/>
</Menu>
</MenuBar>
<ToolBar name="mainToolBar" fullWidth="true" noMerge="1"> <text>Main Toolbar</text>
<Action name="file_open" group="file_operations" />
<Action name="file_refresh_all" group="file_operations" />
<Action name="file_stop_reading" group="file_operations" />
<Separator/>
<Action name="edit_copy" group="edit_operations" />
<Action name="report_mail_to_owner" group="report_operations"/>
<Separator/>
<Action name="cleanup_open_in_konqueror" group="cleanup_operations"/>
<Action name="cleanup_open_in_terminal" group="cleanup_operations"/>
<Action name="cleanup_compress_subtree" group="cleanup_operations"/>
<Action name="cleanup_move_to_trash_bin" group="cleanup_operations"/>
<Action name="cleanup_hard_delete" group="cleanup_operations"/>
<Separator/>
<Action name="treemap_zoom_in" group="treemap_operations"/>
<Action name="treemap_zoom_out" group="treemap_operations"/>
</ToolBar>
<!-- Context menu for the tree view -->
<Menu name="treeViewContextMenu" noMerge="1">
<Action name="edit_copy" />
<Action name="report_mail_to_owner"/>
<Separator/>
<Action name="file_refresh_all"/>
<Action name="file_refresh_selected"/>
<Action name="file_continue_reading_at_mount_point"/>
<Separator/>
<Action name="cleanup_open_with"/>
<Separator/>
<Action name="cleanup_open_in_konqueror"/>
<Action name="cleanup_open_in_terminal"/>
<Action name="cleanup_compress_subtree"/>
<Action name="cleanup_make_clean"/>
<Action name="cleanup_delete_trash"/>
<Action name="cleanup_move_to_trash_bin"/>
<Action name="cleanup_hard_delete"/>
<Separator/>
<Action name="cleanup_user_defined_0"/>
<Action name="cleanup_user_defined_1"/>
<Action name="cleanup_user_defined_2"/>
<Action name="cleanup_user_defined_3"/>
<Action name="cleanup_user_defined_4"/>
<Action name="cleanup_user_defined_5"/>
<Action name="cleanup_user_defined_6"/>
<Action name="cleanup_user_defined_7"/>
<Action name="cleanup_user_defined_8"/>
<Action name="cleanup_user_defined_9"/>
</Menu>
<!-- Context menu for the treemap -->
<Menu name="treemapContextMenu" noMerge="1">
<Action name="treemap_zoom_in" />
<Action name="treemap_zoom_out"/>
<Action name="treemap_select_parent"/>
<Action name="treemap_rebuild"/>
<Separator/>
<Action name="treemap_help"/>
<Separator/>
<Action name="file_refresh_all"/>
<Separator/>
<Action name="cleanup_open_with"/>
<Separator/>
<Action name="cleanup_open_in_konqueror"/>
<Action name="cleanup_open_in_terminal"/>
<Action name="cleanup_compress_subtree"/>
<Action name="cleanup_make_clean"/>
<Action name="cleanup_delete_trash"/>
<Action name="cleanup_move_to_trash_bin"/>
<Action name="cleanup_hard_delete"/>
<Separator/>
<Action name="cleanup_user_defined_0"/>
<Action name="cleanup_user_defined_1"/>
<Action name="cleanup_user_defined_2"/>
<Action name="cleanup_user_defined_3"/>
<Action name="cleanup_user_defined_4"/>
<Action name="cleanup_user_defined_5"/>
<Action name="cleanup_user_defined_6"/>
<Action name="cleanup_user_defined_7"/>
<Action name="cleanup_user_defined_8"/>
<Action name="cleanup_user_defined_9"/>
</Menu>
<!-- Emacs Customization -->
<!-- Local Variables: -->
<!-- sgml-indent-step: 4 -->
<!-- End: -->
</kpartgui>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,417 @@
/*
* File name: kdirtreeiterators.h
* Summary: Support classes for KDirStat - KDirTree iterator classes
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#include "kdirtreeiterators.h"
#include "kdirtree.h"
using namespace KDirStat;
KFileInfoIterator::KFileInfoIterator( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy )
{
init( parent,
dotEntryPolicy,
true ); // callNext
}
KFileInfoIterator::KFileInfoIterator( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy,
bool callNext )
{
init( parent, dotEntryPolicy, callNext );
}
void
KFileInfoIterator::init( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy,
bool callNext )
{
_parent = parent;
_policy = dotEntryPolicy;
_current = 0;
_directChildrenProcessed = false;
_dotEntryProcessed = false;
_dotEntryChildrenProcessed = false;
if ( callNext )
next();
}
KFileInfoIterator::~KFileInfoIterator()
{
// NOP
}
void KFileInfoIterator::next()
{
if ( ! _directChildrenProcessed )
{
// Process direct children
_current = _current ? _current->next() : _parent->firstChild();
if ( ! _current )
{
_directChildrenProcessed = true;
next();
}
else
{
// kdDebug() << k_funcinfo << " direct child " << _current << endl;
}
}
else // _directChildrenProcessed
{
if ( ! _dotEntryProcessed )
{
// Process dot entry
_current = _policy == KDotEntryAsSubDir ? _parent->dotEntry() : 0;
_dotEntryProcessed = true;
if ( ! _current )
{
next();
}
else
{
// kdDebug() << k_funcinfo << " dot entry " << _current << endl;
}
}
else // Dot entry already processed or processing it not desired
{
if ( ! _dotEntryChildrenProcessed )
{
if ( _policy == KDotEntryTransparent )
{
// Process dot entry children
_current = _current ?
_current->next() :
( _parent->dotEntry() ? _parent->dotEntry()->firstChild() : 0 );
if ( ! _current )
{
_dotEntryChildrenProcessed = true;
}
else
{
// kdDebug() << k_funcinfo << " dot entry child " << _current << endl;
}
}
else // _policy != KDotEntryTransparent
{
_current = 0;
_dotEntryChildrenProcessed = true;
}
}
}
}
}
int
KFileInfoIterator::count()
{
int cnt = 0;
// Count direct children
KFileInfo *child = _parent->firstChild();
while ( child )
{
cnt++;
child = child->next();
}
// Handle the dot entry
switch ( _policy )
{
case KDotEntryTransparent: // Count the dot entry's children as well.
if ( _parent->dotEntry() )
{
child = _parent->dotEntry()->firstChild();
while ( child )
{
cnt++;
child = child->next();
}
}
break;
case KDotEntryAsSubDir: // The dot entry counts as one item.
if ( _parent->dotEntry() )
cnt++;
break;
case KDotEntryIgnore: // We're done.
break;
}
return cnt;
}
KFileInfoSortedIterator::KFileInfoSortedIterator( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy,
KFileInfoSortOrder sortOrder,
bool ascending )
: KFileInfoIterator( parent, dotEntryPolicy, false )
{
_sortOrder = sortOrder;
_ascending = ascending;
_initComplete = false;
_childrenList = 0;
_current = 0;
}
void
KFileInfoSortedIterator::delayedInit()
{
_childrenList = new KFileInfoList( _sortOrder, _ascending );
CHECK_PTR( _childrenList );
if ( _sortOrder == KSortByName )
{
makeDefaultOrderChildrenList();
}
else
{
makeChildrenList();
}
_current = _childrenList->first();
_initComplete = true;
}
KFileInfoSortedIterator::~KFileInfoSortedIterator()
{
if ( _childrenList )
delete _childrenList;
}
void KFileInfoSortedIterator::makeDefaultOrderChildrenList()
{
// Fill children list with direct children
KFileInfo *child = _parent->firstChild();
while ( child )
{
_childrenList->append( child );
child = child->next();
}
_childrenList->sort();
if ( _policy == KDotEntryAsSubDir && _parent->dotEntry() )
{
// Append dot entry to the children list
_childrenList->append( _parent->dotEntry() );
}
// Append the dot entry's children to the children list
if ( _policy == KDotEntryTransparent && _parent->dotEntry() )
{
// Create a temporary list for the dot entry children
KFileInfoList dotEntryChildrenList( _sortOrder, _ascending );
child = _parent->dotEntry()->firstChild();
while ( child )
{
dotEntryChildrenList.append( child );
child = child->next();
}
dotEntryChildrenList.sort();
// Now append all of this dot entry children list to the children list
child = dotEntryChildrenList.first();
while ( child )
{
_childrenList->append( child );
child = dotEntryChildrenList.next();
}
}
}
void
KFileInfoSortedIterator::makeChildrenList()
{
KFileInfoIterator it( _parent, _policy );
while ( *it )
{
_childrenList->append( *it );
++it;
}
_childrenList->sort();
}
KFileInfo *
KFileInfoSortedIterator::current()
{
if ( ! _initComplete )
delayedInit();
return _current;
}
void KFileInfoSortedIterator::next()
{
if ( ! _initComplete )
delayedInit();
_current = _childrenList->next();
}
bool
KFileInfoSortedIterator::finished()
{
if ( ! _initComplete )
delayedInit();
return _current == 0;
}
KFileInfoSortedBySizeIterator::KFileInfoSortedBySizeIterator( KFileInfo * parent,
KFileSize minSize,
KDotEntryPolicy dotEntryPolicy,
bool ascending )
: KFileInfoSortedIterator( parent, dotEntryPolicy, KSortByTotalSize, ascending )
, _minSize( minSize )
{
}
void
KFileInfoSortedBySizeIterator::makeChildrenList()
{
KFileInfoIterator it( _parent, _policy );
while ( *it )
{
if ( (*it)->totalSize() >= _minSize )
_childrenList->append( *it );
++it;
}
_childrenList->sort();
}
KFileInfoList::KFileInfoList( KFileInfoSortOrder sortOrder, bool ascending )
: QPtrList<KFileInfo>()
{
_sortOrder = sortOrder;
_ascending = ascending;
}
KFileInfoList::~KFileInfoList()
{
// NOP
}
KFileSize
KFileInfoList::sumTotalSizes()
{
KFileSize sum = 0;
KFileInfoListIterator it( *this );
while ( *it )
{
sum += (*it)->totalSize();
++it;
}
return sum;
}
int
KFileInfoList::compareItems( QCollection::Item it1, QCollection::Item it2 )
{
if ( it1 == it2 )
return 0;
KFileInfo *file1 = (KFileInfo *) it1;
KFileInfo *file2 = (KFileInfo *) it2;
int result = 0;
switch ( _sortOrder )
{
case KUnsorted:
return 1;
case KSortByName:
result = QString::compare( file1->name(), file2->name() );
break;
case KSortByTotalSize:
result = compare<KFileSize>( file1->totalSize(), file2->totalSize() );
break;
case KSortByLatestMtime:
result = compare<time_t>( file1->latestMtime(), file2->latestMtime() );
break;
}
return _ascending ? result : -result;
}
// EOF

@ -0,0 +1,386 @@
/*
* File name: kdirtreeiterators.h
* Summary: Support classes for KDirStat - KDirTree iterators
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KDirTreeIterators_h
#define KDirTreeIterators_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "kdirtree.h"
namespace KDirStat
{
/**
* Policies how to treat a "dot entry" for iterator objects.
* See @ref KFileInfoIterator for details.
**/
typedef enum
{
KDotEntryTransparent, // Flatten hierarchy - move dot entry children up
KDotEntryAsSubDir, // Treat dot entry as ordinary subdirectory
KDotEntryIgnore // Ignore dot entry and its children completely
} KDotEntryPolicy;
typedef enum
{
KUnsorted,
KSortByName,
KSortByTotalSize,
KSortByLatestMtime
} KFileInfoSortOrder;
// Forward declarations
class KFileInfoList;
/**
* Iterator class for children of a @ref KFileInfo object. For optimum
* performance, this iterator class does NOT return children in any
* specific sort order. If you need that, use @ref KFileInfoSortedIterator
* instead.
*
* Sample usage:
*
* KFileInfoIterator it( node, KDotEntryTransparent );
*
* while ( *it )
* {
* kdDebug() << *it << ":\t" << (*it)->totalSize() ) << endl;
* ++it;
* }
*
* This will output the URL (path+name) and the total size of each (direct)
* subdirectory child and each (direct) file child of 'node'.
* Notice: This does not recurse into subdirectories!
*
* @short (unsorted) iterator for @ref KFileInfo children.
**/
class KFileInfoIterator
{
public:
/**
* Constructor: Initialize an iterator object to iterate over the
* children of 'parent' (unsorted!), depending on 'dotEntryPolicy':
*
* KDotEntryTransparent (default):
*
* Treat the dot entry as if it wasn't there - pretend to move all its
* children up to the real parent. This makes a directory look very
* much like the directory on disk, without the dot entry. 'current()'
* or 'operator*()' will never return the dot entry, but all of its
* children. Subdirectories will be processed before any file children.
*
* KDotEntryIsSubDir:
*
* Treat the dot entry just like any other subdirectory. Don't iterate
* over its children, too (unlike KDotEntryTransparent above).
* 'current()' or 'operator*()' will return the dot entry, but none of
* its children (unless, of course, you create an iterator with the dot
* entry as the parent).
*
* KDotEntryIgnore:
*
* Ignore the dot entry and its children completely. Useful if children
* other than subdirectories are not interesting anyway. 'current()'
* or 'operator*()' will never return the dot entry nor any of its
* children.
*
**/
KFileInfoIterator( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy = KDotEntryTransparent );
protected:
/**
* Alternate constructor to be called from derived classes: Those can
* choose not to call next() in the constructor.
**/
KFileInfoIterator ( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy,
bool callNext );
private:
/**
* Internal initialization called from any constructor.
**/
void init ( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy,
bool callNext );
public:
/**
* Destructor.
**/
virtual ~KFileInfoIterator();
/**
* Return the current child object or 0 if there is no more.
* Same as @ref operator*() .
**/
virtual KFileInfo * current() { return _current; }
/**
* Return the current child object or 0 if there is no more.
* Same as @ref current().
**/
KFileInfo * operator*() { return current(); }
/**
* Advance to the next child. Same as @ref operator++().
**/
virtual void next();
/**
* Advance to the next child. Same as @ref next().
**/
void operator++() { next(); }
/**
* Returns 'true' if this iterator is finished and 'false' if not.
**/
virtual bool finished() { return _current == 0; }
/**
* Check whether or not the current child is a directory, i.e. can be
* cast to @ref KDirInfo * .
**/
bool currentIsDir() { return _current && _current->isDirInfo(); }
/**
* Return the current child object cast to @ref KDirInfo * or 0 if
* there either is no more or it isn't a directory. Check with @ref
* currentIsDir() before using this!
**/
KDirInfo * currentDir() { return currentIsDir() ? (KDirInfo *) _current : 0; }
/**
* Return the number of items that will be processed.
* This is an expensive operation.
**/
int count();
protected:
KFileInfo * _parent;
KDotEntryPolicy _policy;
KFileInfo * _current;
bool _directChildrenProcessed;
bool _dotEntryProcessed;
bool _dotEntryChildrenProcessed;
}; // class KFileInfoIterator
/**
* Iterator class for children of a @ref KFileInfo object. This iterator
* returns children sorted by name: Subdirectories first, then the dot
* entry (if desired - depending on policy), then file children (if
* desired). Note: If you don't need the sorting feature, you might want to
* use @ref KFileItemIterator instead which has better performance.
*
* @short sorted iterator for @ref KFileInfo children.
**/
class KFileInfoSortedIterator: public KFileInfoIterator
{
public:
/**
* Constructor. Specify the sorting order with 'sortOrder' and 'ascending'.
* See @ref KFileInfoIterator for more details.
**/
KFileInfoSortedIterator( KFileInfo * parent,
KDotEntryPolicy dotEntryPolicy = KDotEntryTransparent,
KFileInfoSortOrder sortOrder = KSortByName,
bool ascending = true );
/**
* Destructor.
**/
virtual ~KFileInfoSortedIterator();
/**
* Return the current child object or 0 if there is no more.
*
* Inherited from @ref KFileInfoIterator.
* Overwritten to overcome some shortcomings of C++:
* Virtual methods cannot be used in the constructor.
**/
virtual KFileInfo * current();
/**
* Advance to the next child. Same as @ref operator++().
* Sort by name, sub directories first, then the dot entry (if
* desired), then files (if desired).
*
* Inherited from @ref KFileInfoIterator.
**/
virtual void next();
/**
* Returns 'true' if this iterator is finished and 'false' if not.
*
* Inherited from @ref KFileInfoIterator.
**/
virtual bool finished();
protected:
/**
* Delayed initialization for class parts that rely on availability of
* virtual methods. This is a kludge to overcome a major shortcoming of
* C++: Virtual methods are not available in the constructor yet.
* This is a neverending cause of trouble.
**/
void delayedInit();
/**
* Make a 'default order' children list:
* First all subdirectories sorted by name,
* then the dot entry (depending on policy),
* then the dot entry's children (depending on policy).
**/
virtual void makeDefaultOrderChildrenList();
/**
* Make a sorted children list according to the current sort
* criteria - unless KSortByName is requested, in which case
* makeDefaultOrderChildrenList() above is used.
**/
virtual void makeChildrenList();
// Data members
KFileInfoList * _childrenList;
KFileInfoSortOrder _sortOrder;
bool _ascending;
bool _initComplete;
}; // class KFileInfoSortedIterator
/**
* Specialized KFileInfo iterator that sorts by (total) size, yet
* disregards children below a minimum size. This can considerably improve
* performance if the number of children that need to be sorted decreases
* dramatically.
*
* For example, treemaps can only display a limited portion of large
* directory trees since the number of available pixels is very
* limited. Thus, files (or directories) below a certain size usually don't
* get a individual visual representation anyway, so they may as well be
* omitted right away - no need for expensive list sorting operations.
**/
class KFileInfoSortedBySizeIterator: public KFileInfoSortedIterator
{
public:
/**
* Constructor. Children below 'minSize' will be ignored by this iterator.
**/
KFileInfoSortedBySizeIterator( KFileInfo * parent,
KFileSize minSize = 0,
KDotEntryPolicy dotEntryPolicy = KDotEntryTransparent,
bool ascending = false );
/**
* Destructor.
**/
virtual ~KFileInfoSortedBySizeIterator() {};
protected:
/**
* Create the (sorted) children list. Disregard children below minSize.
* Reimplemented from KFileInfoSortedIterator.
**/
virtual void makeChildrenList();
// Data members
KFileSize _minSize;
}; // class KFileInfoSortedBySizeIterator
/**
* Internal helper class for sorting iterators.
**/
class KFileInfoList: public QPtrList<KFileInfo>
{
public:
/**
* Constructor.
**/
KFileInfoList( KFileInfoSortOrder sortOrder = KSortByName,
bool ascending = true );
/**
* Destructor.
**/
virtual ~KFileInfoList();
/**
* Returns the sum of all the total sizes in the list.
**/
KFileSize sumTotalSizes();
protected:
/**
* Comparison function. This is why this class is needed at all.
**/
virtual int compareItems( QCollection::Item it1, QCollection::Item it2 );
KFileInfoSortOrder _sortOrder;
bool _ascending;
};
typedef QPtrListIterator<KFileInfo> KFileInfoListIterator;
//----------------------------------------------------------------------
// Static Functions
//----------------------------------------------------------------------
/**
* Generic comparison function as expected by all kinds of sorting etc.
* algorithms. Requires operator<() and operator==() to be defined for this
* class.
**/
template<class T>
inline int compare( T val1, T val2 )
{
if ( val1 < val2 ) return -1;
else if ( val1 == val2 ) return 0;
else return 1;
}
} // namespace KDirStat
#endif // ifndef KDirTreeIterators_h
// EOF

File diff suppressed because it is too large Load Diff

@ -0,0 +1,889 @@
/*
* File name: kdirtreeview.h
* Summary: High level classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-08-26
*/
#ifndef KDirTreeView_h
#define KDirTreeView_h
// Alternative parent class for KDirTreeView.
//
// If you change this, don't forget to change the KDirTreeView class
// declaration also. Unfortunately there this 'define' can't be used -
// it seems to confuse the 'moc' preprocessor.
#define USE_KLISTVIEW 0
#define DEBUG_COUNTERS 10
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <qdatetime.h>
#include <qlistview.h>
#include <qpixmap.h>
#include <klistview.h>
#include "kdirtree.h"
// Forward declarations
class QWidget;
class QTimer;
class QPopupMenu;
class KPacManAnimation;
// Open a new name space since KDE's name space is pretty much cluttered
// already - all names that would even remotely match are already used up,
// yet the resprective classes don't quite fit the purposes required here.
namespace KDirStat
{
#define KDirTreeViewMaxFillColor 16
#if USE_KLISTVIEW
# define KDirTreeViewParentClass KListView
#else
# define KDirTreeViewParentClass QListView
#endif
class KDirTreeViewItem;
class KDirTreeView: public QListView
// Using
// class KDirTreeView: public KDirTreeViewParentClass
// or some other 'ifdef' ... construct seems to confuse "moc".
{
Q_OBJECT
public:
/**
* Default constructor.
**/
KDirTreeView( QWidget * parent = 0 );
/**
* Destructor.
**/
virtual ~KDirTreeView();
/**
* Locate the counterpart to an original tree item "wanted" somewhere
* within this view tree. Returns 0 on failure.
* If "lazy" is set, only the open part of the tree is searched.
* "doClone" specifies whether or not to (deferred) clone nodes that
* are not cloned yet. This is only used if "lazy" is false.
**/
KDirTreeViewItem * locate( KFileInfo * wanted,
bool lazy = true,
bool doClone = true );
/**
* Get the first child of this view or 0 if there is none.
* Use the child's next() method to get the next child.
* Reimplemented from @ref QListView.
**/
KDirTreeViewItem * firstChild() const
{ return (KDirTreeViewItem *) KDirTreeViewParentClass::firstChild(); }
/**
* Return the currently selected item or 0, if none is selected.
**/
KDirTreeViewItem * selection() const { return _selection; }
/**
* Returns the default level until which items are opened by default
* (unless they are dot entries).
**/
int openLevel() const { return _openLevel; }
/**
* Returns true if the view tree is to be cloned lazily, i.e. only
* those view tree branches that are really visible are synced with the
* original tree.
**/
bool doLazyClone() const { return _doLazyClone; }
/**
* Enable / disable PacMan animation in this tree view during directory
* reading. This is disabled by default since it eats quite some
* performance.
**/
void enablePacManAnimation( bool enable ) { _doPacManAnimation = enable; }
/**
* Returns true if the PacMan animation is to be used during directory
* reading.
**/
bool doPacManAnimation() const { return _doPacManAnimation; }
/**
* Returns the number of open items in the entire tree.
**/
int openCount();
/**
* Return the percentage bar fill color for the specified directory
* level (0..MaxInt). Wraps around every usedFillColors() colors.
**/
const QColor & fillColor( int level ) const;
/**
* Very much like @ref fillColor(), but doesn't wrap around at @ref
* usedFillColors(), but at KDirTreeViewMaxFillColor.
**/
const QColor & rawFillColor( int level ) const;
/**
* Set the fill color of percentage bars of the specified directory
* level (0..KDirTreeViewMaxFillColor-1).
*
* Calling repaint() after setting all desired colors is the
* caller's responsibility.
**/
void setFillColor( int level, const QColor &color );
/**
* Set all tree colors to default values.
**/
void setDefaultFillColors();
/**
* Set the number of used percentage bar fill colors
* (1..KDirTreeViewMaxFillColor).
**/
void setUsedFillColors( int usedFillColors );
/**
* Returns the number of used percentage bar fill colors.
**/
int usedFillColors() const { return _usedFillColors; }
/**
* Set the tree background color.
*
* Calling repaint() after setting all desired colors is the
* caller's responsibility.
**/
void setTreeBackground( const QColor &color );
/**
* Returns the tree background color.
**/
const QColor & treeBackground() const { return _treeBackground; }
/**
* Returns the background color for percentage bars.
**/
const QColor & percentageBarBackground() const { return _percentageBarBackground; }
/**
* (Try to) ensure good contrast between the tree background and the
* percentage bars' 3D edges - prevent ugly 3D effects which will
* inevitably be the case for a white background (which unfortunately
* is very common): The percentage bars use white and black for 3D
* borders - like any other widget. But other widgets normally can
* assume their parent widget uses some more neutral color so white and
* black will result in at least some minimal contrast.
*
* This function automagically sets a reasonable default background
* color for the tree display: If the current color scheme's document
* background color (as used for input fields, lists etc.) is white or
* black, use the palette midlight color (the same color as "normal"
* widgets like push buttons etc., but brighter). For all other colors
* than white, the document background color (the palette base color)
* is used.
**/
void ensureContrast();
/**
* Set the sort column.
*
* Reimplemented from QListView so we can keep track of the sort column.
**/
virtual void setSorting( int column, bool increasing = TRUE );
/**
* Returns the internal @ref KDirTree this view works on.
* Handle with caution: This might be short-lived information.
* The view might choose to create a new tree shortly after returning
* this, so don't store this pointer internally.
**/
KDirTree *tree() { return _tree; }
int nameCol() const { return _nameCol; }
int iconCol() const { return _iconCol; }
int percentBarCol() const { return _percentBarCol; }
int percentNumCol() const { return _percentNumCol; }
int totalSizeCol() const { return _totalSizeCol; }
int workingStatusCol() const { return _workingStatusCol; }
int ownSizeCol() const { return _ownSizeCol; }
int totalItemsCol() const { return _totalItemsCol; }
int totalFilesCol() const { return _totalFilesCol; }
int totalSubDirsCol() const { return _totalSubDirsCol; }
int latestMtimeCol() const { return _latestMtimeCol; }
int readJobsCol() const { return _readJobsCol; }
int sortCol() const { return _sortCol; }
QPixmap openDirIcon() const { return _openDirIcon; }
QPixmap closedDirIcon() const { return _closedDirIcon; }
QPixmap openDotEntryIcon() const { return _openDotEntryIcon; }
QPixmap closedDotEntryIcon() const { return _closedDotEntryIcon; }
QPixmap unreadableDirIcon() const { return _unreadableDirIcon; }
QPixmap mountPointIcon() const { return _mountPointIcon; }
QPixmap fileIcon() const { return _fileIcon; }
QPixmap symLinkIcon() const { return _symLinkIcon; }
QPixmap blockDevIcon() const { return _blockDevIcon; }
QPixmap charDevIcon() const { return _charDevIcon; }
QPixmap fifoIcon() const { return _fifoIcon; }
QPixmap stopIcon() const { return _stopIcon; }
QPixmap workingIcon() const { return _workingIcon; }
QPixmap readyIcon() const { return _readyIcon; }
/**
* Set function name of debug function #i
**/
void setDebugFunc( int i, const QString & functionName );
/**
* Increase debug counter #i
**/
void incDebugCount( int i );
public slots:
/**
* Open a directory URL. Assume "file:" protocol unless otherwise specified.
**/
void openURL( KURL url );
/**
* Refresh (i.e. re-read from disk) the entire tree.
**/
void refreshAll();
/**
* Refresh (i.e. re-read from disk) the selected subtree.
**/
void refreshSelected();
/**
* Forcefully stop a running read process.
**/
void abortReading();
/**
* Clear this view's contents.
**/
void clear();
/**
* Select a (QListViewItem) item. Triggers selectionChanged() signals.
**/
void selectItem( QListViewItem *item );
/**
* Select an item. Triggers selectionChanged() signals.
* Overloaded for convenience.
**/
void selectItem( KDirTreeViewItem *item ) { selectItem( (QListViewItem *) item ); }
/**
* Select a KDirTree item. Used for connecting the @ref
* KDirTree::selectionChanged() signal.
**/
void selectItem( KFileInfo *item );
/**
* Clear the current selection. Triggers selectionChanged() signals.
**/
void clearSelection();
/**
* Close all tree branches except the one specified.
**/
void closeAllExcept( KDirTreeViewItem *except );
/**
* Send a standardized mail to the owner of the selected branch.
* The user will get a mailer window where he can edit that mail all he
* likes before deciding to send or discard it.
*
* The mail includes all currently open branches from the selected
* branch on.
**/
void sendMailToOwner();
/**
* Notification of a change in the KDE palette, i.e. the user selected
* and applied different colors in the KDE control center.
**/
void paletteChanged();
/**
* Read configuration and initialize variables accordingly.
* Will be called automatically in the constructor.
**/
void readConfig();
/**
* Save configuraton.
**/
void saveConfig() const;
/**
* Emit a @ref userActivity() signal worth 'points' activity points.
**/
void logActivity( int points );
/**
* Returns the minimum recommended size for this widget.
* Reimplemented from QWidget.
**/
virtual QSize minimumSizeHint() const { return QSize( 0, 0 ); }
protected slots:
/**
* Add a child as a clone of original tree item "newChild" to this view
* tree.
**/
void addChild ( KFileInfo *newChild );
/**
* Delete a cloned child.
**/
void deleteChild ( KFileInfo *newChild );
/**
* Recursively update the visual representation of the summary fields.
* This update is as lazy as possible for optimum performance since it
* is called very frequently as a cyclic update.
**/
void updateSummary();
/**
* Signal end of all read jobs, finalize display and terminate pending
* cyclic visual update.
**/
void slotFinished();
/**
* Signal abortion of all read jobs, finalize display and terminate pending
* cyclic visual update.
**/
void slotAborted();
/**
* Signal end of one read job at this level and finalize display of
* this level.
**/
void finalizeLocal( KDirInfo *dir );
/**
* Display progress information in the status bar. Automatically adds
* the elapsed time of a directory scan.
**/
void sendProgressInfo( const QString & currentDir = "" );
#if QT_VERSION < 300
/**
* "moc" doesnt't seem to handle default arguments well, so this is an
* overloaded slot that uses the internally stored current directory.
**/
void sendProgressInfo();
#endif
/**
* Set up everything prior to reading: Cyclic update timer, display
* busy state, default sorting, stopwatch.
**/
void prepareReading();
/**
* Change the tree display to "busy" state, i.e. add a column to
* display the number of pending read jobs for each level.
**/
void busyDisplay();
/**
* Change the tree display back to "idle" state, i.e. remove columns
* that are useful only while directories are being read, like the
* pending read jobs column.
**/
void idleDisplay();
/**
* Pop up context menu (i.e. emit the contextMenu() signal) or open a
* small info popup with exact information, depending on 'column'.
**/
void popupContextMenu ( QListViewItem * listViewItem,
const QPoint & pos,
int column );
/**
* Pop up info window with exact byte size.
**/
void popupContextSizeInfo ( const QPoint & pos,
KFileSize size );
/**
* Pop up info window with arbitrary one-line text.
**/
void popupContextInfo ( const QPoint & pos,
const QString & info );
protected slots:
/**
* Notification that a column has just been resized, thus may need
* repaining.
**/
void columnResized( int column, int oldSize, int newSize );
signals:
/**
* Single line progress information, emitted when the read status
* changes - typically when a new directory is being read. Connect to a
* status bar etc. to keep the user busy.
**/
void progressInfo( const QString &infoLine );
/**
* Emitted when reading is started.
**/
void startingReading();
/**
* Emitted when reading this tree is finished.
**/
void finished();
/**
* Emitted when reading this tree has been aborted.
**/
void aborted();
/**
* Emitted when the currently selected item changes.
* Caution: 'item' may be 0 when the selection is cleared.
**/
void selectionChanged( KDirTreeViewItem *item );
/**
* Emitted when the currently selected item changes.
* Caution: 'item' may be 0 when the selection is cleared.
**/
void selectionChanged( KFileInfo *item );
/**
* Emitted when a context menu for this item should be opened.
* (usually on right click). 'pos' contains the click's mouse
* coordinates.
*
* NOTE:
*
* This is _not_ the same as @ref QListView::rightButtonClicked():
* The context menu may not open on a right click on every column,
* usually only in the nameCol().
**/
void contextMenu( KDirTreeViewItem *item, const QPoint &pos );
/**
* Emitted at user activity. Some interactive actions are assigned an
* amount of "activity points" that can be used to judge whether or not
* the user is actually using this program or if it's just idly sitting
* around on the desktop. This is intended for use together with a @ref
* KActivityTracker.
**/
void userActivity( int points );
protected:
KDirTree * _tree;
QTimer * _updateTimer;
QTime _stopWatch;
QString _currentDir;
KDirTreeViewItem * _selection;
QPopupMenu * _contextInfo;
int _idContextInfo;
int _openLevel;
bool _doLazyClone;
bool _doPacManAnimation;
int _updateInterval; // millisec
int _usedFillColors;
QColor _fillColor [ KDirTreeViewMaxFillColor ];
QColor _treeBackground;
QColor _percentageBarBackground;
// The various columns in which to display information
int _nameCol;
int _iconCol;
int _percentNumCol;
int _percentBarCol;
int _totalSizeCol;
int _workingStatusCol;
int _ownSizeCol;
int _totalItemsCol;
int _totalFilesCol;
int _totalSubDirsCol;
int _latestMtimeCol;
int _readJobsCol;
int _sortCol;
int _debugCount[ DEBUG_COUNTERS ];
QString _debugFunc [ DEBUG_COUNTERS ];
// The various icons
QPixmap _openDirIcon;
QPixmap _closedDirIcon;
QPixmap _openDotEntryIcon;
QPixmap _closedDotEntryIcon;
QPixmap _unreadableDirIcon;
QPixmap _mountPointIcon;
QPixmap _fileIcon;
QPixmap _symLinkIcon;
QPixmap _blockDevIcon;
QPixmap _charDevIcon;
QPixmap _fifoIcon;
QPixmap _stopIcon;
QPixmap _workingIcon;
QPixmap _readyIcon;
};
class KDirTreeViewItem: public QListViewItem
{
public:
/**
* Constructor for the root item.
**/
KDirTreeViewItem ( KDirTreeView * view,
KFileInfo * orig );
/**
* Constructor for all other items.
**/
KDirTreeViewItem ( KDirTreeView * view,
KDirTreeViewItem * parent,
KFileInfo * orig );
/**
* Destructor.
**/
virtual ~KDirTreeViewItem();
/**
* Locate the counterpart to an original tree item "wanted" somewhere
* within this view tree. Returns 0 on failure.
*
* When "lazy" is set, only the open part of the tree is searched.
* "doClone" specifies whether or not to (deferred) clone nodes that
* are not cloned yet. This is only used if "lazy" is false.
* "Level" is just a hint for the current tree level for better
* performance. It will be calculated automatically if omitted.
**/
KDirTreeViewItem * locate( KFileInfo * wanted,
bool lazy = true,
bool doClone = true,
int level = -1 );
/**
* Recursively update the visual representation of the summary fields.
* This update is as lazy as possible for optimum performance.
**/
void updateSummary();
/**
* Bring (the top level of) this branch of the view tree in sync with
* the original tree. Does _not_ recurse into subdirectories - only
* this level of this branch is processed. Called when lazy tree
* cloning is in effect and this branch is about to be opened.
**/
void deferredClone();
/**
* Finalize this level - clean up unneeded / undesired dot entries.
**/
void finalizeLocal();
/**
* Returns the corresponding view.
**/
KDirTreeView * view() { return _view; }
/**
* Returns the parent view item or 0 if this is the root.
**/
KDirTreeViewItem * parent() { return _parent; }
/**
* Returns the corresponding original item of the "real" (vs. view)
* tree where all the important information resides.
**/
KFileInfo * orig() { return _orig; }
/**
* Returns the first child of this item or 0 if there is none.
* Use the child's next() method to get the next child.
* Reimplemented from @ref QListViewItem.
**/
KDirTreeViewItem * firstChild() const
{ return (KDirTreeViewItem *) QListViewItem::firstChild(); }
/**
* Returns the next sibling of this item or 0 if there is none.
* (Kind of) reimplemented from @ref QListViewItem.
**/
KDirTreeViewItem * next() const
{ return (KDirTreeViewItem *) QListViewItem::nextSibling(); }
/**
* Comparison function used for sorting the list.
*
* Using this function is much more efficient than overwriting
* QListViewItem::key() which operates on QStrings.
*
* Returns:
* -1 if this < other
* 0 if this == other
* +1 if this > other
*
* Reimplemented from QListViewItem
**/
virtual int compare( QListViewItem * other,
int col,
bool ascending ) const;
/**
* Perform any necessary pending updates when a branch is opened.
* Reimplemented from @ref QListViewItem.
**/
virtual void setOpen( bool open );
/**
* Notification that a branch in this subtree has been opened or close
* somewhere. Don't call this if the state hasn't really changed!
**/
void openNotify( bool open );
/**
* Recursively open this subtree and all its ancestors up to the root.
**/
void openSubtree();
/**
* Recursively close all tree branches from here on downwards.
**/
void closeSubtree();
/**
* Close all tree branches except this one from the root on.
**/
void closeAllExceptThis();
/**
* Returns the number of open items in this subtree.
**/
int openCount() const { return _openCount; }
/**
* Recursively return an ASCII representation of all open items from
* here on.
**/
QString asciiDump();
protected:
/**
* Set the appropriate icon depending on this item's type and open /
* closed state.
**/
void setIcon();
/**
* Remove dot entry if it doesn't have any children.
* Reparent all of the dot entry's children if there are no
* subdirectories on this level.
**/
void cleanupDotEntries();
/**
* Find this entry's dot entry (clone).
*
* This doesn't create one if deferred cloning is in effect (which is
* not a drawback since cloning directory nodes create a dot entry
* clone along with the directory clone).
*
* Returns 0 if there is no dot entry clone.
**/
KDirTreeViewItem * findDotEntry() const;
/**
* Paint method. Reimplemented from @ref QListViewItem so different
* colors can be used - and of course for painting percentage bars.
*
* Reimplemented from @ref QListViewItem.
**/
virtual void paintCell ( QPainter * painter,
const QColorGroup & colorGroup,
int column,
int width,
int alignment );
/**
* Paint a percentage bar into a @ref QListViewItem cell.
* 'width' is the width of the entire cell.
* 'indent' is the number of pixels to indent the bar.
**/
void paintPercentageBar ( float percent,
QPainter * painter,
int indent,
int width,
const QColor & fillColor,
const QColor & barBackground );
/**
* Generic comparison function.
**/
template<typename T> inline
int compare( T a, T b ) const
{
if ( a < b ) return -1;
if ( a > b ) return 1;
return 0;
}
private:
/**
* Initializations common to all constructors.
**/
void init ( KDirTreeView * view,
KDirTreeViewItem * parent,
KFileInfo * orig );
protected:
// Data members
KDirTreeView * _view;
KDirTreeViewItem * _parent;
KFileInfo * _orig;
KPacManAnimation * _pacMan;
float _percent;
int _openCount;
};
inline kdbgstream & operator<< ( kdbgstream & stream, KDirTreeViewItem * item )
{
if ( item )
{
if ( item->orig() )
{
stream << item->orig()->debugUrl();
}
else
{
stream << "<NULL orig()> " << endl;
}
}
else
stream << "<NULL>";
return stream;
}
//----------------------------------------------------------------------
// Static Functions
//----------------------------------------------------------------------
/**
* Format a file size with all digits, yet human readable using the current
* locale's thousand separator, i.e. 12,345,678 rather than 12345678
**/
QString formatSizeLong( KFileSize size );
/**
* Format a file size for use within a QListView::key() function:
* Right-justify and fill with leading zeroes.
**/
QString hexKey( KFileSize size );
/**
* Format a millisecond granularity time human readable.
* Milliseconds will only be inluded if 'showMilliSeconds' is true.
**/
QString formatTime ( long millisec,
bool showMilliSeconds = false );
/**
* Format counters of any kind.
*
* Returns an empty string if 'suppressZero' is 'true' and the value of
* 'count' is 0.
**/
QString formatCount( int count, bool suppressZero = false );
/**
* Format percentages.
**/
QString formatPercent( float percent );
/**
* Format time and date human-readable as "yyyy-mm-dd hh:mm:ss"
* - unlike that ctime() crap that is really useless.
* See the source for more about why this format.
**/
QString formatTimeDate( time_t rawTime );
/**
* Format time and date according to the current locale for those who
* really must have that brain-dead ctime() format.
**/
QString localeTimeDate( time_t rawTime );
/**
* Return a color that contrasts to 'contrastColor'.
**/
QColor contrastingColor ( const QColor &desiredColor,
const QColor &contrastColor );
} // namespace KDirStat
#endif // ifndef KDirTreeView_h
// EOF

@ -0,0 +1,503 @@
/*
* File name: kfeedback.cpp
* Summary: User feedback form
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2004-11-23
*/
#include <qheader.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qmultilineedit.h>
#include <qhbox.h>
#include <kglobal.h>
#include <kapp.h>
#include <klocale.h>
#include <kdebug.h>
#include <kaboutdata.h>
#include <kiconloader.h>
#include <kurl.h>
#include "kfeedback.h"
KFeedbackDialog::KFeedbackDialog( const QString & feedbackMailAddress,
const QString & helpTopic )
: KDialogBase( Plain, // dialogFace
i18n( "Feedback" ), // caption
Apply | Cancel
| ( helpTopic.isEmpty() ? 0 : (int) Help ), // buttonMask
Apply ) // defaultButton
{
QVBoxLayout * layout = new QVBoxLayout( plainPage(), 0, spacingHint() );
setButtonApply( KGuiItem( i18n( "&Mail this..." ) ) );
if ( ! helpTopic.isEmpty() )
setHelp( helpTopic );
_form = new KFeedbackForm( feedbackMailAddress, plainPage() );
CHECK_PTR( _form );
layout->addWidget( _form );
checkSendButton();
connect( this, SIGNAL( applyClicked() ),
_form, SLOT ( sendMail() ) );
connect( _form, SIGNAL( mailSent() ),
this, SLOT ( hide() ) );
connect( _form, SIGNAL( mailSent() ),
this, SIGNAL( mailSent() ) );
connect( _form, SIGNAL( checkComplete() ),
this, SLOT ( checkSendButton() ) );
}
KFeedbackDialog::~KFeedbackDialog()
{
// NOP
}
void
KFeedbackDialog::checkSendButton()
{
enableButtonApply( _form->readyToSend() );
}
KFeedbackForm::KFeedbackForm( const QString & feedbackMailAddress,
QWidget * parent )
: QVBox( parent )
, _feedbackMailAddress( feedbackMailAddress )
{
//
// Explanation above the question list
//
QLabel * label = new QLabel( i18n( "<p><b>Please tell us your opinion about this program.</b></p>"
"<p>You will be able to review everything in your mailer "
"before any mail is sent.<br>"
"Nothing will be sent behind your back.</p>"
), this );
//
// Question list
//
_questionList = new KFeedbackQuestionList( this );
CHECK_PTR( _questionList );
connect( _questionList, SIGNAL( checkComplete() ),
this, SLOT ( slotCheckComplete() ) );
//
// Explanation below the question list
//
QHBox * hbox = new QHBox( this );
CHECK_PTR( hbox );
QSizePolicy pol( QSizePolicy::Fixed, QSizePolicy::Fixed ); // hor / vert
label = new QLabel( i18n( "Questions marked with " ), hbox );
CHECK_PTR( label );
label->setSizePolicy( pol );
label = new QLabel( hbox );
CHECK_PTR( label );
label->setPixmap( KGlobal::iconLoader()->loadIcon( "edit", KIcon::Small ) );
label->setSizePolicy( pol );
label = new QLabel( i18n( " must be answered before a mail can be sent.") , hbox );
CHECK_PTR( label );
label->setSizePolicy( pol );
new QWidget( hbox ); // Fill any leftover space to the right.
//
// Free-text comment field
//
label = new QLabel( "\n" + i18n( "&Additional Comments:" ), this ); CHECK_PTR( label );
_comment = new QMultiLineEdit( this ); CHECK_PTR( _comment );
label->setBuddy( _comment );
#if (QT_VERSION < 300)
_comment->setFixedVisibleLines( 5 );
#endif
_comment->setWordWrap( QMultiLineEdit::FixedColumnWidth );
_comment->setWrapColumnOrWidth( 70 );
}
KFeedbackForm::~KFeedbackForm()
{
// NOP
}
void
KFeedbackForm::sendMail()
{
//
// Build mail subject
//
QString subject;
const KAboutData * aboutData = KGlobal::instance()->aboutData();
if ( aboutData )
subject = aboutData->programName() + "-" + aboutData->version();
else
subject = kapp->name();
subject = "[kde-feedback] " + subject + " user feedback";
//
// Build mail body
//
QString body = subject + "\n\n"
+ formatComment()
+ _questionList->result();
//
// Build "mailto:" URL from all this
//
KURL mail;
mail.setProtocol( "mailto" );
mail.setPath( _feedbackMailAddress );
mail.setQuery( "?subject=" + KURL::encode_string( subject ) +
"&body=" + KURL::encode_string( body ) );
// TODO: Check for maximum command line length.
//
// The hard part with this is how to get this from all that 'autoconf'
// stuff into 'config.h' or some other include file without hardcoding
// anything - this is too system dependent.
//
// Actually send mail
//
kapp->invokeMailer( mail );
emit mailSent();
}
void
KFeedbackForm::slotCheckComplete()
{
emit checkComplete();
}
QString
KFeedbackForm::formatComment()
{
QString result = _comment->text();
if ( ! result.isEmpty() )
{
result = "<comment>\n" + result + "\n</comment>\n\n";
}
return result;
}
bool
KFeedbackForm::readyToSend()
{
return _questionList->isComplete();
}
KFeedbackQuestionList::KFeedbackQuestionList( QWidget *parent )
: QListView( parent )
{
addColumn( "" );
header()->hide();
}
KFeedbackQuestionList::~KFeedbackQuestionList()
{
// NOP
}
bool
KFeedbackQuestionList::isComplete()
{
KFeedbackQuestion * question = firstQuestion();
while ( question )
{
if ( question->isRequired() && ! question->isAnswered() )
return false;
question = question->nextQuestion();
}
return true;
}
QString
KFeedbackQuestionList::result()
{
QString res;
KFeedbackQuestion * question = firstQuestion();
while ( question )
{
res += question->result();
question = question->nextQuestion();
}
return res;
}
KFeedbackQuestion *
KFeedbackQuestionList::addQuestion( const QString & text,
const QString & id,
bool exclusiveAnswer,
bool required )
{
KFeedbackQuestion * question = new KFeedbackQuestion( this, text, id,
exclusiveAnswer,
required );
CHECK_PTR( question );
return question;
}
void
KFeedbackQuestionList::addYesNoQuestion( const QString & text,
const QString & id,
bool required )
{
KFeedbackQuestion * question = new KFeedbackQuestion( this, text, id,
true, // exclusive
required );
CHECK_PTR( question );
question->addAnswer( i18n( "yes" ), "yes" );
question->addAnswer( i18n( "no" ), "no" );
}
void
KFeedbackQuestionList::questionAnswered()
{
emit checkComplete();
}
void
KFeedbackQuestionList::questionAdded( KFeedbackQuestion * question)
{
if ( question->isRequired() )
emit checkComplete();
}
static int nextNo = 0;
KFeedbackQuestion::KFeedbackQuestion( KFeedbackQuestionList * parent,
const QString & text,
const QString & id,
bool exclusiveAnswer,
bool required,
bool open )
: QCheckListItem( parent, text )
, _id( id )
, _exclusiveAnswer( exclusiveAnswer )
, _required( required )
{
if ( required )
{
setPixmap( 0, KGlobal::iconLoader()->loadIcon( "edit", KIcon::Small ) );
}
setOpen( open );
_no = nextNo++;
parent->questionAdded( this );
}
void
KFeedbackQuestion::addAnswer( const QString & text,
const QString & id )
{
new KFeedbackAnswer( this, text, id, _exclusiveAnswer );
}
bool
KFeedbackQuestion::isAnswered()
{
if ( ! _exclusiveAnswer )
{
/**
* If any number of answers is permitted for this question, this
* question is always considered to be answered.
**/
return true;
}
/**
* If this question requires an exclusive answer, exactly one of them
* should be checked. We don't need to bother about more than one being
* checked here - QListView does that for us.
**/
KFeedbackAnswer *answer = firstAnswer();
while ( answer )
{
if ( answer->isChecked() )
return true;
answer = answer->nextAnswer();
}
return false;
}
QString
KFeedbackQuestion::result()
{
QString res;
int answers = 0;
KFeedbackAnswer *answer = firstAnswer();
while ( answer )
{
if ( answer->isChecked() )
{
res += _id + "=\"" + answer->id() + "\"\n";
answers++;
}
answer = answer->nextAnswer();
}
if ( answers > 1 )
{
res = "\n" + res + "\n";
}
return res;
}
QString
KFeedbackQuestion::text()
{
return QCheckListItem::text(0);
}
QString
KFeedbackQuestion::key( int, bool ) const
{
QString no;
no.sprintf( "%08d", _no );
return no;
}
KFeedbackQuestionList *
KFeedbackQuestion::questionList() const
{
return dynamic_cast<KFeedbackQuestionList *>( listView() );
}
KFeedbackAnswer::KFeedbackAnswer( KFeedbackQuestion * parent,
const QString & text,
const QString & id,
bool exclusive )
: QCheckListItem( parent,
text,
exclusive
? QCheckListItem::RadioButton
: QCheckListItem::CheckBox )
, _id( id )
{
_no = nextNo++;
}
QString
KFeedbackAnswer::text()
{
return QCheckListItem::text(0);
}
QString
KFeedbackAnswer::key( int, bool ) const
{
QString no;
no.sprintf( "%08d", _no );
return no;
}
void
KFeedbackAnswer::stateChange( bool newState )
{
if ( newState && question()->isRequired() )
{
KFeedbackQuestionList * list = question()->questionList();
if ( list )
list->questionAnswered();
}
}
// EOF

@ -0,0 +1,460 @@
/*
* File name: kfeedback.h
* Summary: User feedback form and mailing utilities
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KFeedback_h
#define KFeedback_h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <qlistview.h>
#include <qvbox.h>
#include <kdialogbase.h>
#ifndef NOT_USED
# define NOT_USED(PARAM) ( (void) (PARAM) )
#endif
class KFeedbackForm;
class KFeedbackQuestionList;
class KFeedbackQuestion;
class KFeedbackAnswer;
class QMultiLineEdit;
/**
* Dialog containing a @ref KFeedbackForm and all the infrastructure for
* sending a mail etc.
**/
class KFeedbackDialog: public KDialogBase
{
Q_OBJECT
public:
/**
* Constructor.
**/
KFeedbackDialog( const QString & feedbackMailAddress,
const QString & helpTopic = QString::null );
/**
* Destructor.
**/
virtual ~KFeedbackDialog();
/**
* Returns the internal @KFeedbackForm
**/
KFeedbackForm *form() { return _form; }
public slots:
/**
* Check if sufficient information is available to send a mail now and
* enable / disable the "send mail" button accordingly.
**/
void checkSendButton();
signals:
/**
* Emitted when the user has sent the feedback mail - i.e. when he clicked
* on the "Send mail" button and the mail has successfully been forwarded
* to the mailer. He can still choose not to send the mail from within the
* mailer, though.
**/
void mailSent();
protected:
KFeedbackForm * _form;
};
/**
* User feedback form:
*
* User is asked a list of questions, the answers of which will be sent via
* mail back to a feedback mail address.
**/
class KFeedbackForm: public QVBox
{
Q_OBJECT
public:
/**
* Constructor.
**/
KFeedbackForm( const QString & feedbackMailAddress,
QWidget * parent );
/**
* Destructor.
**/
virtual ~KFeedbackForm();
public slots:
/**
* Compose a mail from the user's answers and send it to the feedback mail
* address passed to the constructor.
*
* This method will check with @ref readyToSend() if the mail can be sent
* with the questions answered until now and prompt the user to answer more
* questions if not.
*
* Connect the @ref mailSent() signal if you are interested when exactly
* all this was successful.
**/
virtual void sendMail();
public:
/**
* Checks if the mail is ready to send, i.e. if all required fields are
* filled.
**/
virtual bool readyToSend();
/**
* Returns the @ref KFeedbackQuestionList .
**/
KFeedbackQuestionList * questionList() { return _questionList; }
signals:
/**
* Emitted when the user has sent the feedback mail - i.e. when he clicked
* on the "Send mail" button and the mail has successfully been forwarded
* to the mailer. He can still choose not to send the mail from within the
* mailer, though.
**/
void mailSent();
/**
* Emitted when it is time to check for completeness of all information in
* this form: Either when a new question is added or when a question is
* answered.
**/
void checkComplete();
protected slots:
/**
* Check for completeness of this form.
**/
void slotCheckComplete();
protected:
/**
* Format the "personal comments" field for sending mail.
**/
QString formatComment();
QString _feedbackMailAddress;
KFeedbackQuestionList * _questionList;
QMultiLineEdit * _comment;
};
/**
* List of feedback questions presented in a @ref QListView widget.
**/
class KFeedbackQuestionList: public QListView
{
Q_OBJECT
public:
/**
* Constructor.
**/
KFeedbackQuestionList( QWidget *parent );
/**
* Destructor.
**/
virtual ~KFeedbackQuestionList();
/**
* Returns whether or not this question list is answered satisfactorily,
* i.e. if all questions marked as "required" are answered.
**/
virtual bool isComplete();
/**
* The result of all answered questions in ASCII.
**/
QString result();
/**
* Add a yes/no question to the list.
*
* 'text' is the text the user will see (in his native language).
*
* 'id' is what will be sent with the feedback mail, thus it should be
* unique within the application, yet human readable (preferably English)
* and not contain any weird characters that might confuse scripts that are
* later used to automatically parse those mails.
* Examples: "would_recommend_to_a_friend"
*
* Set 'required' to 'true' if answering this question is required to
* successfully complete this form.
*
* Returns a pointer to this question so you can add answers.
**/
KFeedbackQuestion * addQuestion( const QString & text,
const QString & id,
bool exclusiveAnswer = true,
bool required = false );
/**
* Add a yes/no question to the list.
**/
void addYesNoQuestion( const QString & text,
const QString & id,
bool required = false );
/**
* Returns the first question of that list.
* Use @ref KFeedbackQuestion::next() to get the next one.
**/
KFeedbackQuestion * firstQuestion() const
{ return (KFeedbackQuestion *) QListView::firstChild(); }
/**
* Notify the list that another question has been answered.
* Emits the @ref checkComplete() signal when all required questions are
* answered.
**/
void questionAnswered();
/**
* Notify the list that another question has been added.
* Emits the @ref checkComplete() signal when a required question is
* added.
**/
void questionAdded( KFeedbackQuestion * question );
signals:
/**
* Emitted when all required questions are answered.
**/
void checkComplete();
};
/**
* A user feedback question to be inserted into a @ref KFeedbackQuestionList.
**/
class KFeedbackQuestion: public QCheckListItem
{
public:
/**
* Constructor.
*
* The parent @ref KFeedbackQuestionList assumes ownership of this object,
* so don't delete it unless you want to delete it from the question list
* as well.
*
* 'text' is the text the user will see (in his native language).
*
* 'id' is what will be sent with the feedback mail, thus it should be
* unique within the application, yet human readable (preferably English)
* and not contain any weird characters that might confuse scripts that are
* later used to automatically parse those mails.
* Examples: "features_not_liked", "stability"
*
* Set 'required' to 'true' if answering this question is required to
* successfully complete this form.
*
* Set 'exclusiveAnswer' to 'true' if only one of all answers may be
* checked at any one time, to 'false' if multiple answers are allowed.
**/
KFeedbackQuestion( KFeedbackQuestionList * parent,
const QString & text,
const QString & id,
bool exclusiveAnswer = true,
bool required = false,
bool open = true );
/**
* Add an answer to this question. Again, 'text' is what the user will see
* (translated to his native language), 'id' is what you will get back with
* the mail. The answer IDs need only be unique for that question; answers
* to other questions may have the same ID.
**/
void addAnswer( const QString & text,
const QString & id );
/**
* Returns if answering this question is required.
**/
bool isRequired() { return _required; }
/**
* Returns if this question is answered satisfactorily.
**/
bool isAnswered();
/**
* The result of this question in ASCII, e.g.
* recommend="yes"
* or
* features_i_like="builtin_tetris"
* features_i_like="pink_elephant"
* features_i_like="studlycapslyfier"
**/
QString result();
/**
* Return this question's ID.
**/
QString id() { return _id; }
/**
* Return this question's text.
**/
QString text();
/**
* Returns whether or not this question requires an exclusive answer.
**/
bool exclusiveAnswer() { return _exclusiveAnswer; }
/**
* Returns the sort key.
*
* Reimplemented from @ref QListViewItem to maintain insertion order.
**/
virtual QString key( int column, bool ascending ) const;
/**
* Returns the next question or 0 if there is no more.
**/
KFeedbackQuestion * nextQuestion() const
{ return (KFeedbackQuestion *) QListViewItem::nextSibling(); }
/**
* Returns the first possible answer to this question.
* Use @ref KFeedbackAnswer::nextAnswer() to get the next one.
**/
KFeedbackAnswer * firstAnswer() const
{ return (KFeedbackAnswer *) QListViewItem::firstChild(); }
/**
* Returns the @ref KFeedbackQuestionList this question belongs to or 0 if
* the parent is no @ref KFeedbackQuestionList.
**/
KFeedbackQuestionList * questionList() const;
protected:
QString _id;
bool _exclusiveAnswer;
bool _required;
int _no;
};
class KFeedbackAnswer: public QCheckListItem
{
public:
/**
* Constructor.
*
* 'exclusive' tells the type of answer: One of many allowed or any number
* of many.
**/
KFeedbackAnswer( KFeedbackQuestion * parent,
const QString & text,
const QString & id,
bool exclusive = true );
/**
* Return this answer's ID.
**/
QString id() { return _id; }
/**
* Return this answer's text.
**/
QString text();
/**
* Returns whether or not this is an exclusive answer.
**/
bool isExclusive() { return _exclusive; }
/**
* Returns whether or not this answer is checked.
**/
bool isChecked() { return QCheckListItem::isOn(); }
/**
* Returns the next possible answer or 0 if there is no more.
**/
KFeedbackAnswer * nextAnswer() const
{ return (KFeedbackAnswer *) QListViewItem::nextSibling(); }
/**
* Returns the question to this answer.
**/
KFeedbackQuestion * question() const
{ return (KFeedbackQuestion *) QListViewItem::parent(); }
/**
* Returns the sort key.
*
* Reimplemented from @ref QListViewItem to maintain insertion order.
**/
virtual QString key( int column, bool ascending ) const;
/**
* On/off change.
*
* Reimplemented from @ref QCheckListItem to monitor answering required
* questions. This method notifies the @ref KFeedbackQuestionList whenever
* a required question is being answered.
**/
virtual void stateChange( bool newState );
protected:
QString _id;
bool _exclusive;
int _no;
};
#endif // KFeedback_h
// EOF

@ -0,0 +1,311 @@
/*
* File name: kpacman.cpp
* Summary: PacMan animation
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2004-03-29
*/
#include <unistd.h>
#include <stdlib.h>
#include <qtimer.h>
#include <qpixmap.h>
#include <kdebug.h>
#include "kpacman.h"
KPacManAnimation::KPacManAnimation( QWidget * widget,
int size,
bool randomStart )
{
_widget = widget;
_size = size;
_randomStart = randomStart;
_brush = QBrush( Qt::yellow );
_pos = 0;
_speed = 4;
_interval = 100;
_minMouth = 10;
_maxMouth = 70;
_mouthInc = ( _maxMouth - _minMouth ) / 3;
_mouth = _minMouth;
_pacManRect = QRect( 0, 0, 0, 0 );
restart();
}
KPacManAnimation::~KPacManAnimation()
{
}
void
KPacManAnimation::restart()
{
_justStarted = true;
if ( _randomStart )
{
_goingRight = ( rand() > ( RAND_MAX / 2 ) );
// Initial _pos is set in animate() since the width (upon which it
// depends) is still unknown here.
}
else
{
_goingRight = true;
_pos = 0;
}
// Care for initial display
_time = _time.addMSecs( _interval + 1 );
}
void
KPacManAnimation::animate( QPainter * painter,
QRect rect )
{
if ( _time.elapsed() < _interval )
return;
_time.restart();
// Make PacMan fit into height
int size = _size <= rect.height() ? _size : rect.height();
if ( rect.width() < size ) // No space to animate in?
return; // -> forget it!
if ( _justStarted )
{
_justStarted = false;
if ( _pacManRect.width() > 0 )
painter->eraseRect( _pacManRect );
if ( _randomStart )
{
// Set random initial position
// - this depends on the width which is unknown in the constructor.
_pos = (int) ( (rect.width() - size ) * ( (double) rand() / RAND_MAX) );
}
}
else // ! _justStarted
{
// Erase last PacMan
if ( ! _goingRight )
_pacManRect.setX( _pacManRect.x() + _pacManRect.width() - _speed );
_pacManRect.setWidth( _speed );
painter->eraseRect( _pacManRect );
}
if ( _pos + size > rect.width() ) // Right edge reached?
{
// Notice: This can also happen when the rectangle is resized - i.e. it
// really makes sense to do that right here rather than at the end of
// this function!
// Turn left
_pos = rect.width() - size;
_goingRight = false;
_mouth = _minMouth;
}
else if ( _pos < 0 ) // Left edge reached?
{
// Turn right
_pos = 0;
_goingRight = true;
_mouth = _minMouth;
}
// Draw PacMan (double-buffered)
_pacManRect = QRect( 0, 0, size, size );
QPixmap pixmap( size, size );
pixmap.fill( painter->backgroundColor() );
QPainter p( &pixmap, _widget );
p.setBrush( _brush );
if ( _goingRight )
{
p.drawPie( _pacManRect,
_mouth * 16, // arc (1/16 degrees)
( 360 - 2 * _mouth ) * 16 ); // arc lenght (1/16 degrees)
}
else
{
p.drawPie( _pacManRect,
( 180 + _mouth ) * 16, // arc (1/16 degrees)
( 360 - 2 * _mouth ) * 16 ); // arc lenght (1/16 degrees)
}
_pacManRect = QRect( rect.x() + _pos, // x
( rect.height() - size ) / 2, // y
size, size ); // width, height
// Transfer pixmap into widget
#if 0
QPoint offset = painter->worldMatrix().map( _pacManRect.topLeft() );
// kdDebug() << "bitBlt() to " << offset.x() << ", " << offset.y() << endl;
bitBlt( _widget, offset, &pixmap );
#endif
painter->drawPixmap( _pacManRect.topLeft(), pixmap );
// Animate mouth for next turn
_mouth += _mouthInc;
if ( _mouth >= _maxMouth ) // max open reached
{
_mouth = _maxMouth;
_mouthInc = -_mouthInc; // reverse direction
}
else if ( _mouth <= _minMouth ) // min open reached
{
_mouth = _minMouth;
_mouthInc = -_mouthInc; // reverse direction
}
// Advance position for next turn
if ( _goingRight )
_pos += _speed;
else
_pos -= _speed;
}
KPacMan::KPacMan( QWidget * parent,
int pacManSize,
bool randomStart,
const char * widgetName )
: QWidget( parent, widgetName )
{
_pacManSize = pacManSize;
_pacMan = new KPacManAnimation( this, _pacManSize, randomStart );
_timer = 0;
_interval = 100; // millisec
_active = false;
_painter = new QPainter( this );
_margin = 1;
}
KPacMan::~KPacMan()
{
if ( _painter )
delete _painter;
if ( _pacMan )
delete _pacMan;
}
void
KPacMan::start()
{
if ( ! _timer )
{
_timer = new QTimer( this );
}
_pacMan->restart();
if ( _timer )
{
_active = true;
_timer->start( _interval );
connect( _timer, SIGNAL( timeout() ),
this, SLOT ( animate() ) );
}
}
void
KPacMan::stop()
{
_active = false;
if ( _timer )
_timer->stop();
repaint();
}
void
KPacMan::animate()
{
repaint( false );
}
void
KPacMan::setInterval( int intervalMilliSec )
{
_interval = intervalMilliSec;
_pacMan->setInterval( _interval );
if ( _timer )
_timer->changeInterval( _interval );
}
void
KPacMan::paintEvent( QPaintEvent *ev )
{
QWidget::paintEvent( ev );
if ( _active )
{
_pacMan->animate( _painter, QRect( _margin, 0, width() - _margin, height() ) );
}
}
void
KPacMan::mouseReleaseEvent ( QMouseEvent *ev )
{
if ( _active )
{
if ( _pacMan->lastPacMan().contains( ev->pos() ) )
stop();
}
}
QSize
KPacMan::sizeHint() const
{
return QSize( 16 * _pacManSize, // width - admittedly somewhat random
_pacManSize + 2 * _margin ); // height
}
// EOF

@ -0,0 +1,265 @@
/*
* File name: kpacman.h
* Summary: PacMan animation inside widgets
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2004-03-29
*/
#ifndef KPacMan_h
#define KPacMan_h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <qwidget.h>
#include <qpainter.h>
#include <qcolor.h>
#include <qdatetime.h>
#ifndef NOT_USED
# define NOT_USED(PARAM) ( (void) (PARAM) )
#endif
class QTimer;
/**
* Helper class to display a PacMan animation inside a widget.
* Note that this is not a widget itself, it needs to be placed inside a widget
* - which fact makes it suitable for use inside non-widget objects such as
* @ref QListViewItem.
*
* If you are looking for a widget that can do all that self-contained, see
* @ref KPacMan.
*
* @short PacMan animation
**/
class KPacManAnimation
{
public:
/**
* Constructor.
*
* Create a PacMan sprite in 'widget' of 'size' pixels diameter. Start at
* a random position and move in random direction if 'randomStart' is true.
**/
KPacManAnimation( QWidget * widget,
int size,
bool randomStart );
/**
* Destructor.
**/
virtual ~KPacManAnimation();
/**
* Animate PacMan inside this rectangle.
* Call this frequently enough (e.g. by a timer) to get fluid motion.
* Set up the painter prior to calling this; the entire rectangle will be
* cleared with the current brush, and PacMan's outline will be drawn with
* the current pen.
*
* PacMan moves from the left side of this rectangle to the right, turning
* around when it (he?) reaches the right edge. It (he?) is centered
* vertically.
*
* My, what is the sex of that thing? ;-)
**/
void animate( QPainter * painter,
QRect rect );
/**
* Restart - reset to initial position and direction.
**/
void restart();
/**
* Return the rectangle where the last PacMan was painted.
**/
QRect lastPacMan() { return _pacManRect; }
/**
* Set the animation interval in milliseconds.
**/
void setInterval( int intervalMilliSec ) { _interval = intervalMilliSec; }
int interval() const { return _interval; }
/**
* Number of pixels to move for each phase.
**/
int speed() const { return _speed; }
void setSpeed( int speed ) { _speed = speed; }
/**
* Brush to draw PacMan's inside. Bright yellow by default.
**/
QBrush brush() const { return _brush; }
void setBrush( const QBrush & brush ) { _brush = brush; }
/**
* Number of degrees PacMan's mouth opens or closes for each animation.
**/
int mouthOpenInc() const { return _mouthInc; }
void setMouthOpenInc( int deg ) { _mouthInc = deg; }
/**
* Minimum angle in degrees that PacMan's mouth opens.
**/
int minMouthOpenAngle() const { return _minMouth; }
void setMinMouthOpenAngle( int deg ) { _minMouth = deg; }
/**
* Maximum angle in degrees that PacMan's mouth opens.
**/
int maxMouthOpenAngle() const { return _maxMouth; }
void setMaxMouthOpenAngle( int deg ) { _maxMouth = deg; }
protected:
QWidget * _widget;
QBrush _brush;
QTime _time;
QRect _pacManRect;
int _size;
bool _randomStart;
int _speed;
int _minMouth;
int _maxMouth;
int _mouthInc;
int _interval; // milliseconds
// Current values
int _pos;
int _mouth;
bool _justStarted;
bool _goingRight;
};
/**
* Widget that displays a PacMan animation.
*
* @short PacMan widget
**/
class KPacMan: public QWidget
{
Q_OBJECT
public:
/**
* Constructor.
*
* @param pacManSize size of the PacMan sprite
* @param randomStart random start position and direction if true
**/
KPacMan( QWidget * parent = 0,
int pacManSize = 16,
bool randomStart = false,
const char * widgetName = 0 );
/**
* Destructor.
**/
virtual ~KPacMan();
/**
* Access to the internal @ref PacManAnimation to avoid duplicating all its
* methods.
**/
KPacManAnimation * pacMan() { return _pacMan; }
/**
* Access to the internal @ref QPainter to avoid duplicating all its
* methods. Change this painter in order to change the visual appearance of
* the PacMan sprite.
**/
QPainter * painter() { return _painter; }
/**
* Returns the animation interval in milliseconds.
**/
int interval() const { return _interval; }
/**
* Set the animation interval in milliseconds.
**/
void setInterval( int intervalMilliSec );
/**
* Return the (left and right) margin.
**/
int margin() { return _margin; }
/**
* Set the (left and right) margin - a place PacMan never goes.
**/
void setMargin( int margin ) { _margin = margin; }
/**
* Returns the widget's preferred size.
*
* Reimplemented from @ref QWidget.
**/
virtual QSize sizeHint() const;
public slots:
/**
* Start the animation.
**/
void start();
/**
* Stop the animation and clear the widget.
**/
void stop();
/**
* Do one animation. Triggered by timer.
**/
void animate();
protected:
/**
* Actually do the painting.
*
* Reimplemented from @ref QWidget.
**/
virtual void paintEvent( QPaintEvent *ev );
/**
* Stop animation on mouse click.
*
* Reimplemented from @ref QWidget.
**/
virtual void mouseReleaseEvent ( QMouseEvent *ev );
protected:
KPacManAnimation * _pacMan;
QPainter * _painter;
QTimer * _timer;
int _interval; // millisec
bool _active;
int _margin;
int _pacManSize;
};
#endif // KPacMan_h
// EOF

@ -0,0 +1,150 @@
/*
* File name: kstdcleanup.cpp
* Summary: Support classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2004-11-23
*/
#include <klocale.h>
#include "kcleanup.h"
#include "kstdcleanup.h"
using namespace KDirStat;
KCleanup *
KStdCleanup::openInKonqueror( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_open_in_konqueror",
"kfmclient openURL %p",
i18n( "Open in &Konqueror" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( true );
cleanup->setWorksForDotEntry( true );
cleanup->setWorksLocalOnly ( false );
cleanup->setRefreshPolicy( KCleanup::noRefresh );
cleanup->setIcon( "konqueror.png" );
cleanup->setShortcut( Qt::CTRL + Qt::Key_K );
return cleanup;
}
KCleanup *
KStdCleanup::openInTerminal( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_open_in_terminal",
"konsole",
i18n( "Open in &Terminal" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( true );
cleanup->setWorksForDotEntry( true );
cleanup->setRefreshPolicy( KCleanup::noRefresh );
cleanup->setIcon( "konsole.png" );
cleanup->setShortcut( Qt::CTRL + Qt::Key_T );
return cleanup;
}
KCleanup *
KStdCleanup::compressSubtree( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_compress_subtree",
"cd ..; tar cjvf %n.tar.bz2 %n && rm -rf %n",
i18n( "&Compress" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( false );
cleanup->setWorksForDotEntry( false );
cleanup->setRefreshPolicy( KCleanup::refreshParent );
cleanup->setIcon( "ark.png" );
return cleanup;
}
KCleanup *
KStdCleanup::makeClean( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_make_clean",
"make clean",
i18n( "&make clean" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( false );
cleanup->setWorksForDotEntry( true );
cleanup->setRefreshPolicy( KCleanup::refreshThis );
return cleanup;
}
KCleanup *
KStdCleanup::deleteTrash( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_delete_trash",
"rm -f *.o *~ *.bak *.auto core",
i18n( "Delete T&rash Files" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( false );
cleanup->setWorksForDotEntry( true );
cleanup->setRefreshPolicy( KCleanup::refreshThis );
cleanup->setRecurse( true );
return cleanup;
}
KCleanup *
KStdCleanup::moveToTrashBin( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_move_to_trash_bin",
"kfmclient move %p %t",
i18n( "Delete (to Trash &Bin)" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( true );
cleanup->setWorksForDotEntry( false );
cleanup->setRefreshPolicy( KCleanup::assumeDeleted );
cleanup->setIcon( "edittrash.png" );
cleanup->setShortcut( Qt::CTRL + Qt::Key_X );
return cleanup;
}
KCleanup *
KStdCleanup::hardDelete( KActionCollection *parent )
{
KCleanup *cleanup = new KCleanup( "cleanup_hard_delete",
"rm -rf %p",
i18n( "&Delete (no way to undelete!)" ),
parent );
CHECK_PTR( cleanup );
cleanup->setWorksForDir ( true );
cleanup->setWorksForFile ( true );
cleanup->setWorksForDotEntry( false );
cleanup->setAskForConfirmation( true );
cleanup->setRefreshPolicy( KCleanup::assumeDeleted );
cleanup->setIcon( "editdelete.png" );
cleanup->setShortcut( Qt::CTRL + Qt::Key_Delete );
return cleanup;
}
// EOF

@ -0,0 +1,65 @@
/*
* File name: kstdcleanup.h
* Summary: Support classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KStdCleanup_h
#define KStdCleanup_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
// Forward declarations
class KActionCollection;
class KDirStat::KCleanup;
namespace KDirStat
{
/**
* Predefined standard @ref KCleanup actions to be performed on
* @ref KDirTree items.
*
* This class is not meant to be ever instantiated - use the static methods
* only.
*
* For details about what each individual method does, refer to the help
* file. Use the old (KDirStat 0.86) help file in case the current help
* file isn't available yet.
*
* @short KDirStat standard cleanup actions
**/
class KStdCleanup
{
public:
static KCleanup *openInKonqueror ( KActionCollection *parent = 0 );
static KCleanup *openInTerminal ( KActionCollection *parent = 0 );
static KCleanup *compressSubtree ( KActionCollection *parent = 0 );
static KCleanup *makeClean ( KActionCollection *parent = 0 );
static KCleanup *deleteTrash ( KActionCollection *parent = 0 );
static KCleanup *moveToTrashBin ( KActionCollection *parent = 0 );
static KCleanup *hardDelete ( KActionCollection *parent = 0 );
private:
/**
* Prevent instances of this class - private constructor / destructor.
**/
KStdCleanup() {}
~KStdCleanup() {}
};
} // namespace KDirStat
#endif // ifndef KStdCleanup_h
// EOF

@ -0,0 +1,608 @@
/*
* File name: ktreemaptile.cpp
* Summary: High level classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-30
*/
#include <math.h>
#include <algorithm>
#include <kapp.h>
#include <klocale.h>
#include <kglobal.h>
#include <qimage.h>
#include <qpainter.h>
#include "ktreemaptile.h"
#include "ktreemapview.h"
#include "kdirtreeiterators.h"
#include "kdirtreeview.h"
using namespace KDirStat;
using std::max;
using std::min;
KTreemapTile::KTreemapTile( KTreemapView * parentView,
KTreemapTile * parentTile,
KFileInfo * orig,
const QRect & rect,
KOrientation orientation )
: QCanvasRectangle( rect, parentView->canvas() )
, _parentView( parentView )
, _parentTile( parentTile )
, _orig( orig )
{
init();
if ( parentTile )
_cushionSurface = parentTile->cushionSurface();
createChildren( rect, orientation );
}
KTreemapTile::KTreemapTile( KTreemapView * parentView,
KTreemapTile * parentTile,
KFileInfo * orig,
const QRect & rect,
const KCushionSurface & cushionSurface,
KOrientation orientation )
: QCanvasRectangle( rect, parentView->canvas() )
, _parentView( parentView )
, _parentTile( parentTile )
, _orig( orig )
, _cushionSurface( cushionSurface )
{
init();
// Intentionally not copying the parent's cushion surface!
createChildren( rect, orientation );
}
KTreemapTile::~KTreemapTile()
{
// NOP
}
void
KTreemapTile::init()
{
// Set up height (z coordinate) - one level higher than the parent so this
// will be closer to the foreground.
//
// Note that this must happen before any children are created.
// I found that out the hard way. ;-)
setZ( _parentTile ? ( _parentTile->z() + 1.0 ) : 0.0 );
setBrush( QColor( 0x60, 0x60, 0x60 ) );
setPen( NoPen );
show(); // QCanvasItems are invisible by default!
// kdDebug() << "Creating treemap tile for " << orig << " " << rect << " size " << orig->totalSize() << endl;
}
void
KTreemapTile::createChildren( const QRect & rect,
KOrientation orientation )
{
if ( _orig->totalSize() == 0 ) // Prevent division by zero
return;
if ( _parentView->squarify() )
createSquarifiedChildren( rect );
else
createChildrenSimple( rect, orientation );
}
void
KTreemapTile::createChildrenSimple( const QRect & rect,
KOrientation orientation )
{
KOrientation dir = orientation;
KOrientation childDir = orientation;
if ( dir == KTreemapAuto )
dir = rect.width() > rect.height() ? KTreemapHorizontal : KTreemapVertical;
if ( orientation == KTreemapHorizontal ) childDir = KTreemapVertical;
if ( orientation == KTreemapVertical ) childDir = KTreemapHorizontal;
int offset = 0;
int size = dir == KTreemapHorizontal ? rect.width() : rect.height();
int count = 0;
double scale = (double) size / (double) _orig->totalSize();
_cushionSurface.addRidge( childDir, _cushionSurface.height(), rect );
KFileInfoSortedBySizeIterator it( _orig,
(KFileSize) ( _parentView->minTileSize() / scale ),
KDotEntryAsSubDir );
while ( *it )
{
int childSize = 0;
childSize = (int) ( scale * (*it)->totalSize() );
if ( childSize >= _parentView->minTileSize() )
{
QRect childRect;
if ( dir == KTreemapHorizontal )
childRect = QRect( rect.x() + offset, rect.y(), childSize, rect.height() );
else
childRect = QRect( rect.x(), rect.y() + offset, rect.width(), childSize );
KTreemapTile * tile = new KTreemapTile( _parentView, this, *it, childRect, childDir );
CHECK_PTR( tile );
tile->cushionSurface().addRidge( dir,
_cushionSurface.height() * _parentView->heightScaleFactor(),
childRect );
offset += childSize;
}
++count;
++it;
}
}
void
KTreemapTile::createSquarifiedChildren( const QRect & rect )
{
if ( _orig->totalSize() == 0 )
{
kdError() << k_funcinfo << "Zero totalSize()" << endl;
return;
}
double scale = rect.width() * (double) rect.height() / _orig->totalSize();
KFileSize minSize = (KFileSize) ( _parentView->minTileSize() / scale );
#if 0
if ( _orig->hasChildren() )
{
_cushionSurface.addRidge( KTreemapHorizontal, _cushionSurface.height(), rect );
_cushionSurface.addRidge( KTreemapVertical, _cushionSurface.height(), rect );
}
#endif
KFileInfoSortedBySizeIterator it( _orig, minSize, KDotEntryAsSubDir );
QRect childrenRect = rect;
while ( *it )
{
KFileInfoList row = squarify( childrenRect, scale, it );
childrenRect = layoutRow( childrenRect, scale, row );
}
}
KFileInfoList
KTreemapTile::squarify( const QRect & rect,
double scale,
KFileInfoSortedBySizeIterator & it )
{
// kdDebug() << "squarify() " << _orig << " " << rect << endl;
KFileInfoList row;
int length = max( rect.width(), rect.height() );
if ( length == 0 ) // Sanity check
{
kdWarning() << k_funcinfo << "Zero length" << endl;
if ( *it ) // Prevent endless loop in case of error:
++it; // Advance iterator.
return row;
}
bool improvingAspectRatio = true;
double lastWorstAspectRatio = -1.0;
double sum = 0;
// This is a bit ugly, but doing all calculations in the 'size' dimension
// is more efficient here since that requires only one scaling before
// doing all other calculations in the loop.
const double scaledLengthSquare = length * (double) length / scale;
while ( *it && improvingAspectRatio )
{
sum += (*it)->totalSize();
if ( ! row.isEmpty() && sum != 0 && (*it)->totalSize() != 0 )
{
double sumSquare = sum * sum;
double worstAspectRatio = max( scaledLengthSquare * row.first()->totalSize() / sumSquare,
sumSquare / ( scaledLengthSquare * (*it)->totalSize() ) );
if ( lastWorstAspectRatio >= 0.0 &&
worstAspectRatio > lastWorstAspectRatio )
{
improvingAspectRatio = false;
}
lastWorstAspectRatio = worstAspectRatio;
}
if ( improvingAspectRatio )
{
// kdDebug() << "Adding " << *it << " size " << (*it)->totalSize() << endl;
row.append( *it );
++it;
}
else
{
// kdDebug() << "Getting worse after adding " << *it << " size " << (*it)->totalSize() << endl;
}
}
return row;
}
QRect
KTreemapTile::layoutRow( const QRect & rect,
double scale,
KFileInfoList & row )
{
if ( row.isEmpty() )
return rect;
// Determine the direction in which to subdivide.
// We always use the longer side of the rectangle.
KOrientation dir = rect.width() > rect.height() ? KTreemapHorizontal : KTreemapVertical;
// This row's primary length is the longer one.
int primary = max( rect.width(), rect.height() );
// This row's secondary length is determined by the area (the number of
// pixels) to be allocated for all of the row's items.
KFileSize sum = row.sumTotalSizes();
int secondary = (int) ( sum * scale / primary );
if ( sum == 0 ) // Prevent division by zero.
return rect;
if ( secondary < _parentView->minTileSize() ) // We don't want tiles that small.
return rect;
// Set up a cushion surface for this layout row:
// Add another ridge perpendicular to the row's direction
// that optically groups this row's tiles together.
KCushionSurface rowCushionSurface = _cushionSurface;
rowCushionSurface.addRidge( dir == KTreemapHorizontal ? KTreemapVertical : KTreemapHorizontal,
_cushionSurface.height() * _parentView->heightScaleFactor(),
rect );
int offset = 0;
int remaining = primary;
KFileInfoListIterator it( row );
while ( *it )
{
int childSize = (int) ( (*it)->totalSize() / (double) sum * primary + 0.5 );
if ( childSize > remaining ) // Prevent overflow because of accumulated rounding errors
childSize = remaining;
remaining -= childSize;
if ( childSize >= _parentView->minTileSize() )
{
QRect childRect;
if ( dir == KTreemapHorizontal )
childRect = QRect( rect.x() + offset, rect.y(), childSize, secondary );
else
childRect = QRect( rect.x(), rect.y() + offset, secondary, childSize );
KTreemapTile * tile = new KTreemapTile( _parentView, this, *it, childRect, rowCushionSurface );
CHECK_PTR( tile );
tile->cushionSurface().addRidge( dir,
rowCushionSurface.height() * _parentView->heightScaleFactor(),
childRect );
offset += childSize;
}
++it;
}
// Subtract the layouted area from the rectangle.
QRect newRect;
if ( dir == KTreemapHorizontal )
newRect = QRect( rect.x(), rect.y() + secondary, rect.width(), rect.height() - secondary );
else
newRect = QRect( rect.x() + secondary, rect.y(), rect.width() - secondary, rect.height() );
// kdDebug() << "Left over:" << " " << newRect << " " << _orig << endl;
return newRect;
}
void
KTreemapTile::drawShape( QPainter & painter )
{
// kdDebug() << k_funcinfo << endl;
QSize size = rect().size();
if ( size.height() < 1 || size.width() < 1 )
return;
if ( _parentView->doCushionShading() )
{
if ( _orig->isDir() || _orig->isDotEntry() )
{
QCanvasRectangle::drawShape( painter );
}
else
{
if ( _cushion.isNull() )
_cushion = renderCushion();
QRect rect = QCanvasRectangle::rect();
if ( ! _cushion.isNull() )
painter.drawPixmap( rect, _cushion );
if ( _parentView->forceCushionGrid() )
{
// Draw a clearly visible boundary
painter.setPen( QPen( _parentView->cushionGridColor(), 1 ) );
if ( rect.x() > 0 )
painter.drawLine( rect.topLeft(), rect.bottomLeft() + QPoint( 0, 1 ) );
if ( rect.y() > 0 )
painter.drawLine( rect.topLeft(), rect.topRight() + QPoint( 1, 0 ) );
}
}
}
else // No cushion shading, use plain tiles
{
painter.setPen( QPen( _parentView->outlineColor(), 1 ) );
if ( _orig->isDir() || _orig->isDotEntry() )
painter.setBrush( _parentView->dirFillColor() );
else
{
painter.setBrush( _parentView->tileColor( _orig ) );
#if 0
painter.setBrush( _parentView->fileFillColor() );
#endif
}
QCanvasRectangle::drawShape( painter );
}
}
QPixmap
KTreemapTile::renderCushion()
{
QRect rect = QCanvasRectangle::rect();
if ( rect.width() < 1 || rect.height() < 1 )
return QPixmap();
// kdDebug() << k_funcinfo << endl;
double nx;
double ny;
double cosa;
int x, y;
int red, green, blue;
// Cache some values. They are used for each loop iteration, so let's try
// to keep multiple indirect references down.
int ambientLight = parentView()->ambientLight();
double lightX = parentView()->lightX();
double lightY = parentView()->lightY();
double lightZ = parentView()->lightZ();
double xx2 = cushionSurface().xx2();
double xx1 = cushionSurface().xx1();
double yy2 = cushionSurface().yy2();
double yy1 = cushionSurface().yy1();
int x0 = rect.x();
int y0 = rect.y();
QColor color = parentView()->tileColor( _orig );
int maxRed = max( 0, color.red() - ambientLight );
int maxGreen = max( 0, color.green() - ambientLight );
int maxBlue = max( 0, color.blue() - ambientLight );
QImage image( rect.width(), rect.height(), 32 );
for ( y = 0; y < rect.height(); y++ )
{
for ( x = 0; x < rect.width(); x++ )
{
nx = 2.0 * xx2 * (x+x0) + xx1;
ny = 2.0 * yy2 * (y+y0) + yy1;
cosa = ( nx * lightX + ny * lightY + lightZ ) / sqrt( nx*nx + ny*ny + 1.0 );
red = (int) ( maxRed * cosa + 0.5 );
green = (int) ( maxGreen * cosa + 0.5 );
blue = (int) ( maxBlue * cosa + 0.5 );
if ( red < 0 ) red = 0;
if ( green < 0 ) green = 0;
if ( blue < 0 ) blue = 0;
red += ambientLight;
green += ambientLight;
blue += ambientLight;
image.setPixel( x, y, qRgb( red, green, blue) );
}
}
if ( _parentView->ensureContrast() )
ensureContrast( image );
return QPixmap( image );
}
void
KTreemapTile::ensureContrast( QImage & image )
{
if ( image.width() > 5 )
{
// Check contrast along the right image boundary:
//
// Compare samples from the outmost boundary to samples a few pixels to
// the inside and count identical pixel values. A number of identical
// pixels are tolerated, but not too many.
int x1 = image.width() - 6;
int x2 = image.width() - 1;
int interval = max( image.height() / 10, 5 );
int sameColorCount = 0;
// Take samples
for ( int y = interval; y < image.height(); y+= interval )
{
if ( image.pixel( x1, y ) == image.pixel( x2, y ) )
sameColorCount++;
}
if ( sameColorCount * 10 > image.height() )
{
// Add a line at the right boundary
QRgb val = contrastingColor( image.pixel( x2, image.height() / 2 ) );
for ( int y = 0; y < image.height(); y++ )
image.setPixel( x2, y, val );
}
}
if ( image.height() > 5 )
{
// Check contrast along the bottom boundary
int y1 = image.height() - 6;
int y2 = image.height() - 1;
int interval = max( image.width() / 10, 5 );
int sameColorCount = 0;
for ( int x = interval; x < image.width(); x += interval )
{
if ( image.pixel( x, y1 ) == image.pixel( x, y2 ) )
sameColorCount++;
}
if ( sameColorCount * 10 > image.height() )
{
// Add a grey line at the bottom boundary
QRgb val = contrastingColor( image.pixel( image.width() / 2, y2 ) );
for ( int x = 0; x < image.width(); x++ )
image.setPixel( x, y2, val );
}
}
}
QRgb
KTreemapTile::contrastingColor( QRgb col )
{
if ( qGray( col ) < 128 )
return qRgb( qRed( col ) * 2, qGreen( col ) * 2, qBlue( col ) * 2 );
else
return qRgb( qRed( col ) / 2, qGreen( col ) / 2, qBlue( col ) / 2 );
}
KCushionSurface::KCushionSurface()
{
_xx2 = 0.0;
_xx1 = 0.0;
_yy2 = 0.0;
_yy1 = 0.0;
_height = CushionHeight;
}
void
KCushionSurface::addRidge( KOrientation dim, double height, const QRect & rect )
{
_height = height;
if ( dim == KTreemapHorizontal )
{
_xx2 = squareRidge( _xx2, _height, rect.left(), rect.right() );
_xx1 = linearRidge( _xx1, _height, rect.left(), rect.right() );
}
else
{
_yy2 = squareRidge( _yy2, _height, rect.top(), rect.bottom() );
_yy1 = linearRidge( _yy1, _height, rect.top(), rect.bottom() );
}
}
double
KCushionSurface::squareRidge( double squareCoefficient, double height, int x1, int x2 )
{
if ( x2 != x1 ) // Avoid division by zero
squareCoefficient -= 4.0 * height / ( x2 - x1 );
return squareCoefficient;
}
double
KCushionSurface::linearRidge( double linearCoefficient, double height, int x1, int x2 )
{
if ( x2 != x1 ) // Avoid division by zero
linearCoefficient += 4.0 * height * ( x2 + x1 ) / ( x2 - x1 );
return linearCoefficient;
}
// EOF

@ -0,0 +1,323 @@
/*
* File name: ktreemaptile.h
* Summary: High level classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-01-07
*/
#ifndef KTreemapTile_h
#define KTreemapTile_h
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <qcanvas.h>
#include <qrect.h>
#include "kdirtreeiterators.h"
namespace KDirStat
{
class KFileInfo;
class KTreemapView;
enum KOrientation
{
KTreemapHorizontal,
KTreemapVertical,
KTreemapAuto
};
/**
* Helper class for cushioned treemaps: This class holds the polynome
* parameters for the cushion surface. The height of each point of such a
* surface is defined as:
*
* z(x, y) = a*x^2 + b*y^2 + c*x + d*y
* or
* z(x, y) = xx2*x^2 + yy2*y^2 + xx1*x + yy1*y
*
* to better keep track of which coefficient belongs where.
**/
class KCushionSurface
{
public:
/**
* Constructor. All polynome coefficients are set to 0.
**/
KCushionSurface();
/**
* Adds a ridge of the specified height in dimension 'dim' within
* rectangle 'rect' to this surface. It's real voodo magic.
*
* Just kidding - read the paper about "cushion treemaps" by Jarke
* J. van Wiik and Huub van de Wetering from the TU Eindhoven, NL for
* more details.
*
* If you don't want to get all that involved: The coefficients are
* changed in some way.
**/
void addRidge( KOrientation dim, double height, const QRect & rect );
/**
* Set the cushion's height.
**/
void setHeight( double newHeight ) { _height = newHeight; }
/**
* Returns the cushion's height.
**/
double height() const { return _height; }
/**
* Returns the polynomal coefficient of the second order for X direction.
**/
double xx2() const { return _xx2; }
/**
* Returns the polynomal coefficient of the first order for X direction.
**/
double xx1() const { return _xx1; }
/**
* Returns the polynomal coefficient of the second order for Y direction.
**/
double yy2() const { return _yy2; }
/**
* Returns the polynomal coefficient of the first order for Y direction.
**/
double yy1() const { return _yy1; }
protected:
/**
* Calculate a new square polynomal coefficient for adding a ridge of
* specified height between x1 and x2.
**/
double squareRidge( double squareCoefficient, double height, int x1, int x2 );
/**
* Calculate a new linear polynomal coefficient for adding a ridge of
* specified height between x1 and x2.
**/
double linearRidge( double linearCoefficient, double height, int x1, int x2 );
// Data members
double _xx2, _xx1;
double _yy2, _yy1;
double _height;
}; // class KCushionSurface
/**
* This is the basic building block of a treemap view: One single tile of a
* treemap. If it corresponds to a leaf in the tree, it will be visible as
* one tile (one rectangle) of the treemap. If it has children, it will be
* subdivided again.
*
* @short Basic building block of a treemap
**/
class KTreemapTile: public QCanvasRectangle
{
public:
/**
* Constructor: Create a treemap tile from 'fileinfo' that fits into a
* rectangle 'rect' inside 'parent'.
*
* 'orientation' is the direction for further subdivision. 'Auto'
* selects the wider direction inside 'rect'.
**/
KTreemapTile( KTreemapView * parentView,
KTreemapTile * parentTile,
KFileInfo * orig,
const QRect & rect,
KOrientation orientation = KTreemapAuto );
protected:
/**
* Alternate constructor: Like the above, but explicitly specify a
* cushion surface rather than using the parent's.
**/
KTreemapTile( KTreemapView * parentView,
KTreemapTile * parentTile,
KFileInfo * orig,
const QRect & rect,
const KCushionSurface & cushionSurface,
KOrientation orientation = KTreemapAuto );
public:
/**
* Destructor.
**/
virtual ~KTreemapTile();
/**
* Returns the original @ref KFileInfo item that corresponds to this
* treemap tile.
**/
KFileInfo * orig() const { return _orig; }
/**
* Returns the parent @ref KTreemapView.
**/
KTreemapView * parentView() const { return _parentView; }
/**
* Returns the parent @ref KTreemapTile or 0 if there is none.
**/
KTreemapTile * parentTile() const { return _parentTile; }
/**
* Returns this tile's cushion surface parameters.
**/
KCushionSurface & cushionSurface() { return _cushionSurface; }
protected:
/**
* Create children (sub-tiles) of this tile.
**/
void createChildren ( const QRect & rect,
KOrientation orientation );
/**
* Create children (sub-tiles) using the simple treemap algorithm:
* Alternate between horizontal and vertical subdivision in each
* level. Each child will get the entire height or width, respectively,
* of the specified rectangle. This algorithm is very fast, but often
* results in very thin, elongated tiles.
**/
void createChildrenSimple( const QRect & rect,
KOrientation orientation );
/**
* Create children using the "squarified treemaps" algorithm as
* described by Mark Bruls, Kees Huizing, and Jarke J. van Wijk of the
* TU Eindhoven, NL.
*
* This algorithm is not quite so simple and involves more expensive
* operations, e.g., sorting the children of each node by size first,
* try some variations of the layout and maybe backtrack to the
* previous attempt. But it results in tiles that are much more
* square-like, i.e. have more reasonable width-to-height ratios. It is
* very much less likely to get thin, elongated tiles that are hard to
* point at and even harder to compare visually against each other.
*
* This implementation includes some improvements to that basic
* algorithm. For example, children below a certain size are
* disregarded completely since they will not get an adequate visual
* representation anyway (it would be way too small). They are
* summarized in some kind of 'misc stuff' area in the parent treemap
* tile - in fact, part of the parent directory's tile can be "seen
* through".
*
* In short, a lot of small children that don't have any useful effect
* for the user in finding wasted disk space are omitted from handling
* and, most important, don't need to be sorted by size (which has a
* cost of O(n*ln(n)) in the best case, so reducing n helps a lot).
**/
void createSquarifiedChildren( const QRect & rect );
/**
* Squarify as many children as possible: Try to squeeze members
* referred to by 'it' into 'rect' until the aspect ratio doesn't get
* better any more. Returns a list of children that should be laid out
* in 'rect'. Moves 'it' until there is no more improvement or 'it'
* runs out of items.
*
* 'scale' is the scaling factor between file sizes and pixels.
**/
KFileInfoList squarify( const QRect & rect,
double scale,
KFileInfoSortedBySizeIterator & it );
/**
* Lay out all members of 'row' within 'rect' along its longer side.
* Returns the new rectangle with the layouted area subtracted.
**/
QRect layoutRow( const QRect & rect,
double scale,
KFileInfoList & row );
/**
* Draw the tile.
*
* Reimplemented from QCanvasRectangle.
**/
virtual void drawShape( QPainter & painter );
/**
* Render a cushion as described in "cushioned treemaps" by Jarke
* J. van Wijk and Huub van de Wetering of the TU Eindhoven, NL.
**/
QPixmap renderCushion();
/**
* Check if the contrast of the specified image is sufficient to
* visually distinguish an outline at the right and bottom borders
* and add a grey line there, if necessary.
**/
void ensureContrast( QImage & image );
/**
* Returns a color that gives a reasonable contrast to 'col': Lighter
* if 'col' is dark, darker if 'col' is light.
**/
QRgb contrastingColor( QRgb col );
private:
/**
* Initialization common to all constructors.
**/
void init();
protected:
// Data members
KTreemapView * _parentView;
KTreemapTile * _parentTile;
KFileInfo * _orig;
KCushionSurface _cushionSurface;
QPixmap _cushion;
}; // class KTreemapTile
} // namespace KDirStat
inline kdbgstream & operator<< ( kdbgstream & stream, const QRect & rect )
{
stream << "("
<< rect.width() << "x" << rect.height()
<< "+" << rect.x() << "+" << rect.y()
<< ")";
return stream;
}
#endif // ifndef KTreemapTile_h
// EOF

@ -0,0 +1,745 @@
/*
* File name: ktreemapview.cpp
* Summary: High level classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-10-20
*/
#include <sys/stat.h>
#include <qevent.h>
#include <qregexp.h>
#include <kapp.h>
#include <kconfig.h>
#include <kglobal.h>
#include <klocale.h>
#include "kdirtree.h"
#include "ktreemapview.h"
#include "ktreemaptile.h"
using namespace KDirStat;
#define UpdateMinSize 20
KTreemapView::KTreemapView( KDirTree * tree, QWidget * parent, const QSize & initialSize )
: QCanvasView( parent )
, _tree( tree )
, _rootTile( 0 )
, _selectedTile( 0 )
, _selectionRect( 0 )
{
// kdDebug() << k_funcinfo << endl;
readConfig();
// Default values for light sources taken from Wiik / Wetering's paper
// about "cushion treemaps".
_lightX = 0.09759;
_lightY = 0.19518;
_lightZ = 0.9759;
if ( _autoResize )
{
setHScrollBarMode( AlwaysOff );
setVScrollBarMode( AlwaysOff );
}
if ( initialSize.isValid() )
resize( initialSize );
if ( tree && tree->root() )
{
if ( ! _rootTile )
{
// The treemap might already be created indirectly by
// rebuildTreemap() called from resizeEvent() triggered by resize()
// above. If this is so, don't do it again.
rebuildTreemap( tree->root() );
}
}
connect( this, SIGNAL( selectionChanged( KFileInfo * ) ),
tree, SLOT ( selectItem ( KFileInfo * ) ) );
connect( tree, SIGNAL( selectionChanged( KFileInfo * ) ),
this, SLOT ( selectTile ( KFileInfo * ) ) );
connect( tree, SIGNAL( deletingChild ( KFileInfo * ) ),
this, SLOT ( deleteNotify ( KFileInfo * ) ) );
connect( tree, SIGNAL( childDeleted() ),
this, SLOT ( rebuildTreemap() ) );
}
KTreemapView::~KTreemapView()
{
}
void
KTreemapView::clear()
{
if ( canvas() )
deleteAllItems( canvas() );
_selectedTile = 0;
_selectionRect = 0;
_rootTile = 0;
}
void
KTreemapView::deleteAllItems( QCanvas * canvas )
{
if ( ! canvas )
return;
QCanvasItemList all = canvas->allItems();
for ( QCanvasItemList::Iterator it = all.begin(); it != all.end(); ++it )
delete *it;
}
void
KTreemapView::readConfig()
{
KConfig * config = kapp->config();
config->setGroup( "Treemaps" );
_ambientLight = config->readNumEntry( "AmbientLight" , DefaultAmbientLight );
_heightScaleFactor = config->readDoubleNumEntry( "HeightScaleFactor" , DefaultHeightScaleFactor );
_autoResize = config->readBoolEntry( "AutoResize" , true );
_squarify = config->readBoolEntry( "Squarify" , true );
_doCushionShading = config->readBoolEntry( "CushionShading" , true );
_ensureContrast = config->readBoolEntry( "EnsureContrast" , true );
_forceCushionGrid = config->readBoolEntry( "ForceCushionGrid" , false );
_minTileSize = config->readNumEntry ( "MinTileSize" , DefaultMinTileSize );
_highlightColor = readColorEntry( config, "HighlightColor" , red );
_cushionGridColor = readColorEntry( config, "CushionGridColor" , QColor( 0x80, 0x80, 0x80 ) );
_outlineColor = readColorEntry( config, "OutlineColor" , black );
_fileFillColor = readColorEntry( config, "FileFillColor" , QColor( 0xde, 0x8d, 0x53 ) );
_dirFillColor = readColorEntry( config, "DirFillColor" , QColor( 0x10, 0x7d, 0xb4 ) );
if ( _autoResize )
{
setHScrollBarMode( AlwaysOff );
setVScrollBarMode( AlwaysOff );
}
else
{
setHScrollBarMode( QScrollView::Auto );
setVScrollBarMode( QScrollView::Auto );
}
}
QColor
KTreemapView::readColorEntry( KConfig * config, const char * entryName, QColor defaultColor )
{
return config->readColorEntry( entryName, &defaultColor );
}
KTreemapTile *
KTreemapView::tileAt( QPoint pos )
{
KTreemapTile * tile = 0;
QCanvasItemList coll = canvas()->collisions( pos );
QCanvasItemList::Iterator it = coll.begin();
while ( it != coll.end() && tile == 0 )
{
tile = dynamic_cast<KTreemapTile *> (*it);
++it;
}
return tile;
}
void
KTreemapView::contentsMousePressEvent( QMouseEvent * event )
{
// kdDebug() << k_funcinfo << endl;
KTreemapTile * tile = tileAt( event->pos() );
switch ( event->button() )
{
case LeftButton:
selectTile( tile );
emit userActivity( 1 );
break;
case MidButton:
// Select clicked tile's parent, if available
if ( _selectedTile &&
_selectedTile->rect().contains( event->pos() ) )
{
if ( _selectedTile->parentTile() )
tile = _selectedTile->parentTile();
}
// Intentionally handling the middle button like the left button if
// the user clicked outside the (old) selected tile: Simply select
// the clicked tile. This makes using this middle mouse button
// intuitive: It can be used very much like the left mouse button,
// but it has added functionality. Plus, it cycles back to the
// clicked tile if the user has already clicked all the way up the
// hierarchy (i.e. the topmost directory is highlighted).
selectTile( tile );
emit userActivity( 1 );
break;
case RightButton:
if ( tile )
{
if ( _selectedTile &&
_selectedTile->rect().contains( event->pos() ) )
{
// If a directory (non-leaf tile) is already selected,
// don't override this by
emit contextMenu( _selectedTile, event->globalPos() );
}
else
{
selectTile( tile );
emit contextMenu( tile, event->globalPos() );
}
emit userActivity( 3 );
}
break;
default:
// event->button() is an enum, so g++ complains
// if there are unhandled cases.
break;
}
}
void
KTreemapView::contentsMouseDoubleClickEvent( QMouseEvent * event )
{
// kdDebug() << k_funcinfo << endl;
KTreemapTile * tile = tileAt( event->pos() );
switch ( event->button() )
{
case LeftButton:
if ( tile )
{
selectTile( tile );
zoomIn();
emit userActivity( 5 );
}
break;
case MidButton:
zoomOut();
emit userActivity( 5 );
break;
case RightButton:
// Double-clicking the right mouse button is pretty useless - the
// first click opens the context menu: Single clicks are always
// delivered first. Even if that would be caught by using timers,
// it would still be very awkward to use: Click too slow, and
// you'll get the context menu rather than what you really wanted -
// then you'd have to get rid of the context menu first.
break;
default:
// Prevent compiler complaints about missing enum values in switch
break;
}
}
void
KTreemapView::zoomIn()
{
if ( ! _selectedTile || ! _rootTile )
return;
KTreemapTile * newRootTile = _selectedTile;
while ( newRootTile->parentTile() != _rootTile &&
newRootTile->parentTile() ) // This should never happen, but who knows?
{
newRootTile = newRootTile->parentTile();
}
if ( newRootTile )
{
KFileInfo * newRoot = newRootTile->orig();
if ( newRoot->isDir() || newRoot->isDotEntry() )
rebuildTreemap( newRoot );
}
}
void
KTreemapView::zoomOut()
{
if ( _rootTile )
{
KFileInfo * root = _rootTile->orig();
if ( root->parent() )
root = root->parent();
rebuildTreemap( root );
}
}
void
KTreemapView::selectParent()
{
if ( _selectedTile && _selectedTile->parentTile() )
selectTile( _selectedTile->parentTile() );
}
bool
KTreemapView::canZoomIn() const
{
if ( ! _selectedTile || ! _rootTile )
return false;
if ( _selectedTile == _rootTile )
return false;
KTreemapTile * newRootTile = _selectedTile;
while ( newRootTile->parentTile() != _rootTile &&
newRootTile->parentTile() ) // This should never happen, but who knows?
{
newRootTile = newRootTile->parentTile();
}
if ( newRootTile )
{
KFileInfo * newRoot = newRootTile->orig();
if ( newRoot->isDir() || newRoot->isDotEntry() )
return true;
}
return false;
}
bool
KTreemapView::canZoomOut() const
{
if ( ! _rootTile || ! _tree->root() )
return false;
return _rootTile->orig() != _tree->root();
}
bool
KTreemapView::canSelectParent() const
{
return _selectedTile && _selectedTile->parentTile();
}
void
KTreemapView::rebuildTreemap()
{
KFileInfo * root = 0;
if ( ! _savedRootUrl.isEmpty() )
{
// kdDebug() << "Restoring old treemap with root " << _savedRootUrl << endl;
root = _tree->locate( _savedRootUrl, true ); // node, findDotEntries
}
if ( ! root )
root = _rootTile ? _rootTile->orig() : _tree->root();
rebuildTreemap( root, canvas()->size() );
_savedRootUrl = "";
}
void
KTreemapView::rebuildTreemap( KFileInfo * newRoot,
const QSize & newSz )
{
// kdDebug() << k_funcinfo << endl;
QSize newSize = newSz;
if ( newSz.isEmpty() )
newSize = visibleSize();
// Delete all old stuff.
clear();
// Re-create a new canvas
if ( ! canvas() )
{
QCanvas * canv = new QCanvas( this );
CHECK_PTR( canv );
setCanvas( canv );
}
canvas()->resize( newSize.width(), newSize.height() );
if ( newSize.width() >= UpdateMinSize && newSize.height() >= UpdateMinSize )
{
// The treemap contents is displayed if larger than a certain minimum
// visible size. This is an easy way for the user to avoid
// time-consuming delays when deleting a lot of files: Simply make the
// treemap (sub-) window very small.
// Fill the new canvas
if ( newRoot )
{
_rootTile = new KTreemapTile( this, // parentView
0, // parentTile
newRoot, // orig
QRect( QPoint( 0, 0), newSize ),
KTreemapAuto );
}
// Synchronize selection with the tree
if ( _tree->selection() )
selectTile( _tree->selection() );
}
else
{
// kdDebug() << "Too small - suppressing treemap contents" << endl;
}
emit treemapChanged();
}
void
KTreemapView::deleteNotify( KFileInfo * )
{
if ( _rootTile )
{
if ( _rootTile->orig() != _tree->root() )
{
// If the user zoomed the treemap in, save the root's URL so the
// current state can be restored upon the next rebuildTreemap()
// call (which is triggered by the childDeleted() signal that the
// tree emits after deleting is done).
//
// Intentionally using debugUrl() here rather than just url() so
// the correct zoom can be restored even when a dot entry is the
// current treemap root.
_savedRootUrl = _rootTile->orig()->debugUrl();
}
else
{
// A shortcut for the most common case: No zoom. Simply use the
// tree's root for the next treemap rebuild.
_savedRootUrl = "";
}
}
else
{
// Intentionally leaving _savedRootUrl alone: Otherwise multiple
// deleteNotify() calls might cause a previously saved _savedRootUrl to
// be unnecessarily deleted, thus the treemap couldn't be restored as
// it was.
}
clear();
}
void
KTreemapView::resizeEvent( QResizeEvent * event )
{
QCanvasView::resizeEvent( event );
if ( _autoResize )
{
bool tooSmall =
event->size().width() < UpdateMinSize ||
event->size().height() < UpdateMinSize;
if ( tooSmall && _rootTile )
{
// kdDebug() << "Suppressing treemap contents" << endl;
rebuildTreemap( _rootTile->orig() );
}
else if ( ! tooSmall && ! _rootTile )
{
if ( _tree->root() )
{
// kdDebug() << "Redisplaying suppressed treemap contents" << endl;
rebuildTreemap( _tree->root() );
}
}
else if ( _rootTile )
{
// kdDebug() << "Auto-resizing treemap" << endl;
rebuildTreemap( _rootTile->orig() );
}
}
}
void
KTreemapView::selectTile( KTreemapTile * tile )
{
// kdDebug() << k_funcinfo << endl;
KTreemapTile * oldSelection = _selectedTile;
_selectedTile = tile;
// Handle selection (highlight) rectangle
if ( _selectedTile )
{
if ( ! _selectionRect )
_selectionRect = new KTreemapSelectionRect( canvas(), _highlightColor );
}
if ( _selectionRect )
_selectionRect->highlight( _selectedTile );
canvas()->update();
if ( oldSelection != _selectedTile )
{
emit selectionChanged( _selectedTile ? _selectedTile->orig() : 0 );
}
}
void
KTreemapView::selectTile( KFileInfo * node )
{
selectTile( findTile( node ) );
}
KTreemapTile *
KTreemapView::findTile( KFileInfo * node )
{
if ( ! node )
return 0;
QCanvasItemList itemList = canvas()->allItems();
QCanvasItemList::Iterator it = itemList.begin();
while ( it != itemList.end() )
{
KTreemapTile * tile = dynamic_cast<KTreemapTile *> (*it);
if ( tile && tile->orig() == node )
return tile;
++it;
}
return 0;
}
QSize
KTreemapView::visibleSize()
{
ScrollBarMode oldHMode = hScrollBarMode();
ScrollBarMode oldVMode = vScrollBarMode();
setHScrollBarMode( AlwaysOff );
setVScrollBarMode( AlwaysOff );
QSize size = QSize( QCanvasView::visibleWidth(),
QCanvasView::visibleHeight() );
setHScrollBarMode( oldHMode );
setVScrollBarMode( oldVMode );
return size;
}
QColor
KTreemapView::tileColor( KFileInfo * file )
{
if ( file )
{
if ( file->isFile() )
{
// Find the filename extension: Everything after the first '.'
QString ext = file->name().section( '.', 1 );
while ( ! ext.isEmpty() )
{
QString lowerExt = ext.lower();
// Try case sensitive comparisions first
if ( ext == "~" ) return Qt::red;
if ( ext == "bak" ) return Qt::red;
if ( ext == "c" ) return Qt::blue;
if ( ext == "cpp" ) return Qt::blue;
if ( ext == "cc" ) return Qt::blue;
if ( ext == "h" ) return Qt::blue;
if ( ext == "hpp" ) return Qt::blue;
if ( ext == "el" ) return Qt::blue;
if ( ext == "o" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "lo" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "Po" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "al" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "moc.cpp" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "moc.cc" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "elc" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "la" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "a" ) return QColor( 0xff, 0xa0, 0x00 );
if ( ext == "rpm" ) return QColor( 0xff, 0xa0, 0x00 );
if ( lowerExt == "tar.bz2" ) return Qt::green;
if ( lowerExt == "tar.gz" ) return Qt::green;
if ( lowerExt == "tgz" ) return Qt::green;
if ( lowerExt == "bz2" ) return Qt::green;
if ( lowerExt == "bz" ) return Qt::green;
if ( lowerExt == "gz" ) return Qt::green;
if ( lowerExt == "html" ) return Qt::blue;
if ( lowerExt == "htm" ) return Qt::blue;
if ( lowerExt == "txt" ) return Qt::blue;
if ( lowerExt == "doc" ) return Qt::blue;
if ( lowerExt == "png" ) return Qt::cyan;
if ( lowerExt == "jpg" ) return Qt::cyan;
if ( lowerExt == "jpeg" ) return Qt::cyan;
if ( lowerExt == "gif" ) return Qt::cyan;
if ( lowerExt == "tif" ) return Qt::cyan;
if ( lowerExt == "tiff" ) return Qt::cyan;
if ( lowerExt == "bmp" ) return Qt::cyan;
if ( lowerExt == "xpm" ) return Qt::cyan;
if ( lowerExt == "tga" ) return Qt::cyan;
if ( lowerExt == "wav" ) return Qt::yellow;
if ( lowerExt == "mp3" ) return Qt::yellow;
if ( lowerExt == "avi" ) return QColor( 0xa0, 0xff, 0x00 );
if ( lowerExt == "mov" ) return QColor( 0xa0, 0xff, 0x00 );
if ( lowerExt == "mpg" ) return QColor( 0xa0, 0xff, 0x00 );
if ( lowerExt == "mpeg" ) return QColor( 0xa0, 0xff, 0x00 );
if ( lowerExt == "pdf" ) return Qt::blue;
if ( lowerExt == "ps" ) return Qt::cyan;
// Some DOS/Windows types
if ( lowerExt == "exe" ) return Qt::magenta;
if ( lowerExt == "com" ) return Qt::magenta;
if ( lowerExt == "dll" ) return QColor( 0xff, 0xa0, 0x00 );
if ( lowerExt == "zip" ) return Qt::green;
if ( lowerExt == "arj" ) return Qt::green;
// No match so far? Try the next extension. Some files might have
// more than one, e.g., "tar.bz2" - if there is no match for
// "tar.bz2", there might be one for just "bz2".
ext = ext.section( '.', 1 );
}
// Shared libs
if ( QRegExp( "lib.*\\.so.*" ).exactMatch( file->name() ) )
return QColor( 0xff, 0xa0, 0x00 );
// Very special, but common: Core dumps
if ( file->name() == "core" ) return Qt::red;
// Special case: Executables
if ( ( file->mode() & S_IXUSR ) == S_IXUSR ) return Qt::magenta;
}
else // Directories
{
// TO DO
return Qt::blue;
}
}
return Qt::white;
}
KTreemapSelectionRect::KTreemapSelectionRect( QCanvas * canvas, const QColor & color )
: QCanvasRectangle( canvas )
{
setPen( QPen( color, 2 ) );
setZ( 1e10 ); // Higher than everything else
}
void
KTreemapSelectionRect::highlight( KTreemapTile * tile )
{
if ( tile )
{
QRect tileRect = tile->rect();
move( tileRect.x(), tileRect.y() );
setSize( tileRect.width(), tileRect.height() );
if ( ! isVisible() )
show();
}
else
{
if ( isVisible() )
hide();
}
}
// EOF

@ -0,0 +1,446 @@
/*
* File name: ktreemapview.h
* Summary: High level classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-02-02
*/
#ifndef KTreemapView_h
#define KTreemapView_h
#include <qcanvas.h>
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#define MinAmbientLight 0
#define MaxAmbientLight 200
#define DefaultAmbientLight 40
#define MinHeightScalePercent 10
#define MaxHeightScalePercent 200
#define DefaultHeightScalePercent 100
#define DefaultHeightScaleFactor ( DefaultHeightScalePercent / 100.0 )
#define DefaultMinTileSize 3
#define CushionHeight 1.0
class QMouseEvent;
class KConfig;
namespace KDirStat
{
class KTreemapTile;
class KTreemapSelectionRect;
class KDirTree;
class KFileInfo;
class KTreemapView: public QCanvasView
{
Q_OBJECT
public:
/**
* Constructor.
**/
KTreemapView( KDirTree * tree,
QWidget * parent = 0,
const QSize & initialSize = QSize() );
/**
* Destructor.
**/
virtual ~KTreemapView();
/**
* Returns the (topmost) treemap tile at the specified position
* or 0 if there is none.
**/
KTreemapTile * tileAt( QPoint pos );
/**
* Returns the minimum recommended size for this widget.
* Reimplemented from QWidget.
**/
virtual QSize minimumSizeHint() const { return QSize( 0, 0 ); }
/**
* Returns this treemap view's currently selected treemap tile or 0 if
* there is none.
**/
KTreemapTile * selectedTile() const { return _selectedTile; }
/**
* Returns this treemap view's root treemap tile or 0 if there is none.
**/
KTreemapTile * rootTile() const { return _rootTile; }
/**
* Returns this treemap view's @ref KDirTree.
**/
KDirTree * tree() const { return _tree; }
/**
* Search the treemap for a tile that corresponds to the specified
* KFileInfo node. Returns 0 if there is none.
*
* Notice: This is an expensive operation since all treemap tiles need
* to be searched.
**/
KTreemapTile * findTile( KFileInfo * node );
/**
* Returns a suitable color for 'file' based on a set of internal rules
* (according to filename extension, MIME type or permissions).
**/
QColor tileColor( KFileInfo * file );
public slots:
/**
* Make a treemap tile this treemap's selected tile.
* 'tile' may be 0. In this case, only the previous selection is
* deselected.
**/
void selectTile( KTreemapTile * tile );
/**
* Search the treemap for a tile with the specified KFileInfo node and
* select that tile if it is found. If nothing is found or if 'node' is
* 0, the previously selected tile is deselected.
**/
void selectTile( KFileInfo * node );
/**
* Zoom in one level towards the currently selected treemap tile:
* The entire treemap will be rebuilt with the near-topmost ancestor of
* the selected tile as the new root.
**/
void zoomIn();
/**
* Zoom out one level: The parent (if there is any) KFileInfo node of
* the current treemap root becomes the new root. This usually works
* only after zoomIn().
**/
void zoomOut();
/**
* Select the parent of the currently selected tile (if possible).
*
* This is very much the same as clicking with the middle mouse button,
* but not quite: The middle mouse button cycles back to the tile
* clicked at if there is no more parent. This method does not (because
* there is no known mouse position).
**/
void selectParent();
/**
* Completely rebuild the entire treemap from the internal tree's root
* on.
**/
void rebuildTreemap();
/**
* Clear the treemap contents.
**/
void clear();
/**
* Delete all items of a QCanvas.
*
* Strangely enough, QCanvas itself does not provide such a function.
**/
static void deleteAllItems( QCanvas * canvas );
/**
* Notification that a dir tree node has been deleted.
**/
void deleteNotify( KFileInfo * node );
/**
* Read some parameters from the global @ref KConfig object.
**/
void readConfig();
public:
/**
* Rebuild the treemap with 'newRoot' as the new root and the specified
* size. If 'newSize' is (0, 0), visibleSize() is used.
**/
void rebuildTreemap( KFileInfo * newRoot,
const QSize & newSize = QSize() );
/**
* Returns the visible size of the viewport presuming no scrollbars are
* needed - which makes a lot more sense than fiddling with scrollbars
* since treemaps can be scaled to make scrollbars unnecessary.
**/
QSize visibleSize();
/**
* Returns the visible width of the viewport presuming no scrollbars
* are needed.
*
* This uses visibleSize() which is a somewhat expensive operation, so
* if you need both visibleWidth() and visibleHeight(), better call
* visibleSize() once and access its width() and height() methods.
**/
int visibleWidth() { return visibleSize().width(); }
/**
* Returns the visible height of the viewport presuming no scrollbars
* are needed.
*
* This uses visibleSize() which is a somewhat expensive operation, so
* if you need both visibleWidth() and visibleHeight(), better call
* visibleSize() once and access its width() and height() methods.
**/
int visibleHeight() { return visibleSize().height(); }
/**
* Returns true if it is possible to zoom in with the currently
* selected tile, false if not.
**/
bool canZoomIn() const;
/**
* Returns true if it is possible to zoom out with the currently
* selected tile, false if not.
**/
bool canZoomOut() const;
/**
* Returns true if it is possible to select the parent of the currently
* selected tile, false if not.
**/
bool canSelectParent() const;
/**
* Returns 'true' if the treemap is automatically resized to fit into
* the available space, 'false' if not.
**/
bool autoResize() const { return _autoResize; }
/**
* Returns 'true' if treemap tiles are to be squarified upon creation,
* 'false' if not.
**/
bool squarify() const { return _squarify; }
/**
* Returns 'true' if cushion shading is to be used, 'false' if not.
**/
bool doCushionShading() const { return _doCushionShading; }
/**
* Returns 'true' if cushion shaded treemap tiles are to be separated
* by a grid, 'false' if not.
**/
bool forceCushionGrid() const { return _forceCushionGrid; }
/**
* Returns 'true' if tile boundary lines should be drawn for cushion
* treemaps, 'false' if not.
**/
bool ensureContrast() const { return _ensureContrast; }
/**
* Returns the minimum tile size in pixels. No treemap tiles less than
* this in width or height are desired.
**/
int minTileSize() const { return _minTileSize; }
/**
* Returns the cushion grid color.
**/
const QColor & cushionGridColor() const { return _cushionGridColor; }
/**
* Returns the outline color to use if cushion shading is not used.
**/
const QColor & outlineColor() const { return _outlineColor; }
/**
* Returns the fill color for non-directory treemap tiles when cushion
* shading is not used.
**/
const QColor & fileFillColor() const { return _fileFillColor; }
/**
* Returns the fill color for directory (or "dotentry") treemap tiles
* when cushion shading is not used.
**/
const QColor & dirFillColor() const { return _dirFillColor; }
/**
* Returns the intensity of ambient light for cushion shading
* [0..255]
**/
int ambientLight() const { return _ambientLight; }
/**
* Returns the X coordinate of a directed light source for cushion
* shading.
**/
double lightX() const { return _lightX; }
/**
* Returns the Y coordinate of a directed light source for cushion
* shading.
**/
double lightY() const { return _lightY; }
/**
* Returns the Z coordinate of a directed light source for cushion
* shading.
**/
double lightZ() const { return _lightZ; }
/**
* Returns cushion ridge height degradation factor (0 .. 1.0) for each
* level of subdivision.
**/
double heightScaleFactor() const { return _heightScaleFactor; }
signals:
/**
* Emitted when the currently selected item changes.
* Caution: 'item' may be 0 when the selection is cleared.
**/
void selectionChanged( KFileInfo * item );
/**
* Emitted when the treemap changes, e.g. is rebuilt, zoomed in, or
* zoomed out.
**/
void treemapChanged();
/**
* Emitted when a context menu for this tile should be opened.
* (usually on right click). 'pos' contains the click's mouse
* coordinates.
**/
void contextMenu( KTreemapTile * tile, const QPoint & pos );
/**
* Emitted at user activity. Some interactive actions are assigned an
* amount of "activity points" that can be used to judge whether or not
* the user is actually using this program or if it's just idly sitting
* around on the desktop. This is intended for use together with a @ref
* KActivityTracker.
**/
void userActivity( int points );
protected:
/**
* Catch mouse click - emits a selectionChanged() signal.
**/
virtual void contentsMousePressEvent( QMouseEvent * event );
/**
* Catch mouse double click:
* Left button double-click zooms in,
* right button double-click zooms out,
* middle button double-click rebuilds treemap.
**/
virtual void contentsMouseDoubleClickEvent( QMouseEvent * event );
/**
* Resize the treemap view. Suppress the treemap contents if the size
* falls below a minimum size, redisplay it if it grows above that
* minimum size.
*
* Reimplemented from QFrame.
**/
virtual void resizeEvent( QResizeEvent * event );
/**
* Convenience method to read a color from 'config'.
**/
QColor readColorEntry( KConfig * config,
const char * entryName,
QColor defaultColor );
// Data members
KDirTree * _tree;
KTreemapTile * _rootTile;
KTreemapTile * _selectedTile;
KTreemapSelectionRect * _selectionRect;
QString _savedRootUrl;
bool _autoResize;
bool _squarify;
bool _doCushionShading;
bool _forceCushionGrid;
bool _ensureContrast;
int _minTileSize;
QColor _highlightColor;
QColor _cushionGridColor;
QColor _outlineColor;
QColor _fileFillColor;
QColor _dirFillColor;
int _ambientLight;
double _lightX;
double _lightY;
double _lightZ;
double _heightScaleFactor;
}; // class KTreemapView
/**
* Transparent rectangle to make a treemap tile clearly visible as
* "selected". Leaf tiles could do that on their own, but higher-level
* tiles (corresponding to directories) are obscured for the most part, so
* only a small portion (if any) of their highlighted outline could be
* visible. This selection rectangle simply draws a two-pixel red outline
* on top (i.e., great z-height) of everything else. The rectangle is
* transparent, so the treemap tile contents remain visible.
**/
class KTreemapSelectionRect: public QCanvasRectangle
{
public:
/**
* Constructor.
**/
KTreemapSelectionRect( QCanvas * canvas, const QColor & color );
/**
* Highlight the specified treemap tile: Resize this selection
* rectangle to match this tile and move it to this tile's
* position. Show the selection rectangle if it is currently
* invisible.
**/
void highlight( KTreemapTile * tile );
}; // class KTreemapSelectionRect
} // namespace KDirStat
#endif // ifndef KTreemapView_h
// EOF

Binary file not shown.

Binary file not shown.

@ -0,0 +1,2 @@
iconsdir = $(kde_datadir)/kdirstat/icons
icons_ICON = AUTO

@ -0,0 +1,6 @@
####### kdevelop will overwrite this part!!! (begin)##########
####### kdevelop will overwrite this part!!! (end)############
POFILES = AUTO

@ -0,0 +1,963 @@
# translation of de.po to Deutsch
# Copyright (C) 2003 Free Software Foundation, Inc.
# Christoph Eckert <mchristoph.eckert at t-online.de>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2004-03-01 14:25+0100\n"
"PO-Revision-Date: 2004-03-01 13:47:00+0100\n"
"Last-Translator: Stefan Hundhammer <sh@suse.de>\n"
"Language-Team: Deutsch <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: kcleanupcollection.cpp:231
msgid "User Defined Cleanup #&%1"
msgstr "Benutzerdefinierte Aufräumaktion Nr. &%1"
#: kcleanupcollection.cpp:234
msgid "User Defined Cleanup #%1"
msgstr "Benutzerdefinierte Aufräumaktion #%1"
#: kcleanup.cpp:169
msgid ""
"%1\n"
"in directory %2"
msgstr ""
"%1\n"
"im Verzeichnis %2"
#: kcleanup.cpp:173
msgid ""
"%1\n"
"for file %2"
msgstr ""
"%1\n"
"für die Datei %2"
#: kcleanup.cpp:178 kdirstatsettings.cpp:106
msgid "Please Confirm"
msgstr "Bitte bestätigen"
#: kcleanup.cpp:179
msgid "Confirm"
msgstr "Bestätigen"
#: kdirstatapp.cpp:145
msgid "Open &URL..."
msgstr "&URL öffnen..."
#: kdirstatapp.cpp:152
msgid "Refresh &All"
msgstr "Alles &aktualisieren"
#: kdirstatapp.cpp:156
msgid "Refresh &Selected"
msgstr "Ausgewähltes Verzeichnis &neu einlesen"
#: kdirstatapp.cpp:160
msgid "Continue Reading at &Mount Point"
msgstr "Am &Mountpunkt weiterlesen"
#: kdirstatapp.cpp:164
msgid "Stop Rea&ding"
msgstr "Lesen Ab&brechen"
#: kdirstatapp.cpp:173
msgid "Zoom in"
msgstr "Vergrößern"
#: kdirstatapp.cpp:177
msgid "Zoom out"
msgstr "Verkleinern"
#: kdirstatapp.cpp:181
msgid "Select Parent"
msgstr "Nach oben"
#: kdirstatapp.cpp:185
msgid "Rebuild Treemap"
msgstr "Treemap neu aufbauen"
#: kdirstatapp.cpp:189
msgid "Show Treemap"
msgstr "Treemap anzeigen"
#: kdirstatapp.cpp:193
msgid "Help about Treemaps"
msgstr "Hilfe zu Treemaps"
#: kdirstatapp.cpp:199
msgid "Send &Mail to Owner"
msgstr "&Mail an Besitzer senden"
#: kdirstatapp.cpp:203
msgid "Send &Feedback Mail..."
msgstr "&Feedback-Mail versenden"
#: kdirstatapp.cpp:208
msgid "Opens a directory"
msgstr "Öffnet ein Verzeichnis"
#: kdirstatapp.cpp:209
msgid "Opens a (possibly remote) directory"
msgstr "Öffnet ein Verzeichnis (auch über Netzwerk)"
#: kdirstatapp.cpp:210
msgid "Opens a recently used directory"
msgstr "Öffnet ein kürzlich verwendetes Verzeichnis"
#: kdirstatapp.cpp:211
msgid "Closes the current directory"
msgstr "Schließt das aktuelle Verzeichnis"
#: kdirstatapp.cpp:212
msgid "Re-reads the entire directory tree"
msgstr "Liest den gesamten Verzeichnisbaum neu ein"
#: kdirstatapp.cpp:213
msgid "Re-reads the selected subtree"
msgstr "Liest den ausgewählten Teilbaum neu ein"
#: kdirstatapp.cpp:214
msgid "Scan mounted file systems"
msgstr "Gemountete Dateisysteme einlesen"
#: kdirstatapp.cpp:215
msgid "Stops directory reading"
msgstr "Lesen anhalten"
#: kdirstatapp.cpp:216
msgid "Quits the application"
msgstr "Beendet das Programm"
#: kdirstatapp.cpp:217
msgid "Copies the URL of the selected item to the clipboard"
msgstr "Kopiert die URL des ausgewählten Eintrags in die Zwischenablage"
#: kdirstatapp.cpp:218
msgid "Enables/disables the toolbar"
msgstr "Werkzeugleiste ein- und ausschalten"
#: kdirstatapp.cpp:219
msgid "Enables/disables the statusbar"
msgstr "Statusleiste ein- und ausschalten"
#: kdirstatapp.cpp:220
msgid "Enables/disables the treemap view"
msgstr "Werkzeugleiste ein- und ausschalten"
#: kdirstatapp.cpp:221
msgid "Zoom treemap in"
msgstr "Treemap vergrößern"
#: kdirstatapp.cpp:222
msgid "Zoom treemap out"
msgstr "Treemap verkleinern"
#: kdirstatapp.cpp:223
msgid "Select parent"
msgstr "Nach oben"
#: kdirstatapp.cpp:224
msgid "Rebuild treemap to fit into available space"
msgstr "Treemap in verfügbaren Platz einpassen"
#: kdirstatapp.cpp:225
msgid "Opens the preferences dialog"
msgstr "Öffnet den Einstellungsdialog"
#: kdirstatapp.cpp:226
msgid "Sends a mail to the owner of the selected subtree"
msgstr "Sendet eine Mail an den Besitzer des ausgewählten Teilbaumes"
#: kdirstatapp.cpp:301 kdirstatapp.cpp:335 kdirstatapp.cpp:445
#: kdirstatapp.cpp:460 kdirstatapp.cpp:472 kdirstatapp.cpp:485
#: kdirstatapp.cpp:494 kdirstatapp.cpp:506
msgid "Ready."
msgstr "Fertig."
#: kdirstatapp.cpp:328 kdirstatapp.cpp:438 kdirstatapp.cpp:467
msgid "Opening directory..."
msgstr "Verzeichnis öffnen..."
#: kdirstatapp.cpp:440
msgid "Open Directory..."
msgstr "Verzeichnis öffnen..."
#: kdirstatapp.cpp:452
msgid "Opening URL..."
msgstr "URL wird geöffnet..."
#: kdirstatapp.cpp:455
msgid "Open URL..."
msgstr "URL öffnen"
#: kdirstatapp.cpp:479
msgid "Closing directory..."
msgstr "Verzeichnis schließen..."
#: kdirstatapp.cpp:492
msgid "Refreshing directory tree..."
msgstr "Verzeichnisbaum neu einlesen..."
#: kdirstatapp.cpp:504
msgid "Refreshing selected subtree..."
msgstr "Ausgewählten Teilbaum neu einlesen..."
#: kdirstatapp.cpp:684
msgid ""
"Now that you know this program for some time,\n"
"wouldn't you like to tell the authors your opinion about it?\n"
"\n"
"Open Source software depends on user feedback.\n"
"Your opinion can help us make the software better."
msgstr ""
"Möchten Sie nicht vielleicht jetzt, da Sie dieses\n"
"Programm einigermaßen kennengelernt haben, den\n"
"Autoren Ihre Meinung darüber mitteilen?\n"
"\n"
"Open-Source-Software lebt davon, daß die Anwender mitmachen.\n"
"Ihre Meinung kann entscheidend dazu beitragen, die Software\n"
"besser zu machen."
#: kdirstatapp.cpp:689
msgid "Please tell us your opinion!"
msgstr "Bitte lassen Sie uns Ihre Meinung wissen!"
#: kdirstatapp.cpp:690
msgid "Open &Feedback Form..."
msgstr "&Feedback-Formular öffnen..."
#: kdirstatapp.cpp:691
msgid "&No, and don't ask again!"
msgstr "&Nein, und bitte nicht mehr nachfragen."
#: kdirstatfeedback.cpp:33
msgid "What is your general opinion about this program?"
msgstr "Wie finden Sie dieses Programm?"
#: kdirstatfeedback.cpp:35
msgid "It's one of my favourites"
msgstr "Es ist eines meiner Lieblingsprogramme"
#: kdirstatfeedback.cpp:36
msgid "I like it"
msgstr "Es gefällt mir"
#: kdirstatfeedback.cpp:37
msgid "It's sometimes useful"
msgstr "Ganz nett"
#: kdirstatfeedback.cpp:38
msgid "It's average"
msgstr "Es geht so"
#: kdirstatfeedback.cpp:39
msgid "Nice try, but this could be done better"
msgstr "Netter Versuch, aber stark verbesserungsbedürftig"
#: kdirstatfeedback.cpp:40
msgid "It's poor"
msgstr "Armselig"
#: kdirstatfeedback.cpp:41
msgid "It's useless"
msgstr "Nutzlos"
#: kdirstatfeedback.cpp:42
msgid "It's crap"
msgstr "So ein Mist!"
#: kdirstatfeedback.cpp:44
msgid "Which features of this program do you like?"
msgstr "Welche Eigenschaften dieses Programmes gefallen Ihnen?"
#: kdirstatfeedback.cpp:47
msgid "Which features don't you like?"
msgstr "Welche Eigenschaften gefallen Ihnen nicht?"
#: kdirstatfeedback.cpp:50
msgid "Which features do you never use?"
msgstr "Welche Funktionen benutzen Sie überhaupt nicht?"
#: kdirstatfeedback.cpp:53
msgid "What is your favourite feature?"
msgstr "Welche Funktion finden Sie besonders gut?"
#: kdirstatfeedback.cpp:56
msgid "Are there features you are missing?"
msgstr "Vermissen Sie irgendwelche Funktionen?"
#: kdirstatfeedback.cpp:57
msgid "Yes, a lot! (please add comment below)"
msgstr "Ja, eine ganze Menge! (Bitte im Kommentarfeld unten präzisieren)"
#: kdirstatfeedback.cpp:58
msgid "Some (please add comment below)"
msgstr "Sonstige (bitte unten Kommentar angeben)"
#: kdirstatfeedback.cpp:59
msgid "None"
msgstr "Keine"
#: kdirstatfeedback.cpp:60
msgid "It has too many features already!"
msgstr "Es ist jetzt schon überladen!"
#: kdirstatfeedback.cpp:62
msgid "How do you rate the stability of this program?"
msgstr "Wie beurteilen Sie die Stabilität dieses Programms?"
#: kdirstatfeedback.cpp:63
msgid "Rock solid"
msgstr "Bombenstabil"
#: kdirstatfeedback.cpp:64 kdirstatfeedback.cpp:71
msgid "Good"
msgstr "Gut"
#: kdirstatfeedback.cpp:65 kdirstatfeedback.cpp:72 kdirstatfeedback.cpp:79
#: kdirstatfeedback.cpp:86
msgid "Average"
msgstr "Durchschnittlich"
#: kdirstatfeedback.cpp:66 kdirstatfeedback.cpp:73
msgid "Poor"
msgstr "Bescheiden"
#: kdirstatfeedback.cpp:67
msgid "It keeps crashing all the time"
msgstr "Es stürzt dauernd ab"
#: kdirstatfeedback.cpp:69
msgid "How do you rate the performance of this program?"
msgstr "Wie beurteilen Sie die Geschwindigkeit dieses Programms?"
#: kdirstatfeedback.cpp:70
msgid "Great"
msgstr "Hervorragend"
#: kdirstatfeedback.cpp:74
msgid "It's so slow it drives me nuts"
msgstr "Es ist so langsam, daß es mich wahnsinnig macht"
#: kdirstatfeedback.cpp:76
msgid "What is your experience with computers in general?"
msgstr "Wie beurteilen Sie Ihre Computerkenntnisse allgemein?"
#: kdirstatfeedback.cpp:77 kdirstatfeedback.cpp:84
msgid "Expert"
msgstr "Experte"
#: kdirstatfeedback.cpp:78 kdirstatfeedback.cpp:85
msgid "Fair"
msgstr "Einigermaßen gut"
#: kdirstatfeedback.cpp:80 kdirstatfeedback.cpp:87
msgid "Learning"
msgstr "Normaler Anwender"
#: kdirstatfeedback.cpp:81 kdirstatfeedback.cpp:88
msgid "Newbie"
msgstr "Einsteiger"
#: kdirstatfeedback.cpp:83
msgid "What is your experience with Unix/Linux systems?"
msgstr "Wie beurteilen Sie Ihre Linux- bzw. Unixkenntnisse?"
#: kdirstatfeedback.cpp:90
msgid ""
"Did you have trouble figuring out how to work with this program in general?"
msgstr "Fiel es Ihnen der Umgang mit diesem Programm am Anfang schwer?"
#: kdirstatfeedback.cpp:92
msgid "No problem"
msgstr "Kein Problem"
#: kdirstatfeedback.cpp:93
msgid "Some"
msgstr "Ein bißchen"
#: kdirstatfeedback.cpp:94 kdirstatfeedback.cpp:132
msgid "I'm still learning"
msgstr "Ich bin noch dabei, es herauszufinden"
#: kdirstatfeedback.cpp:95
msgid "I didn't have a clue what to do at first"
msgstr "Ich hatte anfangs überhaupt keine Ahnung"
#: kdirstatfeedback.cpp:96 kdirstatfeedback.cpp:133
msgid "I still don't have a clue what to do"
msgstr "Ich habe immer noch keine Ahnung"
#: kdirstatfeedback.cpp:98
msgid "Where do you use this program most?"
msgstr "Wo setzen Sie dieses Programm am meisten ein?"
#: kdirstatfeedback.cpp:99
msgid "At work"
msgstr "In der Arbeit"
#: kdirstatfeedback.cpp:100
msgid "At home"
msgstr "Zu Hause"
#: kdirstatfeedback.cpp:101
msgid "At university / school"
msgstr "In der Uni bzw. Schule"
#: kdirstatfeedback.cpp:103
msgid "What is your primary role there?"
msgstr "Was ist dort Ihre Hauptfunktion?"
#: kdirstatfeedback.cpp:104 kdirstatfeedback.cpp:112
msgid "Home user"
msgstr "Privatanwender"
#: kdirstatfeedback.cpp:105 kdirstatfeedback.cpp:113
msgid "Student"
msgstr "Student / Schüler"
#: kdirstatfeedback.cpp:106 kdirstatfeedback.cpp:114
msgid "Educational (teacher / professor)"
msgstr "Ausbilder (Lehrer, Dozent)"
#: kdirstatfeedback.cpp:107 kdirstatfeedback.cpp:115
msgid "Non-computer related work"
msgstr "Nichts computerbezogenes"
#: kdirstatfeedback.cpp:108 kdirstatfeedback.cpp:116
msgid "Developer"
msgstr "Entwickler"
#: kdirstatfeedback.cpp:109 kdirstatfeedback.cpp:117
msgid "System administrator"
msgstr "Systemverwalter"
#: kdirstatfeedback.cpp:111
msgid "Do you have any other roles there?"
msgstr "Haben Sie dort weitere Funktionen?"
#: kdirstatfeedback.cpp:119
msgid "How did you get to know this program?"
msgstr "Wie sind Sie auf dieses Programm gestoßen?"
#: kdirstatfeedback.cpp:120
msgid "In a menu on my machine"
msgstr "In einem Menü auf meinem Computer"
#: kdirstatfeedback.cpp:121
msgid "Somebody told me about it"
msgstr "Jemand hat mir davon erzählt"
#: kdirstatfeedback.cpp:122
msgid "On the internet"
msgstr "Im Internet"
#: kdirstatfeedback.cpp:123
msgid "Printed magazine / book"
msgstr "Zeitschrift / Buch"
#: kdirstatfeedback.cpp:124
msgid "Other (please add comment below)"
msgstr "Sonstige (bitte Kommentar unten)"
#: kdirstatfeedback.cpp:126
msgid ""
"Did you ever get a KDirStat mail report telling you to clean up disk space?"
msgstr "Haben Sie schon einmal eine KDirStat-Mail erhalten, in der sie aufgefordert wurden, Plattenplatz aufzuräumen?"
#: kdirstatfeedback.cpp:129
msgid "Could you figure yet out how to work with the treemaps?"
msgstr "Haben Sie schon herausbekommen, wie man mit Treemaps umgeht?"
#: kdirstatfeedback.cpp:130
msgid "I became an expert at it"
msgstr "Ich bin darin zum Experten geworden"
#: kdirstatfeedback.cpp:131
msgid "I got a fairly good idea of it"
msgstr "Ich kenne mich so einigermaßen damit aus"
#: kdirstatfeedback.cpp:134
msgid "Treemaps? Huh? What the hell is that?"
msgstr "Treemaps? Was ist das denn?"
#: kdirstatfeedback.cpp:136
msgid "What do you think about the treemaps?"
msgstr "Was halten Sie von den Treemaps?"
#: kdirstatfeedback.cpp:137
msgid "They are useless"
msgstr "Sie sind nutzlos"
#: kdirstatfeedback.cpp:138
msgid "The display is confusing"
msgstr "Die Darstellung ist verwirrend"
#: kdirstatfeedback.cpp:139
msgid "They look ugly"
msgstr "Sieht häßlich aus"
#: kdirstatfeedback.cpp:140
msgid "They look nice"
msgstr "Sieht gut aus"
#: kdirstatfeedback.cpp:141
msgid "They help finding large files"
msgstr "Hilft, große Dateien zu finden"
#: kdirstatfeedback.cpp:142
msgid "I could do with the treemap view alone"
msgstr "Mir würde die Treemap-Ansicht alleine völlig ausreichen"
#: kdirstatfeedback.cpp:143
msgid "The combination of tree view and treemaps is great"
msgstr "Die Kombination von Baumansicht und Treemap ist sehr gut"
#: kdirstatfeedback.cpp:144
msgid "I want more info inside the treemap view"
msgstr "Ich möchte mehr Informationen innerhalb der Treemap-Ansicht"
#: kdirstatfeedback.cpp:145
msgid "Leave the treemaps as they are right now"
msgstr "Die Treemaps sollten genauso bleiben, wie sie jetzt sind"
#: kdirstatfeedback.cpp:147
msgid "Would you recommend this program to a friend?"
msgstr "Würden Sie dieses Programm an Freunde weiterempfehlen?"
#: kdirstatfeedback.cpp:158
msgid "The directory tree display in general"
msgstr "Die Anzeige des Verzeichnis generell"
#: kdirstatfeedback.cpp:159
msgid "Percentage bars as graphical display of relative sizes"
msgstr "Prozentbalken als grafische Darstellung der relativen Größe"
#: kdirstatfeedback.cpp:160
msgid "Files apart from directories in a separate <Files> item"
msgstr "Dateien getrennt von Verzeichnissen als separaten <Dateien>-Eintrag"
#: kdirstatfeedback.cpp:162
msgid "Treemaps in general"
msgstr "Treemaps allgemein"
#: kdirstatfeedback.cpp:163
msgid "The cushioned treemap rendering"
msgstr "Die Kissendarstellung der Treemaps"
#: kdirstatfeedback.cpp:165
msgid "Cleanup actions in general"
msgstr "Aufräumaktionen allgemein"
#: kdirstatfeedback.cpp:166
msgid "Predefined cleanup actions"
msgstr "Vordefinierte Aufräumaktionen"
#: kdirstatfeedback.cpp:167
msgid "User defined cleanup actions"
msgstr "Benutzerdefinierte Aufräumaktionen"
#: kdirstatfeedback.cpp:168
msgid "Cleanup action configuration"
msgstr "Konfiguration der Aufräumaktionen"
#: kdirstatfeedback.cpp:170
msgid "Different colors in percentage bars"
msgstr "Unterschiedliche Farben der Prozentbalken"
#: kdirstatfeedback.cpp:171
msgid "Tree color configuration"
msgstr "Farbzuweisung für die Baumanzeige"
#: kdirstatfeedback.cpp:172
msgid "Staying on one file system"
msgstr "Innerhalb eines Dateisystemes bleiben"
#: kdirstatfeedback.cpp:173
msgid "The \"mail to owner\" facility"
msgstr "Die Funktion \"Mail an Besitzer\""
#: kdirstatfeedback.cpp:174
msgid "This \"feedback mail\" facility"
msgstr "Diese Funktion \"Feedback-Mail\" hier"
#: kdirstatfeedback.cpp:176
msgid "Human readable sizes (kB, MB, ...)"
msgstr "Für Menschen lesbare Größenangaben (KB, MB, ...)"
#: kdirstatfeedback.cpp:177
msgid "All the numbers in the tree display"
msgstr "Die ganzen Zahlen in der Baumanzeige"
#: kdirstatfeedback.cpp:178
msgid "Last change time of an entire directory tree"
msgstr "Die letzte Änderungszeit eines gesamten Verzeichnisbaums"
#: kdirstatfeedback.cpp:179
msgid "The PacMan animation"
msgstr "Die PacMan-Animation"
#: kdirstatsettings.cpp:37
msgid "Settings"
msgstr "Einstellungen"
#: kdirstatsettings.cpp:66
msgid "&Cleanups"
msgstr "&Aufräumen"
#: kdirstatsettings.cpp:70
msgid "&Tree Colors"
msgstr "&Verzeichnisfarben"
#: kdirstatsettings.cpp:74
msgid "Tree&map"
msgstr "&Treemap"
#: kdirstatsettings.cpp:78
msgid "&General"
msgstr "Allge&mein"
#: kdirstatsettings.cpp:104
msgid ""
"Really revert all settings to their default values?\n"
"You will lose all changes you ever made!"
msgstr ""
"Wirklich alle Einstellungen auf Voreinstellungen zurücksetzen?\n"
"Alle eigenen Einstellungen gehen dabei verloren!"
#: kdirstatsettings.cpp:107
msgid "&Really Revert to Defaults"
msgstr "Wirklich auf Standardwerte zu&rücksetzen"
#: kdirstatsettings.cpp:193
msgid "Tree Level %1"
msgstr "Baumebene %1"
#: kdirstatsettings.cpp:529
msgid "&Enabled"
msgstr "&Aktiv"
#: kdirstatsettings.cpp:566
msgid "&Title:"
msgstr "&Titel:"
#: kdirstatsettings.cpp:567
msgid "&Command Line:"
msgstr "&Kommandozeile:"
#: kdirstatsettings.cpp:569
#, c-format
msgid "%p Full Path"
msgstr "%p Vollständiger Pfad"
#: kdirstatsettings.cpp:572
#, c-format
msgid "%n File / Directory Name Without Path"
msgstr "%n Datei- bzw. Verzeichnisname ohne Pfad"
#: kdirstatsettings.cpp:575
msgid "%t KDE Trash Directory"
msgstr "%t KDE-Mülleimer-Verzeichnis"
#: kdirstatsettings.cpp:581
msgid "&Recurse into Subdirectories"
msgstr "Unte&rverzeichnisse durchlaufen"
#: kdirstatsettings.cpp:586
msgid "&Ask for Confirmation"
msgstr "&Nachfragen"
#: kdirstatsettings.cpp:592
msgid "Works for..."
msgstr "Anwendbar auf..."
#: kdirstatsettings.cpp:598
msgid "&Directories"
msgstr "&Verzeichnisse"
#: kdirstatsettings.cpp:599
msgid "&Files"
msgstr "&Dateien"
#: kdirstatsettings.cpp:600
msgid "<Files> P&seudo Entries"
msgstr "<Dateien>-P&seudo-Einträge"
#: kdirstatsettings.cpp:610
msgid "On Local Machine Only ('file:/' Protocol)"
msgstr "Nur lokal ('file:/' -Protokoll)"
#: kdirstatsettings.cpp:611
msgid "Network Transparent (ftp, smb, tar, ...)"
msgstr "Netzwerktransparent (ftp, smb, tar, ...)"
#: kdirstatsettings.cpp:631
msgid "Refresh &Policy:"
msgstr "A&ktualisierung:"
#: kdirstatsettings.cpp:642
msgid "No Refresh"
msgstr "Nicht aktualisieren"
#: kdirstatsettings.cpp:643
msgid "Refresh This Entry"
msgstr "Diesen Eintrag aktualisieren"
#: kdirstatsettings.cpp:644
msgid "Refresh This Entry's Parent"
msgstr "Übergeordneten Eintrag aktualisieren"
#: kdirstatsettings.cpp:645
msgid "Assume Entry Has Been Deleted"
msgstr "Annehmen, der Eintrag sei gelöscht"
#: kdirstatsettings.cpp:715
msgid "Directory Reading"
msgstr "Verzeichnisse lesen"
#: kdirstatsettings.cpp:718
msgid "Cross &File System Boundaries"
msgstr "Über Dateisystemgrenzen &hinweg lesen"
#: kdirstatsettings.cpp:719
msgid "Use Optimized &Local Directory Read Methods"
msgstr "Für lokale Verzeichnisse &optimierte Lesemethoden verwenden"
#: kdirstatsettings.cpp:726
msgid "Animation"
msgstr "Animation"
#: kdirstatsettings.cpp:729
msgid "P@cM@n Animation in Tool &Bar"
msgstr "P@cM@n-Animation in der &Werkzeugleiste"
#: kdirstatsettings.cpp:730
msgid "P@cM@n Animation in Directory &Tree"
msgstr "P@cM@n-Animation im Verzeichnis&baum"
#: kdirstatsettings.cpp:809
msgid "S&quarify Treemap"
msgstr "Treemap &Quadrat-optimieren"
#: kdirstatsettings.cpp:810
msgid "Use C&ushion Shading"
msgstr "&Kissendarstellung"
#: kdirstatsettings.cpp:815
msgid "Cushion Parameters"
msgstr "Kissen-Parameter"
#: kdirstatsettings.cpp:820
msgid "Ambient &Light"
msgstr "&Umgebungslicht"
#: kdirstatsettings.cpp:830
msgid "&Height Scale"
msgstr "&Höhenskala"
#: kdirstatsettings.cpp:840
msgid "Draw Lines if Lo&w Contrast"
msgstr "&Linien bei geringem Kontrast"
#: kdirstatsettings.cpp:844
msgid "Always Draw &Grid"
msgstr "Immer &Gitter anzeigen"
#: kdirstatsettings.cpp:847
msgid "Gr&id Color: "
msgstr "G&itterfarbe:"
#: kdirstatsettings.cpp:857
msgid "Colors for Plain Treemaps"
msgstr "Farben für einfache Treemaps"
#: kdirstatsettings.cpp:860
msgid "&Files: "
msgstr "&Dateien:"
#: kdirstatsettings.cpp:865
msgid "&Directories: "
msgstr "&Verzeichnisse:"
#: kdirstatsettings.cpp:870
msgid "Gr&id: "
msgstr "G&itter:"
#: kdirstatsettings.cpp:884
msgid "Hi&ghlight R&ectangle: "
msgstr "Markierungs&rahmen:"
#: kdirstatsettings.cpp:892
msgid "Minim&um Treemap Tile Size: "
msgstr "Mi&nimale Kachelgröße:"
#: kdirstatsettings.cpp:899
msgid "Auto-&Resize Treemap"
msgstr "Treemap automatisch &einpassen"
#: kdirtree.cpp:1548 kdirtreeview.cpp:800
msgid "Bytes"
msgstr "Bytes"
#: kdirtree.cpp:1557
msgid "kB"
msgstr "KB"
#: kdirtree.cpp:1566
msgid "MB"
msgstr "MB"
#: kdirtree.cpp:1573
msgid "GB"
msgstr "GB"
#: kdirtreeview.cpp:62
msgid "Name"
msgstr "Name"
#: kdirtreeview.cpp:64
msgid "Subtree Percentage"
msgstr "Teilbaum Prozent"
#: kdirtreeview.cpp:65
msgid "Percentage"
msgstr "Prozent"
#: kdirtreeview.cpp:66
msgid "Subtree Total"
msgstr "Teilbaum gesamt"
#: kdirtreeview.cpp:68
msgid "Own Size"
msgstr "Eigene Größe"
#: kdirtreeview.cpp:69
msgid "Items"
msgstr "Einträge"
#: kdirtreeview.cpp:70
msgid "Files"
msgstr "Dateien"
#: kdirtreeview.cpp:71
msgid "Subdirs"
msgstr "Unterverz."
#: kdirtreeview.cpp:72
msgid "Last Change"
msgstr "Geändert am"
#: kdirtreeview.cpp:165
msgid "Read Jobs"
msgstr "Gelesene"
#: kdirtreeview.cpp:434
msgid "Finished. Elapsed time: %1"
msgstr "Fertig. Gesamtdauer : %1"
#: kdirtreeview.cpp:464
msgid "Aborted. Elapsed time: %1"
msgstr "Benutzerabbruch. Gesamtdauer : %1"
#: kdirtreeview.cpp:499
msgid "Elapsed time: %1 reading directory %2"
msgstr "Zeit bisher: %1 Lese Verzeichnis %2"
#: kdirtreeview.cpp:907
msgid "Disk Usage"
msgstr "Platzbedarf"
#: kdirtreeview.cpp:909
msgid "Please check your disk usage and clean up if you can. Thank you."
msgstr "Bitte überprüfen Sie den verbrauchten Plattenplatz und räumen Sie nach Möglichkeit auf. Danke."
#: kdirtreeview.cpp:913
msgid "Disk usage report generated by KDirStat"
msgstr "Report über Plattenplatzverbrauch - generiert von KDirStat"
#: kdirtreeview.cpp:976
msgid "<Files>"
msgstr "<Dateien>"
#: kdirtreeview.cpp:1109
msgid "[%1 Read Jobs]"
msgstr "[%1 Lesejobs]"
#: kfeedback.cpp:32
msgid "Feedback"
msgstr "Feedback"
#: kfeedback.cpp:38
msgid "&Mail this..."
msgstr "&Mail versenden..."
#: kfeedback.cpp:88
msgid ""
"<p><b>Please tell us your opinion about this program.</b></p><p>You will be "
"able to review everything in your mailer before any mail is sent.<br>Nothing "
"will be sent behind your back.</p>"
msgstr ""
"<p><b>Bitte teilen Sie uns Ihre Meinung zu diesem Programm mit.</b></p>\n"
"<p>Sie können alles noch einmal in ihrem Mail-Programm überprüfen, \n"
"bevor tatsächlich eine Mail verschickt wird.<br>\n"
"Es wird garantiert nichts hinter Ihrem Rücken versendet.</p>"
#: kfeedback.cpp:113
msgid "Questions marked with "
msgstr "Fragen, die mit "
#: kfeedback.cpp:122
msgid " must be answered before a mail can be sent."
msgstr " gekennzeichnet sind, müssen beantwortet werden, um eine Mail zu senden."
#: kfeedback.cpp:133
msgid "&Additional Comments:"
msgstr "Zusätzliche &Anmerkungen:"
#: kfeedback.cpp:311
msgid "yes"
msgstr "Ja"
#: kfeedback.cpp:312
msgid "no"
msgstr "Nein"
#: kstdcleanup.cpp:23
msgid "Open in &Konqueror"
msgstr "In &Konqueror öffnen"
#: kstdcleanup.cpp:43
msgid "Open in &Terminal"
msgstr "In &Terminal öffnen"
#: kstdcleanup.cpp:62
msgid "&Compress"
msgstr "&Komprimieren"
#: kstdcleanup.cpp:80
msgid "&make clean"
msgstr "&make clean"
#: kstdcleanup.cpp:97
msgid "Delete T&rash Files"
msgstr "Müll-Da&teien löschen"
#: kstdcleanup.cpp:115
msgid "Delete (to Trash &Bin)"
msgstr "In den Mülleimer verschie&ben"
#: kstdcleanup.cpp:134
msgid "&Delete (no way to undelete!)"
msgstr "Lö&schen (Endgültig!)"
#~ msgid "Clean &Up"
#~ msgstr "A&ufräumen"
#~ msgid "&Report"
#~ msgstr "&Report"

@ -0,0 +1,726 @@
# translation of fr.po to français
# Copyright (C) 2003 Free Software Foundation, Inc.
# Michel Grentzinger <mic.grentz@online.fr>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: kdirstat 2.3.6\n"
"POT-Creation-Date: 2002-04-19 13:38+0900\n"
"PO-Revision-Date: 2003-04-25 21:45GMT\n"
"Last-Translator: Michel Grentzinger <mic.grentz@online.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.0.1\n"
#: kcleanup.cpp:171
msgid ""
"%1\n"
"in directory %2"
msgstr ""
"%1\n"
"dans le répertoire %2"
#: kcleanup.cpp:175
msgid ""
"%1\n"
"for file %2"
msgstr ""
"%1\n"
"pour le fichier %2"
#: kcleanup.cpp:180 kdirstatsettings.cpp:100
msgid "Please confirm"
msgstr "Veuillez confirmer"
#: kcleanup.cpp:181
msgid "Confirm"
msgstr "Confirmation"
#: kdirstatapp.cpp:126
msgid "Refresh &All"
msgstr "Rafraîchir &tout"
#: kdirstatapp.cpp:130
msgid "Refresh &Selected"
msgstr "Rafraîchir la &sélection"
#: kdirstatapp.cpp:134
msgid "Continue Reading at &Mount Point"
msgstr "Continuer la lecture au point de &montage"
#: kdirstatapp.cpp:144
msgid "Send &Mail to Owner"
msgstr "Envoyer un &courriel au propriétaire"
#: kdirstatapp.cpp:148
msgid "Send &Feedback Mail..."
msgstr "Envoyer une &remarque par courriel ..."
#: kdirstatapp.cpp:153
msgid "Opens a directory"
msgstr "Ouvre un répertoire"
#: kdirstatapp.cpp:154
msgid "Opens a recently used directory"
msgstr "Ouvre un répertoire récemment utilisé"
#: kdirstatapp.cpp:155
msgid "Closes the current directory"
msgstr "Ferme le répertoire courant"
#: kdirstatapp.cpp:156
msgid "Re-reads the entire directory tree"
msgstr "Relire l'arborescence complète du répertoire"
#: kdirstatapp.cpp:157
msgid "Re-reads the selected subtree"
msgstr "Relire la sous-arborescence sélectionnée"
#: kdirstatapp.cpp:158
msgid "Scan mounted file systems"
msgstr "Examiner les systèmes de fichier montés"
#: kdirstatapp.cpp:159
msgid "Quits the application"
msgstr "Quitte l'application"
#: kdirstatapp.cpp:160
msgid "Copies the URL of the selected item to the clipboard"
msgstr "Copie l'URL de l'entrée sélectionnée vers le presse-papier"
#: kdirstatapp.cpp:161
msgid "Enables/disables the toolbar"
msgstr "Active/désactive la barre d'outils"
#: kdirstatapp.cpp:162
msgid "Enables/disables the statusbar"
msgstr "Active/désactive la barre d'état"
#: kdirstatapp.cpp:163
msgid "Opens the preferences dialog"
msgstr "Ouvre les préférences"
#: kdirstatapp.cpp:164
msgid "Sends a mail to the owner of the selected subtree"
msgstr "Envoie un courriel au propriétaire du sous-arbre sélectionné"
#: kdirstatapp.cpp:216 kdirstatapp.cpp:250 kdirstatapp.cpp:349
#: kdirstatapp.cpp:361 kdirstatapp.cpp:374 kdirstatapp.cpp:383
#: kdirstatapp.cpp:395
msgid "Ready."
msgstr "Prêt."
#: kdirstatapp.cpp:243 kdirstatapp.cpp:342 kdirstatapp.cpp:356
msgid "Opening directory..."
msgstr "Ouverture d'un répertoire..."
#: kdirstatapp.cpp:344
msgid "Open Directory..."
msgstr "Ouvrir un répertoire..."
#: kdirstatapp.cpp:368
msgid "Closing directory..."
msgstr "Fermeture du répertoire..."
#: kdirstatapp.cpp:381
msgid "Refreshing directory tree..."
msgstr "Rafraîchissement de l'arborescence du répertoire..."
#: kdirstatapp.cpp:393
msgid "Refreshing selected subtree..."
msgstr "Rafraîchissement du sous-arbre sélectionné..."
#: kdirstatapp.cpp:482
msgid ""
"Now that you know this program for some time,\n"
"wouldn't you like to tell the authors your opinion about it?\n"
"\n"
"Open Source software depends on user feedback.\n"
"Your opinion can help us make the software better."
msgstr ""
"Maintenant que vous connaissez ce programme depuis un moment,\n"
"n'aimeriez-vous pas indiquer aux auteurs l'opinion que vous en avez ?\n"
"\n"
"Le logiciel Open Source dépend de l'avis des utilisateurs.\n"
"Vos remarques peuvent nous aider à améliorer le programme."
#: kdirstatapp.cpp:487
msgid "Please tell us your opinion!"
msgstr "Veuillez nous indiquer votre opinion !"
#: kdirstatapp.cpp:488
msgid "Open &Feedback Form..."
msgstr "Ouvrir le &formulaire de remarques..."
#: kdirstatapp.cpp:489
msgid "&No, and don't ask again!"
msgstr "&Non, et ne plus me demander !"
#: kdirtreeview.cpp:59
msgid "Name"
msgstr "Nom"
#: kdirtreeview.cpp:61
msgid "Subtree Percentage"
msgstr "Pourcentage du sous-arbre"
#: kdirtreeview.cpp:62
msgid "Percentage"
msgstr "Pourcentage"
#: kdirtreeview.cpp:63
msgid "Subtree Total"
msgstr "Total du sous-arbre"
#: kdirtreeview.cpp:65
msgid "Own Size"
msgstr "Taille propre"
#: kdirtreeview.cpp:66
msgid "Items"
msgstr "Entrées"
#: kdirtreeview.cpp:67
msgid "Files"
msgstr "Fichiers"
#: kdirtreeview.cpp:68
msgid "Subdirs"
msgstr "Sous-répertoires"
#: kdirtreeview.cpp:69
msgid "Last Change"
msgstr "Modifié"
#: kdirtreeview.cpp:156
msgid "Read Jobs"
msgstr "Lectures à faire"
#: kdirtreeview.cpp:405
#, c-format
msgid "Finished. Elapsed time: %1"
msgstr "Terminé. Temps écoulé : %1"
#: kdirtreeview.cpp:440
msgid "Elapsed time: %1 reading directory %2"
msgstr "Temps écoulé: %1 lecture du répertoire %2 "
#: kdirtreeview.cpp:704 kdirtreeview.cpp:1451
msgid "Bytes"
msgstr "Octets"
#: kdirtreeview.cpp:803
msgid "Disk usage"
msgstr "Utilisation du disque"
#: kdirtreeview.cpp:805
msgid "Please check your disk usage and clean up if you can. Thank you."
msgstr "Veuillez vérifier l'utilisation de votre disque et nettoyez-le si vous pouvez. Merci."
#: kdirtreeview.cpp:809
msgid "Disk usage report generated by KDirStat"
msgstr "Rapport de l'utilisation du disque généré par KDirStat"
#: kdirtreeview.cpp:868
msgid "<Files>"
msgstr "<Fichiers>"
#: kdirtreeview.cpp:1460
msgid "kB"
msgstr "Ko"
#: kdirtreeview.cpp:1469
msgid "MB"
msgstr "Mo"
#: kdirtreeview.cpp:1476
msgid "GB"
msgstr "Go"
#: kstdcleanup.cpp:26
msgid "Open in &Konqueror"
msgstr "Ouvrir dans &Konqueror"
#: kstdcleanup.cpp:46
msgid "Open in &Terminal"
msgstr "Ouvrir dans un &Terminal"
#: kstdcleanup.cpp:65
msgid "&Compress"
msgstr "&Compresser"
#: kstdcleanup.cpp:83
msgid "&make clean"
msgstr "&make clean"
#: kstdcleanup.cpp:100
msgid "Delete T&rash Files"
msgstr "Supp&rimer les fichiers détruits"
#: kstdcleanup.cpp:118
msgid "Delete (to Trash &Bin)"
msgstr "Supprimer (vers la cor&beille)"
#: kstdcleanup.cpp:137
msgid "&Delete (no way to undelete!)"
msgstr "&Supprimer (aucune façon de restaurer !)"
#: kcleanupcollection.cpp:234
#, c-format
msgid "User Defined Cleanup #&%1"
msgstr "Nettoyage défini par l'utilisateur #&%1"
#: kcleanupcollection.cpp:237
#, c-format
msgid "User Defined Cleanup #%1"
msgstr "Nettoyage défini par l'utilisateur #%1"
#: kdirstatsettings.cpp:39
msgid "Settings"
msgstr "Paramètres"
#: kdirstatsettings.cpp:68
msgid "&Cleanups"
msgstr "&Nettoyages"
#: kdirstatsettings.cpp:72
msgid "&Tree Colors"
msgstr "&Couleurs de l'arborescence"
#: kdirstatsettings.cpp:98
msgid ""
"Really revert all settings to their default values?\n"
"You will lose all changes you ever made!"
msgstr ""
"Revenir vraiment aux valeurs par défaut pour tous les paramètres ?\n"
"Vous perdrez tous les changements déjà effectués !\""
#: kdirstatsettings.cpp:101
msgid "&Really revert to defaults"
msgstr "&Revenir vraiment aux valeurs par défaut"
#: kdirstatsettings.cpp:185
#, c-format
msgid "Tree level %1"
msgstr "Niveau de l'arborescence %1"
#: kdirstatsettings.cpp:527
msgid "&Enabled"
msgstr "&Activé"
#: kdirstatsettings.cpp:564
msgid "&Title:"
msgstr "&Titre : "
#: kdirstatsettings.cpp:565
msgid "&Command line:"
msgstr "Ligne de &commande : "
#: kdirstatsettings.cpp:567
#, c-format
msgid "%p full path"
msgstr "%p chemin complet"
#: kdirstatsettings.cpp:570
#, c-format
msgid "%n file / directory name without path"
msgstr "%n nom de fichier / répertoire sans chemin"
#: kdirstatsettings.cpp:576
msgid "&Recurse into subdirectories"
msgstr "&Traiter récursivement les sous-répertoires"
#: kdirstatsettings.cpp:581
msgid "&Ask for confirmation"
msgstr "&Demander une confirmation"
#: kdirstatsettings.cpp:587
msgid "Works for..."
msgstr "Fonctionne avec les..."
#: kdirstatsettings.cpp:593
msgid "&Directories"
msgstr "&Répertoires"
#: kdirstatsettings.cpp:594
msgid "&Files"
msgstr "&Fichiers"
#: kdirstatsettings.cpp:595
msgid "<Files> p&seudo entries"
msgstr "&Pseudos-entrées <Fichiers>"
#: kdirstatsettings.cpp:605
msgid "On local machine only ('file:/' protocol)"
msgstr "Uniquement sur la machine locale (protocole 'file:/')"
#: kdirstatsettings.cpp:606
msgid "Network transparent (ftp, smb, tar, ...)"
msgstr "A travers le réseau (ftp, smb, tar, ...)"
#: kdirstatsettings.cpp:626
msgid "Refresh &Policy:"
msgstr "Règl&es de rafraîchissement : "
#: kdirstatsettings.cpp:637
msgid "No refresh"
msgstr "Pas de rafraîchissement"
#: kdirstatsettings.cpp:638
msgid "Refresh this entry"
msgstr "Rafraîchir cette entrée"
#: kdirstatsettings.cpp:639
msgid "Refresh this entry's parent"
msgstr "Rafraîchir le parent de cette entrée"
#: kdirstatsettings.cpp:640
msgid "Assume entry has been deleted"
msgstr "S'assurer que l'entrée a été supprimée"
#: kdirstatfeedback.cpp:36
msgid "What is your general opinion about this program?"
msgstr "Quelle est votre impression générale sur ce programme ?"
#: kdirstatfeedback.cpp:38
msgid "It's one of my favourites"
msgstr "C'est l'un de mes préféré"
#: kdirstatfeedback.cpp:39
msgid "I like it"
msgstr "Je l'adore"
#: kdirstatfeedback.cpp:40
msgid "It's sometimes useful"
msgstr "Il est parfois utile"
#: kdirstatfeedback.cpp:41
msgid "It's average"
msgstr "Il est moyen"
#: kdirstatfeedback.cpp:42
msgid "Nice try, but this could be done better"
msgstr "Satisfaisant, mais celà pourrait être meilleur"
#: kdirstatfeedback.cpp:43
msgid "It's poor"
msgstr "Il est médiocre"
#: kdirstatfeedback.cpp:44
msgid "It's useless"
msgstr "Il est inutile"
#: kdirstatfeedback.cpp:45
msgid "It's crap"
msgstr "C'est de la merde"
#: kdirstatfeedback.cpp:47
msgid "Which features of this program do you like?"
msgstr "Quelles fonctionnalités de ce programme aimez-vous ?"
#: kdirstatfeedback.cpp:50
msgid "Which features don't you like?"
msgstr "Quelles fonctionnalités n'aimez-vous pas ?"
#: kdirstatfeedback.cpp:53
msgid "Which features do you never use?"
msgstr "Quelles fonctionnalités n'utilisez-vous jamais ?"
#: kdirstatfeedback.cpp:56
msgid "What is your favourite feature?"
msgstr "Quelle est votre fonctionnalité préférée ?"
#: kdirstatfeedback.cpp:59
msgid "Are there features you are missing?"
msgstr "Voyez-vous des fonctionnalités manquantes ?"
#: kdirstatfeedback.cpp:60
msgid "Yes, a lot! (please add comment below)"
msgstr "Oui, beaucoup ! (veuillez ajouter vos commentaires ci-dessous)"
#: kdirstatfeedback.cpp:62
msgid "None"
msgstr "Aucune"
#: kdirstatfeedback.cpp:63
msgid "It has too many features already!"
msgstr "Il y a déjà trop de fonctionnalités !"
#: kdirstatfeedback.cpp:65
msgid "How do you rate the stability of this program?"
msgstr "Comment évaluez-vous la stabilité de ce programme ?"
#: kdirstatfeedback.cpp:66
msgid "Rock solid"
msgstr "Solide comme un roc"
#: kdirstatfeedback.cpp:67 kdirstatfeedback.cpp:74
msgid "Good"
msgstr "Bonne"
#: kdirstatfeedback.cpp:68 kdirstatfeedback.cpp:75 kdirstatfeedback.cpp:82
#: kdirstatfeedback.cpp:89
msgid "Average"
msgstr "Moyenne"
#: kdirstatfeedback.cpp:69 kdirstatfeedback.cpp:76
msgid "Poor"
msgstr "Médiocre"
#: kdirstatfeedback.cpp:70
msgid "It keeps crashing all the time"
msgstr "Il n'arrête pas de planter"
#: kdirstatfeedback.cpp:72
msgid "How do you rate the performance of this program?"
msgstr "Comment évaluez-vous la performance de ce programme ?"
#: kdirstatfeedback.cpp:73
msgid "Great"
msgstr "Excellente"
#: kdirstatfeedback.cpp:77
msgid "It's so slow it drives me nuts"
msgstr "Il est tellement lent qu'il me rend fou"
#: kdirstatfeedback.cpp:79
msgid "What is your experience with computers in general?"
msgstr "Quelle est votre expérience informatique globalement ?"
#: kdirstatfeedback.cpp:80 kdirstatfeedback.cpp:87
msgid "Expert"
msgstr "Expert"
#: kdirstatfeedback.cpp:81 kdirstatfeedback.cpp:88
msgid "Fair"
msgstr "Correct"
#: kdirstatfeedback.cpp:83 kdirstatfeedback.cpp:90
msgid "Learning"
msgstr "Apprenti"
#: kdirstatfeedback.cpp:84 kdirstatfeedback.cpp:91
msgid "Newbie"
msgstr "Débutant"
#: kdirstatfeedback.cpp:86
msgid "What is your experience with Unix/Linux systems?"
msgstr "Quelle est votre expérience avec les systèmes Unix/Linux ?"
#: kdirstatfeedback.cpp:93
msgid "Did you have trouble figuring out how to work with this program?"
msgstr "Avez-vous eu du mal à savoir comment travailler avec ce programme ?"
#: kdirstatfeedback.cpp:95
msgid "No problem"
msgstr "Aucun problème"
#: kdirstatfeedback.cpp:96
msgid "Some"
msgstr "Un peu"
#: kdirstatfeedback.cpp:97
msgid "I'm still learning"
msgstr "Je suis encore en train d'apprendre"
#: kdirstatfeedback.cpp:98
msgid "I didn't have a clue what to do at first"
msgstr "Je n'avais pas la moindre idée de ce qu'il fallait faire au début"
#: kdirstatfeedback.cpp:99
msgid "I still don't have a clue what to do"
msgstr "Je n'ai toujours pas la moindre idée de ce qu'il faut faire"
#: kdirstatfeedback.cpp:101
msgid "Where do you use this program most?"
msgstr "Où utilisez-vous ce programme le plus souvent ?"
#: kdirstatfeedback.cpp:102
msgid "At work"
msgstr "Au travail"
#: kdirstatfeedback.cpp:103
msgid "At home"
msgstr "A la maison"
#: kdirstatfeedback.cpp:104
msgid "At university / school"
msgstr "A l'université / à l'école"
#: kdirstatfeedback.cpp:106
msgid "What is your primary role there?"
msgstr "Quelle est votre fonction la-bàs ?"
#: kdirstatfeedback.cpp:107 kdirstatfeedback.cpp:115
msgid "Home user"
msgstr "Utilisateur personnel"
#: kdirstatfeedback.cpp:108 kdirstatfeedback.cpp:116
msgid "Student"
msgstr "Etudiant"
#: kdirstatfeedback.cpp:109 kdirstatfeedback.cpp:117
msgid "Educational (teacher / professor)"
msgstr "Education (enseignant / professeur)"
#: kdirstatfeedback.cpp:110 kdirstatfeedback.cpp:118
msgid "Non-computer related work"
msgstr "Travail non lié à l'informatique"
#: kdirstatfeedback.cpp:111 kdirstatfeedback.cpp:119
msgid "Developer"
msgstr "Développeur"
#: kdirstatfeedback.cpp:112 kdirstatfeedback.cpp:120
msgid "System administrator"
msgstr "Administrateur système"
#: kdirstatfeedback.cpp:114
msgid "Do you have any other roles there?"
msgstr "Avez-vous d'autres fonctions la-bàs ?"
#: kdirstatfeedback.cpp:122
msgid "How did you get to know this program?"
msgstr "Comment avez-vous connu ce programme ?"
#: kdirstatfeedback.cpp:123
msgid "In a menu on my machine"
msgstr "Dans un menu de ma machine"
#: kdirstatfeedback.cpp:124
msgid "Somebody told me about it"
msgstr "Quelqu'un m'en a parlé"
#: kdirstatfeedback.cpp:125
msgid "On the internet"
msgstr "Sur internet"
#: kdirstatfeedback.cpp:126
msgid "Printed magazine / book"
msgstr "Magazine imprimé / livre"
#: kdirstatfeedback.cpp:127
msgid "Other (please add comment below)"
msgstr "Autre (veuillez ajoutez vos commentaires ci-dessous)"
#: kdirstatfeedback.cpp:129
msgid "Did you ever get a KDirStat mail report telling you to clean up disk space?"
msgstr "Avez-vous déjà recu un courriel de KDirStat vous indiquant de libérer de l'espace disque ?"
#: kdirstatfeedback.cpp:132
msgid "Would you recommend this program to a friend?"
msgstr "Conseillerez-vous ce programme à un ami ?"
#: kdirstatfeedback.cpp:143
msgid "The directory tree display in general"
msgstr "L'affichage de l'arborescence des répertoires en général"
#: kdirstatfeedback.cpp:144
msgid "Percentage bars as graphical display of relative sizes"
msgstr "L'affichage en barres graphiques du pourcentage des tailles relatives"
#: kdirstatfeedback.cpp:145
msgid "Files apart from directories in a separate <Files> item"
msgstr "L'ensemble des fichiers d'un répertoire dans une entrée <Fichiers> séparée"
#: kdirstatfeedback.cpp:147
msgid "Cleanup actions in general"
msgstr "Les actions de nettoyage en général"
#: kdirstatfeedback.cpp:148
msgid "Predefined cleanup actions"
msgstr "Les actions de nettoyage prédéfinies"
#: kdirstatfeedback.cpp:149
msgid "User defined cleanup actions"
msgstr "Les actions de nettoyage prédéfinies par l'utilisateur"
#: kdirstatfeedback.cpp:150
msgid "Cleanup action configuration"
msgstr "La configuration des actions de nettoyage"
#: kdirstatfeedback.cpp:152
msgid "Different colors in percentage bars"
msgstr "Les couleurs différentes dans les barres de pourcentage"
#: kdirstatfeedback.cpp:153
msgid "Tree color configuration"
msgstr "La configuration des couleurs de l'arborescence"
#: kdirstatfeedback.cpp:154
msgid "Staying on one file system"
msgstr "Le fait de rester sur un système de fichier"
#: kdirstatfeedback.cpp:155
msgid "The \"mail to owner\" facility"
msgstr "La fonction \"envoyer un courriel au propriétaire\""
#: kdirstatfeedback.cpp:156
msgid "This \"feedback mail\" facility"
msgstr "La fonction \"envoyer une remarque par courriel\""
#: kdirstatfeedback.cpp:158
msgid "Human readable sizes (kB, MB, ...)"
msgstr "Les tailles lisibles facilement (Ko, Mo, ...)"
#: kdirstatfeedback.cpp:159
msgid "All the numbers in the tree display"
msgstr "Tous les chiffres dans l'affichage de l'arborescence"
#: kdirstatfeedback.cpp:160
msgid "Last change time of an entire directory tree"
msgstr "Heure de la dernière modification de l'arborescence entière d'un répertoire"
#: kdirstatfeedback.cpp:161
msgid "The PacMan animation"
msgstr "L'animation PacMan"
#: kfeedback.cpp:35
msgid "Feedback"
msgstr "Les remarques aux auteurs"
#: kfeedback.cpp:41
msgid "&Mail this..."
msgstr "&Envoyer ceci..."
#: kfeedback.cpp:91
msgid ""
"<p><b>Please tell us your opinion about this program.</b></p><p>You will be "
"able to review everything in your mailer before any mail is sent.<br>Nothing "
"will be sent behind your back.</p>"
msgstr "<p><b>Veuillez nous indiquer votre opinion à propos de ce programme.</b></p><p>Vous pourrez revoir toute chose dans votre client de courrier avant que le courriel ne soit envoyé <br>Rien ne sera envoyé à votre insu.</p>"
#: kfeedback.cpp:116
msgid "Questions marked with "
msgstr "Les questions marquées par un "
#: kfeedback.cpp:125
msgid " must be answered before a mail can be sent."
msgstr "doivent être remplies avant qu'un courriel ne puisse être envoyé."
#: kfeedback.cpp:136
msgid "&Additional comments:"
msgstr "Rem&arques supplémentaires"
#: kfeedback.cpp:314
msgid "yes"
msgstr "oui"
#: kfeedback.cpp:315
msgid "no"
msgstr "non"
#: kdirstatui.rc:32
msgid "Clean &Up"
msgstr "&Nettoyage"
#: kdirstatui.rc:60
msgid "&Report"
msgstr "&Rapport"
#~ #: kdirstatfeedback.cpp:61
#~ msgid "Some (please add comment below)"
#~ msgstr "Quelques-unes (veuillez ajouter vos commentaires ci-dessous)"

@ -0,0 +1,733 @@
# translation of hu.po to Hungarian
# translation of fr.po to hungarian
# translation of fr.po to français
# Copyright (C) 2003 Free Software Foundation, Inc.
# Michel Grentzinger <mic.grentz@online.fr>, 2003
# Marcel Hilzinger <hili@suselinux.hu>, 2003
# Peter Breuer <comp@suselinux.hu>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: hu\n"
"POT-Creation-Date: 2002-04-19 13:38+0900\n"
"PO-Revision-Date: 2003-09-05 15:43+0200\n"
"Last-Translator: Peter Breuer <comp@suselinux.hu>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.0.1\n"
#: kcleanup.cpp:171
msgid ""
"%1\n"
"in directory %2"
msgstr ""
"%1\n"
"ebben a könyvtárban: %2"
#: kcleanup.cpp:175
msgid ""
"%1\n"
"for file %2"
msgstr ""
"%1\n"
"ehhez a fájlhoz: %2"
#: kcleanup.cpp:180 kdirstatsettings.cpp:100
msgid "Please confirm"
msgstr "Kérem, erősítse meg"
#: kcleanup.cpp:181
msgid "Confirm"
msgstr "Megerősítés"
#: kdirstatapp.cpp:126
msgid "Refresh &All"
msgstr "Összes &frissítése"
#: kdirstatapp.cpp:130
msgid "Refresh &Selected"
msgstr "&Kiválasztottak frissítése"
#: kdirstatapp.cpp:134
msgid "Continue Reading at &Mount Point"
msgstr "Az olvasás folytatása a &csatolási ponttól"
#: kdirstatapp.cpp:144
msgid "Send &Mail to Owner"
msgstr "&Levélküldés a tulajdonosnak"
#: kdirstatapp.cpp:148
msgid "Send &Feedback Mail..."
msgstr "&Válaszlevél küldése..."
#: kdirstatapp.cpp:153
msgid "Opens a directory"
msgstr "Könyvtár megnyitása"
#: kdirstatapp.cpp:154
msgid "Opens a recently used directory"
msgstr "A legutóbb használt könyvtár megnyitása"
#: kdirstatapp.cpp:155
msgid "Closes the current directory"
msgstr "A jelenlegi könyvtár bezárása"
#: kdirstatapp.cpp:156
msgid "Re-reads the entire directory tree"
msgstr "A teljes könyvtárfa újraolvasása"
#: kdirstatapp.cpp:157
msgid "Re-reads the selected subtree"
msgstr "A kiválasztott alkönyvtárfa újraolvasása"
#: kdirstatapp.cpp:158
msgid "Scan mounted file systems"
msgstr "Csatolt fájlrendszerek ellenőrzése"
#: kdirstatapp.cpp:159
msgid "Quits the application"
msgstr "Kilépés az alkalmazásból"
#: kdirstatapp.cpp:160
msgid "Copies the URL of the selected item to the clipboard"
msgstr "A kiválasztott elem URL címének vágólapra másolása"
#: kdirstatapp.cpp:161
msgid "Enables/disables the toolbar"
msgstr "Az eszköztár ki/bekapcsolása"
#: kdirstatapp.cpp:162
msgid "Enables/disables the statusbar"
msgstr "Az állapotsor ki/bekapcsolása"
#: kdirstatapp.cpp:163
msgid "Opens the preferences dialog"
msgstr "A beállítási párbeszédablak megnyitása"
#: kdirstatapp.cpp:164
msgid "Sends a mail to the owner of the selected subtree"
msgstr "Levélküldés a kiválasztott alkönyvtárak tulajdonosának"
#: kdirstatapp.cpp:216 kdirstatapp.cpp:250 kdirstatapp.cpp:349
#: kdirstatapp.cpp:361 kdirstatapp.cpp:374 kdirstatapp.cpp:383
#: kdirstatapp.cpp:395
msgid "Ready."
msgstr "Kész."
#: kdirstatapp.cpp:243 kdirstatapp.cpp:342 kdirstatapp.cpp:356
msgid "Opening directory..."
msgstr "Könyvtár megnyitása..."
#: kdirstatapp.cpp:344
msgid "Open Directory..."
msgstr "Könyvtár megnyitása..."
#: kdirstatapp.cpp:368
msgid "Closing directory..."
msgstr "Könyvtár bezárása..."
#: kdirstatapp.cpp:381
msgid "Refreshing directory tree..."
msgstr "A könyvtárfa frissítése..."
#: kdirstatapp.cpp:393
msgid "Refreshing selected subtree..."
msgstr "A kiválasztott könyvtárfa frissítése..."
#: kdirstatapp.cpp:482
msgid ""
"Now that you know this program for some time,\n"
"wouldn't you like to tell the authors your opinion about it?\n"
"\n"
"Open Source software depends on user feedback.\n"
"Your opinion can help us make the software better."
msgstr ""
"Ha gyakran használja a programot,\n"
"megosztaná velünk tapasztalatait?\n"
"\n"
"A nyílt forráskódú szoftver minősége a felhasználói visszajelzésektől függ.\n"
"A megjegyzései segíthetnek jobbá tenni a szoftvert."
#: kdirstatapp.cpp:487
msgid "Please tell us your opinion!"
msgstr "Kérjük tudassa velünk véleményét!"
#: kdirstatapp.cpp:488
msgid "Open &Feedback Form..."
msgstr "Vála&sz űrlap megnyitása..."
#: kdirstatapp.cpp:489
msgid "&No, and don't ask again!"
msgstr "&Nem és ne is kérdezzen újból!"
#: kdirtreeview.cpp:59
msgid "Name"
msgstr "Név"
#: kdirtreeview.cpp:61
msgid "Subtree Percentage"
msgstr "Alkönyvtárfa százalékban"
#: kdirtreeview.cpp:62
msgid "Percentage"
msgstr "Százalék"
#: kdirtreeview.cpp:63
msgid "Subtree Total"
msgstr "Alkönyvtárfa összesen"
#: kdirtreeview.cpp:65
msgid "Own Size"
msgstr "Egyéni méret"
#: kdirtreeview.cpp:66
msgid "Items"
msgstr "Elemek"
#: kdirtreeview.cpp:67
msgid "Files"
msgstr "Fájlok"
#: kdirtreeview.cpp:68
msgid "Subdirs"
msgstr "Alkönyvtárak"
#: kdirtreeview.cpp:69
msgid "Last Change"
msgstr "Utolsó módosítás"
#: kdirtreeview.cpp:156
msgid "Read Jobs"
msgstr "Beolvasott feladatok"
#: kdirtreeview.cpp:405
#, c-format
msgid "Finished. Elapsed time: %1"
msgstr "Végrehajtva. Eltelt idő : %1"
#: kdirtreeview.cpp:440
msgid "Elapsed time: %1 reading directory %2"
msgstr "Eltelt idő: %1 %2 könyvtár olvasása "
#: kdirtreeview.cpp:704 kdirtreeview.cpp:1451
msgid "Bytes"
msgstr "bájt(ok)"
#: kdirtreeview.cpp:803
msgid "Disk usage"
msgstr "Lemezhasználat"
#: kdirtreeview.cpp:805
msgid "Please check your disk usage and clean up if you can. Thank you."
msgstr "Kérem ellenőrizze a lemez kihasználtságát és tisztítsa meg a felesleges fájloktól, ha akarja. Köszönöm."
#: kdirtreeview.cpp:809
msgid "Disk usage report generated by KDirStat"
msgstr "Lemezhasználat jelentés a KDirStat programtól"
#: kdirtreeview.cpp:868
msgid "<Files>"
msgstr "<Fájlok>"
#: kdirtreeview.cpp:1460
msgid "kB"
msgstr "KB"
#: kdirtreeview.cpp:1469
msgid "MB"
msgstr "MB"
#: kdirtreeview.cpp:1476
msgid "GB"
msgstr "GB"
#: kstdcleanup.cpp:26
msgid "Open in &Konqueror"
msgstr "Megnyitás &Konquerorban"
#: kstdcleanup.cpp:46
msgid "Open in &Terminal"
msgstr "Megnyitás &terminálban"
#: kstdcleanup.cpp:65
msgid "&Compress"
msgstr "&Tömörítés"
#: kstdcleanup.cpp:83
msgid "&make clean"
msgstr "&Tisztítás"
#: kstdcleanup.cpp:100
msgid "Delete T&rash Files"
msgstr "KDirStat &szemétkosár ürítése"
#: kstdcleanup.cpp:118
msgid "Delete (to Trash &Bin)"
msgstr "Kidobás a KDirStat &szemétkosárba)"
#: kstdcleanup.cpp:137
msgid "&Delete (no way to undelete!)"
msgstr "&Törlés (nem lehet visszavonni!)"
#: kcleanupcollection.cpp:234
#, c-format
msgid "User Defined Cleanup #&%1"
msgstr "Felhasználó által megadott tisztítás: #&%1"
#: kcleanupcollection.cpp:237
#, c-format
msgid "User Defined Cleanup #%1"
msgstr "Felhasználó által megadott tisztítás: #%1"
#: kdirstatsettings.cpp:39
msgid "Settings"
msgstr "Beállítások"
#: kdirstatsettings.cpp:68
msgid "&Cleanups"
msgstr "&Tisztítások"
#: kdirstatsettings.cpp:72
msgid "&Tree Colors"
msgstr "&Könyvtárfa színek"
#: kdirstatsettings.cpp:98
msgid ""
"Really revert all settings to their default values?\n"
"You will lose all changes you ever made!"
msgstr ""
"Valóban vissza szeretné állítani az összes értéket az alapértelmezett értékre?\n"
"Minden beállítást el fog veszteni!"
#: kdirstatsettings.cpp:101
msgid "&Really revert to defaults"
msgstr "&Alapértelmezett értékek visszaállítása"
#: kdirstatsettings.cpp:185
#, c-format
msgid "Tree level %1"
msgstr "Könyvtárszint %1"
#: kdirstatsettings.cpp:527
msgid "&Enabled"
msgstr "&Aktív"
#: kdirstatsettings.cpp:564
msgid "&Title:"
msgstr "&Cím : "
#: kdirstatsettings.cpp:565
msgid "&Command line:"
msgstr "&Parancssor: "
#: kdirstatsettings.cpp:567
#, c-format
msgid "%p full path"
msgstr "%p teljes útvonal"
#: kdirstatsettings.cpp:570
#, c-format
msgid "%n file / directory name without path"
msgstr "%n fájl / könyvtárnév útvonal nélkül"
#: kdirstatsettings.cpp:576
msgid "&Recurse into subdirectories"
msgstr "&Belépés az alkönyvtárakba is"
#: kdirstatsettings.cpp:581
msgid "&Ask for confirmation"
msgstr "&Kérdezzen rá a jóváhagyáshoz"
#: kdirstatsettings.cpp:587
msgid "Works for..."
msgstr "Működik az alábbinál..."
#: kdirstatsettings.cpp:593
msgid "&Directories"
msgstr "&Könyvtárak"
#: kdirstatsettings.cpp:594
msgid "&Files"
msgstr "&Fájlok"
#: kdirstatsettings.cpp:595
msgid "<Files> p&seudo entries"
msgstr "<Fájlok> &Pszeudo-bejegyzések"
#: kdirstatsettings.cpp:605
msgid "On local machine only ('file:/' protocol)"
msgstr "Csak a helyi gépen ('file:/' protokoll)"
#: kdirstatsettings.cpp:606
msgid "Network transparent (ftp, smb, tar, ...)"
msgstr "Transzparens hálózat (ftp, smb, tar, ...)"
#: kdirstatsettings.cpp:626
msgid "Refresh &Policy:"
msgstr "Frissítési &Szabályok: "
#: kdirstatsettings.cpp:637
msgid "No refresh"
msgstr "Nincs frissítés"
#: kdirstatsettings.cpp:638
msgid "Refresh this entry"
msgstr "Frissítse ezt a bejegyzést"
#: kdirstatsettings.cpp:639
msgid "Refresh this entry's parent"
msgstr "Frissítse a bejegyzés szülőjét"
#: kdirstatsettings.cpp:640
msgid "Assume entry has been deleted"
msgstr "Feltételezett törölt bejegyzés"
#: kdirstatfeedback.cpp:36
msgid "What is your general opinion about this program?"
msgstr "Mik az általános észrevételei a programmal kapcsolatban?"
#: kdirstatfeedback.cpp:38
msgid "It's one of my favourites"
msgstr "Egyike a kedvenceimnek"
#: kdirstatfeedback.cpp:39
msgid "I like it"
msgstr "Kedvelem"
#: kdirstatfeedback.cpp:40
msgid "It's sometimes useful"
msgstr "Néha hasznos"
#: kdirstatfeedback.cpp:41
msgid "It's average"
msgstr "Közepes"
#: kdirstatfeedback.cpp:42
msgid "Nice try, but this could be done better"
msgstr "Szép próbálkozás, de lehetne jobb is"
#: kdirstatfeedback.cpp:43
msgid "It's poor"
msgstr "Szegényes"
#: kdirstatfeedback.cpp:44
msgid "It's useless"
msgstr "Használhatatlan"
#: kdirstatfeedback.cpp:45
msgid "It's crap"
msgstr "Rossz"
#: kdirstatfeedback.cpp:47
msgid "Which features of this program do you like?"
msgstr "Mely tulajdonságokat kedvel a programban?"
#: kdirstatfeedback.cpp:50
msgid "Which features don't you like?"
msgstr "Mely tulajdonságokat nem kedvel a programban?"
#: kdirstatfeedback.cpp:53
msgid "Which features do you never use?"
msgstr "Mely tulajdonságokat nem használ a programban?"
#: kdirstatfeedback.cpp:56
msgid "What is your favourite feature?"
msgstr "Melyek a kedvenc tulajdonságai?"
#: kdirstatfeedback.cpp:59
msgid "Are there features you are missing?"
msgstr "Mik a hiányos vagy hiányzó tulajdonságok?"
#: kdirstatfeedback.cpp:60
msgid "Yes, a lot! (please add comment below)"
msgstr "Igen, nagyon! (kérjük töltse ki a megjegyzés rovatot is)"
#: kdirstatfeedback.cpp:62
msgid "None"
msgstr "Semmi"
#: kdirstatfeedback.cpp:63
msgid "It has too many features already!"
msgstr "Túl sok tulajdonsága van már most is!"
#: kdirstatfeedback.cpp:65
msgid "How do you rate the stability of this program?"
msgstr "Hogyan osztályozná a program stabilitását? "
#: kdirstatfeedback.cpp:66
msgid "Rock solid"
msgstr "Sziklaszilárd"
#: kdirstatfeedback.cpp:67 kdirstatfeedback.cpp:74
msgid "Good"
msgstr "Jó"
#: kdirstatfeedback.cpp:68 kdirstatfeedback.cpp:75 kdirstatfeedback.cpp:82
#: kdirstatfeedback.cpp:89
msgid "Average"
msgstr "Közepes"
#: kdirstatfeedback.cpp:69 kdirstatfeedback.cpp:76
msgid "Poor"
msgstr "Szegényes"
#: kdirstatfeedback.cpp:70
msgid "It keeps crashing all the time"
msgstr "Mindig lefagy"
#: kdirstatfeedback.cpp:72
msgid "How do you rate the performance of this program?"
msgstr "Hogyan osztályozza a program teljesítményét?"
#: kdirstatfeedback.cpp:73
msgid "Great"
msgstr "Kitűnő"
#: kdirstatfeedback.cpp:77
msgid "It's so slow it drives me nuts"
msgstr "Túl lassú"
#: kdirstatfeedback.cpp:79
msgid "What is your experience with computers in general?"
msgstr "Mi a gyakorlata általában a számítógépekkel?"
#: kdirstatfeedback.cpp:80 kdirstatfeedback.cpp:87
msgid "Expert"
msgstr "Szakértő"
#: kdirstatfeedback.cpp:81 kdirstatfeedback.cpp:88
msgid "Fair"
msgstr "Megfelelő"
#: kdirstatfeedback.cpp:83 kdirstatfeedback.cpp:90
msgid "Learning"
msgstr "Tanuló"
#: kdirstatfeedback.cpp:84 kdirstatfeedback.cpp:91
msgid "Newbie"
msgstr "Újonc"
#: kdirstatfeedback.cpp:86
msgid "What is your experience with Unix/Linux systems?"
msgstr "Mi a gyakorlata Unix/Linux rendszerek terén?"
#: kdirstatfeedback.cpp:93
msgid "Did you have trouble figuring out how to work with this program?"
msgstr "Vázolná nekünk, hogyan dolgozik a programmal?"
#: kdirstatfeedback.cpp:95
msgid "No problem"
msgstr "Nincs probléma"
#: kdirstatfeedback.cpp:96
msgid "Some"
msgstr "Néha"
#: kdirstatfeedback.cpp:97
msgid "I'm still learning"
msgstr "Jelenleg még tanulok"
#: kdirstatfeedback.cpp:98
msgid "I didn't have a clue what to do at first"
msgstr "Nincs ötletem mit tegyek elsőként"
#: kdirstatfeedback.cpp:99
msgid "I still don't have a clue what to do"
msgstr "Nincs továbbra sem ötletem, mit tehetnék"
#: kdirstatfeedback.cpp:101
msgid "Where do you use this program most?"
msgstr "Hol használja legtöbbet a programot?"
#: kdirstatfeedback.cpp:102
msgid "At work"
msgstr "Munkahelyen"
#: kdirstatfeedback.cpp:103
msgid "At home"
msgstr "Otthon"
#: kdirstatfeedback.cpp:104
msgid "At university / school"
msgstr "Iskolában"
#: kdirstatfeedback.cpp:106
msgid "What is your primary role there?"
msgstr "Mi az elsődleges célja?"
#: kdirstatfeedback.cpp:107 kdirstatfeedback.cpp:115
msgid "Home user"
msgstr "Otthoni felhasználó"
#: kdirstatfeedback.cpp:108 kdirstatfeedback.cpp:116
msgid "Student"
msgstr "Diák"
#: kdirstatfeedback.cpp:109 kdirstatfeedback.cpp:117
msgid "Educational (teacher / professor)"
msgstr "Oktató (tanársegéd / tanár)"
#: kdirstatfeedback.cpp:110 kdirstatfeedback.cpp:118
msgid "Non-computer related work"
msgstr "Nem számítógépes munka"
#: kdirstatfeedback.cpp:111 kdirstatfeedback.cpp:119
msgid "Developer"
msgstr "Fejlesztő"
#: kdirstatfeedback.cpp:112 kdirstatfeedback.cpp:120
msgid "System administrator"
msgstr "Rendszeradminisztrátor"
#: kdirstatfeedback.cpp:114
msgid "Do you have any other roles there?"
msgstr "Vannak egyéb feladatai itt?"
#: kdirstatfeedback.cpp:122
msgid "How did you get to know this program?"
msgstr "Hol találta meg a programot?"
#: kdirstatfeedback.cpp:123
msgid "In a menu on my machine"
msgstr "A gépemen található menüből"
#: kdirstatfeedback.cpp:124
msgid "Somebody told me about it"
msgstr "Valaki mesélt róla"
#: kdirstatfeedback.cpp:125
msgid "On the internet"
msgstr "Az interneten"
#: kdirstatfeedback.cpp:126
msgid "Printed magazine / book"
msgstr "Nyomtatott újságban / könyvben"
#: kdirstatfeedback.cpp:127
msgid "Other (please add comment below)"
msgstr "Egyéb (Kérjük részletezze alább)"
#: kdirstatfeedback.cpp:129
msgid "Did you ever get a KDirStat mail report telling you to clean up disk space?"
msgstr "Kapott már valaha KDirStat levél jelentést a lemezhely tisztításáról?"
#: kdirstatfeedback.cpp:132
msgid "Would you recommend this program to a friend?"
msgstr "Ajánlaná a programot egy barátjának?"
#: kdirstatfeedback.cpp:143
msgid "The directory tree display in general"
msgstr "Az általános könyvtárfa megjelenítés"
#: kdirstatfeedback.cpp:144
msgid "Percentage bars as graphical display of relative sizes"
msgstr "A százalékjelzők grafikusak relatív méretezéssel"
#: kdirstatfeedback.cpp:145
msgid "Files apart from directories in a separate <Files> item"
msgstr "A könyvtárakban eltérő fájlok, külön <Fájlok> bejegyzéssel "
#: kdirstatfeedback.cpp:147
msgid "Cleanup actions in general"
msgstr "Általános akciók törlése"
#: kdirstatfeedback.cpp:148
msgid "Predefined cleanup actions"
msgstr "Előre megadott akciók törlése"
#: kdirstatfeedback.cpp:149
msgid "User defined cleanup actions"
msgstr "Felhasználó által megadott akciók törlése"
#: kdirstatfeedback.cpp:150
msgid "Cleanup action configuration"
msgstr "Az akció beállítások törlése"
#: kdirstatfeedback.cpp:152
msgid "Different colors in percentage bars"
msgstr "Eltérő színek a százalékjelzőkben"
#: kdirstatfeedback.cpp:153
msgid "Tree color configuration"
msgstr "Könyvtárfa színek beállítása"
#: kdirstatfeedback.cpp:154
msgid "Staying on one file system"
msgstr "Maradjon egyetlen fájlrendszeren"
#: kdirstatfeedback.cpp:155
msgid "The \"mail to owner\" facility"
msgstr "A \"levél a felhasználónak\" lehetőség"
#: kdirstatfeedback.cpp:156
msgid "This \"feedback mail\" facility"
msgstr "A \"válaszlevél\" lehetőség"
#: kdirstatfeedback.cpp:158
msgid "Human readable sizes (kB, MB, ...)"
msgstr "Emberi mértékegységű méretek (KB, MB, ...)"
#: kdirstatfeedback.cpp:159
msgid "All the numbers in the tree display"
msgstr "Az összes szám a könyvtárfa nézetben"
#: kdirstatfeedback.cpp:160
msgid "Last change time of an entire directory tree"
msgstr "A teljes könyvtárba utolsó módosításának ideje"
#: kdirstatfeedback.cpp:161
msgid "The PacMan animation"
msgstr "A PacMan animáció"
#: kfeedback.cpp:35
msgid "Feedback"
msgstr "Visszajelzés"
#: kfeedback.cpp:41
msgid "&Mail this..."
msgstr "&Levél küldése..."
#: kfeedback.cpp:91
msgid ""
"<p><b>Please tell us your opinion about this program.</b></p><p>You will be "
"able to review everything in your mailer before any mail is sent.<br>Nothing "
"will be sent behind your back.</p>"
msgstr ""
"<p><b>Kérjük ossza meg velünk a programmal kapcsolatos észrevételeit.</b></p> "
"<p>Minden küldendő adatot lehetősége lesz mégegyszer átolvasni a levelezőprogramjában."
"<br>Semmit sem küldünk az Ön háta mögött.</p>"
#: kfeedback.cpp:116
msgid "Questions marked with "
msgstr "A csillaggal jelölt kérdéseket "
#: kfeedback.cpp:125
msgid " must be answered before a mail can be sent."
msgstr " meg kell válaszolni mielőtt a levél küldésre kerülne."
#: kfeedback.cpp:136
msgid "&Additional comments:"
msgstr "További &megjegyzések:"
#: kfeedback.cpp:314
msgid "yes"
msgstr "igen"
#: kfeedback.cpp:315
msgid "no"
msgstr "nem"
#: kdirstatui.rc:32
msgid "Clean &Up"
msgstr "&Tisztítás"
#: kdirstatui.rc:60
msgid "&Report"
msgstr "&Jelentés"
#~ #: kdirstatfeedback.cpp:61
#~ msgid "Some (please add comment below)"
#~ msgstr "Quelques-unes (veuillez ajouter vos commentaires ci-dessous)"

@ -0,0 +1,960 @@
# translation of it.po to Italiano
# Copyright (C) 2003 Free Software Foundation, Inc.
# Giuliano Colla <colla@copeca.it>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: it\n"
"POT-Creation-Date: 2003-11-11 10:55+0100\n"
"PO-Revision-Date: 2003-11-12 19:25+0100\n"
"Last-Translator: Giuliano Colla <colla@copeca.it>\n"
"Language-Team: Italiano\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.0\n"
#: kcleanupcollection.cpp:231
msgid "User Defined Cleanup #&%1"
msgstr "Pulizia personalizzata N. &%1"
#: kcleanupcollection.cpp:234
msgid "User Defined Cleanup #%1"
msgstr "Pulizia personalizzata N. %1"
#: kcleanup.cpp:169
msgid ""
"%1\n"
"in directory %2"
msgstr ""
"%1\n"
"nella directory %2"
#: kcleanup.cpp:173
msgid ""
"%1\n"
"for file %2"
msgstr ""
"%1\n"
"per il file %2"
#: kcleanup.cpp:178 kdirstatsettings.cpp:106
msgid "Please Confirm"
msgstr "Confermare"
#: kcleanup.cpp:179
msgid "Confirm"
msgstr "Conferma"
#: kdirstatapp.cpp:145
msgid "Open &URL..."
msgstr "Apri &URL..."
#: kdirstatapp.cpp:152
msgid "Refresh &All"
msgstr "&Aggiornare tutto"
#: kdirstatapp.cpp:156
msgid "Refresh &Selected"
msgstr "Aggiornare &Selezione"
#: kdirstatapp.cpp:160
msgid "Continue Reading at &Mount Point"
msgstr "Continua Lettura al punto di &Mount"
#: kdirstatapp.cpp:164
msgid "Stop Rea&ding"
msgstr "&Ferma Lettura"
#: kdirstatapp.cpp:173
msgid "Zoom in"
msgstr "Ingrandisci"
#: kdirstatapp.cpp:177
msgid "Zoom out"
msgstr "Rimpicciolisci"
#: kdirstatapp.cpp:181
msgid "Select Parent"
msgstr "Seleziona Padre"
#: kdirstatapp.cpp:185
msgid "Rebuild Treemap"
msgstr "Ricostruisci la Treemap"
#: kdirstatapp.cpp:189
msgid "Show Treemap"
msgstr "Mostra la Treemap"
#: kdirstatapp.cpp:193
msgid "Help about Treemaps"
msgstr "Aiuto sulle Treemap"
#: kdirstatapp.cpp:199
msgid "Send &Mail to Owner"
msgstr "Invia una e-&Mail al Proprietario"
#: kdirstatapp.cpp:203
msgid "Send &Feedback Mail..."
msgstr "Invia una E-mail di &Commento"
#: kdirstatapp.cpp:208
msgid "Opens a directory"
msgstr "Apre una Directory"
#: kdirstatapp.cpp:209
msgid "Opens a (possibly remote) directory"
msgstr "Apre una Directory (anche remota)"
#: kdirstatapp.cpp:210
msgid "Opens a recently used directory"
msgstr "Apre una Directory usata recentemente"
#: kdirstatapp.cpp:211
msgid "Closes the current directory"
msgstr "Chiude la Directory corrente"
#: kdirstatapp.cpp:212
msgid "Re-reads the entire directory tree"
msgstr "Ricarica l'intero albero di Directory"
#: kdirstatapp.cpp:213
msgid "Re-reads the selected subtree"
msgstr "Ricarica il sottoalbero selezionato"
#: kdirstatapp.cpp:214
msgid "Scan mounted file systems"
msgstr "Ricerca i filesystem montati"
#: kdirstatapp.cpp:215
msgid "Stops directory reading"
msgstr "Ferma la lettura della Directory"
#: kdirstatapp.cpp:216
msgid "Quits the application"
msgstr "Uscita dal programma"
#: kdirstatapp.cpp:217
msgid "Copies the URL of the selected item to the clipboard"
msgstr "Copia l'URL selezionato negli appunti"
#: kdirstatapp.cpp:218
msgid "Enables/disables the toolbar"
msgstr "Abilita/disabilita la barra degli strumenti"
#: kdirstatapp.cpp:219
msgid "Enables/disables the statusbar"
msgstr "Abilita/disabilita la barra di stato"
#: kdirstatapp.cpp:220
msgid "Enables/disables the treemap view"
msgstr "Abilita/disabilita la vista della Treemap"
#: kdirstatapp.cpp:221
msgid "Zoom treemap in"
msgstr "Ingrandisci la Treemap"
#: kdirstatapp.cpp:222
msgid "Zoom treemap out"
msgstr "Rimpicciolisci la Treemap"
#: kdirstatapp.cpp:223
msgid "Select parent"
msgstr "Seleziona Padre"
#: kdirstatapp.cpp:224
msgid "Rebuild treemap to fit into available space"
msgstr "Riadatta la Treemap allo spazio disponibile"
#: kdirstatapp.cpp:225
msgid "Opens the preferences dialog"
msgstr "Apre il dialogo delle preferenze"
#: kdirstatapp.cpp:226
msgid "Sends a mail to the owner of the selected subtree"
msgstr "Invia una e-mail al proprietario del sottoalbero selezionato"
#: kdirstatapp.cpp:301 kdirstatapp.cpp:335 kdirstatapp.cpp:445
#: kdirstatapp.cpp:460 kdirstatapp.cpp:472 kdirstatapp.cpp:485
#: kdirstatapp.cpp:494 kdirstatapp.cpp:506
msgid "Ready."
msgstr "Pronto."
#: kdirstatapp.cpp:328 kdirstatapp.cpp:438 kdirstatapp.cpp:467
msgid "Opening directory..."
msgstr "Apertura directory..."
#: kdirstatapp.cpp:440
msgid "Open Directory..."
msgstr "Apre Directory..."
#: kdirstatapp.cpp:452
msgid "Opening URL..."
msgstr "Apertura URL..."
#: kdirstatapp.cpp:455
msgid "Open URL..."
msgstr "Apri URL..."
#: kdirstatapp.cpp:479
msgid "Closing directory..."
msgstr "Chiusura Directory..."
#: kdirstatapp.cpp:492
msgid "Refreshing directory tree..."
msgstr "Aggiornamento albero..."
#: kdirstatapp.cpp:504
msgid "Refreshing selected subtree..."
msgstr "Aggiornamento sottoalbero scelto..."
#: kdirstatapp.cpp:684
msgid ""
"Now that you know this program for some time,\n"
"wouldn't you like to tell the authors your opinion about it?\n"
"\n"
"Open Source software depends on user feedback.\n"
"Your opinion can help us make the software better."
msgstr ""
"Ora che ha usato il programma per qualche tempo,\n"
"non vorrebbe dire agli autori la sua opinione in proposito?\n"
"\n"
"Il software Open Source si affida al parere degli utenti.\n"
"I suoi commenti ci possono aiutare a migliorarlo."
#: kdirstatapp.cpp:689
msgid "Please tell us your opinion!"
msgstr "Vi preghiamo di darci il vostro parere! "
#: kdirstatapp.cpp:690
msgid "Open &Feedback Form..."
msgstr "Apri il &Questionario ..."
#: kdirstatapp.cpp:691
msgid "&No, and don't ask again!"
msgstr "&No,e non chiedermelo più."
#: kdirstatfeedback.cpp:33
msgid "What is your general opinion about this program?"
msgstr "Quale è la sua opinione in generale su questo programma?"
#: kdirstatfeedback.cpp:35
msgid "It's one of my favourites"
msgstr "E' uno dei miei preferiti"
#: kdirstatfeedback.cpp:36
msgid "I like it"
msgstr "Mi piace"
#: kdirstatfeedback.cpp:37
msgid "It's sometimes useful"
msgstr "Qualche volta è utile"
#: kdirstatfeedback.cpp:38
msgid "It's average"
msgstr "E' nella media"
#: kdirstatfeedback.cpp:39
msgid "Nice try, but this could be done better"
msgstr "Buon tentativo, ma si poteva fare di meglio"
#: kdirstatfeedback.cpp:40
msgid "It's poor"
msgstr "E' molto modesto"
#: kdirstatfeedback.cpp:41
msgid "It's useless"
msgstr "E' inutile"
#: kdirstatfeedback.cpp:42
msgid "It's crap"
msgstr "Fa schifo!"
#: kdirstatfeedback.cpp:44
msgid "Which features of this program do you like?"
msgstr "Quali caratteristiche di questo programma le piacciono?"
#: kdirstatfeedback.cpp:47
msgid "Which features don't you like?"
msgstr "Quali caratteristiche non le piacciono?"
#: kdirstatfeedback.cpp:50
msgid "Which features do you never use?"
msgstr "Quali funzioni non usa mai?"
#: kdirstatfeedback.cpp:53
msgid "What is your favourite feature?"
msgstr "Quali funzioni predilige?"
#: kdirstatfeedback.cpp:56
msgid "Are there features you are missing?"
msgstr "Ci sono funzioni di cui sente la mancanza?"
#: kdirstatfeedback.cpp:57
msgid "Yes, a lot! (please add comment below)"
msgstr "Sì, molte! (Per piacere, aggiunga qui sotto le sue richieste)"
#: kdirstatfeedback.cpp:58
msgid "Some (please add comment below)"
msgstr "Alcune (Per piacere, aggiunga qui sotto le sue richieste)"
#: kdirstatfeedback.cpp:59
msgid "None"
msgstr "Nessuna"
#: kdirstatfeedback.cpp:60
msgid "It has too many features already!"
msgstr "Ha già anche troppe funzioni!"
#: kdirstatfeedback.cpp:62
msgid "How do you rate the stability of this program?"
msgstr "Come classifica la stabilità di questo programma?"
#: kdirstatfeedback.cpp:63
msgid "Rock solid"
msgstr "Come una roccia!"
#: kdirstatfeedback.cpp:64 kdirstatfeedback.cpp:71
msgid "Good"
msgstr "Buona"
#: kdirstatfeedback.cpp:65 kdirstatfeedback.cpp:72 kdirstatfeedback.cpp:79
#: kdirstatfeedback.cpp:86
msgid "Average"
msgstr "Media"
#: kdirstatfeedback.cpp:66 kdirstatfeedback.cpp:73
msgid "Poor"
msgstr "Modesta"
#: kdirstatfeedback.cpp:67
msgid "It keeps crashing all the time"
msgstr "Si pianta di continuo"
#: kdirstatfeedback.cpp:69
msgid "How do you rate the performance of this program?"
msgstr "Come classifica le prestazioni di questo programma?"
#: kdirstatfeedback.cpp:70
msgid "Great"
msgstr "Notevoli"
#: kdirstatfeedback.cpp:74
msgid "It's so slow it drives me nuts"
msgstr "E' così lento che mi fa impazzire"
#: kdirstatfeedback.cpp:76
msgid "What is your experience with computers in general?"
msgstr "Quale è la sua esperienza con i computers in generale?"
#: kdirstatfeedback.cpp:77 kdirstatfeedback.cpp:84
msgid "Expert"
msgstr "Esperto"
#: kdirstatfeedback.cpp:78 kdirstatfeedback.cpp:85
msgid "Fair"
msgstr "Abbastanza buona"
#: kdirstatfeedback.cpp:80 kdirstatfeedback.cpp:87
msgid "Learning"
msgstr "Sto imparando"
#: kdirstatfeedback.cpp:81 kdirstatfeedback.cpp:88
msgid "Newbie"
msgstr "Alle prime armi"
#: kdirstatfeedback.cpp:83
msgid "What is your experience with Unix/Linux systems?"
msgstr "Quale è la sua esperienza sui sitemi Unix/Linux?"
#: kdirstatfeedback.cpp:90
msgid "Did you have trouble figuring out how to work with this program in general?"
msgstr "Ha avuto problemi a capire come funziona questo programma in generale?"
#: kdirstatfeedback.cpp:92
msgid "No problem"
msgstr "Nessun problema"
#: kdirstatfeedback.cpp:93
msgid "Some"
msgstr "Qualche problema"
#: kdirstatfeedback.cpp:94 kdirstatfeedback.cpp:132
msgid "I'm still learning"
msgstr "Sto ancora imparando"
#: kdirstatfeedback.cpp:95
msgid "I didn't have a clue what to do at first"
msgstr "Non avevo un'idea di come fare"
#: kdirstatfeedback.cpp:96 kdirstatfeedback.cpp:133
msgid "I still don't have a clue what to do"
msgstr "Non ho ancora un'idea di come fare"
#: kdirstatfeedback.cpp:98
msgid "Where do you use this program most?"
msgstr "Dove usa questo programma prevalentemente?"
#: kdirstatfeedback.cpp:99
msgid "At work"
msgstr "Al lavoro"
#: kdirstatfeedback.cpp:100
msgid "At home"
msgstr "A casa"
#: kdirstatfeedback.cpp:101
msgid "At university / school"
msgstr "A scuola / all'Università"
#: kdirstatfeedback.cpp:103
msgid "What is your primary role there?"
msgstr "Quale è il suo ruolo in quel luogo?"
#: kdirstatfeedback.cpp:104 kdirstatfeedback.cpp:112
msgid "Home user"
msgstr "Utente privato"
#: kdirstatfeedback.cpp:105 kdirstatfeedback.cpp:113
msgid "Student"
msgstr "Studente"
#: kdirstatfeedback.cpp:106 kdirstatfeedback.cpp:114
msgid "Educational (teacher / professor)"
msgstr "Insegnante"
#: kdirstatfeedback.cpp:107 kdirstatfeedback.cpp:115
msgid "Non-computer related work"
msgstr "Lavoro non informatico"
#: kdirstatfeedback.cpp:108 kdirstatfeedback.cpp:116
msgid "Developer"
msgstr "Sviluppatore"
#: kdirstatfeedback.cpp:109 kdirstatfeedback.cpp:117
msgid "System administrator"
msgstr "Amministratore di sistema"
#: kdirstatfeedback.cpp:111
msgid "Do you have any other roles there?"
msgstr "Ricopre altri ruoli?"
#: kdirstatfeedback.cpp:119
msgid "How did you get to know this program?"
msgstr "Come è venuto a conoscenza di questo programma?"
#: kdirstatfeedback.cpp:120
msgid "In a menu on my machine"
msgstr "In un menu del mio computer"
#: kdirstatfeedback.cpp:121
msgid "Somebody told me about it"
msgstr "Qualcuno me ne ha parlato"
#: kdirstatfeedback.cpp:122
msgid "On the internet"
msgstr "Su Internet"
#: kdirstatfeedback.cpp:123
msgid "Printed magazine / book"
msgstr "Da riviste / libri"
#: kdirstatfeedback.cpp:124
msgid "Other (please add comment below)"
msgstr "Altro (si prega specificare sotto)"
#: kdirstatfeedback.cpp:126
msgid "Did you ever get a KDirStat mail report telling you to clean up disk space?"
msgstr "Ha mai ricevuto un report da KDirStat che suggeriva di liberare spazio sul disco?"
#: kdirstatfeedback.cpp:129
msgid "Could you figure yet out how to work with the treemaps?"
msgstr "E' già riuscito a orientarsi nell'uso delle Treemap?"
#: kdirstatfeedback.cpp:130
msgid "I became an expert at it"
msgstr "Sono diventato un esperto!"
#: kdirstatfeedback.cpp:131
msgid "I got a fairly good idea of it"
msgstr "Ne ho già un'idea abbastanza chiara"
#: kdirstatfeedback.cpp:134
msgid "Treemaps? Huh? What the hell is that?"
msgstr "Le Treemap? Che cosa diavolo sono?"
#: kdirstatfeedback.cpp:136
msgid "What do you think about the treemaps?"
msgstr "Che cosa pensa delle Treemap?"
#: kdirstatfeedback.cpp:137
msgid "They are useless"
msgstr "Sono inutili"
#: kdirstatfeedback.cpp:138
msgid "The display is confusing"
msgstr "La visualizzazione disorienta"
#: kdirstatfeedback.cpp:139
msgid "They look ugly"
msgstr "Sono brutte"
#: kdirstatfeedback.cpp:140
msgid "They look nice"
msgstr "Sono belle"
#: kdirstatfeedback.cpp:141
msgid "They help finding large files"
msgstr "Aiutano a trovare i file più lunghi"
#: kdirstatfeedback.cpp:142
msgid "I could do with the treemap view alone"
msgstr "Potrei lavorare solo con la vista a Treemap"
#: kdirstatfeedback.cpp:143
msgid "The combination of tree view and treemaps is great"
msgstr "La combinazione delle due viste, a albero e a Treemap, è una grande idea"
#: kdirstatfeedback.cpp:144
msgid "I want more info inside the treemap view"
msgstr "Vorrei più informazioni nella vista a Treemap"
#: kdirstatfeedback.cpp:145
msgid "Leave the treemaps as they are right now"
msgstr "Le Treemap mi vanno bene così come sono"
#: kdirstatfeedback.cpp:147
msgid "Would you recommend this program to a friend?"
msgstr "Consiglierebbe questo programma a un amico?"
#: kdirstatfeedback.cpp:158
msgid "The directory tree display in general"
msgstr "La presentazione in generale dell'albero delle directory"
#: kdirstatfeedback.cpp:159
msgid "Percentage bars as graphical display of relative sizes"
msgstr "Le barre come rappresentazione grafica delle dimensioni relative"
#: kdirstatfeedback.cpp:160
msgid "Files apart from directories in a separate <Files> item"
msgstr "I files distinti dalle directory in un oggetto <Files> a parte"
#: kdirstatfeedback.cpp:162
msgid "Treemaps in general"
msgstr "Le Treemap in generale"
#: kdirstatfeedback.cpp:163
msgid "The cushioned treemap rendering"
msgstr "La presentazione \"a cuscino\" delle Treemap"
#: kdirstatfeedback.cpp:165
msgid "Cleanup actions in general"
msgstr "Le funzioni di pulizia in generale"
#: kdirstatfeedback.cpp:166
msgid "Predefined cleanup actions"
msgstr "Le funzioni di pulizia predefinite"
#: kdirstatfeedback.cpp:167
msgid "User defined cleanup actions"
msgstr "Le funzioni di pulizia personalizzate"
#: kdirstatfeedback.cpp:168
msgid "Cleanup action configuration"
msgstr "La configurabilità delle funzioni di pulizia"
#: kdirstatfeedback.cpp:170
msgid "Different colors in percentage bars"
msgstr "I colori differenziati nelle barre"
#: kdirstatfeedback.cpp:171
msgid "Tree color configuration"
msgstr "La presentazione a colori dell'albero"
#: kdirstatfeedback.cpp:172
msgid "Staying on one file system"
msgstr "Il rimanere all'interno di un solo filesystem"
#: kdirstatfeedback.cpp:173
msgid "The \"mail to owner\" facility"
msgstr "La funzione \"Invia una e-mail al proprietario\""
#: kdirstatfeedback.cpp:174
msgid "This \"feedback mail\" facility"
msgstr "Questa posibilità di inviare commenti"
#: kdirstatfeedback.cpp:176
msgid "Human readable sizes (kB, MB, ...)"
msgstr "Dimensioni in valori comprensibili (KB, MB, ...)"
#: kdirstatfeedback.cpp:177
msgid "All the numbers in the tree display"
msgstr "Tutti i numeri nella presentazione ad albero"
#: kdirstatfeedback.cpp:178
msgid "Last change time of an entire directory tree"
msgstr "La data dell'ultimo cambiamento di un intero albero di directory"
#: kdirstatfeedback.cpp:179
msgid "The PacMan animation"
msgstr "L'animazione PacMan"
#: kdirstatsettings.cpp:37
msgid "Settings"
msgstr "Impostazioni"
#: kdirstatsettings.cpp:66
msgid "&Cleanups"
msgstr "&Pulizia"
#: kdirstatsettings.cpp:70
msgid "&Tree Colors"
msgstr "&Colori"
#: kdirstatsettings.cpp:74
msgid "Tree&map"
msgstr "&Treemap"
#: kdirstatsettings.cpp:78
msgid "&General"
msgstr "&Generali"
#: kdirstatsettings.cpp:104
msgid ""
"Really revert all settings to their default values?\n"
"You will lose all changes you ever made!"
msgstr ""
"Ripristinare tutte le impostazioni ai valori originali?\n"
"Tutte le modifiche che avete fatto andranno perse!"
#: kdirstatsettings.cpp:107
msgid "&Really Revert to Defaults"
msgstr "&Ripristina le impostazioni originali"
#: kdirstatsettings.cpp:193
msgid "Tree Level %1"
msgstr "Livello %1"
#: kdirstatsettings.cpp:529
msgid "&Enabled"
msgstr "&Abilitato"
#: kdirstatsettings.cpp:566
msgid "&Title:"
msgstr "&Titolo:"
#: kdirstatsettings.cpp:567
msgid "&Command Line:"
msgstr "Riga di &Comando:"
#: kdirstatsettings.cpp:569
#, c-format
msgid "%p Full Path"
msgstr "%p Percorso completo"
#: kdirstatsettings.cpp:572
#, c-format
msgid "%n File / Directory Name Without Path"
msgstr "%n File / Directory senza percorso"
#: kdirstatsettings.cpp:575
msgid "%t KDE Trash Directory"
msgstr "%t Directory Cestino di KDE"
#: kdirstatsettings.cpp:581
msgid "&Recurse into Subdirectories"
msgstr "&Recursione nelle sotto-directory"
#: kdirstatsettings.cpp:586
msgid "&Ask for Confirmation"
msgstr "Dom&anda Conferma"
#: kdirstatsettings.cpp:592
msgid "Works for..."
msgstr "Applica a..."
#: kdirstatsettings.cpp:598
msgid "&Directories"
msgstr "&Directory"
#: kdirstatsettings.cpp:599
msgid "&Files"
msgstr "&Files"
#: kdirstatsettings.cpp:600
msgid "<Files> P&seudo Entries"
msgstr "<Files>-P&seudo-voci"
#: kdirstatsettings.cpp:610
msgid "On Local Machine Only ('file:/' Protocol)"
msgstr "Solo computer locale (protocollo 'file./')"
#: kdirstatsettings.cpp:611
msgid "Network Transparent (ftp, smb, tar, ...)"
msgstr "Trasparente alla rete (ftp, smb, tar, ...)"
#: kdirstatsettings.cpp:631
msgid "Refresh &Policy:"
msgstr "&Politica di agiornamento:"
#: kdirstatsettings.cpp:642
msgid "No Refresh"
msgstr "Non aggiornare"
#: kdirstatsettings.cpp:643
msgid "Refresh This Entry"
msgstr "Aggiorna questa voce"
#: kdirstatsettings.cpp:644
msgid "Refresh This Entry's Parent"
msgstr "Aggiorna il Padre di questa voce"
#: kdirstatsettings.cpp:645
msgid "Assume Entry Has Been Deleted"
msgstr "Considera la voce come cancellata"
#: kdirstatsettings.cpp:715
msgid "Directory Reading"
msgstr "Lettura directory"
#: kdirstatsettings.cpp:718
msgid "Cross &File System Boundaries"
msgstr "Attraversa i confini tra &Filesystem"
#: kdirstatsettings.cpp:719
msgid "Use Optimized &Local Directory Read Methods"
msgstr "Usa lettura ottimizzata delle directory &locali"
#: kdirstatsettings.cpp:726
msgid "Animation"
msgstr "Animazione"
#: kdirstatsettings.cpp:729
msgid "P@cM@n Animation in Tool &Bar"
msgstr "Animazione P@cM@n nella &Barra Strumenti"
#: kdirstatsettings.cpp:730
msgid "P@cM@n Animation in Directory &Tree"
msgstr "Animazione P@cM@n nell'albero delle &Directory"
#: kdirstatsettings.cpp:809
msgid "S&quarify Treemap"
msgstr "Treemap S&quadrata"
#: kdirstatsettings.cpp:810
msgid "Use C&ushion Shading"
msgstr "Sfumatura a C&uscino"
#: kdirstatsettings.cpp:815
msgid "Cushion Parameters"
msgstr "Parametri Cuscino"
#: kdirstatsettings.cpp:820
msgid "Ambient &Light"
msgstr "&Luce Ambiente"
#: kdirstatsettings.cpp:830
msgid "&Height Scale"
msgstr "&Scala in altezza"
#: kdirstatsettings.cpp:840
msgid "Draw Lines if Lo&w Contrast"
msgstr "Con &Basso Contrasto traccia Linee"
#: kdirstatsettings.cpp:844
msgid "Always Draw &Grid"
msgstr "Disegna sempre &Griglia"
#: kdirstatsettings.cpp:847
msgid "Gr&id Color: "
msgstr "Colore Gr&iglia"
#: kdirstatsettings.cpp:857
msgid "Colors for Plain Treemaps"
msgstr "Colori delle Treemap semplici"
#: kdirstatsettings.cpp:860
msgid "&Files: "
msgstr "&Files: "
#: kdirstatsettings.cpp:865
msgid "&Directories: "
msgstr "&Directory: "
#: kdirstatsettings.cpp:870
msgid "Gr&id: "
msgstr "Gr&iglia: "
#: kdirstatsettings.cpp:884
msgid "Hi&ghlight R&ectangle: "
msgstr "Evidenzia R&ettangolo; "
#: kdirstatsettings.cpp:892
msgid "Minim&um Treemap Tile Size: "
msgstr "Dimensione &Minima Piastrelle Treemap"
#: kdirstatsettings.cpp:899
msgid "Auto-&Resize Treemap"
msgstr "Auto-&Ridimensiona Treemap"
#: kdirtree.cpp:1548 kdirtreeview.cpp:800
msgid "Bytes"
msgstr "Bytes"
#: kdirtree.cpp:1557
msgid "kB"
msgstr "KB"
#: kdirtree.cpp:1566
msgid "MB"
msgstr "MB"
#: kdirtree.cpp:1573
msgid "GB"
msgstr "GB"
#: kdirtreeview.cpp:62
msgid "Name"
msgstr "Nome"
#: kdirtreeview.cpp:64
msgid "Subtree Percentage"
msgstr "% Sottoalbero"
#: kdirtreeview.cpp:65
msgid "Percentage"
msgstr "Percentuale"
#: kdirtreeview.cpp:66
msgid "Subtree Total"
msgstr "Totale Sottoalbero"
#: kdirtreeview.cpp:68
msgid "Own Size"
msgstr "Dimens. Propria"
#: kdirtreeview.cpp:69
msgid "Items"
msgstr "Oggetti"
#: kdirtreeview.cpp:70
msgid "Files"
msgstr "File"
#: kdirtreeview.cpp:71
msgid "Subdirs"
msgstr "Sottodir."
#: kdirtreeview.cpp:72
msgid "Last Change"
msgstr "Ultima Modifica"
#: kdirtreeview.cpp:165
msgid "Read Jobs"
msgstr "Letture in corso"
#: kdirtreeview.cpp:434
msgid "Finished. Elapsed time: %1"
msgstr "Pronto. Tempo trascorso: %1"
#: kdirtreeview.cpp:464
msgid "Aborted. Elapsed time: %1"
msgstr "Annullato. Tempo trascorso: %1"
#: kdirtreeview.cpp:499
msgid "Elapsed time: %1 reading directory %2"
msgstr "Tempo trascorso: %1 Lettura directory %2"
#: kdirtreeview.cpp:907
msgid "Disk Usage"
msgstr "Utilizzo disco"
#: kdirtreeview.cpp:909
msgid "Please check your disk usage and clean up if you can. Thank you."
msgstr "Controllare l'occupazione del disco e ripulire, se possibile. Grazie."
#: kdirtreeview.cpp:913
msgid "Disk usage report generated by KDirStat"
msgstr "Rapporto sull'uso del disco generato da KDirStat"
#: kdirtreeview.cpp:976
msgid "<Files>"
msgstr "<File>"
#: kdirtreeview.cpp:1109
msgid "[%1 Read Jobs]"
msgstr "[%1 Letture in corso]"
#: kfeedback.cpp:32
msgid "Feedback"
msgstr "Commenti"
#: kfeedback.cpp:38
msgid "&Mail this..."
msgstr "&Invia questo..."
#: kfeedback.cpp:88
msgid ""
"<p><b>Please tell us your opinion about this program.</b></p><p>You will be "
"able to review everything in your mailer before any mail is sent.<br>Nothing "
"will be sent behind your back.</p>"
msgstr ""
"<p><b>Ci mandi la sua opinione su questo programma</b></p><p>Potrà "
"rivedere tutto nel suo programma di posta prima della spedizione.<br>Nulla "
"sarà spedito a sua insaputa.</p>"
#: kfeedback.cpp:113
msgid "Questions marked with "
msgstr "E' necessario rispondere alle domande contrassegnate da "
#: kfeedback.cpp:122
msgid " must be answered before a mail can be sent."
msgstr " perché l'e-mail possa essere spedita."
#: kfeedback.cpp:133
msgid "&Additional Comments:"
msgstr "Commenti &Aggiuntivi"
#: kfeedback.cpp:311
msgid "yes"
msgstr "sì"
#: kfeedback.cpp:312
msgid "no"
msgstr "no"
#: kstdcleanup.cpp:23
msgid "Open in &Konqueror"
msgstr "Apri in &Konqueror"
#: kstdcleanup.cpp:43
msgid "Open in &Terminal"
msgstr "Apri in un &Terminale"
#: kstdcleanup.cpp:62
msgid "&Compress"
msgstr "&Comprimi"
#: kstdcleanup.cpp:80
msgid "&make clean"
msgstr "&make clean"
#: kstdcleanup.cpp:97
msgid "Delete T&rash Files"
msgstr "Elimina Files da Cestina&re"
#: kstdcleanup.cpp:115
msgid "Delete (to Trash &Bin)"
msgstr "Elimina (al Cesti&no)"
#: kstdcleanup.cpp:134
msgid "&Delete (no way to undelete!)"
msgstr "Elimina (&Definitivamente)"
#: required for version 2.3.7
msgid "Clean &Up"
msgstr "&Pulizia"
msgid "&Report"
msgstr "&Rapporto"

@ -0,0 +1,973 @@
# translation of ja.po to
# translation of ja.po to
# translation of ja.po to
# translation of ja.po to
# Copyright (C) 2003 Free Software Foundation, Inc.
# Toyohiro Asukai <toyohiro@ksmplus.com>, 2003
#, no-wrap
msgid ""
msgstr ""
"Project-Id-Version: ja\n"
"POT-Creation-Date: 2003-10-27 14:56+0900\n"
"PO-Revision-Date: 2003-10-29 17:08+0900\n"
"Last-Translator: Toyohiro Asukai <toyohiro@ksmplus.com>\n"
"Language-Team: <Kdeveloper@kde.gr.jp>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 3.1.2\n"
#: kstdcleanup.cpp:23
msgid "Open in &Konqueror"
msgstr "Konquerorで開く(&K)"
#: kstdcleanup.cpp:43
msgid "Open in &Terminal"
msgstr "ターミナルで開く(&T)"
#: kstdcleanup.cpp:62
msgid "&Compress"
msgstr "圧縮(&C)"
#: kstdcleanup.cpp:80
msgid "&make clean"
msgstr "&make clean"
#: kstdcleanup.cpp:97
msgid "Delete T&rash Files"
msgstr "ゴミ箱を空に(&r)"
#: kstdcleanup.cpp:115
msgid "Delete (to Trash &Bin)"
msgstr "ゴミ箱へ(&B)"
#: kstdcleanup.cpp:134
msgid "&Delete (no way to undelete!)"
msgstr "削除(復元できない)(&D)"
#: kcleanup.cpp:169
msgid ""
"%1\n"
"in directory %2"
msgstr ""
"%1\n"
"ディレクトリー %2"
#: kcleanup.cpp:173
msgid ""
"%1\n"
"for file %2"
msgstr ""
"%1\n"
"ファイル %2"
#: kcleanup.cpp:178 kdirstatsettings.cpp:106
msgid "Please Confirm"
msgstr "確認してください"
#: kcleanup.cpp:179
msgid "Confirm"
msgstr "確認"
#: kfeedback.cpp:32
msgid "Feedback"
msgstr "フィードバック"
#: kfeedback.cpp:38
msgid "&Mail this..."
msgstr "これをメール(&M)..."
#: kfeedback.cpp:88
msgid ""
"<p><b>Please tell us your opinion about this program.</b></p><p>You will be "
"able to review everything in your mailer before any mail is sent.<br>Nothing "
"will be sent behind your back.</p>"
msgstr ""
"<p><b>我々にこのプログラムに関するあなたの意見を聞かせてください</b></p><p>"
"メールを送信する前に、あなたのメーラーですべてをチェックすることができます<br> "
"何も、あなたに黙って送信されません</p>"
#: kfeedback.cpp:113
msgid "Questions marked with "
msgstr "質問で、次の印"
#: kfeedback.cpp:122
msgid " must be answered before a mail can be sent."
msgstr "は、メールを送信する前に、答えていなければいけません"
#: kfeedback.cpp:133
msgid "&Additional Comments:"
msgstr "追加コメント(&A):"
#: kfeedback.cpp:311
msgid "yes"
msgstr "はい"
#: kfeedback.cpp:312
msgid "no"
msgstr "いいえ"
#: kdirtreeview.cpp:62
msgid "Name"
msgstr "名前"
#: kdirtreeview.cpp:64
msgid "Subtree Percentage"
msgstr "サブツリー・バーセンテージ"
#: kdirtreeview.cpp:65
msgid "Percentage"
msgstr "パーセンテージ"
#: kdirtreeview.cpp:66
msgid "Subtree Total"
msgstr "サブツリー合計"
#: kdirtreeview.cpp:68
msgid "Own Size"
msgstr "サイズ"
#: kdirtreeview.cpp:69
msgid "Items"
msgstr "アイテム数"
#: kdirtreeview.cpp:70
msgid "Files"
msgstr "ファイル数"
#: kdirtreeview.cpp:71
msgid "Subdirs"
msgstr "サブディレクトリ数"
#: kdirtreeview.cpp:72
msgid "Last Change"
msgstr "最終更新日"
#: kdirtreeview.cpp:165
msgid "Read Jobs"
msgstr "読取りジョブ"
#: kdirtreeview.cpp:434
#, c-format
msgid "Finished. Elapsed time: %1"
msgstr "終了. 経過時間 : %1"
#: kdirtreeview.cpp:464
#, c-format
msgid "Aborted. Elapsed time: %1"
msgstr "中断. 経過時間 : %1"
#: kdirtreeview.cpp:499
msgid "Elapsed time: %1 reading directory %2"
msgstr "経過時間: %1 ディレクトリ読込み中 %2"
#: kdirtree.cpp:1548 kdirtreeview.cpp:800
msgid "Bytes"
msgstr "バイト"
#: kdirtreeview.cpp:907
msgid "Disk Usage"
msgstr "ディスク使用状況"
#: kdirtreeview.cpp:909
msgid "Please check your disk usage and clean up if you can. Thank you."
msgstr "ディスク使用状況を確認してください、もし可能なら不要ファイルを削除してください"
#: kdirtreeview.cpp:913
msgid "Disk usage report generated by KDirStat"
msgstr "KDirStatによってディスク使用状況レポートを作成しました"
#: kdirtreeview.cpp:976
msgid "<Files>"
msgstr "<ファイル>"
#: kdirtreeview.cpp:1109
msgid "[%1 Read Jobs]"
msgstr "[%1 読込みジョブ]"
#: kdirstatfeedback.cpp:33
msgid "What is your general opinion about this program?"
msgstr "このプログラムに関するあなたの一般的な意見は、何ですか?"
#: kdirstatfeedback.cpp:35
msgid "It's one of my favourites"
msgstr "私のお気に入りの1つです"
#: kdirstatfeedback.cpp:36
msgid "I like it"
msgstr "好きです"
#: kdirstatfeedback.cpp:37
msgid "It's sometimes useful"
msgstr "時々役に立ちます"
#: kdirstatfeedback.cpp:38
msgid "It's average"
msgstr "普通です"
#: kdirstatfeedback.cpp:39
msgid "Nice try, but this could be done better"
msgstr "素晴らしいです、しかしより良くすることができます"
#: kdirstatfeedback.cpp:40
msgid "It's poor"
msgstr "貧弱です"
#: kdirstatfeedback.cpp:41
msgid "It's useless"
msgstr "役に立ちません"
#: kdirstatfeedback.cpp:42
msgid "It's crap"
msgstr "ナンセンスです"
#: kdirstatfeedback.cpp:44
msgid "Which features of this program do you like?"
msgstr "あなたは、このプログラムのどの機能が好きか?"
#: kdirstatfeedback.cpp:47
msgid "Which features don't you like?"
msgstr "あなたは、どの機能が嫌いですか?"
#: kdirstatfeedback.cpp:50
msgid "Which features do you never use?"
msgstr "あなたは、どの機能を使用しませんか?"
#: kdirstatfeedback.cpp:53
msgid "What is your favourite feature?"
msgstr "あなたの大好きな機能は、何ですか?"
#: kdirstatfeedback.cpp:56
msgid "Are there features you are missing?"
msgstr "あなたが見逃している機能が、ありますか?"
#: kdirstatfeedback.cpp:57
msgid "Yes, a lot! (please add comment below)"
msgstr "はい,たくさん!(コメントを下で記述)"
#: kdirstatfeedback.cpp:58
msgid "Some (please add comment below)"
msgstr "いくつか(コメントを下で記述)"
#: kdirstatfeedback.cpp:59
msgid "None"
msgstr "なし"
#: kdirstatfeedback.cpp:60
msgid "It has too many features already!"
msgstr "すでにあまりに多くの機能を持つ!"
#: kdirstatfeedback.cpp:62
msgid "How do you rate the stability of this program?"
msgstr "どのように、あなたはこのプログラムの安定度の評価を得ますか?"
#: kdirstatfeedback.cpp:63
msgid "Rock solid"
msgstr "信頼できる"
#: kdirstatfeedback.cpp:64 kdirstatfeedback.cpp:71
msgid "Good"
msgstr "良い"
#: kdirstatfeedback.cpp:65 kdirstatfeedback.cpp:72 kdirstatfeedback.cpp:79
#: kdirstatfeedback.cpp:86
msgid "Average"
msgstr "普通"
#: kdirstatfeedback.cpp:66 kdirstatfeedback.cpp:73
msgid "Poor"
msgstr "貧弱"
#: kdirstatfeedback.cpp:67
msgid "It keeps crashing all the time"
msgstr "ずっと、クラッシュし続ける"
#: kdirstatfeedback.cpp:69
msgid "How do you rate the performance of this program?"
msgstr "どのように、このプログラムのパフォーマンスの評価を得ますか?"
#: kdirstatfeedback.cpp:70
msgid "Great"
msgstr "とても良い"
#: kdirstatfeedback.cpp:74
msgid "It's so slow it drives me nuts"
msgstr "とても遅い"
#: kdirstatfeedback.cpp:76
msgid "What is your experience with computers in general?"
msgstr "コンピュータによるあなたの経験は?"
#: kdirstatfeedback.cpp:77 kdirstatfeedback.cpp:84
msgid "Expert"
msgstr "専門家"
#: kdirstatfeedback.cpp:78 kdirstatfeedback.cpp:85
msgid "Fair"
msgstr "一応(そこそこ)"
#: kdirstatfeedback.cpp:80 kdirstatfeedback.cpp:87
msgid "Learning"
msgstr "学習中"
#: kdirstatfeedback.cpp:81 kdirstatfeedback.cpp:88
msgid "Newbie"
msgstr "初心者"
#: kdirstatfeedback.cpp:83
msgid "What is your experience with Unix/Linux systems?"
msgstr "Unix/Linuxシステムによるあなたの経験は"
#: kdirstatfeedback.cpp:90
msgid "Did you have trouble figuring out how to work with this program in general?"
msgstr "どのようにこのプログラムの動作を理解するのに苦労したか?"
#: kdirstatfeedback.cpp:92
msgid "No problem"
msgstr "苦労しない"
#: kdirstatfeedback.cpp:93
msgid "Some"
msgstr "時々"
#: kdirstatfeedback.cpp:94 kdirstatfeedback.cpp:132
msgid "I'm still learning"
msgstr "まだ、学習中"
#: kdirstatfeedback.cpp:95
msgid "I didn't have a clue what to do at first"
msgstr "何を最初にすればいいか手がかりがなかった"
#: kdirstatfeedback.cpp:96 kdirstatfeedback.cpp:133
msgid "I still don't have a clue what to do"
msgstr "まだ何をしたら良いか解らない"
#: kdirstatfeedback.cpp:98
msgid "Where do you use this program most?"
msgstr "どこで、あなたは最もこのプログラムを使うか?"
#: kdirstatfeedback.cpp:99
msgid "At work"
msgstr "仕事で"
#: kdirstatfeedback.cpp:100
msgid "At home"
msgstr "自宅で"
#: kdirstatfeedback.cpp:101
msgid "At university / school"
msgstr "大学/学校で"
#: kdirstatfeedback.cpp:103
msgid "What is your primary role there?"
msgstr "あなたの主な役割は?"
#: kdirstatfeedback.cpp:104 kdirstatfeedback.cpp:112
msgid "Home user"
msgstr "自宅ユーザ"
#: kdirstatfeedback.cpp:105 kdirstatfeedback.cpp:113
msgid "Student"
msgstr "学生"
#: kdirstatfeedback.cpp:106 kdirstatfeedback.cpp:114
msgid "Educational (teacher / professor)"
msgstr "教育者(先生/教授)"
#: kdirstatfeedback.cpp:107 kdirstatfeedback.cpp:115
msgid "Non-computer related work"
msgstr "非コンピュータ関連した仕事"
#: kdirstatfeedback.cpp:108 kdirstatfeedback.cpp:116
msgid "Developer"
msgstr "開発者"
#: kdirstatfeedback.cpp:109 kdirstatfeedback.cpp:117
msgid "System administrator"
msgstr "システム管理者"
#: kdirstatfeedback.cpp:111
msgid "Do you have any other roles there?"
msgstr "あなたは、他の役割を持っていますか?"
#: kdirstatfeedback.cpp:119
msgid "How did you get to know this program?"
msgstr "どのように、あなたはこのプログラムを知りましたか?"
#: kdirstatfeedback.cpp:120
msgid "In a menu on my machine"
msgstr "私のマシンのメニューで"
#: kdirstatfeedback.cpp:121
msgid "Somebody told me about it"
msgstr "誰かが、私に教えた"
#: kdirstatfeedback.cpp:122
msgid "On the internet"
msgstr "インターネットの上で"
#: kdirstatfeedback.cpp:123
msgid "Printed magazine / book"
msgstr "書籍 マガジン/本"
#: kdirstatfeedback.cpp:124
msgid "Other (please add comment below)"
msgstr "その他 (コメントを下で記述)"
#: kdirstatfeedback.cpp:126
msgid "Did you ever get a KDirStat mail report telling you to clean up disk space?"
msgstr "ディスクスペースをきれいにするようにKDirStatメール・レポートを得ましたか"
#: kdirstatfeedback.cpp:129
msgid "Could you figure yet out how to work with the treemaps?"
msgstr "Could you figure yet out how to work with the treemaps?"
#: kdirstatfeedback.cpp:130
msgid "I became an expert at it"
msgstr "私はエキスパートになりました"
#: kdirstatfeedback.cpp:131
msgid "I got a fairly good idea of it"
msgstr "私は、かなりよい考えを思いつきました。"
#: kdirstatfeedback.cpp:134
msgid "Treemaps? Huh? What the hell is that?"
msgstr "ツリーマップ?へえー? 一体全体、それは何ですか"
#: kdirstatfeedback.cpp:136
msgid "What do you think about the treemaps?"
msgstr "ツリーマップについての貴方の考えは?"
#: kdirstatfeedback.cpp:137
msgid "They are useless"
msgstr "役立ちません"
#: kdirstatfeedback.cpp:138
msgid "The display is confusing"
msgstr "表示は混同しています"
#: kdirstatfeedback.cpp:139
msgid "They look ugly"
msgstr "醜く見えます"
#: kdirstatfeedback.cpp:140
msgid "They look nice"
msgstr "よく見えます"
#: kdirstatfeedback.cpp:141
msgid "They help finding large files"
msgstr "大きなファイルを見つけることを支援します"
#: kdirstatfeedback.cpp:142
msgid "I could do with the treemap view alone"
msgstr "私は、ツリーマップ表示を単独で必要とします。"
#: kdirstatfeedback.cpp:143
msgid "The combination of tree view and treemaps is great"
msgstr "ツリー表示およびツリーマップのコンビネーションは良いです"
#: kdirstatfeedback.cpp:144
msgid "I want more info inside the treemap view"
msgstr "私は、ツリーマップ表示の内部のより多くの情報を望みます。"
#: kdirstatfeedback.cpp:145
msgid "Leave the treemaps as they are right now"
msgstr "それらが今ちょうどあるように、ツリーマップを残します"
#: kdirstatfeedback.cpp:147
msgid "Would you recommend this program to a friend?"
msgstr "あなたは、このプログラムを友人に推薦しますか?"
#: kdirstatfeedback.cpp:158
msgid "The directory tree display in general"
msgstr "ディレクトリーツリーを表示する"
#: kdirstatfeedback.cpp:159
msgid "Percentage bars as graphical display of relative sizes"
msgstr "関連するサイズのグラフィックディスプレイとしてのパーセンテージ・バー"
#: kdirstatfeedback.cpp:160
msgid "Files apart from directories in a separate <Files> item"
msgstr "別々の<ファイル>項目でのディレクトリーからは、別ファイルとして"
#: kdirstatfeedback.cpp:162
msgid "Treemaps in general"
msgstr "ツリーマップ(一般)"
#: kdirstatfeedback.cpp:163
msgid "The cushioned treemap rendering"
msgstr "ツリーマップレンダー"
#: kdirstatfeedback.cpp:165
msgid "Cleanup actions in general"
msgstr "クリーンアップ動作"
#: kdirstatfeedback.cpp:166
msgid "Predefined cleanup actions"
msgstr "定義されたクリーンアップ動作"
#: kdirstatfeedback.cpp:167
msgid "User defined cleanup actions"
msgstr "ユーザー定義した、クリーンアップ動作"
#: kdirstatfeedback.cpp:168
msgid "Cleanup action configuration"
msgstr "クリーンアップ動作設定"
#: kdirstatfeedback.cpp:170
msgid "Different colors in percentage bars"
msgstr "パーセンテージ・バーでの異なる色"
#: kdirstatfeedback.cpp:171
msgid "Tree color configuration"
msgstr "ツリーカラー構成"
#: kdirstatfeedback.cpp:172
msgid "Staying on one file system"
msgstr "1つのファイルシステム上に"
#: kdirstatfeedback.cpp:173
msgid "The \"mail to owner\" facility"
msgstr "\"オーナーへのメール\" 機能"
#: kdirstatfeedback.cpp:174
msgid "This \"feedback mail\" facility"
msgstr "\"フィードバックメール\" 機能"
#: kdirstatfeedback.cpp:176
msgid "Human readable sizes (kB, MB, ...)"
msgstr "判読可能なサイズkBMB..."
#: kdirstatfeedback.cpp:177
msgid "All the numbers in the tree display"
msgstr "ツリー表示での全ての数"
#: kdirstatfeedback.cpp:178
msgid "Last change time of an entire directory tree"
msgstr "ディレクトリーツリーの最後の変更時間"
#: kdirstatfeedback.cpp:179
msgid "The PacMan animation"
msgstr "パックマン・アニメーション"
#: kdirstatsettings.cpp:37
msgid "Settings"
msgstr "設定"
#: kdirstatsettings.cpp:66
msgid "&Cleanups"
msgstr "クリーンアップ(&C)"
#: kdirstatsettings.cpp:70
msgid "&Tree Colors"
msgstr "ツリー色(&T)"
#: kdirstatsettings.cpp:74
msgid "Tree&map"
msgstr "ツリーマップ(&m)"
#: kdirstatsettings.cpp:78
msgid "&General"
msgstr "一般(&G)"
#: kdirstatsettings.cpp:104
msgid ""
"Really revert all settings to their default values?\n"
"You will lose all changes you ever made!"
msgstr ""
"本当に、全ての設定値をデフォルト値に戻しますか?\n"
"貴方は、これまでに作った全ての変更を失います!"
#: kdirstatsettings.cpp:107
msgid "&Really Revert to Defaults"
msgstr "本当に、デフォルト値に戻します。(&R)"
#: kdirstatsettings.cpp:193
#, c-format
msgid "Tree Level %1"
msgstr "ツリーレベル %1"
#: kdirstatsettings.cpp:529
msgid "&Enabled"
msgstr "有効(&E)"
#: kdirstatsettings.cpp:566
msgid "&Title:"
msgstr "タイトル(&T):"
#: kdirstatsettings.cpp:567
msgid "&Command Line:"
msgstr "コマンドライン(&C):"
#: kdirstatsettings.cpp:569
#, c-format
msgid "%p Full Path"
msgstr "%p フルパス"
#: kdirstatsettings.cpp:572
#, c-format
msgid "%n File / Directory Name Without Path"
msgstr "%n パスのない、ファイル/ディレクトリ名"
#: kdirstatsettings.cpp:575
msgid "%t KDE Trash Directory"
msgstr "%t KDE ゴミ箱のディレクトリー"
#: kdirstatsettings.cpp:581
msgid "&Recurse into Subdirectories"
msgstr "サブディレクトリへの再帰(&R)"
#: kdirstatsettings.cpp:586
msgid "&Ask for Confirmation"
msgstr "確認を求める(&A)"
#: kdirstatsettings.cpp:592
msgid "Works for..."
msgstr "動作..."
#: kdirstatsettings.cpp:598
msgid "&Directories"
msgstr "ディレクトリ(&D)"
#: kdirstatsettings.cpp:599
msgid "&Files"
msgstr "ファイル(&F)"
#: kdirstatsettings.cpp:600
msgid "<Files> P&seudo Entries"
msgstr "<ファイル> 疑似エントリー(&s)"
#: kdirstatsettings.cpp:610
msgid "On Local Machine Only ('file:/' Protocol)"
msgstr "ローカルマシン上のみ ('file:/' protocol)"
#: kdirstatsettings.cpp:611
msgid "Network Transparent (ftp, smb, tar, ...)"
msgstr "ネットワークトランスペアレント(ftp, smb, tar, ...)"
#: kdirstatsettings.cpp:631
msgid "Refresh &Policy:"
msgstr "リフレッシュのポリシー(&P):"
#: kdirstatsettings.cpp:642
msgid "No Refresh"
msgstr "リフレッシュなし"
#: kdirstatsettings.cpp:643
msgid "Refresh This Entry"
msgstr "このエントリをリフレッシュ"
#: kdirstatsettings.cpp:644
msgid "Refresh This Entry's Parent"
msgstr "エントリーの親をリフレッシュ"
#: kdirstatsettings.cpp:645
msgid "Assume Entry Has Been Deleted"
msgstr "エントリーが削除されたと仮定"
#: kdirstatsettings.cpp:715
msgid "Directory Reading"
msgstr "ディレクトリーの読込み"
#: kdirstatsettings.cpp:718
msgid "Cross &File System Boundaries"
msgstr "クロス・ファイル・システム境界(&F)"
#: kdirstatsettings.cpp:719
msgid "Use Optimized &Local Directory Read Methods"
msgstr "ローカルディレクトリーを最適化(&L)"
#: kdirstatsettings.cpp:726
msgid "Animation"
msgstr "アニメーション"
#: kdirstatsettings.cpp:729
msgid "P@cM@n Animation in Tool &Bar"
msgstr "パックマンアニメーションツールバー(&B)"
#: kdirstatsettings.cpp:730
msgid "P@cM@n Animation in Directory &Tree"
msgstr "ディレクトリーツリー内のパックマンアニメーション(&T)"
#: kdirstatsettings.cpp:809
msgid "S&quarify Treemap"
msgstr "四角のツリーマップ(&q)"
#: kdirstatsettings.cpp:810
msgid "Use C&ushion Shading"
msgstr "濃淡な図形(&u)"
#: kdirstatsettings.cpp:815
msgid "Cushion Parameters"
msgstr "パラメータ"
#: kdirstatsettings.cpp:820
msgid "Ambient &Light"
msgstr "アンビアント・ライト(&L)"
#: kdirstatsettings.cpp:830
msgid "&Height Scale"
msgstr "高さ(&H)"
#: kdirstatsettings.cpp:840
msgid "Draw Lines if Lo&w Contrast"
msgstr "低いコントラスト時の描画ライン(&w)"
#: kdirstatsettings.cpp:844
msgid "Always Draw &Grid"
msgstr "グリッド表示(&G)"
#: kdirstatsettings.cpp:847
msgid "Gr&id Color: "
msgstr "グリッド色(&i): "
#: kdirstatsettings.cpp:857
msgid "Colors for Plain Treemaps"
msgstr "簡易・ツリーマップ時の色"
#: kdirstatsettings.cpp:860
msgid "&Files: "
msgstr "ファイル(&F): "
#: kdirstatsettings.cpp:865
msgid "&Directories: "
msgstr "ディレクトリ(&D): "
#: kdirstatsettings.cpp:870
msgid "Gr&id: "
msgstr "グリッド(&i): "
#: kdirstatsettings.cpp:884
msgid "Hi&ghlight R&ectangle: "
msgstr "ハイライト(&g)・長方形(&e): "
#: kdirstatsettings.cpp:892
msgid "Minim&um Treemap Tile Size: "
msgstr "最小のツリーマップ・タイル・サイズ(&u): "
#: kdirstatsettings.cpp:899
msgid "Auto-&Resize Treemap"
msgstr "自動リサイズ・ツリーマップ(&R)"
#: kdirtree.cpp:1557
msgid "kB"
msgstr "kB"
#: kdirtree.cpp:1566
msgid "MB"
msgstr "MB"
#: kdirtree.cpp:1573
msgid "GB"
msgstr "GB"
#: kdirstatapp.cpp:145
msgid "Open &URL..."
msgstr "URLを開く(&U)..."
#: kdirstatapp.cpp:152
msgid "Refresh &All"
msgstr "全てリフレッシュ(&A)"
#: kdirstatapp.cpp:156
msgid "Refresh &Selected"
msgstr "選択した項目のリフレッシュ(&S)"
#: kdirstatapp.cpp:160
msgid "Continue Reading at &Mount Point"
msgstr "マウント・ポイントで読み続ける(&M)"
#: kdirstatapp.cpp:164
msgid "Stop Rea&ding"
msgstr "読込み中止(&d)"
#: kdirstatapp.cpp:173
msgid "Zoom in"
msgstr "ズームイン"
#: kdirstatapp.cpp:177
msgid "Zoom out"
msgstr "ズームアウト"
#: kdirstatapp.cpp:181
msgid "Select Parent"
msgstr "親を選択"
#: kdirstatapp.cpp:185
msgid "Rebuild Treemap"
msgstr "ツリーマップの再構築"
#: kdirstatapp.cpp:189
msgid "Show Treemap"
msgstr "ツリーマップ表示"
#: kdirstatapp.cpp:193
msgid "Help about Treemaps"
msgstr "ツリーマップのヘルプ"
#: kdirstatapp.cpp:199
msgid "Send &Mail to Owner"
msgstr "オーナーにメイル送信(&M)"
#: kdirstatapp.cpp:203
msgid "Send &Feedback Mail..."
msgstr "フィードバックメール送信(&F)..."
#: kdirstatapp.cpp:208
msgid "Opens a directory"
msgstr "ディレクトリを開きます"
#: kdirstatapp.cpp:209
msgid "Opens a (possibly remote) directory"
msgstr "(恐らく遠隔)ディレクトリーを開きます"
#: kdirstatapp.cpp:210
msgid "Opens a recently used directory"
msgstr "最近用いられているディレクトリーを開きます"
#: kdirstatapp.cpp:211
msgid "Closes the current directory"
msgstr "カレント・ディレクトリを閉じます"
#: kdirstatapp.cpp:212
msgid "Re-reads the entire directory tree"
msgstr "再度ディレクトリー全体を読みます"
#: kdirstatapp.cpp:213
msgid "Re-reads the selected subtree"
msgstr "選択されたサブツリーを再度読みます"
#: kdirstatapp.cpp:214
msgid "Scan mounted file systems"
msgstr "マウントしたファイル・システムをスキャンします"
#: kdirstatapp.cpp:215
msgid "Stops directory reading"
msgstr "ディレクトリーの読込みを中止"
#: kdirstatapp.cpp:216
msgid "Quits the application"
msgstr "アプリケーションを中止します"
#: kdirstatapp.cpp:217
msgid "Copies the URL of the selected item to the clipboard"
msgstr "選択されたアイテムのURLをクリップボードにコピーします"
#: kdirstatapp.cpp:218
msgid "Enables/disables the toolbar"
msgstr "ツールバーを表示/非表示"
#: kdirstatapp.cpp:219
msgid "Enables/disables the statusbar"
msgstr "ステータスバーを表示/非表示"
#: kdirstatapp.cpp:220
msgid "Enables/disables the treemap view"
msgstr "ツリーマップを表示/非表示"
#: kdirstatapp.cpp:221
msgid "Zoom treemap in"
msgstr "ツリーマップズームイン"
#: kdirstatapp.cpp:222
msgid "Zoom treemap out"
msgstr "ツリーマップズームアウト"
#: kdirstatapp.cpp:223
msgid "Select parent"
msgstr "親を選択"
#: kdirstatapp.cpp:224
msgid "Rebuild treemap to fit into available space"
msgstr "利用可能なスペースに入れるべきツリーマップを再構築"
#: kdirstatapp.cpp:225
msgid "Opens the preferences dialog"
msgstr "プレファレンス・ダイアログを開く"
#: kdirstatapp.cpp:226
msgid "Sends a mail to the owner of the selected subtree"
msgstr "選択されたサブツリーの所有者へメールを送信"
#: kdirstatapp.cpp:301 kdirstatapp.cpp:335 kdirstatapp.cpp:445
#: kdirstatapp.cpp:460 kdirstatapp.cpp:472 kdirstatapp.cpp:485
#: kdirstatapp.cpp:494 kdirstatapp.cpp:506
msgid "Ready."
msgstr "準備ができています"
#: kdirstatapp.cpp:328 kdirstatapp.cpp:438 kdirstatapp.cpp:467
msgid "Opening directory..."
msgstr "ディレクトリーを開いてます..."
#: kdirstatapp.cpp:440
msgid "Open Directory..."
msgstr "ディレクトリー開きます"
#: kdirstatapp.cpp:452
msgid "Opening URL..."
msgstr "URLを開いています..."
#: kdirstatapp.cpp:455
msgid "Open URL..."
msgstr "URL開きます..."
#: kdirstatapp.cpp:479
msgid "Closing directory..."
msgstr "ディレクトリーを閉じています..."
#: kdirstatapp.cpp:492
msgid "Refreshing directory tree..."
msgstr "ディレクトリーツリーのリフレッシュ中..."
#: kdirstatapp.cpp:504
msgid "Refreshing selected subtree..."
msgstr "選択されたサブツリーのリフレッシュ中..."
#: kdirstatapp.cpp:684
msgid ""
"Now that you know this program for some time,\n"
"wouldn't you like to tell the authors your opinion about it?\n"
"\n"
"Open Source software depends on user feedback.\n"
"Your opinion can help us make the software better."
msgstr ""
"このプログラムを知っているので\n"
"著者にあなたの見解を伝えることはいかがではないでしょうか?\n"
"\n"
"Open Source ソフトウェアはユーザ・フィードバックに依存します。\n"
"あなたの意見は、私たちがソフトウェアをよりよくするのを助けることができます。"
#: kdirstatapp.cpp:689
msgid "Please tell us your opinion!"
msgstr "私たちにあなたの意見を伝えてください!"
#: kdirstatapp.cpp:690
msgid "Open &Feedback Form..."
msgstr "フィードバックフォームを開く(&F)..."
#: kdirstatapp.cpp:691
msgid "&No, and don't ask again!"
msgstr "いいえ、再び尋ねないでください!(&N)"
#: kcleanupcollection.cpp:231
#, c-format
msgid "User Defined Cleanup #&%1"
msgstr "ユーザ・クリーンアップを定義しました #&%1"
#: kcleanupcollection.cpp:234
#, c-format
msgid "User Defined Cleanup #%1"
msgstr "ユーザ・クリーンアップを定義しました #%1"
#: kdirstatui.rc:34
msgid "Clean &Up"
msgstr "クリーンアップ(&U)"
#: kdirstatui.rc:75
msgid "&Treemap"
msgstr "ツリーマップ(&T)"
#: kdirstatui.rc:75
msgid "&Report"
msgstr "レポート(&R)"

@ -0,0 +1 @@
timestamp

@ -0,0 +1,3 @@
doc
kdirstat
po
Loading…
Cancel
Save