summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2016-03-26 20:11:54 +0100
committerSlávek Banko <slavek.banko@axis.cz>2016-03-26 20:11:54 +0100
commitb0263695595db848002728b3ebbd8b27fd08ca8c (patch)
tree085d0b4a9f07462145c0cd6d15b306fe5ad2c1bc
downloadtde-style-ia-ora-b0263695595db848002728b3ebbd8b27fd08ca8c.tar.gz
tde-style-ia-ora-b0263695595db848002728b3ebbd8b27fd08ca8c.zip
Initial import of ia-ora 1.0.8
-rw-r--r--AUTHORS1
-rw-r--r--COPYING340
-rw-r--r--ChangeLog0
-rw-r--r--Doxyfile275
-rw-r--r--INSTALL167
-rw-r--r--Makefile.am22
-rw-r--r--Makefile.cvs10
-rw-r--r--NEWS0
-rw-r--r--README0
-rw-r--r--TODO0
-rw-r--r--configure.in.in6
-rw-r--r--ia_ora.spec82
-rw-r--r--src/Makefile.am1
-rw-r--r--src/kwin/Makefile.am19
-rw-r--r--src/kwin/config/Makefile.am14
-rw-r--r--src/kwin/config/config.cpp102
-rw-r--r--src/kwin/config/config.h55
-rw-r--r--src/kwin/config/configdialog.ui53
-rw-r--r--src/kwin/iaora.cpp665
-rw-r--r--src/kwin/iaora.desktop5
-rw-r--r--src/kwin/iaora.h126
-rw-r--r--src/kwin/iaorabutton.cpp528
-rw-r--r--src/kwin/iaorabutton.h85
-rw-r--r--src/kwin/iaoraclient.cpp514
-rw-r--r--src/kwin/iaoraclient.h73
-rw-r--r--src/kwin/misc.cpp49
-rw-r--r--src/kwin/misc.h28
-rw-r--r--src/widget/Makefile.am26
-rw-r--r--src/widget/bitmaps.h85
-rw-r--r--src/widget/ia_ora.cpp3426
-rw-r--r--src/widget/ia_ora.h308
-rw-r--r--src/widget/ia_ora.themerc6
32 files changed, 7071 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..2fb489b
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Laurent Montel <lmontel@mandriva.com>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..5b6e7c6
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 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
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ChangeLog
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..c74393a
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,275 @@
+# Doxyfile 1.4.1-KDevelop
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = ia_ora.kdevelop
+PROJECT_NUMBER = 0.1
+OUTPUT_DIRECTORY =
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = /home/montel/
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = YES
+FILE_VERSION_FILTER =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = /home/montel/ia_ora
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.C \
+ *.CC \
+ *.C++ \
+ *.II \
+ *.I++ \
+ *.H \
+ *.HH \
+ *.H++ \
+ *.CS \
+ *.PHP \
+ *.PHP3 \
+ *.M \
+ *.MM \
+ *.C \
+ *.H \
+ *.tlh \
+ *.diff \
+ *.patch \
+ *.moc \
+ *.xpm \
+ *.dox
+RECURSIVE = yes
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = yes
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = ia_ora.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 1000
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..02a4a07
--- /dev/null
+++ b/INSTALL
@@ -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.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..8a2284f
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,22 @@
+SUBDIRS = $(TOPSUBDIRS)
+
+$(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:
+ cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common package-messages
+ $(MAKE) -C po merge
+
+EXTRA_DIST = admin COPYING configure.in.in
+
+dist-hook:
+ cd $(top_distdir) && perl admin/am_edit -padmin
+ cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs
diff --git a/Makefile.cvs b/Makefile.cvs
new file mode 100644
index 0000000..4c0afd1
--- /dev/null
+++ b/Makefile.cvs
@@ -0,0 +1,10 @@
+all:
+ @echo "This Makefile is only for the CVS repository"
+ @echo "This will be deleted before making the distribution"
+ @echo ""
+ $(MAKE) -f admin/Makefile.common cvs
+
+dist:
+ $(MAKE) -f admin/Makefile.common dist
+
+.SILENT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/NEWS
diff --git a/README b/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/README
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TODO
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000..ddca40b
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,6 @@
+#MIN_CONFIG(3.2.0)
+
+AM_INIT_AUTOMAKE(ia_ora-kde, 1.0.8)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
diff --git a/ia_ora.spec b/ia_ora.spec
new file mode 100644
index 0000000..315e7fc
--- /dev/null
+++ b/ia_ora.spec
@@ -0,0 +1,82 @@
+Summary: Ia Ora theme for kde
+Name: ia_ora
+Version: 1.0
+Release: %mkrel 2
+License: GPL
+Group: Graphical desktop/Other
+URL: http://www.mandrivalinux.com/
+BuildRequires: kdelibs-devel
+BuildRequires: kdebase-devel >= 3.1.94-11mdk
+Source0: %{name}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+
+%description
+Mandriva Ia Ora theme
+
+
+%package kde
+Summary: Mandriva theme for KDE - Widget design
+Group: Graphical desktop/KDE
+
+%description kde
+Mandriva theme for KDE - Widget design
+
+%package kde-kwin
+Summary: Mandriva theme for KDE - Window Decorations
+Group: Graphical desktop/KDE
+
+%description kde-kwin
+Mandriva theme for KDE - Window Decorations
+
+
+%prep
+%setup -q -n%name
+
+%build
+make -f admin/Makefile.common cvs
+
+export QTDIR=%qtdir
+export KDEDIR=%_prefix
+
+export LD_LIBRARY_PATH=$QTDIR/%_lib:$KDEDIR/%_lib:$LD_LIBRARY_PATH
+export PATH=$QTDIR/bin:$KDEDIR/bin:$PATH
+
+%configure2_5x \
+%if "%{_lib}" != "lib"
+ --enable-libsuffix="%(A=%{_lib}; echo ${A/lib/})" \
+%endif
+ --with-xinerama
+%make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%makeinstall_std
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files kde-kwin
+%defattr(-,root,root,-)
+%_libdir/kde3/kwin3_iaora.la
+%_libdir/kde3/kwin3_iaora.so
+%_libdir/kde3/kwin_iaora_config.la
+%_libdir/kde3/kwin_iaora_config.so
+%_datadir/apps/kwin/iaora.desktop
+
+
+
+%files kde
+%defattr(-,root,root,-)
+%_libdir/kde3/plugins/styles/ia_ora.la
+%_libdir/kde3/plugins/styles/ia_ora.so
+%_datadir/apps/kstyle/themes/ia_ora.themerc
+
+%changelog
+* Thu Sep 07 2006 Laurent MONTEL <lmontel@mandriva.com> 1.0-2
+- Some fixes
+
+* Mon Sep 04 2006 Laurent MONTEL <lmontel@mandriva.com> 1.0-1
+- Initial package
+
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..cc6a276
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS=widget kwin
diff --git a/src/kwin/Makefile.am b/src/kwin/Makefile.am
new file mode 100644
index 0000000..5e52b07
--- /dev/null
+++ b/src/kwin/Makefile.am
@@ -0,0 +1,19 @@
+AUTOMAKE_OPTIONS = foreign
+
+SUBDIRS = config
+
+KDE_CXXFLAGS = -DQT_PLUGIN
+
+INCLUDES = -I$(srcdir)/../../lib $(all_includes)
+
+kwindir = $(kde_datadir)/kwin/
+kwin_DATA = iaora.desktop
+
+kde_module_LTLIBRARIES = kwin3_iaora.la
+kwin3_iaora_la_SOURCES = iaora.cpp iaoraclient.cpp iaorabutton.cpp misc.cpp
+kwin3_iaora_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+kwin3_iaora_la_LIBADD = $(LIB_KDEUI) -lkdecorations -lqt-mt -lkdecore -lkdefx
+kwin3_iaora_la_METASOURCES = AUTO
+
+DISTCLEANFILES = $(kwin3_iaora_la_METASOURCES)
+
diff --git a/src/kwin/config/Makefile.am b/src/kwin/config/Makefile.am
new file mode 100644
index 0000000..e4f9c03
--- /dev/null
+++ b/src/kwin/config/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = kwin_iaora_config.la
+
+kwin_iaora_config_la_SOURCES = config.cpp configdialog.ui
+kwin_iaora_config_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+kwin_iaora_config_la_LIBADD = $(LIB_KDEUI) -lqt-mt -lkdecore
+
+METASOURCES = AUTO
+noinst_HEADERS = config.h
+DISTCLEANFILES = $(METASOURCES)
+
+lnkdir = $(kde_datadir)/kwin
+
diff --git a/src/kwin/config/config.cpp b/src/kwin/config/config.cpp
new file mode 100644
index 0000000..6320c23
--- /dev/null
+++ b/src/kwin/config/config.cpp
@@ -0,0 +1,102 @@
+/*
+ Copyright (C) 2006 Montel Laurent <lmontel@mandriva.com>
+ based on plastik
+ Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+
+#include "config.h"
+#include "configdialog.h"
+
+IaOraConfig::IaOraConfig(KConfig* config, QWidget* parent)
+ : QObject(parent), m_config(0), m_dialog(0)
+{
+ // create the configuration object
+ m_config = new KConfig("kwiniaorarc");
+ KGlobal::locale()->insertCatalogue("kwin_clients");
+
+ // create and show the configuration dialog
+ m_dialog = new ConfigDialog(parent);
+ m_dialog->show();
+
+ // load the configuration
+ load(config);
+
+ // setup the connections
+ connect(m_dialog->menuClose, SIGNAL(toggled(bool)),
+ this, SIGNAL(changed()));
+ connect(m_dialog->titleShadow, SIGNAL(toggled(bool)),
+ this, SIGNAL(changed()));
+}
+
+IaOraConfig::~IaOraConfig()
+{
+ delete m_dialog;
+ delete m_config;
+}
+
+void IaOraConfig::load(KConfig*)
+{
+ m_config->setGroup("General");
+
+ bool menuClose = m_config->readBoolEntry("CloseOnMenuDoubleClick", true);
+ m_dialog->menuClose->setChecked(menuClose);
+ bool titleShadow = m_config->readBoolEntry("TitleShadow", true);
+ m_dialog->titleShadow->setChecked(titleShadow);
+}
+
+void IaOraConfig::save(KConfig*)
+{
+ m_config->setGroup("General");
+
+ m_config->writeEntry("CloseOnMenuDoubleClick", m_dialog->menuClose->isChecked() );
+ m_config->writeEntry("TitleShadow", m_dialog->titleShadow->isChecked() );
+ m_config->sync();
+}
+
+void IaOraConfig::defaults()
+{
+ m_dialog->menuClose->setChecked(false);
+ m_dialog->titleShadow->setChecked(true);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Plugin Stuff //
+//////////////////////////////////////////////////////////////////////////////
+
+extern "C"
+{
+ KDE_EXPORT QObject* allocate_config(KConfig* config, QWidget* parent) {
+ return (new IaOraConfig(config, parent));
+ }
+}
+
+#include "config.moc"
diff --git a/src/kwin/config/config.h b/src/kwin/config/config.h
new file mode 100644
index 0000000..9be0ea5
--- /dev/null
+++ b/src/kwin/config/config.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2006 Montel Laurent <lmontel@mandriva.com>
+ based on plastik
+ Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KNIFTYCONFIG_H
+#define KNIFTYCONFIG_H
+
+#include <qobject.h>
+
+class QButtonGroup;
+class QGroupBox;
+class KConfig;
+class ConfigDialog;
+
+class IaOraConfig : public QObject
+{
+ Q_OBJECT
+public:
+ IaOraConfig(KConfig* config, QWidget* parent);
+ ~IaOraConfig();
+
+signals:
+ void changed();
+
+public slots:
+ void load(KConfig *config);
+ void save(KConfig *config);
+ void defaults();
+
+private:
+ KConfig *m_config;
+ ConfigDialog *m_dialog;
+};
+
+#endif // KNIFTYCONFIG_H
diff --git a/src/kwin/config/configdialog.ui b/src/kwin/config/configdialog.ui
new file mode 100644
index 0000000..a6167b4
--- /dev/null
+++ b/src/kwin/config/configdialog.ui
@@ -0,0 +1,53 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ConfigDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>535</width>
+ <height>88</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Config Dialog</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>titleShadow</cstring>
+ </property>
+ <property name="text">
+ <string>Use shadowed &amp;text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want the titlebar text to have a 3D look with a shadow behind it.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>menuClose</cstring>
+ </property>
+ <property name="text">
+ <string>Close windows by double clicking the menu button</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want windows to be closed when you double click the menu button, similar to Microsoft Windows.</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>titleShadow</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/kwin/iaora.cpp b/src/kwin/iaora.cpp
new file mode 100644
index 0000000..887baff
--- /dev/null
+++ b/src/kwin/iaora.cpp
@@ -0,0 +1,665 @@
+/* Ia Ora KWin window decoration
+ Copyright (C) 2006 Laurent Montel <lmontel@mandriva.com>
+ Based on plastik code
+ Copyright (C) 2003-2005 Sandro Giessl <sandro@giessl.com>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <qbitmap.h>
+#include <qpainter.h>
+#include <qimage.h>
+#include <qapplication.h>
+#include <kconfig.h>
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+
+#include "misc.h"
+#include "iaora.h"
+#include "iaora.moc"
+#include "iaoraclient.h"
+#include "iaorabutton.h"
+
+namespace KWinIaOra
+{
+
+IaOraHandler::IaOraHandler()
+{
+ memset(m_pixmaps, 0, sizeof(QPixmap*)*NumPixmaps*2*2); // set elements to 0
+ memset(m_bitmaps, 0, sizeof(QBitmap*)*NumButtonIcons*2);
+
+ reset(0);
+}
+
+IaOraHandler::~IaOraHandler()
+{
+ for (int t=0; t < 2; ++t)
+ for (int a=0; a < 2; ++a)
+ for (int i=0; i < NumPixmaps; ++i)
+ delete m_pixmaps[t][a][i];
+ for (int t=0; t < 2; ++t)
+ for (int i=0; i < NumButtonIcons; ++i)
+ delete m_bitmaps[t][i];
+}
+
+bool IaOraHandler::reset(unsigned long changed)
+{
+ // we assume the active font to be the same as the inactive font since the control
+ // center doesn't offer different settings anyways.
+ m_titleFont = KDecoration::options()->font(true, false); // not small
+ m_titleFontTool = KDecoration::options()->font(true, true); // small
+
+ // check if we are in reverse layout mode
+ m_reverse = QApplication::reverseLayout();
+
+ // read in the configuration
+ readConfig();
+
+ // pixmaps probably need to be updated, so delete the cache.
+ for (int t=0; t < 2; ++t) {
+ for (int a=0; a < 2; ++a) {
+ for (int i=0; i < NumPixmaps; i++) {
+ if (m_pixmaps[t][a][i]) {
+ delete m_pixmaps[t][a][i];
+ m_pixmaps[t][a][i] = 0;
+ }
+ }
+ }
+ }
+ for (int t=0; t < 2; ++t) {
+ for (int i=0; i < NumButtonIcons; i++) {
+ if (m_bitmaps[t][i]) {
+ delete m_bitmaps[t][i];
+ m_bitmaps[t][i] = 0;
+ }
+ }
+ }
+
+ // Do we need to "hit the wooden hammer" ?
+ bool needHardReset = true;
+ // TODO: besides the Color and Font settings I can maybe handle more changes
+ // without a hard reset. I will do this later...
+ if (changed & SettingColors || changed & SettingFont)
+ {
+ needHardReset = false;
+ } else if (changed & SettingButtons) {
+ // handled by KCommonDecoration
+ needHardReset = false;
+ }
+
+ if (needHardReset) {
+ return true;
+ } else {
+ resetDecorations(changed);
+ return false;
+ }
+}
+
+KDecoration* IaOraHandler::createDecoration( KDecorationBridge* bridge )
+{
+ return new IaOraClient( bridge, this );
+}
+
+bool IaOraHandler::supports( Ability ability )
+{
+ switch( ability )
+ {
+ case AbilityAnnounceButtons:
+ case AbilityButtonMenu:
+ case AbilityButtonOnAllDesktops:
+ case AbilityButtonSpacer:
+ case AbilityButtonHelp:
+ case AbilityButtonMinimize:
+ case AbilityButtonMaximize:
+ case AbilityButtonClose:
+ case AbilityButtonAboveOthers:
+ case AbilityButtonBelowOthers:
+ case AbilityButtonShade:
+ return true;
+ default:
+ return false;
+ };
+}
+
+void IaOraHandler::readConfig()
+{
+ // create a config object
+ KConfig config("kwiniaorarc");
+ config.setGroup("General");
+
+ // grab settings
+ m_titleShadow = config.readBoolEntry("TitleShadow", true);
+
+ QFontMetrics fm(m_titleFont); // active font = inactive font
+ int titleHeightMin = config.readNumEntry("MinTitleHeight", 22);
+ // The title should strech with bigger font sizes!
+ m_titleHeight = QMAX(titleHeightMin, fm.height() + 4); // 4 px for the shadow etc.
+ // have an even title/button size so the button icons are fully centered...
+ if ( m_titleHeight%2 == 0)
+ m_titleHeight++;
+
+ fm = QFontMetrics(m_titleFontTool); // active font = inactive font
+ int titleHeightToolMin = config.readNumEntry("MinTitleHeightTool", 22);
+ // The title should strech with bigger font sizes!
+ m_titleHeightTool = QMAX(titleHeightToolMin, fm.height() ); // don't care about the shadow etc.
+ // have an even title/button size so the button icons are fully centered...
+ if ( m_titleHeightTool%2 == 0)
+ m_titleHeightTool++;
+
+ m_menuClose = config.readBoolEntry("CloseOnMenuDoubleClick", true);
+}
+
+QColor IaOraHandler::getBorderColor( KWinIaOra::ColorType type, const bool active)
+{
+ //Force colors
+ switch (type) {
+ case Border1:
+ return QColor( "#EFF3F7" );
+ break;
+ case Border2:
+ return QColor( "#DFE7EF" );
+ break;
+ case Border3:
+ return QColor( "#C7D3DF" );
+ break;
+ default:
+ return Qt::black;
+ }
+ return Qt::black;
+}
+
+QColor IaOraHandler::getShadowColor()
+{
+ QColor col = KDecoration::options()->color(ColorTitleBar, true);
+ if ( col == QColor("#4964AE") )
+ {
+ return QColor( "#000000" );
+ }
+ //default Arctic color
+ else if ( col == QColor("#8ec7ff") )
+ {
+ return QColor( "#666666" );
+ }
+ else if ( col == QColor("7BAAE7") )
+ {
+ return QColor( "#666666" );
+ }
+ //default Orange color
+ else if ( col == QColor("#F7B610") )
+ {
+ return QColor( "#666666" );
+ }
+ //default Gray color
+ else if ( col == QColor("#c7d3df") )
+ {
+ return QColor( "#333333" );
+ }
+ return QColor( "#666666" );
+}
+
+QColor IaOraHandler::getGradientColor( KWinIaOra::ColorType type, const bool active)
+{
+ QColor col = KDecoration::options()->color(ColorTitleBar, active);
+ //default Blue color
+ if ( active )
+ {
+ if ( col == QColor("#4964AE") )
+ {
+ switch (type) {
+ case TitleGradient1:
+ return QColor("#8EA2CF");
+ break;
+ case TitleGradient2:
+ return QColor("#415DA6");
+ break;
+ case TitleGradient4:
+ return QColor("#4964AE");
+ break;
+ case TitleGradient3:
+ return QColor("#21459C");
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ //default Smooth color
+ else if ( col == QColor("#7BAAE7") )
+ {
+ switch (type) {
+ case TitleGradient1:
+ return QColor("#ADCFFF");
+ break;
+ case TitleGradient2:
+ return QColor("#5A8AD6");
+ break;
+ case TitleGradient4:
+ return QColor("#7BAAE7");
+ break;
+ case TitleGradient3:
+ return QColor("#427DC6");
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ //default Orange color
+ else if ( col == QColor("#F7B610") )
+ {
+ switch (type) {
+ case TitleGradient1:
+ return QColor("#FFCB10");
+ break;
+ case TitleGradient2:
+ return QColor("#ffa208");
+ break;
+ case TitleGradient4:
+ return QColor("#f7b610");
+ break;
+ case TitleGradient3:
+ return QColor("#f79600");
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ //default Arctic color
+ else if ( col == QColor("#8ec7ff") )
+ {
+ switch (type) {
+ case TitleGradient1:
+ return QColor("#c7dfff");
+ break;
+ case TitleGradient2:
+ return QColor("#79beff");
+ break;
+ case TitleGradient4:
+ return QColor("#8ec7ff");
+ break;
+ case TitleGradient3:
+ return QColor("#69b6ff");
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ //default Gray color
+ else if ( col == QColor("#c7d3df") )
+ {
+ switch (type) {
+ case TitleGradient1:
+ return QColor("#cfd7df");
+ break;
+ case TitleGradient2:
+ return QColor("#a6b2c7");
+ break;
+ case TitleGradient4:
+ return QColor("#c7d3df");
+ break;
+ case TitleGradient3:
+ return QColor("#8692a6");
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ else
+ {
+ switch (type) {
+ case TitleGradient1:
+ return col.light( 150 );
+ break;
+ case TitleGradient2:
+ return col.dark( 112 );
+ break;
+ case TitleGradient4:
+ return col;
+ break;
+ case TitleGradient3:
+ return col.dark( 130 );
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ }
+ else
+ {
+ if ( col == QColor( "#EFF3F7" ) )
+ {
+ switch (type) {
+ case TitleGradient1:
+ return QColor( "#DFE7EF" );
+ break;
+ case TitleGradient2:
+ return QColor( "#C7D3DF" );
+ break;
+ case TitleGradient4:
+ return QColor( "#CFD7DF" );
+ break;
+ case TitleGradient3:
+ return QColor( "#B6C3CF" );
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+ else
+ {
+ //create algo
+ switch (type) {
+ case TitleGradient1:
+ return col.dark(107);
+ break;
+ case TitleGradient2:
+ return col.dark( 117 );
+ break;
+ case TitleGradient4:
+ return col.dark( 115 );
+ break;
+ case TitleGradient3:
+ return col.dark( 131 );
+ break;
+ default:
+ return Qt::black;
+ }
+ }
+
+ }
+ return Qt::black;
+}
+
+QColor IaOraHandler::getColor(KWinIaOra::ColorType type, const bool active)
+{
+ switch (type) {
+ case TitleBorder:
+ return KDecoration::options()->color(ColorTitleBar, active);
+ case TitleGradient1:
+ case TitleGradient2:
+ case TitleGradient4:
+ case TitleGradient3:
+ return getGradientColor( type, active);
+ case Border1:
+ case Border2:
+ case Border3:
+ return getBorderColor( type, active);
+ case ShadeTitleLight:
+ return alphaBlendColors(KDecoration::options()->color(ColorTitleBar, active),
+ Qt::white, active?205:215);
+ //todo verify
+ case ShadeTitleDark:
+ return alphaBlendColors(KDecoration::options()->color(ColorTitleBar, active),
+ Qt::black, active?205:215);
+ break;
+ case TitleFont:
+ return KDecoration::options()->color(ColorFont, active);
+ default:
+ return Qt::black;
+ }
+}
+
+void IaOraHandler::pretile( QPixmap *&pix, int size, Qt::Orientation dir ) const
+{
+ QPixmap *newpix;
+ QPainter p;
+
+ if ( dir == Qt::Horizontal )
+ newpix = new QPixmap( size, pix->height() );
+ else
+ newpix = new QPixmap( pix->width(), size );
+
+ p.begin( newpix );
+ p.drawTiledPixmap( newpix->rect(), *pix ) ;
+ p.end();
+
+ delete pix;
+ pix = newpix;
+}
+
+const QPixmap &IaOraHandler::pixmap(Pixmaps type, bool active, bool toolWindow)
+{
+ if (m_pixmaps[toolWindow][active][type])
+ return *m_pixmaps[toolWindow][active][type];
+
+ QPixmap *pm = 0;
+
+ switch (type) {
+ case TitleBarTileTop:
+ {
+ pm = new QPixmap(1, 3);
+ QPainter painter(pm);
+ painter.setPen(getColor(TitleBorder, active));
+ painter.drawPoint(0,0);
+
+ painter.fillRect(0,1,pm->width(),pm->height()-1,getColor(TitleGradient1, active));
+ painter.end();
+ pretile(pm, 64, Qt::Horizontal);
+ break;
+ }
+ case TitleBarTile:
+ {
+ const int titleBarTileHeight = (toolWindow ? m_titleHeightTool : m_titleHeight) + 2;
+ // gradient used as well in TitleBarTileTop as TitleBarTile
+ const int gradientHeight = 2 + titleBarTileHeight;
+ QPixmap gradient(1, gradientHeight);
+ QPainter painter(&gradient);
+ KPixmap tempPixmap;
+ tempPixmap.resize(1, gradientHeight/2);
+ KPixmapEffect::gradient(tempPixmap,
+ getColor(TitleGradient1, active),
+ getColor(TitleGradient2, active),
+ KPixmapEffect::VerticalGradient);
+ painter.drawPixmap(0,0, tempPixmap);
+ tempPixmap.resize(1, gradientHeight - (gradientHeight/2));
+ KPixmapEffect::gradient(tempPixmap,
+ getColor(TitleGradient3, active) ,
+ getColor(TitleGradient4, active),
+ KPixmapEffect::VerticalGradient);
+ painter.drawPixmap(0,gradientHeight/2, tempPixmap);
+ painter.end();
+
+ pm = new QPixmap(1, titleBarTileHeight);
+ painter.begin(pm);
+ painter.drawPixmap(0, 0, gradient, 0,2);
+ painter.setPen(getColor(TitleGradient3, active).dark(110) );
+ painter.drawPoint(0,titleBarTileHeight-1);
+
+ painter.end();
+
+ pretile(pm, 64, Qt::Horizontal);
+
+ break;
+ }
+
+ case TitleBarLeft:
+ {
+ const int h = 4 + (toolWindow ? m_titleHeightTool : m_titleHeight) + 2;
+
+ pm = new QPixmap(3, h);
+ QPainter painter(pm);
+
+ painter.drawTiledPixmap(0,0, 3, 3, pixmap(TitleBarTileTop, active, toolWindow) );
+ painter.drawTiledPixmap(0,3, 3, h-3, pixmap(TitleBarTile, active, toolWindow) );
+
+ painter.setPen(getColor(TitleBorder, active) );
+ painter.drawLine(0,0, 0,h);
+
+ break;
+ }
+ case TitleBarRight:
+ {
+ const int h = 4 + (toolWindow ? m_titleHeightTool : m_titleHeight) + 2;
+
+ pm = new QPixmap(3, h);
+ QPainter painter(pm);
+
+ painter.drawTiledPixmap(0,0, 3, 3, pixmap(TitleBarTileTop, active, toolWindow) );
+ painter.drawTiledPixmap(0,3, 3, h-3, pixmap(TitleBarTile, active, toolWindow) );
+
+ painter.setPen(getColor(TitleBorder, active));
+ painter.drawLine(2,0, 2,h);
+
+ break;
+ }
+
+ case BorderLeftTile:
+ {
+ pm = new QPixmap(3, 1);
+ QPainter painter(pm);
+ painter.setPen(getColor(Border3, active) );
+ painter.drawPoint(0, 0);
+ painter.setPen(getColor(Border2, active) );
+ painter.drawPoint(1, 0);
+
+ painter.setPen(getColor(Border1, active) );
+ painter.drawPoint(2,0);
+ painter.end();
+ pretile(pm, 64, Qt::Vertical);
+ break;
+ }
+
+ case BorderRightTile:
+ {
+
+ pm = new QPixmap(3, 1);
+ QPainter painter(pm);
+ painter.setPen(getColor(Border1, active) );
+ painter.drawPoint(0,0);
+ painter.setPen(getColor(Border2, active) );
+ painter.drawPoint(1, 0);
+ painter.setPen(getColor(Border3, active) );
+ painter.drawPoint(2, 0);
+ painter.end();
+ pretile(pm, 64, Qt::Vertical);
+
+ break;
+ }
+
+ case BorderBottomLeft:
+ {
+ pm = new QPixmap(3, 3);
+ QPainter painter(pm);
+ painter.drawTiledPixmap(0,0,3,3, pixmap(BorderBottomTile, active, toolWindow) );
+ painter.setPen(getColor(Border3, active) );
+ painter.drawLine(0,0, 0,3);
+
+ painter.setPen(getColor(Border1, active) );
+ painter.drawLine(2,0, 2,0);
+ painter.end();
+
+ break;
+ }
+
+ case BorderBottomRight:
+ {
+
+ pm = new QPixmap(3, 3);
+ QPainter painter(pm);
+ painter.drawTiledPixmap(0,0,3,3, pixmap(BorderBottomTile, active, toolWindow) );
+ painter.setPen(getColor(Border3, active) );
+ painter.drawLine(2,0, 2,3);
+ painter.setPen(getColor(Border2, active) );
+ painter.drawLine(1,0, 1,1);
+
+ painter.setPen(getColor(Border1, active) );
+ painter.drawLine(0,0, 0,0);
+
+ painter.end();
+
+ break;
+ }
+
+ case BorderBottomTile:
+ default:
+ {
+ pm = new QPixmap(1, 3);
+ QPainter painter(pm);
+
+ painter.setPen(getColor(Border1, active) );
+ painter.drawPoint(0,0);
+ painter.setPen(getColor(Border2, active) );
+ painter.drawPoint(0,1);
+ painter.setPen(getColor(Border3, active) );
+ painter.drawPoint(0, 2);
+ painter.end();
+
+ pretile(pm, 64, Qt::Horizontal);
+
+ break;
+ }
+ }
+
+ m_pixmaps[toolWindow][active][type] = pm;
+ return *pm;
+}
+
+const QBitmap &IaOraHandler::buttonBitmap(ButtonIcon type, const QSize &size, bool toolWindow)
+{
+ int typeIndex = type;
+
+ // btn icon size...
+ int reduceW = 0, reduceH = 0;
+ if(size.width()>14) {
+ reduceW = static_cast<int>(2*(size.width()/3.5) );
+ }
+ else
+ reduceW = 6;
+ if(size.height()>14)
+ reduceH = static_cast<int>(2*(size.height()/3.5) );
+ else
+ reduceH = 6;
+
+ int w = size.width() - reduceW;
+ int h = size.height() - reduceH;
+
+ if (m_bitmaps[toolWindow][typeIndex] && m_bitmaps[toolWindow][typeIndex]->size()==QSize(w,h) )
+ return *m_bitmaps[toolWindow][typeIndex];
+
+ // no matching pixmap found, create a new one...
+
+ delete m_bitmaps[toolWindow][typeIndex];
+ m_bitmaps[toolWindow][typeIndex] = 0;
+
+ QBitmap bmp = IconEngine::icon(type /*icon*/, QMIN(w,h) );
+ QBitmap *bitmap = new QBitmap(bmp);
+ m_bitmaps[toolWindow][typeIndex] = bitmap;
+ return *bitmap;
+}
+
+
+// make the handler accessible to other classes...
+static IaOraHandler *handler = 0;
+IaOraHandler* Handler()
+{
+ return handler;
+}
+
+} // KWinPlastik
+
+//////////////////////////////////////////////////////////////////////////////
+// Plugin Stuff //
+//////////////////////////////////////////////////////////////////////////////
+
+extern "C"
+{
+ KDE_EXPORT KDecorationFactory *create_factory()
+ {
+ KWinIaOra::handler = new KWinIaOra::IaOraHandler();
+ return KWinIaOra::handler;
+ }
+}
diff --git a/src/kwin/iaora.desktop b/src/kwin/iaora.desktop
new file mode 100644
index 0000000..7bece01
--- /dev/null
+++ b/src/kwin/iaora.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Encoding=UTF-8
+Icon=
+Name=Ia ora
+X-KDE-Library=kwin3_iaora
diff --git a/src/kwin/iaora.h b/src/kwin/iaora.h
new file mode 100644
index 0000000..3f8d757
--- /dev/null
+++ b/src/kwin/iaora.h
@@ -0,0 +1,126 @@
+/* IaOra KWin window decoration
+ Based on plastik theme
+ Copyright (C) 2003-2005 Sandro Giessl <sandro@giessl.com>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef IAORA_H
+#define IAORA_H
+
+#include <qfont.h>
+
+#include <kdecoration.h>
+#include <kdecorationfactory.h>
+
+namespace KWinIaOra {
+
+enum ColorType {
+ TitleGradient1 = 0, // top
+ TitleGradient2,
+ TitleGradient3, // bottom
+ TitleGradient4,
+ ShadeTitleLight,
+ ShadeTitleDark,
+ Border1,
+ Border2,
+ Border3,
+ TitleFont,
+ TitleBorder
+};
+
+enum Pixmaps {
+ TitleBarTileTop=0,
+ TitleBarTile,
+ TitleBarLeft,
+ TitleBarRight,
+ BorderLeftTile,
+ BorderRightTile,
+ BorderBottomTile,
+ BorderBottomLeft,
+ BorderBottomRight,
+ NumPixmaps
+};
+
+enum ButtonIcon {
+ CloseIcon = 0,
+ MaxIcon,
+ MaxRestoreIcon,
+ MinIcon,
+ HelpIcon,
+ OnAllDesktopsIcon,
+ NotOnAllDesktopsIcon,
+ KeepAboveIcon,
+ NoKeepAboveIcon,
+ KeepBelowIcon,
+ NoKeepBelowIcon,
+ ShadeIcon,
+ UnShadeIcon,
+ NumButtonIcons
+};
+
+class IaOraHandler: public QObject, public KDecorationFactory
+{
+ Q_OBJECT
+public:
+ IaOraHandler();
+ ~IaOraHandler();
+ virtual bool reset( unsigned long changed );
+
+ virtual KDecoration* createDecoration( KDecorationBridge* );
+ virtual bool supports( Ability ability );
+
+ const QPixmap &pixmap(Pixmaps type, bool active, bool toolWindow);
+ const QBitmap &buttonBitmap(ButtonIcon type, const QSize &size, bool toolWindow);
+
+ int titleHeight()const { return m_titleHeight; }
+ int titleHeightTool()const { return m_titleHeightTool; }
+ const QFont &titleFont() { return m_titleFont; }
+ const QFont &titleFontTool() { return m_titleFontTool; }
+ bool titleShadow()const { return m_titleShadow; }
+ bool menuClose()const { return m_menuClose; }
+ bool reverseLayout()const { return m_reverse; }
+ QColor getColor(KWinIaOra::ColorType type, const bool active = true);
+ QColor getGradientColor( KWinIaOra::ColorType type, const bool active);
+ QColor getBorderColor( KWinIaOra::ColorType type, const bool active);
+ QColor getShadowColor();
+
+private:
+ void readConfig();
+
+ void pretile(QPixmap *&pix, int size, Qt::Orientation dir) const;
+
+ bool m_titleShadow;
+ bool m_menuClose;
+ bool m_reverse;
+ int m_titleHeight;
+ int m_titleHeightTool;
+ QFont m_titleFont;
+ QFont m_titleFontTool;
+
+ // pixmap cache
+ QPixmap *m_pixmaps[2][2][NumPixmaps]; // button pixmaps have normal+pressed state...
+ QBitmap *m_bitmaps[2][NumButtonIcons];
+};
+
+IaOraHandler* Handler();
+
+} // KWinPlastik
+
+#endif // IAORA_H
diff --git a/src/kwin/iaorabutton.cpp b/src/kwin/iaorabutton.cpp
new file mode 100644
index 0000000..fe9c3a6
--- /dev/null
+++ b/src/kwin/iaorabutton.cpp
@@ -0,0 +1,528 @@
+/* IaOra KWin window decoration
+ Copyright (C) 2006 Laurent Montel <lmontel@mandriva.com>
+ based on plastik code
+ Copyright (C) 2003-2005 Sandro Giessl <sandro@giessl.com>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <qbitmap.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+#include <qtimer.h>
+
+#include "iaorabutton.h"
+#include "iaorabutton.moc"
+#include "iaoraclient.h"
+#include "misc.h"
+
+namespace KWinIaOra
+{
+
+
+IaOraButton::IaOraButton(ButtonType type, IaOraClient *parent, const char *name)
+ : KCommonDecorationButton(type, parent, name),
+ m_client(parent),
+ m_iconType(NumButtonIcons),
+ hover(false)
+{
+ setBackgroundMode(NoBackground);
+
+}
+
+IaOraButton::~IaOraButton()
+{
+}
+
+void IaOraButton::reset(unsigned long changed)
+{
+ if (changed&DecorationReset || changed&ManualReset || changed&SizeChange || changed&StateChange) {
+ switch (type() ) {
+ case CloseButton:
+ m_iconType = CloseIcon;
+ break;
+ case HelpButton:
+ m_iconType = HelpIcon;
+ break;
+ case MinButton:
+ m_iconType = MinIcon;
+ break;
+ case MaxButton:
+ if (isOn()) {
+ m_iconType = MaxRestoreIcon;
+ } else {
+ m_iconType = MaxIcon;
+ }
+ break;
+ case OnAllDesktopsButton:
+ if (isOn()) {
+ m_iconType = NotOnAllDesktopsIcon;
+ } else {
+ m_iconType = OnAllDesktopsIcon;
+ }
+ break;
+ case ShadeButton:
+ if (isOn()) {
+ m_iconType = UnShadeIcon;
+ } else {
+ m_iconType = ShadeIcon;
+ }
+ break;
+ case AboveButton:
+ if (isOn()) {
+ m_iconType = NoKeepAboveIcon;
+ } else {
+ m_iconType = KeepAboveIcon;
+ }
+ break;
+ case BelowButton:
+ if (isOn()) {
+ m_iconType = NoKeepBelowIcon;
+ } else {
+ m_iconType = KeepBelowIcon;
+ }
+ break;
+ default:
+ m_iconType = NumButtonIcons; // empty...
+ break;
+ }
+
+ this->update();
+ }
+}
+
+
+void IaOraButton::enterEvent(QEvent *e)
+{
+ QButton::enterEvent(e);
+
+ hover = true;
+ repaint(false);
+}
+
+void IaOraButton::leaveEvent(QEvent *e)
+{
+ QButton::leaveEvent(e);
+
+ hover = false;
+ repaint(false);
+}
+
+void IaOraButton::drawButton(QPainter *painter)
+{
+ QRect r(0,0,width(),height());
+
+ bool active = m_client->isActive();
+ KPixmap tempKPixmap;
+
+ QPixmap buffer;
+ buffer.resize(width(), height());
+ QPainter bP(&buffer);
+
+ // fake the titlebar background
+ bP.drawTiledPixmap(0, 0, width(), width(), /*define color*/m_client->getTitleBarTile(active) );
+ if (type() == MenuButton)
+ {
+ QPixmap menuIcon(m_client->icon().pixmap( QIconSet::Small, QIconSet::Normal));
+ if (width() < menuIcon.width() || height() < menuIcon.height() ) {
+ menuIcon.convertFromImage( menuIcon.convertToImage().smoothScale(width(), height()));
+ }
+ bP.drawPixmap((width()-menuIcon.width())/2, (height()-menuIcon.height())/2, menuIcon);
+ }
+ else
+ {
+ int dX,dY;
+ const QBitmap &icon = Handler()->buttonBitmap(m_iconType, size(), decoration()->isToolWindow() );
+ dX = r.x()+(r.width()-icon.width())/2;
+ dY = r.y()+(r.height()-icon.height())/2;
+ if (isDown() ) {
+ dY++;
+ }
+#if 0
+ if(!isDown() && Handler()->titleShadow() ) {
+ QColor shadowColor;
+ if (qGray(Handler()->getColor(TitleFont,active).rgb()) < 100)
+ shadowColor = QColor(255, 255, 255);
+ else
+ shadowColor = QColor(0,0,0);
+ //bP.setPen(alphaBlendColors(sourfaceTop, shadowColor, 180) );
+ bP.drawPixmap(dX+1, dY+1, icon);
+ }
+#endif
+ bP.setPen(Handler()->getColor(TitleFont,hover ? false : active) );
+ bP.drawPixmap(dX, dY, icon,0,0,icon.width(),icon.height()/2);
+ bP.setPen(QColor("#CFD7DF") );
+ bP.drawPixmap(dX, dY+icon.height()/2, icon,0,icon.height()/2,icon.width(),icon.height());
+ }
+ bP.end();
+ painter->drawPixmap(0, 0, buffer);
+}
+
+QBitmap IconEngine::icon(ButtonIcon icon, int size)
+{
+ if (size%2 == 0)
+ --size;
+
+ QBitmap bitmap(size,size);
+ bitmap.fill(Qt::color0);
+ QPainter p(&bitmap);
+
+ p.setPen(Qt::color1);
+
+ QRect r = bitmap.rect();
+
+ // line widths
+ int lwTitleBar = 1;
+ if (r.width() > 16) {
+ lwTitleBar = 4;
+ } else if (r.width() > 4) {
+ lwTitleBar = 2;
+ }
+ int lwArrow = 1;
+ if (r.width() > 16) {
+ lwArrow = 4;
+ } else if (r.width() > 7) {
+ lwArrow = 2;
+ }
+
+ //QColor col1( "#FFFFFF" );
+ //QColor col2( "#CFD7DF" );
+
+ switch(icon) {
+ case CloseIcon:
+ {
+ int lineWidth = 1;
+ if (r.width() > 16) {
+ lineWidth = 3;
+ } else if (r.width() > 4) {
+ lineWidth = 2;
+ }
+
+ drawObject(p, DiagonalLine, r.x(), r.y(), r.width(), lineWidth);
+ drawObject(p, CrossDiagonalLine, r.x(), r.bottom(), r.width(), lineWidth);
+
+ break;
+ }
+
+ case MaxIcon:
+ {
+ int lineWidth2 = 1; // frame
+ if (r.width() > 16) {
+ lineWidth2 = 2;
+ } else if (r.width() > 4) {
+ lineWidth2 = 1;
+ }
+
+ drawObject(p, HorizontalLine, r.x(), r.top(), r.width(), lwTitleBar);
+ drawObject(p, HorizontalLine, r.x(), r.bottom()-(lineWidth2-1), r.width(), lineWidth2);
+ drawObject(p, VerticalLine, r.x(), r.top(), r.height(), lineWidth2);
+ drawObject(p, VerticalLine, r.right()-(lineWidth2-1), r.top(), r.height(), lineWidth2);
+
+ break;
+ }
+
+ case MaxRestoreIcon:
+ {
+ int lineWidth2 = 1; // frame
+ if (r.width() > 16) {
+ lineWidth2 = 2;
+ } else if (r.width() > 4) {
+ lineWidth2 = 1;
+ }
+
+ int margin1, margin2;
+ margin1 = margin2 = lineWidth2*2;
+ if (r.width() < 8)
+ margin1 = 1;
+
+ // background window
+ drawObject(p, HorizontalLine, r.x(), r.top(), r.width()-margin1+1 +3 , lineWidth2);
+ drawObject(p, HorizontalLine, r.right()-margin2, r.bottom()-(lineWidth2-1)/*-margin1*/, margin2, lineWidth2);
+ drawObject(p, VerticalLine, r.x(), r.top(), margin2+3, lineWidth2);
+ drawObject(p, VerticalLine, r.right()-(lineWidth2-1), r.top(), r.height()-margin1+3, lineWidth2);
+
+ // foreground window
+ drawObject(p, HorizontalLine, r.x(), r.top()+margin2, r.width()-margin2, lwTitleBar);
+ drawObject(p, HorizontalLine, r.x(), r.bottom()-(lineWidth2-1), r.width()-margin2, lineWidth2);
+ drawObject(p, VerticalLine, r.x(), r.top()+margin2, r.height(), lineWidth2);
+ drawObject(p, VerticalLine, r.right()-(lineWidth2-1)-margin2, r.top()+margin2, r.height(), lineWidth2);
+ break;
+ }
+
+ case MinIcon:
+ {
+ int posY = r.height()/2-(lwTitleBar-1);
+
+ drawObject(p, HorizontalLine, r.x()+1,posY, r.width()-2, lwTitleBar);
+ //grey 2
+ //p.setPen( col2 );
+ p.drawLine(r.x(),posY+1, r.x()+r.width()-1, posY+1);
+ p.drawLine(r.x()+1, posY+2, r.x()+r.width()-2, posY+2);
+
+ break;
+ }
+
+ case HelpIcon:
+ {
+ int center = r.x()+r.width()/2 -1;
+ int side = r.width()/4;
+
+ // paint a question mark... code is quite messy, to be cleaned up later...! :o
+
+ if (r.width() > 16) {
+ int lineWidth = 3;
+
+ // top bar
+ drawObject(p, HorizontalLine, center-side+3, r.y(), 2*side-3-1, lineWidth);
+ // top bar rounding
+ drawObject(p, CrossDiagonalLine, center-side-1, r.y()+5, 6, lineWidth);
+ drawObject(p, DiagonalLine, center+side-3, r.y(), 5, lineWidth);
+ // right bar
+ drawObject(p, VerticalLine, center+side+2-lineWidth, r.y()+3, r.height()-(2*lineWidth+side+2+1), lineWidth);
+ // bottom bar
+ drawObject(p, CrossDiagonalLine, center, r.bottom()-2*lineWidth, side+2, lineWidth);
+ drawObject(p, HorizontalLine, center, r.bottom()-3*lineWidth+2, lineWidth, lineWidth);
+ // the dot
+ drawObject(p, HorizontalLine, center, r.bottom()-(lineWidth-1), lineWidth, lineWidth);
+ } else if (r.width() > 8) {
+ int lineWidth = 2;
+
+ // top bar
+ drawObject(p, HorizontalLine, center-(side-1), r.y(), 2*side-1, lineWidth);
+ // top bar rounding
+ if (r.width() > 9) {
+ drawObject(p, CrossDiagonalLine, center-side-1, r.y()+3, 3, lineWidth);
+ } else {
+ drawObject(p, CrossDiagonalLine, center-side-1, r.y()+2, 3, lineWidth);
+ }
+ drawObject(p, DiagonalLine, center+side-1, r.y(), 3, lineWidth);
+ // right bar
+ drawObject(p, VerticalLine, center+side+2-lineWidth, r.y()+2, r.height()-(2*lineWidth+side+1), lineWidth);
+ // bottom bar
+ drawObject(p, CrossDiagonalLine, center, r.bottom()-2*lineWidth+1, side+2, lineWidth);
+ // the dot
+ drawObject(p, HorizontalLine, center, r.bottom()-(lineWidth-1), lineWidth, lineWidth);
+ } else {
+ int lineWidth = 1;
+
+ // top bar
+ drawObject(p, HorizontalLine, center-(side-1), r.y(), 2*side, lineWidth);
+ // top bar rounding
+ drawObject(p, CrossDiagonalLine, center-side-1, r.y()+1, 2, lineWidth);
+ // right bar
+ drawObject(p, VerticalLine, center+side+1, r.y(), r.height()-(side+2+1), lineWidth);
+ // bottom bar
+ drawObject(p, CrossDiagonalLine, center, r.bottom()-2, side+2, lineWidth);
+ // the dot
+ drawObject(p, HorizontalLine, center, r.bottom(), 1, 1);
+ }
+
+ break;
+ }
+
+ case NotOnAllDesktopsIcon:
+ {
+ int lwMark = r.width()-lwTitleBar*2-2;
+ if (lwMark < 1)
+ lwMark = 3;
+
+ drawObject(p, HorizontalLine, r.x()+(r.width()-lwMark)/2, r.y()+(r.height()-lwMark)/2, lwMark, lwMark);
+
+ // Fall through to OnAllDesktopsIcon intended!
+ }
+ case OnAllDesktopsIcon:
+ {
+ // horizontal bars
+ drawObject(p, HorizontalLine, r.x()+lwTitleBar, r.y(), r.width()-2*lwTitleBar, lwTitleBar);
+ drawObject(p, HorizontalLine, r.x()+lwTitleBar, r.bottom()-(lwTitleBar-1), r.width()-2*lwTitleBar, lwTitleBar);
+ // vertical bars
+ drawObject(p, VerticalLine, r.x(), r.y()+lwTitleBar, r.height()-2*lwTitleBar, lwTitleBar);
+ drawObject(p, VerticalLine, r.right()-(lwTitleBar-1), r.y()+lwTitleBar, r.height()-2*lwTitleBar, lwTitleBar);
+
+
+ break;
+ }
+
+ case NoKeepAboveIcon:
+ {
+ int center = r.x()+r.width()/2;
+
+ // arrow
+ drawObject(p, CrossDiagonalLine, r.x(), center+2*lwArrow, center-r.x(), lwArrow);
+ drawObject(p, DiagonalLine, r.x()+center, r.y()+1+2*lwArrow, center-r.x(), lwArrow);
+ if (lwArrow>1)
+ drawObject(p, HorizontalLine, center-(lwArrow-2), r.y()+2*lwArrow, (lwArrow-2)*2, lwArrow);
+
+ // Fall through to KeepAboveIcon intended!
+ }
+ case KeepAboveIcon:
+ {
+ int center = r.x()+r.width()/2;
+
+ // arrow
+ drawObject(p, CrossDiagonalLine, r.x(), center, center-r.x(), lwArrow);
+ drawObject(p, DiagonalLine, r.x()+center, r.y()+1, center-r.x(), lwArrow);
+ if (lwArrow>1)
+ drawObject(p, HorizontalLine, center-(lwArrow-2), r.y(), (lwArrow-2)*2, lwArrow);
+
+ break;
+ }
+
+ case NoKeepBelowIcon:
+ {
+ int center = r.x()+r.width()/2;
+
+ // arrow
+ drawObject(p, DiagonalLine, r.x(), center-2*lwArrow, center-r.x(), lwArrow);
+ drawObject(p, CrossDiagonalLine, r.x()+center, r.bottom()-1-2*lwArrow, center-r.x(), lwArrow);
+ if (lwArrow>1)
+ drawObject(p, HorizontalLine, center-(lwArrow-2), r.bottom()-(lwArrow-1)-2*lwArrow, (lwArrow-2)*2, lwArrow);
+
+ // Fall through to KeepBelowIcon intended!
+ }
+ case KeepBelowIcon:
+ {
+ int center = r.x()+r.width()/2;
+
+ // arrow
+ drawObject(p, DiagonalLine, r.x(), center, center-r.x(), lwArrow);
+ drawObject(p, CrossDiagonalLine, r.x()+center, r.bottom()-1, center-r.x(), lwArrow);
+ if (lwArrow>1)
+ drawObject(p, HorizontalLine, center-(lwArrow-2), r.bottom()-(lwArrow-1), (lwArrow-2)*2, lwArrow);
+
+ break;
+ }
+
+ case ShadeIcon:
+ {
+ drawObject(p, HorizontalLine, r.x(), r.y(), r.width(), lwTitleBar);
+
+ break;
+ }
+
+ case UnShadeIcon:
+ {
+ int lw1 = 1;
+ int lw2 = 1;
+ if (r.width() > 16) {
+ lw1 = 4;
+ lw2 = 2;
+ } else if (r.width() > 7) {
+ lw1 = 2;
+ lw2 = 1;
+ }
+
+ int h = QMAX( (r.width()/2), (lw1+2*lw2) );
+
+ // horizontal bars
+ drawObject(p, HorizontalLine, r.x(), r.y(), r.width(), lw1);
+ drawObject(p, HorizontalLine, r.x(), r.x()+h-(lw2-1), r.width(), lw2);
+ // vertical bars
+ drawObject(p, VerticalLine, r.x(), r.y(), h, lw2);
+ drawObject(p, VerticalLine, r.right()-(lw2-1), r.y(), h, lw2);
+
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ p.end();
+
+ bitmap.setMask(bitmap);
+
+ return bitmap;
+}
+
+void IconEngine::drawObject(QPainter &p, Object object, int x, int y, int length, int lineWidth)
+{
+ switch(object) {
+ case DiagonalLine:
+ if (lineWidth <= 1) {
+ for (int i = 0; i < length; ++i) {
+ p.drawPoint(x+i,y+i);
+ }
+ } else if (lineWidth <= 2) {
+ for (int i = 0; i < length; ++i) {
+ p.drawPoint(x+i,y+i);
+ }
+ for (int i = 0; i < (length-1); ++i) {
+ p.drawPoint(x+1+i,y+i);
+ p.drawPoint(x+i,y+1+i);
+ }
+ } else {
+ for (int i = 1; i < (length-1); ++i) {
+ p.drawPoint(x+i,y+i);
+ }
+ for (int i = 0; i < (length-1); ++i) {
+ p.drawPoint(x+1+i,y+i);
+ p.drawPoint(x+i,y+1+i);
+ }
+ for (int i = 0; i < (length-2); ++i) {
+ p.drawPoint(x+2+i,y+i);
+ p.drawPoint(x+i,y+2+i);
+ }
+ }
+ break;
+ case CrossDiagonalLine:
+ if (lineWidth <= 1) {
+ for (int i = 0; i < length; ++i) {
+ p.drawPoint(x+i,y-i);
+ }
+ } else if (lineWidth <= 2) {
+ for (int i = 0; i < length; ++i) {
+ p.drawPoint(x+i,y-i);
+ }
+ for (int i = 0; i < (length-1); ++i) {
+ p.drawPoint(x+1+i,y-i);
+ p.drawPoint(x+i,y-1-i);
+ }
+ } else {
+ for (int i = 1; i < (length-1); ++i) {
+ p.drawPoint(x+i,y-i);
+ }
+ for (int i = 0; i < (length-1); ++i) {
+ p.drawPoint(x+1+i,y-i);
+ p.drawPoint(x+i,y-1-i);
+ }
+ for (int i = 0; i < (length-2); ++i) {
+ p.drawPoint(x+2+i,y-i);
+ p.drawPoint(x+i,y-2-i);
+ }
+ }
+ break;
+ case HorizontalLine:
+ for (int i = 0; i < lineWidth; ++i) {
+ p.drawLine(x,y+i, x+length-1, y+i);
+ }
+ break;
+ case VerticalLine:
+ for (int i = 0; i < lineWidth; ++i) {
+ p.drawLine(x+i,y, x+i, y+length-1);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+} // KWinIaOra
diff --git a/src/kwin/iaorabutton.h b/src/kwin/iaorabutton.h
new file mode 100644
index 0000000..12e9a53
--- /dev/null
+++ b/src/kwin/iaorabutton.h
@@ -0,0 +1,85 @@
+/* Plastik KWin window decoration
+ Copyright (C) 2003-2005 Sandro Giessl <sandro@giessl.com>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef IAORABUTTON_H
+#define IAORABUTTON_H
+
+#include <qbutton.h>
+#include <qimage.h>
+#include "iaora.h"
+
+#include <kcommondecoration.h>
+
+class QTimer;
+
+namespace KWinIaOra {
+
+class IaOraClient;
+
+class IaOraButton : public KCommonDecorationButton
+{
+ Q_OBJECT
+public:
+ IaOraButton(ButtonType type, IaOraClient *parent, const char *name);
+ ~IaOraButton();
+
+ void reset(unsigned long changed);
+ IaOraClient * client() { return m_client; }
+
+
+private:
+ void enterEvent(QEvent *e);
+ void leaveEvent(QEvent *e);
+ void drawButton(QPainter *painter);
+
+private:
+ IaOraClient *m_client;
+ ButtonIcon m_iconType;
+ bool hover;
+};
+
+/**
+ * This class creates bitmaps which can be used as icons on buttons. The icons
+ * are "hardcoded".
+ * Over the previous "Gimp->xpm->QImage->recolor->SmoothScale->QPixmap" solution
+ * it has the important advantage that icons are more scalable and at the same
+ * time sharp and not blurred.
+ */
+class IconEngine
+{
+ public:
+ static QBitmap icon(ButtonIcon icon, int size);
+
+ private:
+ enum Object {
+ HorizontalLine,
+ VerticalLine,
+ DiagonalLine,
+ CrossDiagonalLine
+ };
+
+ static void drawObject(QPainter &p, Object object, int x, int y, int length, int lineWidth);
+};
+
+} // namespace KWinIaOra
+
+#endif // IAORABUTTON_H
diff --git a/src/kwin/iaoraclient.cpp b/src/kwin/iaoraclient.cpp
new file mode 100644
index 0000000..7c1af84
--- /dev/null
+++ b/src/kwin/iaoraclient.cpp
@@ -0,0 +1,514 @@
+/* Ia Ora KWin window decoration
+ Copyright (c) 2006 Laurent Montel <lmontel@mandriva.com>
+ based on plastik code
+ Copyright (C) 2003-2005 Sandro Giessl <sandro@giessl.com>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <klocale.h>
+
+#include <qbitmap.h>
+#include <qdatetime.h>
+#include <qfontmetrics.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qdesktopwidget.h>
+
+#include "iaoraclient.h"
+#include "iaorabutton.h"
+#include "misc.h"
+
+namespace KWinIaOra
+{
+
+IaOraClient::IaOraClient(KDecorationBridge* bridge, KDecorationFactory* factory)
+ : KCommonDecoration (bridge, factory),
+ s_titleFont(QFont() )
+{
+ memset(m_captionPixmaps, 0, sizeof(QPixmap*)*2);
+}
+
+IaOraClient::~IaOraClient()
+{
+ clearCaptionPixmaps();
+}
+
+QString IaOraClient::visibleName() const
+{
+ return i18n("Ia Ora");
+}
+
+QString IaOraClient::defaultButtonsLeft() const
+{
+ return "M";
+}
+
+QString IaOraClient::defaultButtonsRight() const
+{
+ return "IAX";
+}
+
+bool IaOraClient::decorationBehaviour(DecorationBehaviour behaviour) const
+{
+ switch (behaviour) {
+ case DB_MenuClose:
+ return Handler()->menuClose();
+
+ case DB_WindowMask:
+ return true;
+
+ default:
+ return KCommonDecoration::decorationBehaviour(behaviour);
+ }
+}
+
+int IaOraClient::layoutMetric(LayoutMetric lm, bool respectWindowState, const KCommonDecorationButton *btn) const
+{
+ bool maximized = maximizeMode()==MaximizeFull && !options()->moveResizeMaximizedWindows();
+
+ switch (lm) {
+ case LM_BorderLeft:
+ case LM_BorderRight:
+ case LM_BorderBottom:
+ {
+ if (respectWindowState && maximized) {
+ return 0;
+ } else {
+ return 3;
+ }
+ }
+
+ case LM_TitleEdgeTop:
+ {
+ if (respectWindowState && maximized) {
+ return 0;
+ } else {
+ return 3;
+ }
+ }
+
+ case LM_TitleEdgeBottom:
+ {
+ if (respectWindowState && maximized) {
+ return 1;
+ } else {
+ return 2;
+ }
+ }
+
+ case LM_TitleEdgeLeft:
+ case LM_TitleEdgeRight:
+ {
+ //if (respectWindowState && maximized) {
+ return 1;
+ //} else {
+ //return 3;
+ //}
+ }
+
+ case LM_TitleBorderLeft:
+ case LM_TitleBorderRight:
+ return 0;
+
+ case LM_ButtonWidth:
+ case LM_ButtonHeight:
+ case LM_TitleHeight:
+ {
+ if (respectWindowState && isToolWindow()) {
+ return Handler()->titleHeightTool();
+ } else {
+ return Handler()->titleHeight();
+ }
+ }
+
+ case LM_ButtonSpacing:
+ return 1;
+
+ case LM_ButtonMarginTop:
+ return 0;
+
+ case LM_ExplicitButtonSpacer:
+ return 3;
+
+ default:
+ return KCommonDecoration::layoutMetric(lm, respectWindowState, btn);
+ }
+}
+
+KCommonDecorationButton *IaOraClient::createButton(ButtonType type)
+{
+ switch (type) {
+ case MenuButton:
+ return new IaOraButton(MenuButton, this, "menu");
+
+ case OnAllDesktopsButton:
+ return new IaOraButton(OnAllDesktopsButton, this, "on_all_desktops");
+
+ case HelpButton:
+ return new IaOraButton(HelpButton, this, "help");
+
+ case MinButton:
+ return new IaOraButton(MinButton, this, "minimize");
+
+ case MaxButton:
+ return new IaOraButton(MaxButton, this, "maximize");
+
+ case CloseButton:
+ return new IaOraButton(CloseButton, this, "close");
+
+ case AboveButton:
+ return new IaOraButton(AboveButton, this, "above");
+
+ case BelowButton:
+ return new IaOraButton(BelowButton, this, "below");
+
+ case ShadeButton:
+ return new IaOraButton(ShadeButton, this, "shade");
+
+ default:
+ return 0;
+ }
+}
+
+void IaOraClient::init()
+{
+ s_titleFont = isToolWindow() ? Handler()->titleFontTool() : Handler()->titleFont();
+
+ clearCaptionPixmaps();
+
+ KCommonDecoration::init();
+}
+
+QRegion IaOraClient::cornerShape(WindowCorner corner)
+{
+ int w = widget()->width();
+ int h = widget()->height();
+
+ switch (corner) {
+ case WC_TopLeft:
+ if (layoutMetric(LM_TitleEdgeLeft) > 0)
+ return QRegion(0, 0, 1, 1);// + QRegion(1, 0, 1, 1);
+ else
+ return QRegion();
+
+ case WC_TopRight:
+ if (layoutMetric(LM_TitleEdgeRight) > 0)
+ return QRegion(w-1, 0, 1, 1);// + QRegion(w-2, 0, 1, 1);
+ else
+ return QRegion();
+
+ case WC_BottomLeft:
+ if (layoutMetric(LM_BorderBottom) > 0)
+ return QRegion(0, h-1, 1, 1);
+ else
+ return QRegion();
+
+ case WC_BottomRight:
+ if (layoutMetric(LM_BorderBottom) > 0)
+ return QRegion(w-1, h-1, 1, 1);
+ else
+ return QRegion();
+
+ default:
+ return QRegion();
+ }
+
+}
+
+void IaOraClient::paintEvent(QPaintEvent *e)
+{
+ QRegion region = e->region();
+
+ IaOraHandler *handler = Handler();
+
+ if (oldCaption != caption() )
+ clearCaptionPixmaps();
+
+ bool active = isActive();
+ bool toolWindow = isToolWindow();
+
+ QPainter painter(widget() );
+
+ // often needed coordinates
+ QRect r = widget()->rect();
+
+ int r_w = r.width();
+// int r_h = r.height();
+ int r_x, r_y, r_x2, r_y2;
+ r.coords(&r_x, &r_y, &r_x2, &r_y2);
+ const int borderLeft = layoutMetric(LM_BorderLeft);
+ const int borderRight = layoutMetric(LM_BorderRight);
+ const int borderBottom = layoutMetric(LM_BorderBottom);
+ const int titleHeight = layoutMetric(LM_TitleHeight);
+ const int titleEdgeTop = layoutMetric(LM_TitleEdgeTop);
+ const int titleEdgeBottom = layoutMetric(LM_TitleEdgeBottom);
+ const int titleEdgeLeft = layoutMetric(LM_TitleEdgeLeft);
+ const int titleEdgeRight = layoutMetric(LM_TitleEdgeRight);
+
+ const int borderBottomTop = r_y2-borderBottom+1;
+ const int borderLeftRight = r_x+borderLeft-1;
+ const int borderRightLeft = r_x2-borderRight+1;
+ const int titleEdgeBottomBottom = r_y+titleEdgeTop+titleHeight+titleEdgeBottom-1;
+
+ const int sideHeight = borderBottomTop-titleEdgeBottomBottom-1;
+
+ QRect Rtitle = QRect(r_x+titleEdgeLeft+buttonsLeftWidth(), r_y+titleEdgeTop,
+ r_x2-titleEdgeRight-buttonsRightWidth()-(r_x+titleEdgeLeft+buttonsLeftWidth()),
+ titleEdgeBottomBottom-(r_y+titleEdgeTop) );
+
+ QRect tempRect;
+
+ // topSpacer
+ if(titleEdgeTop > 0)
+ {
+ tempRect.setRect(r_x+2, r_y, r_w-2*2, titleEdgeTop );
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarTileTop, active, toolWindow) );
+ }
+ }
+
+ // leftTitleSpacer
+ int titleMarginLeft = 0;
+ int titleMarginRight = 0;
+ if(titleEdgeLeft > 0)
+ {
+ tempRect.setRect(r_x, r_y, borderLeft, titleEdgeTop+titleHeight+titleEdgeBottom);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarLeft, active, toolWindow) );
+ titleMarginLeft = borderLeft;
+ }
+ }
+
+ // rightTitleSpacer
+ if(titleEdgeRight > 0)
+ {
+ tempRect.setRect(borderRightLeft, r_y, borderRight, titleEdgeTop+titleHeight+titleEdgeBottom);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarRight, active, toolWindow) );
+ titleMarginRight = borderRight;
+ }
+ }
+
+ // titleSpacer
+ const QPixmap &caption = captionPixmap();
+ if(Rtitle.width() > 0)
+ {
+ m_captionRect = captionRect(); // also update m_captionRect!
+ if (m_captionRect.isValid() && region.contains(m_captionRect) )
+ {
+ painter.drawTiledPixmap(m_captionRect, caption);
+ }
+
+ // left to the title
+ tempRect.setRect(r_x+titleMarginLeft, m_captionRect.top(),
+ m_captionRect.left() - (r_x+titleMarginLeft), m_captionRect.height() );
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarTile, active, toolWindow) );
+ }
+
+ // right to the title
+ tempRect.setRect(m_captionRect.right()+1, m_captionRect.top(),
+ (r_x2-titleMarginRight) - m_captionRect.right(), m_captionRect.height() );
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarTile, active, toolWindow) );
+ }
+
+ }
+
+ // leftSpacer
+ if(borderLeft > 0 && sideHeight > 0)
+ {
+ tempRect.setCoords(r_x, titleEdgeBottomBottom+1, borderLeftRight, borderBottomTop-1);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(BorderLeftTile, active, toolWindow) );
+ }
+ }
+
+ // rightSpacer
+ if(borderRight > 0 && sideHeight > 0)
+ {
+ tempRect.setCoords(borderRightLeft, titleEdgeBottomBottom+1, r_x2, borderBottomTop-1);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(BorderRightTile, active, toolWindow) );
+ }
+ }
+
+ // bottomSpacer
+ if(borderBottom > 0)
+ {
+ int l = r_x;
+ int r = r_x2;
+
+ tempRect.setRect(r_x, borderBottomTop, borderLeft, borderBottom);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(BorderBottomLeft, active, toolWindow) );
+ l = tempRect.right()+1;
+ }
+
+ tempRect.setRect(borderRightLeft, borderBottomTop, borderLeft, borderBottom);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(BorderBottomRight, active, toolWindow) );
+ r = tempRect.left()-1;
+ }
+
+ tempRect.setCoords(l, borderBottomTop, r, r_y2);
+ if (tempRect.isValid() && region.contains(tempRect) ) {
+ painter.drawTiledPixmap(tempRect, handler->pixmap(BorderBottomTile, active, toolWindow) );
+ }
+ }
+}
+
+QRect IaOraClient::captionRect() const
+{
+ const QPixmap &caption = captionPixmap();
+ QRect r = widget()->rect();
+
+ const int titleHeight = layoutMetric(LM_TitleHeight);
+ const int titleEdgeBottom = layoutMetric(LM_TitleEdgeBottom);
+ const int titleEdgeTop = layoutMetric(LM_TitleEdgeTop);
+ const int titleEdgeLeft = layoutMetric(LM_TitleEdgeLeft);
+ const int marginLeft = layoutMetric(LM_TitleBorderLeft);
+ const int marginRight = layoutMetric(LM_TitleBorderRight);
+
+ const int titleLeft = r.left() + titleEdgeLeft + buttonsLeftWidth() + marginLeft;
+ const int titleWidth = r.width() -
+ titleEdgeLeft - layoutMetric(LM_TitleEdgeRight) -
+ buttonsLeftWidth() - buttonsRightWidth() -
+ marginLeft - marginRight;
+ int tX, tW; // position/width of the title buffer
+ if (caption.width() > titleWidth) {
+ tW = titleWidth;
+ } else {
+ tW = caption.width();
+ }
+
+ if (caption.width() > titleWidth ) {
+ // Align left
+ tX = titleLeft;
+ }
+ else
+ tX = titleLeft+(titleWidth- caption.width() )/2;
+ return QRect(tX, r.top()+titleEdgeTop, tW, titleHeight+titleEdgeBottom);
+}
+
+void IaOraClient::updateCaption()
+{
+ QRect oldCaptionRect = m_captionRect;
+
+ if (oldCaption != caption() )
+ clearCaptionPixmaps();
+
+ m_captionRect = IaOraClient::captionRect();
+
+ if (oldCaptionRect.isValid() && m_captionRect.isValid() )
+ widget()->update(oldCaptionRect|m_captionRect);
+ else
+ widget()->update();
+}
+
+void IaOraClient::reset( unsigned long changed )
+{
+ if (changed & SettingColors)
+ {
+ // repaint the whole thing
+ clearCaptionPixmaps();
+ widget()->update();
+ updateButtons();
+ } else if (changed & SettingFont) {
+ // font has changed -- update title height and font
+ s_titleFont = isToolWindow() ? Handler()->titleFontTool() : Handler()->titleFont();
+
+ updateLayout();
+
+ // then repaint
+ clearCaptionPixmaps();
+ widget()->update();
+ }
+
+ KCommonDecoration::reset(changed);
+}
+
+const QPixmap &IaOraClient::getTitleBarTile(bool active) const
+{
+ return Handler()->pixmap(TitleBarTile, active, isToolWindow() );
+}
+
+const QPixmap &IaOraClient::captionPixmap() const
+{
+ bool active = isActive();
+
+ if (m_captionPixmaps[active]) {
+ return *m_captionPixmaps[active];
+ }
+
+ // not found, create new pixmap...
+
+ const uint maxCaptionLength = 300; // truncate captions longer than this!
+ QString c(caption() );
+ if (c.length() > maxCaptionLength) {
+ c.truncate(maxCaptionLength);
+ c.append(" [...]");
+ }
+
+ QFontMetrics fm(s_titleFont);
+ int captionWidth = fm.width(c);
+ int captionHeight = fm.height();
+
+ const int th = layoutMetric(LM_TitleHeight, false) + layoutMetric(LM_TitleEdgeBottom, false);
+
+ QPainter painter;
+
+ const int thickness = 2;
+
+ QPixmap *captionPixmap = new QPixmap(captionWidth+2*thickness, th);
+
+ painter.begin(captionPixmap);
+ painter.drawTiledPixmap(captionPixmap->rect(),
+ Handler()->pixmap(TitleBarTile, active, isToolWindow()) );
+
+ painter.setFont(s_titleFont);
+ QPoint tp(1, captionHeight-1);
+// if(Handler()->titleShadow())
+// {
+// painter.setPen(Handler()->getShadowColor());
+// painter.drawText(tp+QPoint(2,2), c);
+// }
+ painter.setPen(Handler()->getColor(TitleFont,active) );
+ painter.drawText(tp, c );
+ painter.end();
+
+ m_captionPixmaps[active] = captionPixmap;
+ return *captionPixmap;
+}
+
+void IaOraClient::clearCaptionPixmaps()
+{
+ for (int i = 0; i < 2; ++i) {
+ delete m_captionPixmaps[i];
+ m_captionPixmaps[i] = 0;
+ }
+
+ oldCaption = caption();
+}
+
+} // KWinIaOra
diff --git a/src/kwin/iaoraclient.h b/src/kwin/iaoraclient.h
new file mode 100644
index 0000000..5c66194
--- /dev/null
+++ b/src/kwin/iaoraclient.h
@@ -0,0 +1,73 @@
+/* Plastik KWin window decoration
+ Copyright (C) 2003-2005 Sandro Giessl <sandro@giessl.com>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef IAORACLIENT_H
+#define IAORACLIENT_H
+
+#include <kcommondecoration.h>
+
+#include "iaora.h"
+
+namespace KWinIaOra {
+
+class IaOraButton;
+
+class IaOraClient : public KCommonDecoration
+{
+public:
+ IaOraClient(KDecorationBridge* bridge, KDecorationFactory* factory);
+ ~IaOraClient();
+
+ virtual QString visibleName() const;
+ virtual QString defaultButtonsLeft() const;
+ virtual QString defaultButtonsRight() const;
+ virtual bool decorationBehaviour(DecorationBehaviour behaviour) const;
+ virtual int layoutMetric(LayoutMetric lm, bool respectWindowState = true, const KCommonDecorationButton * = 0) const;
+ virtual QRegion cornerShape(WindowCorner corner);
+ virtual KCommonDecorationButton *createButton(ButtonType type);
+
+ virtual void init();
+ virtual void reset( unsigned long changed );
+
+ virtual void paintEvent(QPaintEvent *e);
+ virtual void updateCaption();
+
+ const QPixmap &getTitleBarTile(bool active) const;
+
+private:
+ QRect captionRect() const;
+
+ const QPixmap &captionPixmap() const;
+ void clearCaptionPixmaps();
+
+ mutable QPixmap *m_captionPixmaps[2];
+
+ QRect m_captionRect;
+ QString oldCaption;
+
+ // settings...
+ QFont s_titleFont;
+};
+
+} // KwinIaora
+
+#endif // IAORACLIENT_H
diff --git a/src/kwin/misc.cpp b/src/kwin/misc.cpp
new file mode 100644
index 0000000..f050975
--- /dev/null
+++ b/src/kwin/misc.cpp
@@ -0,0 +1,49 @@
+/* Plastik KWin window decoration
+ Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+
+#include <qcolor.h>
+#include <qimage.h>
+#include <qpainter.h>
+
+#include "misc.h"
+
+QColor alphaBlendColors(const QColor &bgColor, const QColor &fgColor, const int a)
+{
+
+ // normal button...
+ QRgb rgb = bgColor.rgb();
+ QRgb rgb_b = fgColor.rgb();
+ int alpha = a;
+ if(alpha>255) alpha = 255;
+ if(alpha<0) alpha = 0;
+ int inv_alpha = 255 - alpha;
+
+ QColor result = QColor( qRgb(qRed(rgb_b)*inv_alpha/255 + qRed(rgb)*alpha/255,
+ qGreen(rgb_b)*inv_alpha/255 + qGreen(rgb)*alpha/255,
+ qBlue(rgb_b)*inv_alpha/255 + qBlue(rgb)*alpha/255) );
+
+ return result;
+}
+
diff --git a/src/kwin/misc.h b/src/kwin/misc.h
new file mode 100644
index 0000000..b304513
--- /dev/null
+++ b/src/kwin/misc.h
@@ -0,0 +1,28 @@
+/* Plastik KWin window decoration
+ Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+
+ based on the window decoration "Web":
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef MISC_H
+#define MISC_H
+
+QColor alphaBlendColors(const QColor &backgroundColor, const QColor &foregroundColor, const int alpha);
+
+#endif // MISC_H
diff --git a/src/widget/Makefile.am b/src/widget/Makefile.am
new file mode 100644
index 0000000..50d677f
--- /dev/null
+++ b/src/widget/Makefile.am
@@ -0,0 +1,26 @@
+KDE_PLUGIN = -avoid-version -module -no-undefined $(KDE_NO_UNDEFINED) $(KDE_RPATH) $(KDE_MT_LDFLAGS)
+
+AM_CPPFLAGS = -DQT_PLUGIN
+
+INCLUDES = $(all_includes)
+noinst_HEADERS = ia_ora.h bitmaps.h
+kde_style_LTLIBRARIES = ia_ora.la
+ia_ora_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+ia_ora_la_LIBADD = -lkdefx -lkdecore -lqt-mt
+ia_ora_la_SOURCES = ia_ora.cpp
+ia_ora_la_METASOURCES = AUTO
+
+# todo fix me install themerc file
+ia_ora.lo: ia_ora.h ia_ora.moc
+
+ia_ora.moc : ia_ora.h
+ $(MOC) $(srcdir)/ia_ora.h -o ia_ora.moc
+
+BUILT_SOURCES = ia_ora.moc
+
+CLEANFILES = $(BUILT_SOURCES)
+
+ia_oradata_DATA = ia_ora.themerc
+ia_oradatadir = $(kde_datadir)/kstyle/themes
+
+EXTRA_DIST = ia_ora.cpp ia_ora.h $(ia_oradata_DATA)
diff --git a/src/widget/bitmaps.h b/src/widget/bitmaps.h
new file mode 100644
index 0000000..8744288
--- /dev/null
+++ b/src/widget/bitmaps.h
@@ -0,0 +1,85 @@
+#ifndef __BITMAPS_H
+#define __BITMAPS_H
+
+// Fix Qt's wacky image positions
+static const char * const hc_minimize_toto_xpm[] = {
+"12 12 2 1",
+"# c #000000",
+". c None",
+"............",
+"............",
+"............",
+"............",
+"............",
+"............",
+"............",
+"............",
+"...######...",
+"...######...",
+"............",
+"............"};
+
+static const char * const hc_close_toto_xpm[] = {
+"12 12 3 1",
+"# c #000000",
+". c None",
+"; c #4dff50",
+"............",
+"..;;;;;;;;..",
+".....##.....",
+"..##....##..",
+"...##..##...",
+"....####....",
+".....##.....",
+"....####....",
+"...##..##...",
+"..##....##..",
+"..;;.##.;;..",
+"..##....##.."};
+
+
+static const QCOORD s_arrowUp[]={0,4,5,0,
+ 1,3,6,1,
+ 2,4,7,2,
+ 3,1,8,3,
+ 4,0,9,4};
+
+static const QCOORD s_arrowDown[]={0,0,9,0,
+ 1,1,8,1,
+ 2,2,7,2,
+ 3,3,6,3,
+ 4,4,5,4};
+
+static const QCOORD c_edit_arrow[]={-4,-5, 4, -5,
+ -4 ,-2, 4, -2,
+ -3 ,-1, 3, -1,
+ -2 ,0, 2, 0,
+ -1, 1, 1, 1,
+ 0, 2, 0, 2};
+
+static const QCOORD c_arrow[]={-4 ,-2, 4, -2,
+ -3 ,-1, 3, -1,
+ -2 ,0, 2, 0,
+ -1, 1, 1, 1,
+ 0, 2, 0, 2};
+
+const QCOORD u_spinarrow[]={ 0,-2, 0,-2, -1,-1, 1,-1, -2,0, 2,0 };
+const QCOORD d_spinarrow[]={ -2,-1, 2,-1, -1,0, 1,0, 0,1, 0,1 };
+
+
+const QCOORD u_arrow[]={ 0,-2, 0,-2, -1,-1, 1,-1, -2,0, 2,0, -3,1, 3,1 };
+const QCOORD d_arrow[]={ -3,-2, 3,-2, -2,-1, 2,-1, -1,0, 1,0, 0,1, 0,1 };
+const QCOORD l_arrow[]={ 1,-3, 1,-3, 0,-2, 1,-2, -1,-1, 1,-1, -2,0, 1,0, -1,1, 1,1, 0,2, 1,2, 1,3, 1,3 };
+const QCOORD r_arrow[]={ -2,-3, -2,-3, -2,-2, -1,-2, -2,-1, 0,-1, -2,0, 1,0, -2,1, 0,1, -2,2, -1,2, -2,3, -2,3 };
+
+#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2)
+
+
+
+
+static unsigned char menu_check_bits[] = {
+ 0x00,0x00,0x00,0x04,0x00,0x06,0x00,0x07,0x84,0x07,0xcc,0x03,0xfc,0x01,0xfc,
+ 0x00,0x78,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+
+
+#endif
diff --git a/src/widget/ia_ora.cpp b/src/widget/ia_ora.cpp
new file mode 100644
index 0000000..a508738
--- /dev/null
+++ b/src/widget/ia_ora.cpp
@@ -0,0 +1,3426 @@
+/*
+ * Copyright (C) 2007 Gustavo Pichorim Boiko <boiko@mandriva.com>
+ * Copyright (C) 2006 Laurent Montel <lmontel@mandriva.com>
+ *
+ * based on KDE3 HighColor Style (version 1.0)
+ * Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org>
+ * (C) 2001-2002 Fredrik Höglund <fredrik@kde.org>
+ *
+ * renderGradient() code adapted from the Plastik stype
+ * Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+ *
+ * Drawing routines adapted from the KDE2 HCStyle,
+ * Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org>
+ * (C) 2000 Dirk Mueller <mueller@kde.org>
+ * (C) 2001 Martijn Klingens <klingens@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <qdict.h>
+#include <qdrawutil.h>
+#include <qpainter.h>
+#include <qpointarray.h>
+#include <qstyleplugin.h>
+#include <qprogressbar.h>
+
+#include <qcombobox.h>
+#include <qheader.h>
+#include <qmenubar.h>
+#include <qpushbutton.h>
+#include <qscrollbar.h>
+#include <qslider.h>
+#include <qtabbar.h>
+#include <qtoolbutton.h>
+#include <qtoolbar.h>
+#include <qpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kdrawutil.h>
+#include <kpixmapeffect.h>
+#include <qradiobutton.h>
+#include <qimage.h>
+#include <qcheckbox.h>
+#include "ia_ora.h"
+#include "ia_ora.moc"
+#include "bitmaps.h"
+#include <qlistview.h>
+#include <qlistbox.h>
+#include <kdebug.h>
+//#define USE_CROSS 1
+
+// -- Style Plugin Interface -------------------------
+class ThemeMdvStylePlugin : public QStylePlugin
+{
+public:
+ ThemeMdvStylePlugin() {}
+ ~ThemeMdvStylePlugin() {}
+
+ QStringList keys() const
+ {
+ return QStringList() << "ia_ora";
+ }
+
+ QStyle* create( const QString& key )
+ {
+ if ( key == "ia_ora" )
+ return new MandrivaStyle( );
+ return 0;
+ }
+};
+
+Q_EXPORT_PLUGIN( ThemeMdvStylePlugin )
+// ---------------------------------------------------
+
+
+// ### Remove globals
+QBitmap menuBmp;
+
+static bool scrollmin = false;
+static bool scrollmax = false;
+
+
+static const int itemFrame = 1;
+static const int itemHMargin = 3;
+static const int itemVMargin = 0;
+static const int arrowHMargin = 6;
+static const int rightBorder = 12;
+static const char* kdeToolbarWidget = "kde toolbar widget";
+const int smallButMaxW = 27;
+const int smallButMaxH = 20;
+
+// ---------------------------------------------------------------------------
+MandrivaStyle::MandrivaColorData::~MandrivaColorData()
+{
+}
+
+// ---------------------------------------------------------------------------
+
+MandrivaStyle::MandrivaStyle( )
+ : KStyle( AllowMenuTransparency | FilledFrameWorkaround, WindowsStyleScrollBar )
+ , m_dataCache (), formMode( false ),kickerMode(false)
+{
+ hoverWidget = 0L;
+ hoverControl = HoverNone;
+ m_dataCache.setAutoDelete(true);
+ horizontalLine = 0;
+ verticalLine = 0;
+
+ // setup pixmap cache...
+ pixmapCache = new QIntCache<CacheEntry>(150000, 499);
+ pixmapCache->setAutoDelete(true);
+}
+
+
+MandrivaStyle::~MandrivaStyle()
+{
+ delete pixmapCache;
+ delete horizontalLine;
+ delete verticalLine;
+}
+
+
+MandrivaStyle::MandrivaColorData *MandrivaStyle::realizeData (const QColorGroup &cg) const
+{
+ MandrivaColorData *cdata;
+ //define mandriva color
+ cdata = new MandrivaColorData;
+ cdata->spotColor = cg.highlight().rgb();
+
+ //blue mdk color
+ //cg.base() == white
+ //G0 gb.background()
+ //B2 gb.hightlight
+ //Hardcode
+ if ( cg.background() == QColor( "#EFF3F7" ) )
+ {
+ //Be sure to use design color
+ cdata->shades[0]=QColor( "#EFF3F7" );
+ cdata->shades[1]=QColor( "#DFE7EF" );
+ cdata->shades[2]=QColor( "#CFD7DF" );
+ cdata->shades[3]=QColor( "#C7D3DF" );
+ cdata->shades[4]=QColor( "#B6C3CF" );
+ cdata->shades[5]=QColor( "#A6B2C7" );
+ cdata->shades[6]=QColor( "#8692A6" );
+ }
+ else
+ {
+ //create algo
+ cdata->shades[0]=cg.background();
+ cdata->shades[1]=cdata->shades[0].dark(107);
+ cdata->shades[2]=cdata->shades[0].dark(115);
+ cdata->shades[3]=cdata->shades[0].dark(117);
+ cdata->shades[4]=cdata->shades[0].dark(131);
+ cdata->shades[5]=cdata->shades[0].dark(144);
+ cdata->shades[6]=cdata->shades[0].dark(178);
+
+ }
+ if ( cg.highlight() == QColor("#4965AE" ) ) // Blue
+ {
+ cdata->blueMdkColor[0]=QColor("#A6B6E7" );
+ cdata->blueMdkColor[1]=QColor("#8EA2CF" );
+ cdata->blueMdkColor[2]=QColor("#4965AE" );
+ cdata->blueMdkColor[3]=QColor("#415DA6" );
+ cdata->blueMdkColor[4]=QColor("#21459C" );
+ }
+ else if ( cg.highlight() == QColor("#8EC7FF" ) ) // Arctic
+ {
+ cdata->blueMdkColor[0]=QColor("#EFF7FF" );
+ cdata->blueMdkColor[1]=QColor("#C7DFFF" );
+ cdata->blueMdkColor[2]=QColor("#8EC7FF" );
+ cdata->blueMdkColor[3]=QColor("#79BEFF" );
+ cdata->blueMdkColor[4]=QColor("#69B6FF" );
+ }
+ else if ( cg.highlight() == QColor("#7BAAE7" ) ) // Smooth
+ {
+ cdata->blueMdkColor[0]=QColor("#CEE3FF" );
+ cdata->blueMdkColor[1]=QColor("#ADCFFF" );
+ cdata->blueMdkColor[2]=QColor("#7BAAE7" );
+ cdata->blueMdkColor[3]=QColor("#5A8AD6" );
+ cdata->blueMdkColor[4]=QColor("#427DC6" );
+ }
+ else if ( cg.highlight() == QColor("#F7B610" ) ) // Orange
+ {
+ cdata->blueMdkColor[0]=QColor("#FFDF10" );
+ cdata->blueMdkColor[1]=QColor("#FFCB10" );
+ cdata->blueMdkColor[2]=QColor("#F7B610" );
+ cdata->blueMdkColor[3]=QColor("#FFA208" );
+ cdata->blueMdkColor[4]=QColor("#F79600" );
+ }
+ else if ( cg.highlight() == QColor("#CFD7DF" ) ) // Gray
+ {
+ cdata->blueMdkColor[0]=cdata->shades[1];
+ cdata->blueMdkColor[1]=cdata->shades[2];
+ cdata->blueMdkColor[2]=cdata->shades[3];
+ cdata->blueMdkColor[3]=cdata->shades[4];
+ cdata->blueMdkColor[4]=cdata->shades[5];
+ }
+
+ else
+ {
+ cdata->blueMdkColor[2]=cg.highlight();
+ cdata->blueMdkColor[0]=cdata->blueMdkColor[2].light(150);
+ cdata->blueMdkColor[1]=cdata->blueMdkColor[2].light(137);
+ cdata->blueMdkColor[3]=cdata->blueMdkColor[2].dark(112);
+ cdata->blueMdkColor[4]=cdata->blueMdkColor[2].dark(130);
+ }
+
+ if (cg.button() == cg.background())
+ {
+ for (int i=0; i < 7; ++i)
+ cdata->buttonColor[i] = cdata->shades[i];
+ }
+ else if ( cg.button() == QColor( "#EFF3F7" ) )
+ {
+ //Be sure to use design color
+ cdata->buttonColor[0]=QColor( "#EFF3F7" );
+ cdata->buttonColor[1]=QColor( "#DFE7EF" );
+ cdata->buttonColor[2]=QColor( "#CFD7DF" );
+ cdata->buttonColor[3]=QColor( "#C7D3DF" );
+ cdata->buttonColor[4]=QColor( "#B6C3CF" );
+ cdata->buttonColor[5]=QColor( "#A6B2C7" );
+ cdata->buttonColor[6]=QColor( "#8692A6" );
+ }
+ else
+ {
+ cdata->buttonColor[0]=cg.button();
+ cdata->buttonColor[1]=cdata->buttonColor[0].dark(107);
+ cdata->buttonColor[2]=cdata->buttonColor[0].dark(115);
+ cdata->buttonColor[3]=cdata->buttonColor[0].dark(117);
+ cdata->buttonColor[4]=cdata->buttonColor[0].dark(131);
+ cdata->buttonColor[5]=cdata->buttonColor[0].dark(144);
+ cdata->buttonColor[6]=cdata->buttonColor[0].dark(178);
+ }
+
+ return cdata;
+}
+
+/* We assume this seldom collides, since we can only cache one at a time */
+static long hashColorGroup (const QColorGroup &cg)
+{
+ return cg.button().rgb();// << 8 ^ cg.button().rgb();
+}
+
+
+const MandrivaStyle::MandrivaColorData *MandrivaStyle::lookupData (const QColorGroup &cg) const
+{
+ MandrivaColorData *cdata;
+ long h;
+ QIntCache<MandrivaColorData> *cache;
+
+ h = hashColorGroup (cg);
+
+ // Cast away the const crap
+ // Nasty, but how else would i do it?
+ cache = (QIntCache<MandrivaColorData> *)&m_dataCache;
+
+ cdata = cache->find(h);
+
+ if (cdata == 0 || !cdata->isGroup(cg))
+ {
+ if (cdata != 0)
+ {
+ cache->remove (h);
+ }
+
+ cdata = realizeData (cg);
+ cache->insert (h, cdata);
+ }
+
+ return cdata;
+}
+
+void MandrivaStyle::getShade (const QColorGroup &cg, int shadenr, QColor &res) const
+{
+ const MandrivaColorData *cdata = lookupData(cg);
+
+ res = cdata->shades[shadenr];
+}
+
+void MandrivaStyle::updateHoverControl(const QPoint &pos)
+{
+ QRegion repaint;
+ enum Hover oldControl = hoverControl;
+ hoverControl = HoverNone;
+
+ if (!hoverWidget)
+ return;
+
+ if (hoverWidget->inherits("QScrollBar"))
+ {
+ QRect subline(querySubControlMetrics(CC_ScrollBar, hoverWidget,
+ SC_ScrollBarSubLine)),
+ addline(querySubControlMetrics(CC_ScrollBar, hoverWidget,
+ SC_ScrollBarAddLine)),
+ slider(querySubControlMetrics(CC_ScrollBar, hoverWidget,
+ SC_ScrollBarSlider));
+ if (subline.contains(pos))
+ hoverControl = HoverScrollBarSubLine;
+ else if (addline.contains(pos))
+ hoverControl = HoverScrollBarAddLine;
+ else if (slider.contains(pos))
+ hoverControl = HoverScrollBarSlider;
+
+ if (hoverControl == HoverScrollBarSubLine
+ || oldControl == HoverScrollBarSubLine)
+ repaint += subline;
+ if (hoverControl == HoverScrollBarAddLine
+ || oldControl == HoverScrollBarAddLine)
+ repaint += addline;
+ if (hoverControl == HoverScrollBarSlider
+ || oldControl == HoverScrollBarSlider)
+ repaint += slider;
+ }
+ else if (hoverWidget->inherits("QComboBox"))
+ {
+ QComboBox *cb = static_cast<QComboBox*>(hoverWidget);
+ // for not editable combo, this is not necessary
+ if (!cb->editable())
+ return;
+
+ QRect comboArrow(querySubControlMetrics(CC_ComboBox, hoverWidget,
+ SC_ComboBoxArrow)),
+ comboEditField(querySubControlMetrics(CC_ComboBox, hoverWidget,
+ SC_ComboBoxEditField));
+
+ if (comboArrow.contains(pos))
+ hoverControl = HoverComboBoxArrow;
+ else if (comboEditField.contains(pos))
+ hoverControl = HoverComboBoxEdit;
+
+ if (hoverControl == HoverComboBoxArrow
+ || oldControl == HoverComboBoxArrow)
+ repaint += comboArrow;
+ if (hoverControl == HoverComboBoxEdit
+ || oldControl == HoverComboBoxEdit)
+ repaint += comboEditField;
+ }
+ // if we are still in the same subcontrol, return
+ if (oldControl != hoverControl)
+ hoverWidget->repaint(repaint, false);
+}
+
+void MandrivaStyle::polish(QApplication* app)
+{
+ if (!qstrcmp(app->argv()[0], "kicker"))
+ kickerMode = true;
+}
+
+void MandrivaStyle::polish(QWidget* widget)
+{
+ // Put in order of highest occurance to maximize hit rate
+ if ( widget->inherits( "QComboBox" )
+ || widget->inherits("QScrollBar")
+ || widget->inherits("QHeader")
+ || widget->inherits( "QSlider" )
+ || widget->inherits( "QCheckBox" )
+ || widget->inherits("QSplitterHandle"))
+ {
+ widget->installEventFilter(this);
+ if (widget->inherits( "QScrollBar" ) || widget->inherits( "QComboBox" ))
+ widget->setMouseTracking( true );
+ }
+ else if (widget->inherits("QMenuBar")
+ || widget->inherits("QPopupMenu") )
+ {
+ widget->setBackgroundMode(QWidget::NoBackground);
+ }
+ else if (widget->inherits("QPushButton") )
+ {
+ widget->installEventFilter(this);
+ widget->setBackgroundMode( QWidget::PaletteBackground );
+ }
+ else if ( widget->inherits( "KToolBarSeparator" ) || widget->inherits( "QToolBarSeparator" ) )
+ {
+ widget->setBackgroundMode( QWidget::PaletteBackground );
+ }
+ else if (widget->inherits("QToolBarExtensionWidget"))
+ {
+ widget->installEventFilter(this);
+ }
+ else if ( widget->parentWidget() &&
+ ( ( widget->inherits( "QListBox" ) && widget->parentWidget()->inherits( "QComboBox" ) )
+ || widget->inherits( "KCompletionBox" ) ) )
+ {
+ QListBox* listbox = (QListBox*) widget;
+ listbox->setLineWidth( 1 );
+ listbox->setBackgroundMode( NoBackground );
+ widget->installEventFilter( this );
+ }
+ else if ( !qstrcmp( widget->name(), kdeToolbarWidget) )
+ {
+ widget->setBackgroundMode( NoBackground ); // We paint the whole background.
+ widget->installEventFilter(this);
+ }
+ KStyle::polish( widget );
+}
+
+
+void MandrivaStyle::unPolish(QWidget* widget)
+{
+ QFont f = QApplication::font();
+ QApplication::setFont( f, TRUE ); // get rid of the special fonts for special widget classes
+
+ if ( widget->inherits( "QComboBox" )
+ || widget->inherits("QScrollBar")
+ || widget->inherits("QHeader")
+ || widget->inherits( "QSlider" )
+ || widget->inherits( "QCheckBox" )
+ || widget->inherits("QSplitterHandle"))
+ {
+ widget->removeEventFilter(this);
+ }
+ else if ( widget->inherits("QMenuBar")
+ || widget->inherits("QPopupMenu"))
+ {
+ widget->setBackgroundMode(QWidget::PaletteBackground);
+ }
+ else if ( widget->inherits("QPushButton") )
+ {
+ widget->removeEventFilter(this);
+ }
+ else if (widget->inherits("QToolBarExtensionWidget"))
+ {
+ widget->removeEventFilter(this);
+ }
+ else if ( widget->parentWidget() &&
+ ( ( widget->inherits( "QListBox" ) && widget->parentWidget()->inherits( "QComboBox" ) )
+ || widget->inherits( "KCompletionBox" ) ) )
+ {
+ QListBox* listbox = (QListBox*) widget;
+ listbox->setLineWidth( 1 );
+ listbox->setBackgroundMode( PaletteBackground );
+ widget->removeEventFilter( this );
+ widget->clearMask();
+ }
+ //For toolbar internal separators, return to button, too (can't use qt_cast here since don't have access to the class)
+ else if ( widget->inherits( "KToolBarSeparator" ) || widget->inherits( "QToolBarSeparator" ) )
+ {
+ widget->setBackgroundMode( QWidget::PaletteBackground );
+ }
+ else if ( !qstrcmp( widget->name(), kdeToolbarWidget) )
+ {
+ widget->setBackgroundMode( PaletteBackground );
+ widget->removeEventFilter(this);
+ }
+
+ KStyle::unPolish( widget );
+}
+
+/* reimp. */
+void MandrivaStyle::renderMenuBlendPixmap( KPixmap& pix, const QColorGroup &cg,
+ const QPopupMenu* /* popup */ ) const
+{
+ QColor col = cg.background();
+ //FIXME !!!!!!!!!!!!!!!
+#ifdef Q_WS_X11 // Only draw menu gradients on TrueColor, X11 visuals
+ if ( QPaintDevice::x11AppDepth() >= 24 )
+ KPixmapEffect::gradient( pix, col.light(120), col.dark(115),
+ KPixmapEffect::HorizontalGradient );
+ else
+#endif
+ pix.fill( col );
+}
+
+
+void MandrivaStyle::drawHandle( const MandrivaColorData *cdata,
+ QPainter *p,
+ const QRect &r,
+ const QColorGroup & /*cg*/,
+ SFlags flags,
+ const QStyleOption& /*opt*/,
+ bool /*drawBorder*/ /*for the future remove it*/, bool drawGradient) const
+{
+ int x,y,width,height;
+ r.rect(&x, &y, &width, &height);
+ int i = 0;
+ int delta=0;
+ //fix for handle toolbar, otherwise it's not center
+ if (!(flags & Style_Horizontal))
+ {
+
+ if ( drawGradient )
+ renderGradient( p, QRect(x+2,y+2,width-4, height-4),
+ cdata->shades[2], cdata->shades[0],false);
+ if(width > 30)
+ {
+ delta = x + (width/2) - 11;
+ for(i = 0; i < 3; i++)
+ {
+ drawHandlePoint (cdata,p, (delta + 9*i),
+ y + QMAX((height-4)/2,0));
+ }
+ }
+ else
+ {
+ drawHandlePoint (cdata, p, x + (width-4)/2 ,
+ y + QMAX((height-4)/2,0));
+ }
+ }
+ else
+ {
+ if( drawGradient )
+ renderGradient(p, QRect(x+2,y+2,width-4, height-4),
+ cdata->shades[0],cdata->shades[2], true);
+
+ if(height > 30)
+ {
+ delta = y + (height / 2) - 11;
+ for(i = 0; i < 3; i++)
+ {
+ drawHandlePoint (cdata, p, x + QMAX((width-4)/2,0),
+ delta+9*i);
+ }
+ }
+ else
+ {
+ drawHandlePoint (cdata,p, x + QMAX((width-4)/2,0),
+ y + (height-4) / 2);
+ }
+ }
+}
+
+void MandrivaStyle::drawGroupBox(const MandrivaColorData *cdata, const QColorGroup & cg, QPainter *p, const QRect & r, bool /*active*/, bool sunken)const
+{
+ int x,y,w,h;
+ x=r.x(); y=r.y(); w=r.width(); h=r.height();
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+ p->setPen(cdata->shades[2]);
+ p->drawLine(x+1, y2, x2-1, y2);
+ p->drawLine(x2, y+1, x2, y2-1);
+
+
+ p->drawLine(x+1, y, x2-1, y);
+ p->drawLine(x, y+1, x, y2-1);
+ p->setPen( cg.background() );
+ p->drawPoint( x, y );
+ p->drawPoint( x, y2 );
+ p->drawPoint( x2, y );
+ p->drawPoint( x2, y2 );
+
+ p->setPen( sunken ?cg.base():cdata->shades[1] );
+ p->drawLine( x+1, y+1, x2-1, y+1 );
+ p->drawLine( x+1, y+2, x+1, y2-2 );
+
+ p->setPen( sunken ? cdata->shades[1] :cg.base() );
+ p->drawLine( x+1, y2-1, x2-1, y2-1 );
+ p->drawLine( x2-1, y+2, x2-1, y2-2 );
+}
+
+void MandrivaStyle::drawLineSeparator(const MandrivaColorData *cdata,
+ const QColorGroup & cg, QPainter *p,
+ const QRect & r, bool horizontal,
+ bool /*active*/, bool /*sunken*/,
+ bool skipOffset )const
+{
+ QRect line1, line2;
+
+ p->fillRect(r, cg.background());
+ if (horizontal)
+ {
+ int offset = 0;
+
+ // remove 5 pixels from each side of the line
+ if (r.width() > 20 && skipOffset)
+ offset = 3;
+
+ // draw the separator in the middle of the given rect
+ int middle = (r.top() + r.bottom()) / 2;
+ line1 = QRect(r.x() + offset, middle, r.width() - 2*offset, 1);
+ line2 = QRect(r.x() + offset, middle+1, r.width() - 2*offset, 1);
+ }
+ else
+ {
+ int offset = 0;
+
+ // remove 5 pixels from each side of the line
+ if (r.height() > 20 && skipOffset)
+ offset = 3;
+
+ // draw the separator in the middle of the given rect
+ int middle = (r.left() + r.right()) / 2;
+ line1 = QRect(middle, r.y() + offset, 1, r.height() - 2*offset);
+ line2 = QRect(middle+1, r.y() + offset, 1, r.height() - 2*offset);
+ }
+
+ p->setPen(cdata->shades[2]);
+ p->drawLine(line1.left(), line1.top(), line1.right(), line1.bottom());
+
+ p->setPen( cg.base() );
+ p->drawLine(line2.left(), line2.top(), line2.right(), line2.bottom());
+}
+
+
+void MandrivaStyle::drawFrame( const MandrivaColorData *cdata, const QColorGroup & cg, QPainter *p, const QRect & r, bool active )const
+{
+ //use by checkbox,lineedit,spinbox,combobox
+ int x,y,w,h;
+ x=r.x(); y=r.y(); w=r.width(); h=r.height();
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+
+ p->setPen(cdata->shades[4]);
+ p->drawLine(x+1, y2, x2-1, y2);
+ p->drawLine(x2, y+1, x2, y2-1);
+
+ //Change color if it's active
+ if ( active )
+ p->setPen( cdata->shades[5] );
+ p->drawLine(x+1, y, x2-1, y);
+ p->drawLine(x, y+1, x, y2-1);
+ p->setPen( cg.background() );
+ p->drawPoint( x, y );
+ p->drawPoint( x, y2 );
+ p->drawPoint( x2, y );
+ p->drawPoint( x2, y2 );
+}
+// This function draws primitive elements as well as their masks.
+void MandrivaStyle::drawPrimitive( PrimitiveElement pe,
+ QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ const QStyleOption& opt ) const
+{
+ int x, y, xw, yh;
+ x= r.x();
+ y= r.y();
+ xw = r.x()+r.width()-1;
+ yh = r.y()+r.height()-1;
+ bool down = flags & Style_Down;
+ bool on = flags & Style_On;
+ const MandrivaColorData *cdata = lookupData(cg);
+ bool sunken = flags & Style_Sunken;
+
+ switch(pe)
+ {
+ case PE_PanelTabWidget:
+ {
+ p->save();
+ p->setPen(cdata->shades[4]);
+ p->drawRect(r);
+ p->restore();
+ break;
+ }
+ case PE_FocusRect:
+ {
+ p->save();
+ p->setPen(cdata->shades[6]);
+ p->drawWinFocusRect( r );
+ p->restore();
+ break;
+ }
+ case PE_PanelMenuBar: // Menu
+ {
+ //FIXME
+ p->fillRect(r, cg.brush(QColorGroup::Background));
+
+ int x2 = r.x()+r.width()-1;
+ int y2 = r.y()+r.height()-1;
+
+ p->setPen(cdata->shades[2]);
+ p->drawLine(x, y2, x2, y2);
+
+ break;
+ }
+
+ case PE_PanelDockWindow: // Toolbar
+ {
+ bool horiz = r.width() > r.height();
+
+ //Here, we just draw the border.
+ int x = r.x();
+ int y = r.y();
+ int x2 = r.x() + r.width() - 1;
+ int y2 = r.y() + r.height() - 1;
+ int lw = opt.isDefault() ? pixelMetric(PM_DefaultFrameWidth)
+ : opt.lineWidth();
+
+ //FIXME
+ if (lw)
+ {
+ //Gradient border colors.
+ //(Same as in gradients.cpp)
+ QColor gradTop = cg.base();
+ QColor gradBot = cdata->shades[2];
+ if (horiz)
+ {
+ //Top line
+ p->setPen(gradTop);
+ p->drawLine(x, y, x2, y);
+
+ //Bottom line
+ p->setPen(gradBot);
+ p->drawLine(x, y2, x2, y2);
+ }
+ else
+ {
+ //Left line
+ p->setPen(gradTop);
+ p->drawLine(x, y, x, y2);
+
+ //Right line
+ p->setPen(gradBot);
+ p->drawLine(x2, y, x2, y2);
+ }
+ }
+ break;
+ }
+ case PE_DockWindowSeparator:
+ {
+ bool horiz = flags & Style_Horizontal;
+
+ drawLineSeparator( cdata, cg, p, r, !horiz, true, sunken );
+ break;
+ }
+
+ case PE_DockWindowResizeHandle:
+ case PE_Splitter:
+ {
+ QRect real(r);
+ real.addCoords( 1, 0,0 ,0);
+ QColor color = (hoverWidget == p->device())?cdata->shades[1]:cg.background();
+ p->fillRect( r, color );
+ p->setPen( cg.background() );
+ p->drawPoint( r.x(), 0 );
+ p->drawPoint( r.width()-1, 0 );
+ p->drawPoint( r.x(), r.height()-1 );
+ p->drawPoint( r.width()-1, r.height()-1 );
+
+ drawHandle( cdata, p,real,cg,flags,opt, false );
+ break;
+ }
+ case PE_PanelLineEdit:
+ {
+ drawFrame( cdata, cg, p, r, true );
+ break;
+ }
+ case PE_Panel: //QListBox and co
+ {
+ if(kickerMode)
+ break;
+ p->save();
+ p->setPen(cdata->shades[4]);
+ p->drawRect(r);
+ p->restore();
+ break;
+ }
+ case PE_StatusBarSection:
+ {
+ p->fillRect(r, cg.background());
+ break;
+ }
+ case PE_PanelPopup:
+ case PE_WindowFrame:
+ {
+ int lw = /*opt.isDefault() ? pixelMetric(PM_DefaultFrameWidth)
+ : opt.lineWidth()*/1;
+ if (lw == 1 || lw == 2)
+ {
+ QPen oldPen = p->pen();
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+ p->setPen(sunken ? cg.light() : cdata->shades[2]);
+ p->drawLine(x, y2, x2, y2);
+ p->drawLine(x2, y, x2, y2);
+ p->setPen(sunken ? cdata->shades[2] : cg.light());
+ p->drawLine(x, y, x2, y);
+ p->drawLine(x, y, x, y2);
+ p->setPen(sunken ? cg.midlight() : cdata->shades[2]);
+ p->drawLine(x+1, y2-1, x2-1, y2-1);
+ p->drawLine(x2-1, y+1, x2-1, y2-1);
+ p->setPen(sunken ? cdata->shades[2] : cg.midlight());
+ p->drawLine(x+1, y+1, x2-1, y+1);
+ p->drawLine(x+1, y+1, x+1, y2-1);
+ if( lw == 2 )
+ {
+ p->setPen(sunken ? cg.midlight() : cdata->shades[5]);
+ p->drawLine(x+2, y2-2, x2-2, y2-2);
+ p->drawLine(x2-1, y+2, x2-2, y2-2);
+ p->setPen(sunken ? cdata->shades[5] : cg.midlight());
+ p->drawLine(x+2, y+2, x2-2, y+2);
+ p->drawLine(x+2, y+2, x+2, y2-2);
+ }
+ p->setPen(oldPen);
+ }
+ else
+ KStyle::drawPrimitive(pe, p, r, cg, flags, opt);
+ break;
+ }
+ case PE_GroupBoxFrame:
+ {
+ if ( opt.isDefault() || opt.lineWidth() <= 0 )
+ break;
+ drawGroupBox( cdata, cg, p, r, true,sunken );
+ break;
+ }
+#if 0
+ case PE_PanelGroupBox:
+ drawPrimitive( PE_GroupBoxFrame, p, r, cg, flags, opt );
+ break;
+#endif
+ case PE_Separator:
+ {
+ drawLineSeparator( cdata, cg, p, r, true, true, sunken );
+ break;
+ }
+ case PE_HeaderArrow:
+ {
+ if ( flags & Style_Up )
+ drawPrimitive( PE_ArrowUp, p, r, cg, Style_Enabled );
+ else
+ drawPrimitive( PE_ArrowDown, p, r, cg, Style_Enabled );
+ break;
+ }
+ case PE_HeaderSection:
+ {
+ bool horizontal = true;
+ bool isFirst = false;
+ if (p && p->device()->devType() == QInternal::Widget) {
+ QHeader* hdr = dynamic_cast<QHeader*>(p->device());
+ if (hdr)
+ {
+ horizontal = ( hdr->orientation() == Horizontal );
+ isFirst = hdr->mapToIndex(hdr->sectionAt(r.x() ) ) == 0;
+ }
+ }
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ QPen oldPen = p->pen();
+
+ //TODO verify it
+ if (flags & Style_MouseOver)
+ renderGradient( p, QRect(x, y, w, h-1),
+ cdata->shades[0],cdata->shades[2], !horizontal );
+ else if ( on )
+ renderGradient(p, QRect(x, y, w, h-1),
+ cdata->shades[0],cdata->shades[2], !horizontal );
+ else if ( down )
+ renderGradient(p, QRect(x, y, w, h-1),
+ cdata->shades[2],cdata->shades[1], !horizontal );
+ else
+ renderGradient( p, QRect(x, y, w, h-1),
+ cdata->shades[0],cdata->shades[2], !horizontal );
+
+ //don't draw separator for first eleemtn
+ if ( !isFirst )
+ {
+ drawLineSeparator(cdata, cg, p, QRect(x,y,2,h), false, true, false, false);
+ }
+ p->setPen( oldPen );
+ break;
+ }
+ case PE_ExclusiveIndicator:
+ { //radiobutton
+ bool enabled = flags & Style_Enabled;
+ p->setPen( cdata->shades[4] );
+ p->setBrush( QBrush( enabled ? cg.base() : cdata->shades[0] ) );
+ p->drawEllipse( r );
+ bool specificBackground = excludeColor( cg.highlight(), enabled );
+
+ if (!(flags & Style_Off))
+ {
+ if (flags & Style_On) //on
+ {
+ if ( specificBackground )
+ p->setPen( enabled ? cdata->shades[6]:cdata->shades[3] );
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[2]:cdata->shades[3] );
+ p->drawLine( x+5, y+3, xw-5, y+3 );
+ p->drawLine( x+4, y+4, xw-4, y+4 );
+ p->drawLine( x+3, y+5, xw-3, y+5 );
+
+ if ( specificBackground )
+ p->setPen( enabled ? cdata->shades[6]:cdata->shades[5] );
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[4]:cdata->shades[5] );
+
+
+ p->drawLine( x+3, y+6, xw-3, y+6 );
+ p->drawLine( x+4, y+7, xw-4, y+7);
+ p->drawLine( x+5, y+8, xw-5, y+8 );
+ }
+ }
+ break;
+ }
+ case PE_CheckListIndicator:
+ {
+ QCheckListItem *item = opt.checkListItem();
+ if(!item)
+ return;
+ int x = r.x(), y = r.y(), w = r.width(), h = r.width();
+ drawPrimitive(PE_Indicator, p, QRect(x-2, y-2 , w+3, h+3 ) , cg, flags );
+ break;
+ }
+ //case PE_IndicatorMask:
+ case PE_Indicator:
+ { //checkbox
+ bool enabled = flags & Style_Enabled;
+
+ //draw background use base color
+ QRect ar( x+1, y+1, x+11, y+10 );
+ p->fillRect (ar, enabled ? cg.base() : cdata->shades[0]);
+ bool specificBackground = excludeColor( cg.highlight(), enabled );
+ //TODO mouse over
+ if (!(flags & Style_Off))
+ {
+ if (flags & Style_On) //on
+ {
+#ifdef USE_CROSS
+ p->setPen( enabled ? cdata->blueMdkColor[2]:cdata->shades[3] );
+ //TODO look at if we can use a qbitmap directly
+ p->drawLine( x+2, y+2, x+3, y+2 );
+ p->drawLine( x+2, y+3, x+4, y+3 );
+ p->drawLine( x+3, y+4, x+5, y+4 );
+ p->drawLine( x+4, y+5, x+8, y+5 );
+ p->drawLine( x+9, y+2, x+10, y+2 );
+ p->drawLine( x+8, y+3, x+10, y+3 );
+ p->drawLine( x+7, y+4, x+9, y+4 );
+ p->setPen( enabled ? cdata->blueMdkColor[4] : cdata->shades[5]);
+ p->drawLine( x+4, y+6, x+8, y+6 );
+ p->drawLine( x+3, y+7, x+5, y+7 );
+ p->drawLine( x+2, y+8, x+4, y+8 );
+ p->drawLine( x+2, y+9, x+3, y+9 );
+
+ p->drawLine( x+9, y+9, x+10, y+9 );
+ p->drawLine( x+8, y+8, x+10, y+8 );
+ p->drawLine( x+7, y+7, x+9, y+7 );
+#else
+ if (QApplication::reverseLayout() )
+ {
+ if ( specificBackground )
+ p->setPen( enabled ? cdata->shades[6]:cdata->shades[3] );
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[2]:cdata->shades[3] );
+
+ p->drawPoint( x+2,y+2 );
+ p->drawLine( x+2,y+3,x+3,y+3 );
+ p->drawLine( x+2,y+4,x+4,y+4 );
+ p->drawLine( x+3,y+5,x+5,y+5 );
+ p->drawLine( x+4,y+6,x+6,y+6 );
+ p->drawPoint( x+10,y+5 );
+ p->drawLine( x+9,y+6,x+10,y+6 );
+
+ if ( specificBackground )
+ p->setPen( enabled ? Qt::black : cdata->shades[4]);
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[4] : cdata->shades[4]);
+ p->drawLine( x+5,y+7,x+10,y+7 );
+ p->drawLine( x+6,y+8,x+9,y+8 );
+ p->drawLine( x+7,y+9,x+8,y+9 );
+
+ }
+ else
+ {
+ if ( specificBackground )
+ p->setPen( enabled ? cdata->shades[6]:cdata->shades[3] );
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[2]:cdata->shades[3] );
+ p->drawPoint( x+10,y+2 );
+ p->drawLine( x+9,y+3,x+10,y+3 );
+ p->drawLine( x+8,y+4,x+10,y+4 );
+ p->drawLine( x+7,y+5,x+9,y+5 );
+ p->drawLine( x+6,y+6,x+8,y+6 );
+ p->drawPoint( x+2,y+5 );
+ p->drawLine( x+2,y+6,x+3,y+6 );
+
+ if ( specificBackground )
+ p->setPen( enabled ? Qt::black : cdata->shades[4]);
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[4] : cdata->shades[4]);
+
+ p->drawLine( x+2,y+7,x+7,y+7 );
+ p->drawLine( x+3,y+8,x+6,y+8 );
+ p->drawLine( x+4,y+9,x+5,y+9 );
+ }
+#endif
+ }
+ else //tristate
+ {
+ if ( specificBackground )
+ p->setPen( enabled ? cdata->shades[6] : cdata->shades[3]);
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[2] : cdata->shades[3]);
+
+ p->drawLine( x+4, y+5, x+8, y+5 );
+ p->drawLine( x+3, y+6, x+9, y+6 );
+ if ( specificBackground )
+ p->setPen( enabled ? Qt::black : cdata->shades[5]);
+ else
+ p->setPen( enabled ? cdata->blueMdkColor[4] : cdata->shades[5]);
+ p->drawLine( x+4, y+7, x+8, y+7 );
+ }
+ }
+ drawFrame( cdata, cg, p, r,true );
+ break;
+ }
+ case PE_SizeGrip:
+ {
+ int y = r.y();
+ int x2 = r.width();
+ int y2 = r.height();
+ p->setPen( cdata->shades[2] );
+ p->drawPoint( x2, y );
+ p->drawPoint( x2-1, y+1 );
+ p->drawLine( x2-2, y+2, x2-1, y+2 );
+ p->drawLine( x2-3, y+3, x2-1, y+3 );
+ p->drawLine( x2-4, y+4, x2-1, y+4 );
+ p->drawLine( x2-5, y+5, x2-1, y+5 );
+ p->drawLine( x2-6, y+6, x2-1, y+6 );
+ p->drawLine( x2-7, y+7, x2-2, y+7 );
+ p->drawLine( x2-8, y+8, x2-3, y+8 );
+ p->drawLine( x2-9, y+9, x2-4, y+9 );
+ p->drawLine( x2-10, y+10, x2-6, y+10 );
+ p->drawLine( x2-11, y+11, x2-9, y+11 );
+
+ p->drawPoint( x2, y+12 );
+ p->drawLine( x2-1, y+13,x2,y+13 );
+ p->drawLine( x2-2, y+14,x2-1,y+14 );
+
+ //TODO draw last point
+ p->setPen( cdata->shades[3] );
+
+ p->drawLine( x2, y+1, x2, y2-3 );
+ p->drawPoint( x2-1, y+7 );
+ p->drawLine( x2-2, y+8, x2-1, y+8 );
+ p->drawLine( x2-3, y+9, x2-1, y+9 );
+ p->drawLine( x2-5, y+10, x2-1, y+10 );
+ p->drawLine( x2-8, y+11, x2-1, y+11 );
+ p->drawLine( x2-12, y+12, x2-1, y+12 );
+ p->drawLine( x2-13, y+13, x2-2, y+13 );
+ p->drawLine( x2-14, y+14, x2-3, y+14 );
+
+ p->setPen( cg.background() );
+ p->drawPoint( x2, y2 );
+ break;
+ }
+ case PE_SpinWidgetUp:
+ case PE_SpinWidgetDown:
+ {
+ p->save();
+ QRect br;
+ QRect re( r );
+ br.setRect( r.x() , r.y(), r.width()+1, r.height() );
+
+ bool down = flags & Style_Down;
+ bool on = flags & Style_On;
+ bool sunken = on || down;
+ //Verify
+ if ( on )
+ renderGradient(p, br,
+ cdata->shades[0],cdata->shades[2], /*!horizontal*/ false);
+ else if ( down )
+ renderGradient(p, br,
+ cdata->shades[2],cdata->shades[1], /*!horizontal*/ false);
+ else if( !sunken && (flags & Style_Enabled ))
+ renderGradient(p, br,
+ cdata->shades[2],cdata->shades[0], /*!horizontal*/false );
+
+ p->setPen( cdata->shades[5]);
+ p->drawLine( br.x()-1, br.y(), br.x()-1, br.x()+r.height() ); //TODO verify +1 ???
+ if ( pe == PE_SpinWidgetUp )
+ {
+ QRect tmp( re );
+ tmp.addCoords( -1, -2, 1, 1 );
+ p->drawRect( tmp );
+ //p->drawLine(br.x()-1, br.y()+br.height(), br.x()+br.width()-1, br.y()+br.height() ); //TODO verify +1 ???
+ p->setPen( cg.background() );
+ //p->drawPoint( tmp.width()-1, tmp.y()+1 ) ;
+ }
+ else
+ {
+ QRect tmp( re );
+ tmp.addCoords( -1, 0, 1, 1 );
+ p->drawRect( tmp );
+
+ //p->drawLine(br.x()-1, br.y(), br.x()+br.width()-1, br.y() ); //TODO verify +1 ???
+ p->setPen( cg.background() );
+ //p->drawPoint( tmp.width()-5, tmp.height()-2 ) ;
+ }
+ int w = r.width();
+ int sw = w-4;
+ if ( sw < 3 )
+ break;
+ else if ( !(sw & 1) )
+ sw--;
+ sw -= ( sw / 7 ) * 2; // Empty border
+ //TODO don't use same color for active/inactive
+ p->setPen( cg.buttonText() );
+ p->setBrush( cg.buttonText() );
+ QPointArray a;
+ if ( pe == PE_SpinWidgetDown )
+ a.setPoints(QCOORDARRLEN(d_spinarrow), d_spinarrow);
+ else
+ {
+ //move one pixel up
+ re.addCoords( 0, 1,0,0);
+ a.setPoints(QCOORDARRLEN(u_spinarrow), u_spinarrow);
+ }
+ drawMandrivaArrow( a, p, re, cg, flags, opt );
+ p->restore();
+ break;
+ }
+ case PE_ScrollBarSlider:
+ {
+ bool horizontal = flags & Style_Horizontal;
+
+ p->setPen( cdata->shades[5]);
+ if( scrollmin && scrollmax )
+ {
+ QRect tmpRect(r);
+ if( !horizontal )
+ tmpRect.addCoords(0,0,0,1);
+ else
+ tmpRect.addCoords(0,0,1,0);
+
+ p->drawRect( tmpRect );
+ }
+ else
+ p->drawRect( r );
+
+ p->setPen( cdata->shades[0]);
+ if ( horizontal )
+ {
+ p->drawLine( r.x(), r.y()+1, r.x(), r.y()+r.height()-2 );
+ p->drawLine( r.x()+r.width(), r.y() +1 , r.x()+r.width(), r.y()+r.height()-2 );
+ }
+ else
+ {
+ p->drawLine( r.x()+1, r.y(), r.x()+r.width()-2, r.y() );
+ p->drawLine( r.x()+1, r.y()+r.height()-1, r.x()+r.width()-2, r.y()+r.height()-1 );
+ }
+ // if the mouse is over the slider, the first half of the gradient changes
+ bool mouseover = flags & Style_MouseOver;
+
+ QRect tmpRect(r), firstHalf, secondHalf;
+ if (horizontal)
+ {
+ tmpRect.addCoords( 0, 1, 0, -1 );
+ firstHalf = QRect(tmpRect.x(), tmpRect.y(), tmpRect.width(), tmpRect.height()/2);
+ secondHalf = QRect(tmpRect.x(), tmpRect.height()/2 + 1,
+ tmpRect.width(), tmpRect.height() - (tmpRect.height()/2));
+ }
+ else
+ {
+ tmpRect.addCoords( 1, 0, -1, 0 );
+ firstHalf = QRect(tmpRect.x(), tmpRect.y(), tmpRect.width()/2, tmpRect.height());
+ secondHalf = QRect(tmpRect.width()/2 + 1, tmpRect.y(),
+ tmpRect.width() - (tmpRect.width()/2), tmpRect.height());
+ }
+
+ // first half of the gradient
+ // horizontal scrollbars need vertical gradients (that's the reason
+ // of the !horizontal as the last argument
+ renderGradient(p, firstHalf, mouseover ? cdata->blueMdkColor[0] : cdata->blueMdkColor[1],
+ cdata->blueMdkColor[3], !horizontal);
+
+ // second half of the gradient
+ renderGradient(p, secondHalf, cdata->blueMdkColor[4], cdata->blueMdkColor[2], !horizontal);
+
+ // draw the points if !scrollmin or !scrollmax
+ p->setPen( cg.background() );
+ if (horizontal)
+ {
+ if ( !scrollmax )
+ {
+ p->drawPoint( tmpRect.x()+ tmpRect.width()-1, tmpRect.y() );
+ p->drawPoint( tmpRect.x()+tmpRect.width()-1, tmpRect.y()+tmpRect.height()-1 );
+ }
+ if ( !scrollmin )
+ {
+ p->drawPoint( tmpRect.x(), tmpRect.y() );
+ p->drawPoint( tmpRect.x(), tmpRect.height() );
+ }
+ }
+ else
+ {
+ if ( !scrollmax )
+ {
+ p->drawPoint( tmpRect.x(), tmpRect.y()+tmpRect.height()-1 );
+ p->drawPoint( tmpRect.width(), tmpRect.y()+tmpRect.height()-1 );
+ }
+ if ( !scrollmin )
+ {
+ p->drawPoint( tmpRect.x(), tmpRect.y() );
+ p->drawPoint( tmpRect.width(), tmpRect.y() );
+ }
+ }
+
+ break;
+ }
+ case PE_ScrollBarAddPage:
+ case PE_ScrollBarSubPage: {
+ int x, y, w, h;
+ r.rect(&x, &y, &w, &h);
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+
+ p->setPen( cg.base());
+ p->drawLine( x,y,x,y2 );
+ p->drawLine( x2,y,x2,y2 );
+ p->setPen( cdata->shades[5]);
+
+ if (flags & Style_Horizontal) {
+ p->drawLine(x, y, x2, y);
+ p->drawLine(x, y2, x2, y2);
+ p->fillRect( QRect( x, y+1, w, h-2),cdata->shades[0] );
+ } else {
+ p->drawLine(x, y, x, y2);
+ p->drawLine(x2, y, x2, y2);
+ p->fillRect( QRect( x+1, y, w-2, h),cdata->shades[0] );
+ }
+ break;
+ }
+
+ case PE_ScrollBarAddLine:
+ case PE_ScrollBarSubLine:
+ {
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ bool sunken = on || down;
+ bool mouseover = flags & Style_MouseOver;
+ bool horizontal = flags & Style_Horizontal;
+
+ // draw the bounding rect
+ p->setPen( cdata->shades[5]);
+ p->drawRect( r );
+
+ // draw the gradient of the buttons
+ if (w > 4 && h > 4)
+ {
+ if (sunken)
+ renderGradient(p, QRect(x+1, y+1, w-2, h-2),
+ cdata->shades[2],cdata->shades[1], !horizontal);
+ else if ( flags & Style_Enabled )
+ renderGradient(p, QRect(x+1, y+1, w-2, h-2),
+ cdata->shades[0], mouseover ? cdata->shades[1] : cdata->shades[2], !horizontal );
+ }
+
+ PrimitiveElement arrow;
+ // draw some points to get a kind of rounded corner
+ p->setPen( cg.background() );
+ if (pe == PE_ScrollBarAddLine)
+ {
+ arrow = horizontal ? PE_ArrowRight : PE_ArrowDown;
+ if ( horizontal )
+ {
+ p->drawPoint( r.x()+r.width()-1 ,r.y() );
+ p->drawPoint( r.x()+r.width()-1 ,r.y()+r.height()-1 );
+ }
+ else
+ {
+ p->drawPoint( r.x() ,r.y()+r.height()-1 );
+ p->drawPoint( r.x()+r.width()-1 ,r.y()+r.height()-1 );
+ }
+ }
+ else
+ {
+ arrow = horizontal ? PE_ArrowLeft : PE_ArrowUp;
+ if ( horizontal )
+ {
+ p->drawPoint( r.x() ,r.y() );
+ p->drawPoint( r.x() ,r.y()+r.height()-1 );
+ }
+ else
+ {
+ p->drawPoint( r.x() ,r.y() );
+ p->drawPoint( r.x()+r.width()-1 ,r.y() );
+ }
+ }
+
+ // draw the arrow
+ drawPrimitive( arrow, p, r, cg, flags );
+ break;
+ }
+
+ // BUTTONS
+ // -------------------------------------------------------------------
+ case PE_ButtonDefault: //default button
+ case PE_ButtonCommand: // action button
+ case PE_ButtonDropDown:
+ case PE_ButtonTool:
+ {
+ drawButton(cdata,r,p,cg,flags);
+ break;
+ }
+ case PE_CheckMark:
+ {
+ if (menuBmp.isNull())
+ {
+ menuBmp = QBitmap( 12 , 12, menu_check_bits, true);
+ menuBmp.setMask(menuBmp);
+ }
+ int x,y;
+ x=r.x(); y=r.y();
+
+ if (!(flags & Style_Off))
+ {
+ p->setPen( on ? cdata->blueMdkColor[2] : cg.highlightedText () );
+ p->drawPixmap(x+3, y+3, menuBmp);
+ }
+
+ break;
+ }
+
+ //FIXME !!!!!!!!!!!!!!!!!!!! scrollbar
+ case PE_ButtonBevel:
+ {
+ int x,y,w,h;
+ r.rect(&x, &y, &w, &h);
+ bool sunken = on || down;
+ int x2 = x+w-1;
+ int y2 = y+h-1;
+
+ // Outer frame
+ p->setPen(cg.shadow());
+ p->drawRect(r);
+
+ // Bevel
+ p->setPen(sunken ? cg.mid() : cg.light());
+ p->drawLine(x+1, y+1, x2-1, y+1);
+ p->drawLine(x+1, y+1, x+1, y2-1);
+ p->setPen(sunken ? cg.light() : cg.mid());
+ p->drawLine(x+2, y2-1, x2-1, y2-1);
+ p->drawLine(x2-1, y+2, x2-1, y2-1);
+ if (w > 4 && h > 4) {
+ if (sunken)
+ p->fillRect(x+2, y+2, w-4, h-4, cg.button());
+ /*else
+ renderGradient( p, QRect(x+2, y+2, w-4, h-4),
+ cg.button(), flags & Style_Horizontal );*/
+ }
+ break;
+ }
+
+ default:
+ {
+ if (pe >= PE_ArrowUp && pe <= PE_ArrowLeft)
+ {
+ QPointArray a;
+ //array point define into bitmap.h
+ switch(pe) {
+ case PE_ArrowUp:
+ a.setPoints(QCOORDARRLEN(u_arrow), u_arrow);
+ break;
+
+ case PE_ArrowDown:
+ a.setPoints(QCOORDARRLEN(d_arrow), d_arrow);
+ break;
+
+ case PE_ArrowLeft:
+ a.setPoints(QCOORDARRLEN(l_arrow), l_arrow);
+ break;
+
+ default:
+ a.setPoints(QCOORDARRLEN(r_arrow), r_arrow);
+ }
+ drawMandrivaArrow( a, p, r, cg, flags, opt );
+ }
+ else
+ KStyle::drawPrimitive( pe, p, r, cg, flags, opt );
+ }
+ } //switch
+}
+
+void MandrivaStyle::drawMandrivaArrow( QPointArray a, QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ const QStyleOption& /*opt*/ ) const
+{
+ QPen oldPen = p->pen();
+ a.translate( r.x() + r.width() / 2, r.y() + r.height() / 2 );
+ p->setPen(flags & Style_Enabled ? cg.buttonText() : cg.mid() );
+ p->drawLineSegments( a );
+ p->setPen( oldPen ); // restore pen
+}
+
+void MandrivaStyle::drawKStylePrimitive( KStylePrimitive pe,
+ QPainter* p,
+ const QWidget* widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ const QStyleOption &opt ) const
+{
+ const MandrivaColorData *cdata = lookupData(cg);
+ switch(pe)
+ {
+ // GENERAL/KICKER HANDLE
+ // -------------------------------------------------------------------
+ case KPE_GeneralHandle:
+ {
+ drawHandle( cdata, p,r,cg,flags,opt,false );
+ break;
+ }
+
+ // TOOLBAR HANDLE
+ // -------------------------------------------------------------------
+ case KPE_ToolBarHandle:
+ {
+ QRect real(r);
+ real.addCoords( -1, 0,0,0);
+ drawHandle( cdata, p,r,cg,flags,opt,true );
+ break;
+ }
+ // SLIDER GROOVE
+ // -------------------------------------------------------------------
+ case KPE_SliderGroove:
+ {
+ const QSlider* sl = static_cast< const QSlider* >( widget );
+ bool horizontal = sl->orientation() == Horizontal;
+ //TODO fixme
+ p->fillRect( QRect( r.x()+1, r.y()+1, r.width()-2, r.height()-2 ),cdata->shades[0] );
+ p->setPen( cdata->shades[1] );
+
+ int pos = sl->sliderStart();
+
+ if ( horizontal )
+ {
+ //bidi
+ if (QApplication::reverseLayout() )
+ p->fillRect( QRect( pos, 1, r.right(), r.height()-2 ),cdata->shades[3] );
+ else
+ p->fillRect( QRect( 1, 1, pos, r.height()-2 ),cdata->shades[3] );
+ for ( int i = 12; i < r.width() ; )
+ {
+ p->drawLine( i, r.y()+1, i, r.height()-2 );
+ i+=12;
+ }
+ }
+ else
+ {
+ p->fillRect( QRect( 1, pos, r.width()-2, r.height() ),cdata->shades[3] );
+ for ( int i = 12; i < r.height() ; )
+ {
+ p->drawLine( r.x(), i, r.width(), i );
+ i+=12;
+ }
+ }
+ drawFrame( cdata, cg, p, r,true /*flags ? */);
+ break;
+ }
+
+ // SLIDER HANDLE
+ // -------------------------------------------------------------------
+ case KPE_SliderHandle:
+ {
+ const QSlider* sl = static_cast< const QSlider* >( widget );
+ bool horizontal = sl->orientation() == Horizontal;
+ bool mouseOver = (widget == hoverWidget);
+ int x = r.x();
+ int y = r.y();
+ int x2 = r.right();
+ int y2 = y+r.height();
+ p->setPen( mouseOver ? cdata->blueMdkColor[1] : cdata->blueMdkColor[2]);
+ if ( horizontal )
+ {
+ p->drawLine( x+1, y, x2-1, y );
+ p->drawLine( x, y+1, x2, y+1 );
+ p->drawLine( x, y+2, x2, y+2 );
+
+ p->setPen( mouseOver ? cdata->blueMdkColor[2] : cdata->blueMdkColor[4]);
+ p->drawLine( x, y+4, x2, y+4 );
+ p->drawLine( x, y+3, x2, y+3 );
+ p->drawLine( x+1, y+5, x2-1, y+5 );
+
+ //draw cross
+ int newposx = x+r.width()/2;
+
+ p->drawLine( newposx-1, y+1, newposx+1,y+1 );
+ p->drawLine( newposx-2, y+2, newposx+2,y+2 );
+
+ p->setPen( mouseOver ? cdata->blueMdkColor[1] : cdata->blueMdkColor[2]);
+ p->drawLine( newposx-2, y+3, newposx+2,y+3 );
+ p->drawLine( newposx-1, y+4, newposx+1,y+4 );
+ }
+ else //test into kmix
+ {
+ p->drawLine( x, y+1, x, y2-1 );
+ p->drawLine( x+1, y, x+1, y2 );
+ p->drawLine( x+2, y, x+2, y2 );
+
+
+ p->setPen( mouseOver ? cdata->blueMdkColor[2] : cdata->blueMdkColor[4]);
+ p->drawLine( x+3, y, x+3, y2 );
+ p->drawLine( x+4, y, x+4, y2 );
+ p->drawLine( x+5, y+1, x+5, y2-1 );
+
+
+ //draw cross
+ int newposy = y+r.height()/2;
+
+ p->drawLine( x+1, newposy-1, x+1, newposy+1);
+ p->drawLine( x+2, newposy-2, x+2, newposy+2);
+
+ p->setPen( mouseOver ? cdata->blueMdkColor[1] : cdata->blueMdkColor[2]);
+ p->drawLine( x+3, newposy-2, x+3, newposy+2);
+ p->drawLine( x+4, newposy-1, x+4, newposy+1);
+
+ }
+ break;
+ }
+ // copied and slightly modified from KStyle.
+ case KPE_ListViewBranch:
+ {
+ // Typical Windows style listview branch element (dotted line).
+
+ // Create the dotline pixmaps if not already created
+ if ( !verticalLine )
+ {
+ // make 128*1 and 1*128 bitmaps that can be used for
+ // drawing the right sort of lines.
+ verticalLine = new QBitmap( 1, 129, true );
+ horizontalLine = new QBitmap( 128, 1, true );
+ QPointArray a( 64 );
+ QPainter p2;
+ p2.begin( verticalLine );
+
+ int i;
+ for( i=0; i < 64; i++ )
+ a.setPoint( i, 0, i*2+1 );
+ p2.setPen( cdata->shades[4] );
+ p2.drawPoints( a );
+ p2.end();
+ QApplication::flushX();
+ verticalLine->setMask( *verticalLine );
+
+ p2.begin( horizontalLine );
+ for( i=0; i < 64; i++ )
+ a.setPoint( i, i*2+1, 0 );
+ p2.setPen( cdata->shades[4] );
+ p2.drawPoints( a );
+ p2.end();
+ QApplication::flushX();
+ horizontalLine->setMask( *horizontalLine );
+ }
+
+ p->setPen( cg.mid() );
+
+ if (flags & Style_Horizontal)
+ {
+ int point = r.x();
+ int other = r.y();
+ int end = r.x()+r.width();
+ int thickness = r.height();
+
+ while( point < end )
+ {
+ int i = 128;
+ if ( i+point > end )
+ i = end-point;
+ p->drawPixmap( point, other, *horizontalLine, 0, 0, i, thickness );
+ point += i;
+ }
+
+ }
+ else
+ {
+ int point = r.y();
+ int other = r.x();
+ int end = r.y()+r.height();
+ int thickness = r.width();
+ int pixmapoffset = (flags & Style_NoChange) ? 0 : 1; // ### Hackish
+
+ while( point < end )
+ {
+ int i = 128;
+ if ( i+point > end )
+ i = end-point;
+ p->drawPixmap( other, point, *verticalLine, 0, pixmapoffset, thickness, i );
+ point += i;
+ }
+ }
+
+ break;
+ }
+ default:
+ KStyle::drawKStylePrimitive( pe, p, widget, r, cg, flags, opt);
+ }
+}
+
+void MandrivaStyle::drawControl( ControlElement element,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ const QStyleOption& opt ) const
+{
+ const MandrivaColorData *cdata = lookupData(cg);
+ switch (element)
+ {
+ case CE_CheckBox:
+ {
+ drawPrimitive (PE_Indicator, p, r, cg, flags);
+ break;
+ }
+ //progressbar
+ case CE_ProgressBarContents:
+ {
+ const QProgressBar* pb = (const QProgressBar*)widget;
+ QRect backend = subRect(SR_ProgressBarContents, widget);
+ double progress = pb->progress();
+ bool reverse = QApplication::reverseLayout();
+ int steps = pb->totalSteps();
+
+ if (!pb || !backend.isValid())
+ return;
+ //necessary to fill all background
+ //TODO fix it
+ p->fillRect(backend , cg.background() );
+
+ //draw border
+ drawPrimitive( PE_PanelLineEdit, p, r, cg );
+
+ QRect cr(backend);
+ cr.addCoords( 1, 1, -2, -2 );
+
+ // Draw progress bar gradient
+ if (progress > 0 || steps == 0)
+ {
+ double pg = (steps == 0) ? 0.1 : progress / steps;
+ int width = QMIN(cr.width(), (int)(pg * cr.width()));
+ if (steps == 0)
+ width = QMIN(width,20); //Don't cross squares
+
+ if (steps == 0)
+ { //Busy indicator
+
+ if (width < 1) width = 1; //A busy indicator with width 0 is kind of useless
+
+ int remWidth = cr.width() - width; //Never disappear completely
+ if (remWidth <= 0) remWidth = 1; //Do something non-crashy when too small...
+
+ int pstep = int(progress) % ( 2 * remWidth );
+
+ if ( pstep > remWidth )
+ {
+ //Bounce about.. We're remWidth + some delta, we want to be remWidth - delta...
+ // - ( (remWidth + some delta) - 2* remWidth ) = - (some deleta - remWidth) = remWidth - some delta..
+ pstep = - (pstep - 2 * remWidth );
+ }
+ if( reverse )
+ renderGradient(p, QRect(cr.x() + cr.width() - width - pstep, cr.y(), width, cr.height()),
+ cdata->shades[2],cdata->shades[1], false);
+ else
+ renderGradient(p, cr,
+ cdata->shades[2],cdata->shades[1], false);
+ p->setPen(cdata->shades[5]);
+ p->drawLine( backend.x(), backend.y(), backend.width()+1, backend.y());
+ p->drawLine( backend.x(), backend.y(), backend.x(), backend.height());
+ return;
+
+ }
+ if( reverse )
+ {
+ //convert it as after
+ //TODO Verify it
+ QPixmap gradient(1, cr.height()+1);
+ QPainter painter(&gradient);
+ KPixmap tempPixmap;
+ tempPixmap.resize(1, cr.height()/2+1);
+ KPixmapEffect::gradient(tempPixmap,
+ cdata->blueMdkColor[1],
+ cdata->blueMdkColor[3],
+ KPixmapEffect::VerticalGradient);
+ painter.drawPixmap(0,0, tempPixmap);
+ tempPixmap.resize(1, cr.height()+1);
+ KPixmapEffect::gradient(tempPixmap,
+ cdata->blueMdkColor[4],
+ cdata->blueMdkColor[2],
+ KPixmapEffect::VerticalGradient);
+ painter.drawPixmap(0, cr.height()/2 +1, tempPixmap);
+ painter.end();
+ QRect tmp( cr.width()-width+1, cr.y(),width+1,cr.height() );
+ tmp.addCoords( 0, 0, 0, 1 );
+ p->drawTiledPixmap( tmp , gradient );
+ bool changed = false;
+ p->setPen( cdata->shades[1]);
+ for ( int i = 12; i < cr.width() ; )
+ {
+ if ( !changed && ( i >cr.width() -width ) )
+ {
+ p->setPen( cdata->blueMdkColor[2] );
+ changed = true;
+ }
+ p->drawLine( i, r.y()+1, i, r.height()-2 );
+ i+=12;
+ }
+ p->setPen(cg.background() );
+ p->drawPoint( cr.width() -width +1, r.y()+1 );
+ p->drawPoint( cr.width() -width + 1, r.height()-2 );
+
+ }
+ else
+ {
+ QPixmap gradient(1, cr.height()+1);
+ QPainter painter(&gradient);
+ KPixmap tempPixmap;
+ tempPixmap.resize(1, cr.height()/2+1);
+ KPixmapEffect::gradient(tempPixmap,
+ cdata->blueMdkColor[1],
+ cdata->blueMdkColor[3],
+ KPixmapEffect::VerticalGradient);
+ painter.drawPixmap(0,0, tempPixmap);
+ tempPixmap.resize(1, cr.height()+1);
+ KPixmapEffect::gradient(tempPixmap,
+ cdata->blueMdkColor[4],
+ cdata->blueMdkColor[2],
+ KPixmapEffect::VerticalGradient);
+ painter.drawPixmap(0, cr.height()/2 +1, tempPixmap);
+ painter.end();
+ QRect tmp( cr.x(), cr.y(),width-1,cr.height() );
+ tmp.addCoords( 0, 0, 0, 1 );
+ p->drawTiledPixmap( tmp , gradient );
+ bool changed = false;
+ p->setPen( cdata->blueMdkColor[2] );
+ for ( int i = 12; i < cr.width() ; )
+ {
+ if ( !changed && ( i >width ) )
+ {
+ p->setPen( cdata->shades[1] );
+ changed = true;
+ }
+ p->drawLine( i, r.y()+1, i, r.height()-2 );
+ i+=12;
+ }
+ p->setPen(cg.background() );
+ p->drawPoint( width-1, r.y()+1 );
+ p->drawPoint( width-1, r.height()-2 );
+ }
+ }
+ break;
+ }
+ case CE_ProgressBarLabel:
+ {
+ const QProgressBar * pb = (const QProgressBar *) widget;
+ const int unit_width = pixelMetric( PM_ProgressBarChunkWidth, pb );
+ int u = r.width() / unit_width;
+ int p_v = pb->progress();
+ int t_s = pb->totalSteps();
+ if ( u > 0 && pb->progress() >= INT_MAX / u && t_s >= u )
+ {
+ // scale down to something usable.
+ p_v /= u;
+ t_s /= u;
+ }
+ // QColor("#4965AE" ) powerpack
+ if ( pb->percentageVisible() && pb->totalSteps() )
+ {
+ int nu = ( u * p_v + t_s/2 ) / t_s;
+ int x = unit_width * nu;
+ if (pb->indicatorFollowsStyle() || pb->centerIndicator())
+ {
+ if(cg.highlight() == QColor("#4965AE" ))
+ p->setPen( QColor("#FFFFFF"));
+ else
+ p->setPen( QColor( "#000000" ) );
+
+ p->setClipRect( r.x(), r.y(), x, r.height() );
+ p->drawText( r, AlignCenter | SingleLine, pb->progressString() );
+
+ if ( pb->progress() != pb->totalSteps() )
+ {
+ p->setClipRect( r.x() + x, r.y(), r.width() - x, r.height() );
+ //second part of progress bar => black
+ p->setPen( /*cg.highlight()*/QColor( "#000000" ) );
+ p->drawText( r, AlignCenter | SingleLine, pb->progressString() );
+ }
+ }
+ else
+ {
+ if(cg.highlight() == QColor("#4965AE" ))
+ p->setPen( QColor("#FFFFFF"));
+ else
+ p->setPen( QColor( "#000000" ) );
+ p->drawText( r, AlignCenter | SingleLine, pb->progressString() );
+ }
+ }
+ break;
+ }
+ case CE_ToolButtonLabel:
+ {
+ KStyle::drawControl(element, p, widget, r, cg, flags, opt);
+ break;
+ }
+
+ case CE_MenuBarEmptyArea:
+ case CE_DockWindowEmptyArea:
+ {
+ p->fillRect(r, cg.background() );
+ break;
+ }
+ case CE_TabBarTab:
+ {
+ const QTabBar* tb = static_cast< const QTabBar* >( widget );
+ int x, y, xw, yh;
+ int offset= 0;
+ x= r.x();
+ y= r.y();
+ //verify it
+ xw = r.x()+r.width()-1;
+ yh = r.y()+r.height()-1;
+
+ //necessary to define type of tab
+ TabPosition pos;
+ if (tb->count() == 1)
+ pos = Single;
+ else if ((tb->indexOf(opt.tab()->identifier()) == 0))
+ pos = First;
+ else if (tb->indexOf(opt.tab()->identifier()) == tb->count() - 1)
+ pos = Last;
+ else
+ pos = Middle;
+
+ bool bottom = tb->shape() == QTabBar::RoundedBelow ||
+ tb->shape() == QTabBar::TriangularBelow;
+
+ if ( !bottom )
+ {
+ if (flags & Style_Selected )
+ {
+ p->fillRect( r, tb->palette().active().brush( QColorGroup::Background ));
+ //blue-2
+ p->setPen( cdata->blueMdkColor[2]);
+ p->drawLine( x+2, y, xw-2, y );
+ p->drawLine( x+1, y+1, xw-1, y+1 );
+ //blue-4
+ p->setPen( cdata->blueMdkColor[4] );
+ p->drawLine( x, y+2, xw, y+2 );
+ p->drawLine( x, y+3, xw, y+3 );
+ p->setPen( cdata->shades[4] );
+ p->drawLine( xw,y+4,xw,yh);
+ if ( pos==First )
+ p->drawLine( x,y+4,x,yh);
+ else if ( ( pos==Last || pos == Single ) && QApplication::reverseLayout() )
+ p->drawLine( xw, y+4, xw, yh );
+ }
+ else
+ {
+ offset = 3;
+ //grey1
+ p->fillRect( QRect(x,y+offset,r.width()-1,yh), cdata->shades[1]);
+ //grey5
+ p->setPen( cdata->shades[5]);
+ p->drawLine( x+2,y+offset-1,xw-2,y+offset-1);
+ p->drawPoint(x+1, y+offset );
+ p->drawPoint(xw-1, y+offset );
+ p->drawLine( xw, y+offset+1, xw, yh );
+ p->drawLine( x, y+offset+1, x, yh );
+ p->setPen( cdata->shades[4]);
+ p->drawLine( x, yh, xw,yh);
+ }
+ }
+ else
+ {
+ if (flags & Style_Selected )
+ {
+ p->fillRect( r, tb->palette().active().brush( QColorGroup::Background ));
+
+ p->setPen( cdata->blueMdkColor[2] );
+ p->drawLine( x, yh-3, xw, yh-3 );
+ p->drawLine( x, yh-2, xw, yh-2 );
+
+ p->setPen( cdata->blueMdkColor[4] );
+ p->drawLine( x+1, yh-1, xw-1, yh-1 );
+ p->drawLine( x+2, yh, xw-2, yh );
+ p->setPen( cdata->shades[4] );
+ p->drawLine( xw,y,xw,yh-4);
+ if ( pos==First )
+ p->drawLine( x,y,x,yh-4);
+ else if ( ( pos==Last || pos == Single ) && QApplication::reverseLayout() )
+ p->drawLine( x, y, x, yh-4 ); //CHECK
+ }
+ else
+ {
+ offset = 3;
+ //grey1
+ p->fillRect( QRect(x,y,r.width()-1,yh-offset), cdata->shades[1]);
+ //grey5
+ p->setPen( cdata->shades[5]);
+
+ p->drawLine( x+2,yh-offset+1,xw-2,yh-offset+1);
+ p->drawPoint(x+1, yh-offset );
+ p->drawPoint(xw-1, yh-offset );
+ p->drawLine( xw, y, xw, yh-4 );
+ p->drawLine( x, y, x, yh-4 );
+ p->setPen( cdata->shades[4]);
+ p->drawLine( x, y, xw,y);
+ }
+ }
+ break;
+ }
+ //CHECK
+ case CE_MenuBarItem:
+ {
+ QMenuBar *mb = (QMenuBar*)widget;
+ QMenuItem *mi = opt.menuItem();
+ QRect pr = mb->rect();
+
+ bool active = flags & Style_Active;
+ bool focused = flags & Style_HasFocus;
+ bool down = flags & Style_Down;
+
+ QColor textColor = cg.text();
+ if ( active && focused && down )
+ {
+ //top half
+ QRect half_rect = r;
+ half_rect.setHeight(r.height()/2);
+ renderGradient(p, half_rect, cdata->blueMdkColor[1], cdata->blueMdkColor[3], false);
+ //bottom half
+ half_rect.setHeight(r.height() - half_rect.height());
+ half_rect.moveBottom(r.bottom());
+ renderGradient(p, half_rect, cdata->blueMdkColor[4], cdata->blueMdkColor[2], false);
+ textColor = cg.highlightedText();
+ // create the fake rounded corners
+ QPen oldPen = p->pen();
+ p->setPen(cg.background());
+ p->drawPoint(r.topLeft());
+ p->drawPoint(r.topRight());
+ p->drawPoint(r.bottomLeft());
+ p->drawPoint(r.bottomRight());
+ p->setPen(oldPen);
+ }
+ else
+ renderGradient(p, r, cg.background(), cg.background(),false);
+
+ drawItem( p, r, AlignCenter | AlignVCenter | ShowPrefix
+ | DontClip | SingleLine, cg, flags & Style_Enabled,
+ mi->pixmap(), mi->text(), -1, &textColor );
+
+ break;
+ }
+
+
+// POPUPMENU ITEM
+// -------------------------------------------------------------------
+ case CE_PopupMenuItem:
+ {
+ const QPopupMenu *popupmenu = (const QPopupMenu *) widget;
+
+ QMenuItem *mi = opt.menuItem();
+ if ( !mi )
+ {
+ // Don't leave blank holes if we set NoBackground for the QPopupMenu.
+ // This only happens when the popupMenu spans more than one column.
+ if (! (widget->erasePixmap() && !widget->erasePixmap()->isNull()) )
+ p->fillRect(r, cg.brush(QColorGroup::Background) );
+ break;
+ }
+
+ int tab = opt.tabWidth();
+ int checkcol = opt.maxIconWidth();
+ bool enabled = mi->isEnabled();
+ bool checkable = popupmenu->isCheckable();
+ bool active = flags & Style_Active;
+ bool etchtext = styleHint( SH_EtchDisabledText );
+ bool reverse = QApplication::reverseLayout();
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+
+ if ( checkable )
+ checkcol = QMAX( checkcol, 20 );
+
+ // Are we a menu item separator?
+ if ( mi->isSeparator() )
+ {
+ drawLineSeparator( cdata, cg, p, r, true, active, false );
+ break;
+ }
+ // Draw the menu item background
+ if( active && (flags & Style_Enabled))
+ {
+ //top half
+ QRect half_rect = r;
+ half_rect.setHeight(r.height()/2);
+ renderGradient(p, half_rect, cdata->blueMdkColor[1], cdata->blueMdkColor[3], false);
+ //bottom half
+ half_rect.setHeight(r.height() - half_rect.height());
+ half_rect.moveBottom(r.bottom());
+ renderGradient(p, half_rect, cdata->blueMdkColor[4], cdata->blueMdkColor[2], false);
+ // create the fake rounded corners
+ QPen oldPen = p->pen();
+ p->setPen(cg.background());
+ p->drawPoint(r.topLeft());
+ p->drawPoint(r.topRight());
+ p->drawPoint(r.bottomLeft());
+ p->drawPoint(r.bottomRight());
+ p->setPen(oldPen);
+ }
+
+ // Draw the transparency pixmap
+ else if ( widget->erasePixmap() && !widget->erasePixmap()->isNull() )
+ p->drawPixmap( x, y, *widget->erasePixmap(), x, y, w, h );
+ // Draw a solid background
+ else
+ p->fillRect( r, cg.background() );
+
+
+ // Do we have an icon?
+#if 0
+ if ( ( (widget && !qstrcmp(widget->name(),"KMenu" )) ||
+ (widget->parentWidget() && !qstrcmp(widget->parentWidget()->name(),"KMenu" )) )
+ &&
+#endif
+ if( mi->iconSet() )
+ {
+ QIconSet::Mode mode;
+ QRect cr = visualRect( QRect(x, y, checkcol, h), r );
+
+ // Select the correct icon from the iconset
+ if ( active )
+ mode = enabled ? QIconSet::Active : QIconSet::Disabled;
+ else
+ mode = enabled ? QIconSet::Normal : QIconSet::Disabled;
+#if 0 //don't check menu
+ // Do we have an icon and are checked at the same time?
+ // Then draw a "pressed" background behind the icon
+ if ( checkable && !active && mi->isChecked() )
+ {
+ qDrawShadePanel( p, cr.x(), cr.y(), cr.width(), cr.height(),
+ cg, true, 1, &cg.brush(QColorGroup::Midlight) );
+ }
+#endif
+ //TEST IT !!!!!!!!!!!!!!
+ if ( checkable && mi->isChecked() )
+ {//don't display icon when button is checkable
+ int cx = reverse ? x+w - checkcol : x;
+ // Draw the checkmark
+ SFlags cflags = Style_Default;
+ cflags |= active ? Style_Enabled : Style_On;
+ drawPrimitive( PE_CheckMark, p, QRect( cx + itemFrame, y + itemFrame,
+ checkcol - itemFrame*2, h - itemFrame*2), cg, cflags );
+ }
+ else
+ {
+ // Draw the icon
+ QPixmap pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode );
+ QRect pmr( 0, 0, pixmap.width(), pixmap.height() );
+ pmr.moveCenter( cr.center() );
+ p->drawPixmap( pmr.topLeft(), pixmap );
+ }
+ }
+ // Are we checked? (This time without an icon)
+ else if ( (checkable && mi->isChecked()) )
+ {
+ int cx = reverse ? x+w - checkcol : x;
+#if 0 //don't create a checked button
+ // We only have to draw the background if the menu item is inactive
+ // if it's active the "pressed" background is already drawn
+ if ( ! active )
+ qDrawShadePanel( p, cx, y, checkcol, h, cg, true, 1,
+ &cg.brush(QColorGroup::Midlight) );
+#endif
+ // Draw the checkmark
+ SFlags cflags = Style_Default;
+ cflags |= active ? Style_Enabled : Style_On;
+ drawPrimitive( PE_CheckMark, p, QRect( cx + itemFrame, y + itemFrame,
+ checkcol - itemFrame*2, h - itemFrame*2), cg, cflags );
+ }
+
+ // Time to draw the menu item label...
+ int xm = itemFrame + checkcol + itemHMargin; // X position margin
+
+ int xp = reverse ? // X position
+ x + tab + rightBorder + itemHMargin + itemFrame - 1 :
+ x + xm;
+
+ int offset = reverse ? -1 : 1; // Shadow offset for etched text
+
+ // Label width (minus the width of the accelerator portion)
+ int tw = w - xm - tab - arrowHMargin - itemHMargin * 3 - itemFrame + 1;
+
+ // Set the color for enabled and disabled text
+ // (used for both active and inactive menu items)
+ p->setPen( enabled ? cg.buttonText() : cg.mid() );
+
+ // This color will be used instead of the above if the menu item
+ // is active and disabled at the same time. (etched text)
+ QColor discol = cg.mid();
+
+ // Does the menu item draw it's own label?
+ if ( mi->custom() )
+ {
+ int m = itemVMargin;
+ // Save the painter state in case the custom
+ // paint method changes it in some way
+ QPen oldPen = p->pen();
+
+
+ // Draw etched text if we're inactive and the menu item is disabled
+ if ( etchtext && !enabled && !active )
+ {
+ p->setPen( cg.light() );
+ mi->custom()->paint( p, cg, active, enabled, xp+offset, y+m+1, tw, h-2*m );
+ p->setPen( discol );
+ }
+ mi->custom()->paint( p, cg, active, enabled, xp, y+m, tw, h-2*m );
+ p->setPen( oldPen ); // restore pen
+
+ }
+ else
+ {
+ // The menu item doesn't draw it's own label
+ QString s = mi->text();
+
+ // Does the menu item have a text label?
+ if ( !s.isNull() )
+ {
+ int t = s.find( '\t' );
+ int m = itemVMargin;
+ int text_flags = AlignVCenter | ShowPrefix | DontClip | SingleLine;
+ text_flags |= reverse ? AlignRight : AlignLeft;
+
+ //QColor draw = cg.text();
+ QColor draw = (active && enabled) ? cg.highlightedText () : cg.text();
+ p->setPen(draw);
+
+
+ // Does the menu item have a tabstop? (for the accelerator text)
+ if ( t >= 0 )
+ {
+ int tabx = reverse ? x + rightBorder + itemHMargin + itemFrame :
+ x + w - tab - rightBorder - itemHMargin - itemFrame;
+
+ // Draw the right part of the label (accelerator text)
+ if ( etchtext && !enabled && !active )
+ {
+ // Draw etched text if we're inactive and the menu item is disabled
+ p->setPen( cg.light() );
+ p->drawText( tabx+offset, y+m+1, tab, h-2*m, text_flags, s.mid( t+1 ) );
+ p->setPen( discol );
+ }
+ p->drawText( tabx, y+m, tab, h-2*m, text_flags, s.mid( t+1 ) );
+ s = s.left( t );
+ }
+
+ // Draw the left part of the label (or the whole label
+ // if there's no accelerator)
+ if ( etchtext && !enabled && !active )
+ {
+ // Etched text again for inactive disabled menu items...
+ p->setPen( cg.light() );
+ p->drawText( xp+offset, y+m+1, tw, h-2*m, text_flags, s, t );
+ p->setPen( discol );
+ }
+
+ p->drawText( xp, y+m, tw, h-2*m, text_flags, s, t );
+ }
+
+ // The menu item doesn't have a text label
+ // Check if it has a pixmap instead
+ else if ( mi->pixmap() )
+ {
+ QPixmap *pixmap = mi->pixmap();
+
+ // Draw the pixmap
+ if ( pixmap->depth() == 1 )
+ p->setBackgroundMode( OpaqueMode );
+
+ int diffw = ( ( w - pixmap->width() ) / 2 )
+ + ( ( w - pixmap->width() ) % 2 );
+ p->drawPixmap( x+diffw, y+itemFrame, *pixmap );
+
+ if ( pixmap->depth() == 1 )
+ p->setBackgroundMode( TransparentMode );
+ }
+ }
+
+ // Does the menu item have a submenu?
+ if ( mi->popup() )
+ {
+ PrimitiveElement arrow = reverse ? PE_ArrowLeft : PE_ArrowRight;
+ int dim = pixelMetric(PM_MenuButtonIndicator)- itemFrame;
+ QRect vr = visualRect( QRect( x + w - arrowHMargin - itemFrame - dim,
+ y + h / 2 - dim / 2, dim, dim), r );
+
+ // Draw an arrow at the far end of the menu item
+ if ( active )
+ {
+ if ( enabled )
+ discol = cg.buttonText();
+
+ QColorGroup g2( cg.highlightedText ()/*white*/, cg.highlight(), /*white*/cg.highlightedText (), /*white*/cg.highlightedText (),
+ enabled ? cg.highlightedText () : discol, /*discol*/cg.highlightedText (), cg.highlightedText () );
+
+ drawPrimitive( arrow, p, vr, g2, Style_Enabled );
+ }
+ else
+ drawPrimitive( arrow, p, vr, cg,
+ enabled ? Style_Enabled : Style_Default );
+ }
+ break;
+ }
+ case CE_PushButtonLabel:
+ {
+ const QPushButton* button = (const QPushButton*)widget;
+ bool active = button->isOn() || button->isDown();
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+
+ // Shift button contents if pushed.
+ if ( active )
+ {
+ x += pixelMetric(PM_ButtonShiftHorizontal, widget);
+ y += pixelMetric(PM_ButtonShiftVertical, widget);
+ flags |= Style_Sunken;
+ }
+
+ // Does the button have a popup menu?
+ if ( button->isMenuButton() )
+ {
+ int dx = pixelMetric( PM_MenuButtonIndicator, widget );
+ drawPrimitive( PE_ArrowDown, p, QRect(x + w - dx - 2, y + 2, dx, h - 4),
+ cg, flags, opt );
+ w -= dx;
+ }
+
+ // Draw the icon if there is one
+ if ( button->iconSet() && !button->iconSet()->isNull() )
+ {
+ QIconSet::Mode mode = QIconSet::Disabled;
+ QIconSet::State state = QIconSet::Off;
+
+ if (button->isEnabled())
+ mode = button->hasFocus() ? QIconSet::Active : QIconSet::Normal;
+ if (button->isToggleButton() && button->isOn())
+ state = QIconSet::On;
+
+ QPixmap pixmap = button->iconSet()->pixmap( QIconSet::Small, mode, state );
+
+ // Center the iconset if there's no text or pixmap
+ if (button->text().isEmpty() && !button->pixmap())
+ p->drawPixmap( x + (w - pixmap.width()) / 2,
+ y + (h - pixmap.height()) / 2, pixmap );
+ else
+ p->drawPixmap( x + 4, y + (h - pixmap.height()) / 2, pixmap );
+
+ int pw = pixmap.width();
+ x += pw + 4;
+ w -= pw + 4;
+ }
+ // Make the label indicate if the button is a default button or not
+ if ( active || button->isDefault() )
+ {
+ // Draw "fake" bold text - this enables the font metrics to remain
+ // the same as computed in QPushButton::sizeHint(), but gives
+ // a reasonable bold effect.
+ //change color of text
+ drawItem( p, QRect(x, y, w, h), AlignCenter | ShowPrefix,
+ button->colorGroup(),
+ button->isEnabled(),
+ button->pixmap(),
+ button->text(), -1,
+ /*button->isDefault() ? &cdata->blueMdkColor[4] :*/ &button->colorGroup().buttonText() );
+
+#if 0
+ // Normal Text
+ for(i=0; i<2; i++)
+ drawItem( p, QRect(x+i, y, w, h), AlignCenter | ShowPrefix,
+ button->colorGroup(),
+ button->isEnabled(),
+ i == 0 ? button->pixmap() : NULL,
+ button->text(), -1,
+ &button->colorGroup().buttonText() );
+#endif
+ }
+ else
+ {
+ drawItem( p, QRect(x, y, w, h), AlignCenter | ShowPrefix,
+ button->colorGroup(),
+ button->isEnabled(), button->pixmap(),
+ button->text(), -1,
+ &button->colorGroup().buttonText() );
+ }
+ // Draw a focus rect if the button has focus
+ if ( flags & Style_HasFocus )
+ drawPrimitive( PE_FocusRect, p,
+ QStyle::visualRect(subRect(SR_PushButtonFocusRect, widget), widget),
+ cg, flags );
+ break;
+ }
+ case CE_PushButton:
+ {
+ const QPushButton* btn = static_cast< const QPushButton* >( widget );
+ if ( widget == hoverWidget )
+ flags |= Style_MouseOver;
+ if (isFormWidget(btn))
+ formMode = true;
+
+ drawPrimitive( btn->isDefault( ) ? PE_ButtonDefault : PE_ButtonCommand, p, r, cg, flags );
+ }
+ break;
+ default:
+ KStyle::drawControl(element, p, widget, r, cg, flags, opt);
+ }
+}
+
+void MandrivaStyle::drawControlMask( ControlElement element,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QStyleOption& opt ) const
+{
+ switch (element)
+ {
+ case CE_TabBarTab:
+ case CE_TabBarLabel:
+ {
+ p->fillRect(r,color1);
+ break;
+ }
+ default:
+ KStyle::drawControlMask(element, p, widget, r, opt);
+ }
+}
+
+void MandrivaStyle::drawComboboxArrow( QPainter *p,
+ const QWidget *widget,
+ const QRect &ar,
+ const QColorGroup &cg,
+ SFlags flags,
+ SCFlags active)const
+{
+ const QComboBox * cb = (const QComboBox *) widget;
+ bool editableCombo = cb->editable();
+ // Are we enabled?
+ if ( widget->isEnabled() )
+ flags |= Style_Enabled;
+
+ // Are we "pushed" ?
+ if ( active & Style_Sunken )
+ flags |= Style_Sunken;
+ p->setPen( cg.text() );
+ //Don't apply background color otherwise it
+ //destroys gradient.
+ //p->setBackgroundColor( cg.button() );
+ QPointArray a;
+ if ( editableCombo )
+ a.setPoints(QCOORDARRLEN(c_edit_arrow), c_edit_arrow);
+ else
+ a.setPoints(QCOORDARRLEN(c_arrow), c_arrow);
+
+ if ( flags & Style_Down )
+ p->translate( pixelMetric( PM_ButtonShiftHorizontal ),
+ pixelMetric( PM_ButtonShiftVertical ) );
+
+ if ( flags & Style_Enabled )
+ {
+ if ( QApplication::reverseLayout() )
+ {
+ a.translate( editableCombo ? ar.x() + ar.width() / 2 +1 : ar.x() + ar.width() / 2 +4 ,
+ editableCombo ? ar.y() + ar.height() / 2 + 1 : ar.y() + ar.height() / 2 );
+ }
+ else
+ {
+ a.translate( editableCombo ? ar.x() + ar.width() / 2 +1 : ar.x() + ar.width() / 2 -3,
+ editableCombo ? ar.y() + ar.height() / 2 + 1 : ar.y() + ar.height() / 2 );
+ }
+ p->setPen( cg.buttonText() );
+ p->drawLineSegments( a );
+ }
+ else
+ {
+ if ( QApplication::reverseLayout() )
+ {
+ a.translate( editableCombo ? ar.x() + ar.width() / 2 + 1 : ar.x() + ar.width() / 2 +4,
+ editableCombo ? ar.y() + ar.height() / 2 + 1: ar.y() + ar.height() / 2 );
+ }
+ else
+ {
+ a.translate( editableCombo ? ar.x() + ar.width() / 2 + 1 : ar.x() + ar.width() / 2 -3,
+ editableCombo ? ar.y() + ar.height() / 2 + 1: ar.y() + ar.height() / 2 );
+ }
+ p->setPen( cg.light() );
+ p->drawLineSegments( a );
+ a.translate( -1, -1 );
+ p->setPen( cg.mid() );
+ p->drawLineSegments( a );
+ }
+}
+
+void MandrivaStyle::drawComplexControl( ComplexControl control,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ SCFlags controls,
+ SCFlags active,
+ const QStyleOption& opt ) const
+{
+ const MandrivaColorData *cdata = lookupData(cg);
+ switch(control)
+ {
+ case CC_SpinWidget:
+ {
+ const QSpinWidget* sw = static_cast< const QSpinWidget* >( widget );
+ QRect br = visualRect( querySubControlMetrics( CC_SpinWidget, widget, SC_SpinWidgetButtonField ), widget );
+ //FIXME
+ p->fillRect( r, widget->isEnabled() ? cg.base() : cg.background() );
+
+ if ( controls & SC_SpinWidgetButtonField )
+ {
+ if ( controls & SC_SpinWidgetUp)
+ {
+ QColorGroup ucg = sw->isUpEnabled() ? cg : sw->palette().disabled();
+ drawPrimitive( PE_SpinWidgetUp,p, QRect(br.x()+1 , br.y()+1 , br.width()-2 , br.height() / 2 ), ucg, flags, opt);
+ }
+ if ( controls & SC_SpinWidgetDown)
+ {
+ QColorGroup dcg = sw->isDownEnabled() ? cg : sw->palette().disabled();
+
+ drawPrimitive( PE_SpinWidgetDown,p, QRect( br.x()+1 , br.y() + br.height() / 2 , br.width()-2, br.height()/ 2 -1 ), dcg, flags, opt);
+ }
+ }
+ if ( controls & SC_SpinWidgetFrame )
+ drawPrimitive( PE_PanelLineEdit, p, r, cg );
+
+ break;
+ }
+ case CC_ToolButton:
+ {
+ const QToolButton *tb = (const QToolButton *) widget;
+
+ QRect button, menuarea;
+ button = querySubControlMetrics(control, widget, SC_ToolButton, opt);
+ menuarea = querySubControlMetrics(control, widget, SC_ToolButtonMenu, opt);
+
+ SFlags bflags = flags,
+ mflags = flags;
+
+ // don't want to have the buttoncolor as the background...
+ p->fillRect(r, cg.background());
+ bflags &= ~Style_MouseOver;
+
+ if (active & SC_ToolButton)
+ bflags |= Style_Down;
+
+ if (active & SC_ToolButtonMenu)
+ mflags |= Style_Down;
+
+ if (controls & SC_ToolButton)
+ {
+ // If we're pressed, on, or raised...
+ if (bflags & (Style_Down | Style_On | Style_Raised) || widget==hoverWidget )
+ {
+ drawPrimitive(PE_ButtonTool, p, button, cg, bflags, opt);
+ }
+ else if (tb->parentWidget() &&
+ tb->parentWidget()->backgroundPixmap() &&
+ !tb->parentWidget()->backgroundPixmap()->isNull())
+ {
+ QPixmap pixmap = *(tb->parentWidget()->backgroundPixmap());
+ p->drawTiledPixmap( r, pixmap, tb->pos() );
+ }
+ }
+
+ // Draw a toolbutton menu indicator if required
+ if (controls & SC_ToolButtonMenu)
+ {
+ if (mflags & (Style_Down | Style_On | Style_Raised))
+ drawPrimitive(PE_ButtonDropDown, p, menuarea, cg, mflags, opt);
+
+ drawPrimitive(PE_ArrowDown, p, menuarea, cg, mflags, opt);
+ }
+
+ if (tb->hasFocus() && !tb->focusProxy())
+ {
+ QRect fr = tb->rect();
+ fr.addCoords(2, 2, -2, -2);
+ drawPrimitive(PE_FocusRect, p, fr, cg);
+ }
+
+ // Set the color for the ToolButton menu indicator
+ p->setPen(cg.buttonText() );
+
+ break;
+ }
+
+ case CC_ScrollBar:
+ {
+ const QScrollBar *scrollbar = (const QScrollBar *) widget;
+ QRect addline, subline, addpage, subpage, slider, first, last;
+ bool maxedOut = (scrollbar->minValue() == scrollbar->maxValue());
+ scrollmin = ( scrollbar->minValue() == scrollbar->value() );
+ scrollmax = (( scrollbar->maxValue() == scrollbar->value() )|| maxedOut);
+ subline = querySubControlMetrics(control, widget, SC_ScrollBarSubLine, opt);
+ addline = querySubControlMetrics(control, widget, SC_ScrollBarAddLine, opt);
+ subpage = querySubControlMetrics(control, widget, SC_ScrollBarSubPage, opt);
+ addpage = querySubControlMetrics(control, widget, SC_ScrollBarAddPage, opt);
+ slider = querySubControlMetrics(control, widget, SC_ScrollBarSlider, opt);
+
+ first = querySubControlMetrics(control, widget, SC_ScrollBarFirst, opt);
+ last = querySubControlMetrics(control, widget, SC_ScrollBarLast, opt);
+
+ if ((controls & SC_ScrollBarSubLine) && subline.isValid())
+ {
+ int flags = Style_Enabled;
+ if (active == SC_ScrollBarSubLine)
+ flags |= Style_Down;
+ if (scrollbar->orientation() == Qt::Horizontal)
+ flags |= Style_Horizontal;
+ if (hoverWidget == widget && hoverControl == HoverScrollBarSubLine)
+ flags |= Style_MouseOver;
+ drawPrimitive(PE_ScrollBarSubLine, p, subline, cg, flags);
+ }
+ if ((controls & SC_ScrollBarAddLine) && addline.isValid())
+ {
+ int flags = Style_Enabled;
+ if (active == SC_ScrollBarAddLine)
+ flags |= Style_Down;
+ if (scrollbar->orientation() == Qt::Horizontal)
+ flags |= Style_Horizontal;
+ if (hoverWidget == widget && hoverControl == HoverScrollBarAddLine)
+ flags |= Style_MouseOver;
+ drawPrimitive(PE_ScrollBarAddLine, p, addline, cg, flags);
+ }
+ if ((controls & SC_ScrollBarSubPage) && subpage.isValid())
+ drawPrimitive(PE_ScrollBarSubPage, p, subpage, cg,
+ Style_Enabled | ((active == SC_ScrollBarSubPage) ?
+ Style_Down : Style_Default) |
+ ((scrollbar->orientation() == Qt::Horizontal) ?
+ Style_Horizontal : 0));
+ if ((controls & SC_ScrollBarAddPage) && addpage.isValid())
+ drawPrimitive(PE_ScrollBarAddPage, p, addpage, cg,
+ ((maxedOut) ? Style_Default : Style_Enabled) |
+ ((active == SC_ScrollBarAddPage) ?
+ Style_Down : Style_Default) |
+ ((scrollbar->orientation() == Qt::Horizontal) ?
+ Style_Horizontal : 0));
+ if ((controls & SC_ScrollBarFirst) && first.isValid())
+ drawPrimitive(PE_ScrollBarFirst, p, first, cg,
+ Style_Enabled | ((active == SC_ScrollBarFirst) ?
+ Style_Down : Style_Default) |
+ ((scrollbar->orientation() == Qt::Horizontal) ?
+ Style_Horizontal : 0));
+ if ((controls & SC_ScrollBarLast) && last.isValid())
+ drawPrimitive(PE_ScrollBarLast, p, last, cg,
+ Style_Enabled | ((active == SC_ScrollBarLast) ?
+ Style_Down : Style_Default) |
+ ((scrollbar->orientation() == Qt::Horizontal) ?
+ Style_Horizontal : 0));
+ if ((controls & SC_ScrollBarSlider) && slider.isValid())
+ {
+ int flags = Style_Enabled;
+ if (active == SC_ScrollBarSlider)
+ flags |= Style_Down;
+ if (scrollbar->orientation() == Qt::Horizontal)
+ flags |= Style_Horizontal;
+ if (hoverWidget == widget && hoverControl == HoverScrollBarSlider)
+ flags |= Style_MouseOver;
+ drawPrimitive(PE_ScrollBarSlider, p, slider, cg, flags);
+
+ // ### perhaps this should not be able to accept focus if maxedOut?
+ if (scrollbar->hasFocus())
+ {
+ QRect fr(slider.x() + 2, slider.y() + 2,
+ slider.width() - 5, slider.height() - 5);
+ drawPrimitive(PE_FocusRect, p, fr, cg, Style_Default);
+ }
+ }
+ break;
+ }
+ // COMBOBOX
+ // -------------------------------------------------------------------
+ case CC_ComboBox:
+ {
+ const QComboBox * cb = (const QComboBox *) widget;
+ if (isFormWidget(cb))
+ formMode = true;
+ // Draw box and arrow
+ bool reverse = QApplication::reverseLayout();
+ if ( widget == hoverWidget )
+ flags |= Style_MouseOver;
+ bool widgetEnabled = ( widget->isEnabled() );
+ bool sunken = cb->listBox() ? cb->listBox()->isShown() : false;
+
+ //TODO not editable
+ if( cb->editable())
+ {
+ if ((controls & SC_ComboBoxFrame ))
+ {
+ drawFrame( cdata, cg, p, r,true /*flags ? */);
+ }
+
+ if( (controls & SC_ComboBoxEditField ))
+ {
+ QRect ar = QStyle::visualRect(querySubControlMetrics(CC_ComboBox, widget, SC_ComboBoxEditField), widget );
+
+ drawPrimitive( PE_PanelLineEdit, p, ar, cg );
+ }
+ //if ( controls & SC_ComboBoxListBoxPopup )
+ //{
+ //TODO
+ //}
+ if( (controls & SC_ComboBoxArrow ))
+ {
+ QRect ar = QStyle::visualRect(querySubControlMetrics(CC_ComboBox, widget, SC_ComboBoxArrow), widget );
+ bool mouseOver = (flags & Style_MouseOver) && (hoverControl == HoverComboBoxArrow);
+ if ( sunken )
+ renderGradient(p, QRect(ar.x()+1, ar.y()+1, ar.width()-1, ar.height()-2), cdata->shades[2], cdata->shades[0], false);
+ else if ( mouseOver ) // FIXME: should highlight only when the mouse is over the arrow
+ renderGradient(p, QRect(ar.x()+1, ar.y()+1, ar.width()-1, ar.height()-2), Qt::white, cdata->shades[1], false);
+ else
+ renderGradient(p, QRect(ar.x()+1, ar.y()+1, ar.width()-1, ar.height()-2), cdata->shades[0],cdata->shades[2], false);
+
+ if ( widgetEnabled )
+ {
+ if ( reverse )
+ {
+ p->setPen( cg.base() );
+ p->drawLine( ar.x()+1, ar.y()+1,ar.x()+ar.width()-1, ar.y()+1 );
+ p->drawLine( ar.width()-1, ar.y()+1, ar.width()-1, ar.height()-2 );
+
+ p->setPen( cdata->shades[1]);
+ p->drawLine( ar.x(), ar.y()+1,ar.x(), ar.height()-2 );
+ p->drawLine( ar.x(), ar.height()-2, ar.x()+ar.width()-1, ar.height()-2 );
+ }
+ else
+ {
+ p->setPen( cg.base() );
+ p->drawLine( ar.x()+1, ar.y()+1,ar.x()+ar.width()-1, ar.y()+1 );
+ p->drawLine( ar.x()+1, ar.y()+1, ar.x()+1, ar.height()-2 );
+
+ p->setPen( cdata->shades[1]);
+ p->drawLine( ar.x()+ar.width()-1, ar.y()+1,ar.x()+ar.width()-1, ar.height()-2 );
+ p->drawLine( ar.x()+1, ar.height()-2, ar.x()+ar.width()-1, ar.height()-2 );
+ }
+ }
+ p->setPen( widgetEnabled ? cdata->shades[5] :cdata->shades[4] );
+ if ( reverse)
+ p->drawLine( ar.width(), ar.y()+1, ar.width(), ar.height()-2 );
+ else
+ p->drawLine( ar.x(), ar.y()+1, ar.x(), ar.height()-2 );
+
+ drawComboboxArrow( p,widget,ar,cg,flags,active);
+ }
+ }
+ else
+ {
+ QPen oldPen = p->pen();
+
+ // Get the button bounding box
+ QRect ar = QStyle::visualRect(querySubControlMetrics(CC_ComboBox, widget, SC_ComboBoxArrow), widget );
+ drawButton( cdata,r,p,cg,flags | (sunken ? Style_Down : Style_Default));
+
+ //test reverse !
+ if( reverse )
+ {
+ p->setPen(cg.base());
+ p->drawLine( ar.width()-1,ar.y()+5,ar.width()-1,ar.height()-6);
+ p->setPen( cdata->shades[2]);
+ p->drawLine( ar.width(),ar.y()+5,ar.width(),ar.height()-6);
+ }
+ else
+ {
+ p->setPen(cg.base());
+ p->drawLine( ar.x()-1,ar.y()+5,ar.x()-1,ar.height()-6);
+ p->setPen(cdata->shades[2]);
+ p->drawLine( ar.x()-2,ar.y()+5,ar.x()-2,ar.height()-6);
+ }
+
+ drawComboboxArrow( p,widget,ar,cg,flags,active);
+ p->setPen( oldPen );// restore pen
+
+ }
+ break;
+ }
+ default:
+ KStyle::drawComplexControl(control, p, widget,
+ r, cg, flags, controls, active, opt);
+ }
+}
+
+QRect MandrivaStyle::querySubControlMetrics( ComplexControl control,
+ const QWidget* widget,
+ SubControl subcontrol,
+ const QStyleOption& opt ) const
+{
+ switch (control)
+ {
+ case CC_SpinWidget:
+ {
+ switch ( subcontrol )
+ {
+ case SC_SpinWidgetButtonField:
+ return QRect( widget->width() -14 , 0, 14, widget->height() );
+ default:
+ return KStyle::querySubControlMetrics( control, widget, subcontrol, opt );
+ }
+ }
+ //TODO verify it.
+ case CC_ComboBox:
+ {
+ int arrow = 11;
+
+ switch ( subcontrol )
+ {
+ case SC_ComboBoxFrame:
+ return QRect( 0, 0, widget->width(), widget->height() );
+ case SC_ComboBoxArrow:
+ {
+ const QComboBox * cb = (const QComboBox *) widget;
+ return QRect( cb->editable() ? ( widget->width() - arrow - 11 ) : ( widget->width() - arrow- 7 ) , 0, arrow+10 , widget->height() );
+ }
+ case SC_ComboBoxEditField:
+ {
+ if ( widget->width() < 36 || widget->height() < 22 )
+ return QRect( 5, 1, widget->width() - arrow-12, widget->height());
+ else if ( static_cast< const QComboBox* >( widget )->editable() )
+ return QRect( 1,1, widget->width() - arrow-12, widget->height() - 2 );
+ else //TODO verify it
+ return QRect( 5, 1, widget->width() - arrow-12, widget->height() - 2);
+ }
+ default:
+ return KStyle::querySubControlMetrics( control, widget, subcontrol, opt );
+ }
+ break;
+ }
+ case CC_Slider:
+ {
+ const QSlider* sl = static_cast< const QSlider* >( widget );
+ bool horizontal = sl->orientation() == Horizontal;
+ QSlider::TickSetting ticks = sl->tickmarks();
+ int pos = sl->sliderStart();
+ int handleSize = pixelMetric( PM_SliderThickness, widget );
+ int len = pixelMetric( PM_SliderLength, widget );
+ switch ( subcontrol )
+ {
+ case SC_SliderHandle:
+ if ( horizontal )
+ {
+ if ( ticks == QSlider::Both )
+ return QRect( pos, ( sl->height() - handleSize ) / 2, len, handleSize );
+ else if ( ticks == QSlider::Above )
+ return QRect( pos, sl->height() - handleSize, len, handleSize );
+ return QRect( pos, 0, len, handleSize );
+ }
+ else
+ {
+ if ( ticks == QSlider::Both )
+ return QRect( ( sl->width() - handleSize ) / 2, pos, handleSize, len );
+ else if ( ticks == QSlider::Above )
+ return QRect( sl->width() - handleSize, pos, handleSize, len );
+ return QRect( 0, pos, handleSize, len );
+ }
+ default:
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return KStyle::querySubControlMetrics( control, widget, subcontrol, opt );
+}
+
+void MandrivaStyle::drawComplexControlMask( ComplexControl control,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QStyleOption& opt ) const
+{
+//TODO verify
+//#if 0
+ switch (control)
+ {
+ // COMBOBOX & TOOLBUTTON MASKS
+ // -------------------------------------------------------------------
+ case CC_ComboBox:
+ case CC_ToolButton:
+ {
+ int x1, y1, x2, y2;
+ r.coords( &x1, &y1, &x2, &y2 );
+ QCOORD corners[] = { x1,y1, x2,y1, x1,y2, x2,y2 };
+ p->fillRect( r, color1 );
+ p->setPen( color0 );
+ p->drawPoints( QPointArray(4, corners) );
+ break;
+ }
+
+ default:
+ KStyle::drawComplexControlMask(control, p, widget, r, opt);
+ }
+//#endif
+ //KStyle::drawComplexControlMask(control, p, widget, r, opt);
+}
+
+
+int MandrivaStyle::pixelMetric(PixelMetric m, const QWidget *widget) const
+{
+ switch(m)
+ {
+ case PM_SplitterWidth:
+ return 6; //Perhaps 6
+ case PM_ButtonMargin:
+ return 2;
+ case PM_DefaultFrameWidth:
+ return 1;
+ case PM_MenuButtonIndicator:
+ return 13;
+ case PM_SliderLength:
+ return 31;
+ case PM_SliderControlThickness: //VERIFY it
+ return 6;
+ case PM_SliderThickness: //VERIFY it
+ return 6;
+ case PM_ExclusiveIndicatorWidth: // Radiobutton size
+ return 13;
+ case PM_ExclusiveIndicatorHeight:
+ return 12;
+ case PM_SpinBoxFrameWidth:
+ return 1;
+ case PM_CheckListButtonSize: //TODO FIXME §!!!!!!!!!!!!!!!
+ return 10;
+ case PM_ScrollBarSliderMin:
+ return 21;
+ case PM_ScrollBarExtent:
+ return 14; //scrollbar width verify arrow position
+ //checkBox
+ case PM_IndicatorWidth:
+ return 13;
+ case PM_IndicatorHeight:
+ return 12;
+ case PM_TabBarTabShiftVertical:
+ return 0;
+ default:
+ return KStyle::pixelMetric(m, widget);
+ }
+}
+
+
+QSize MandrivaStyle::sizeFromContents( ContentsType contents,
+ const QWidget* widget,
+ const QSize &contentSize,
+ const QStyleOption& opt ) const
+{
+ switch (contents)
+ {
+ //define progressbar default size
+ case CT_ProgressBar:
+ return QSize( contentSize.width(), 20 ) ;
+ case CT_SpinBox:
+ return QSize( contentSize.width(), contentSize.height()+1);
+ case CT_LineEdit: {
+ return contentSize + QSize (1, 1); //add +1 to rect
+ }
+ case CT_SizeGrip:
+ {
+ return QSize( 15, 15 );
+ }
+ case CT_ToolButton:
+ {
+ bool onToolbar = widget->parentWidget() && widget->parentWidget()->inherits( "QToolBar" );
+ if (!onToolbar) //Behaves like a button, so scale appropriately to the border
+ {
+ int w = contentSize.width();
+ int h = contentSize.height();
+ return QSize( w + 12, h + 10 );
+ }
+ else
+ {
+ return KStyle::sizeFromContents( contents, widget, contentSize, opt );
+ }
+ }
+ case CT_ComboBox:
+ {
+ const QComboBox* combobox = (const QComboBox*) widget;
+ int h = contentSize.height();
+
+ if ( h < 22 )
+ h = 22;
+
+ int arrow = 11;
+ return QSize( contentSize.width() + arrow + (combobox->editable() ? 26 : 22),
+ combobox->editable() ? h : contentSize.height() + 10 );
+ }
+ // PUSHBUTTON SIZE
+ // ------------------------------------------------------------------
+ case CT_PushButton:
+ {
+ const QPushButton* button = (const QPushButton*) widget;
+ int w = contentSize.width();
+ int h = contentSize.height();
+ int bm = pixelMetric( PM_ButtonMargin, widget );
+ int fw = pixelMetric( PM_DefaultFrameWidth, widget ) * 2;
+
+ w += bm + fw + 6; // ### Add 6 to make way for bold font.
+ h += bm + fw;
+
+ // Ensure we stick to standard width and heights.
+ if ( button->isDefault() || button->autoDefault() )
+ {
+ if ( w < 80 && !button->pixmap() )
+ w = 80;
+ }
+
+ if ( h < 30 )
+ h = 30;
+
+ return QSize( w, h );
+ }
+ case CT_PopupMenuItem:
+ {
+ if ( ! widget || opt.isDefault() )
+ return contentSize;
+
+ const QPopupMenu *popup = (const QPopupMenu *) widget;
+ bool checkable = popup->isCheckable();
+ QMenuItem *mi = opt.menuItem();
+ int maxpmw = opt.maxIconWidth();
+ int w = contentSize.width(), h = contentSize.height();
+
+ if ( mi->custom() )
+ {
+ w = mi->custom()->sizeHint().width();
+ h = mi->custom()->sizeHint().height();
+ if ( ! mi->custom()->fullSpan() )
+ h += 2*itemVMargin + 2*itemFrame;
+ }
+ else if ( mi->widget() )
+ {
+ // do NOT remove this as it ends up doing wrong things
+ // this if is here to stop processing the item
+ }
+ else if ( mi->isSeparator() )
+ {
+ w = 30; // Arbitrary
+ h = 2;
+ }
+ else
+ {
+ if ( mi->pixmap() )
+ h = QMAX( h, mi->pixmap()->height() + 2*itemFrame );
+ else
+ {
+ // Ensure that the minimum height for text-only menu items
+ // is the same as the icon size used by KDE.
+ h = QMAX( h, 16 + 2*itemFrame );
+ h = QMAX( h, popup->fontMetrics().height()
+ + 2*itemVMargin + 2*itemFrame );
+ }
+
+ if ( mi->iconSet() )
+ h = QMAX( h, mi->iconSet()->pixmap(
+ QIconSet::Small, QIconSet::Normal).height() +
+ 2 * itemFrame );
+ }
+
+ if ( ! mi->text().isNull() && mi->text().find('\t') >= 0 )
+ w += 12;
+ else if ( mi->popup() )
+ w += 2 * arrowHMargin;
+
+ if ( maxpmw )
+ w += maxpmw + 6;
+ if ( checkable && maxpmw < 20 )
+ w += 20 - maxpmw;
+ if ( checkable || maxpmw > 0 )
+ w += 12;
+
+ w += rightBorder;
+
+ return QSize( w, h );
+ }
+
+ default:
+ return KStyle::sizeFromContents( contents, widget, contentSize, opt );
+ }
+}
+
+//Why ? why create virtual function ?
+// Fix Qt's wacky image alignment
+QPixmap MandrivaStyle::stylePixmap(StylePixmap stylepixmap,
+ const QWidget* widget,
+ const QStyleOption& opt) const
+{
+ return KStyle::stylePixmap(stylepixmap, widget, opt);
+}
+
+bool MandrivaStyle::eventFilter( QObject *object, QEvent *event )
+{
+ if (KStyle::eventFilter( object, event ))
+ return true;
+ QToolBar* toolbar;
+ //Hover highlight on buttons and combos
+ if ( object->inherits("QPushButton")
+ || object->inherits("QComboBox")
+ || object->inherits("QScrollBar")
+ || object->inherits("QHeader")
+ || object->inherits("QSlider")
+ || object->inherits("QCheckBox")
+ || object->inherits("QSplitterHandle"))
+ {
+ if ( (event->type() == QEvent::Enter) && static_cast<QWidget*>(object)->isEnabled())
+ {
+ QWidget* button = static_cast<QWidget*>(object);
+ hoverWidget = button;
+ button->repaint( false );
+ }
+ else if ( (event->type() == QEvent::Leave) && (object == hoverWidget) )
+ {
+ QWidget* button = static_cast<QWidget*>(object);
+ hoverWidget = 0;
+ hoverControl = HoverNone;
+ button->repaint( false );
+ }
+ if ((object->inherits("QScrollBar") || object->inherits("QComboBox"))
+ && event->type() == QEvent::MouseMove)
+ {
+ QWidget *button = static_cast<QWidget*>(object);
+ QMouseEvent *e = static_cast<QMouseEvent*>(event);
+ // updateHoverControl will trigger a repainting if necessary
+ updateHoverControl(e->pos());
+ }
+
+ }
+ else if (object->inherits("QListBox"))
+ {
+ if ( event->type() == QEvent::Show || event->type() == QEvent::Hide)
+ {
+ QWidget *w = static_cast<QWidget*>(object);
+ if (w->parentWidget() && w->parentWidget()->inherits("QComboBox"))
+ w->parentWidget()->repaint(false);
+ }
+ }
+ else if ( object->parent() && !qstrcmp( object->name(), kdeToolbarWidget ) )
+ {
+ // Draw a gradient background for custom widgets in the toolbar
+ // that have specified a "kde toolbar widget" name.
+
+ if (event->type() == QEvent::Paint )
+ {
+ // Find the top-level toolbar of this widget, since it may be nested in other
+ // widgets that are on the toolbar.
+ QWidget *widget = static_cast<QWidget*>(object);
+ QWidget *parent = static_cast<QWidget*>(object->parent());
+ int x_offset = widget->x(), y_offset = widget->y();
+ while (parent && parent->parent() && !qstrcmp( parent->name(), kdeToolbarWidget ) )
+ {
+ x_offset += parent->x();
+ y_offset += parent->y();
+ parent = static_cast<QWidget*>(parent->parent());
+ }
+
+ QRect r = widget->rect();
+ QRect pr = parent->rect();
+ bool horiz_grad = pr.width() < pr.height();
+
+ // Check if the parent is a QToolbar, and use its orientation, else guess.
+ QToolBar* tb = dynamic_cast<QToolBar*>(parent);
+ if (tb) horiz_grad = tb->orientation() == Qt::Vertical;
+
+ QPainter p( widget );
+ renderGradient(&p, r, parent->colorGroup().background(),parent->colorGroup().background(), horiz_grad);/*,
+ x_offset, y_offset, pr.width(), pr.height());*/
+ //FIXME: check this code later
+ return false; // Now draw the contents
+ }
+ }
+ else if ( object->parent() &&
+ (toolbar = dynamic_cast<QToolBar*>(object->parent())) )
+ {
+
+ // We need to override the paint event to draw a
+ // gradient on a QToolBarExtensionWidget.
+ if ( event->type() == QEvent::Paint )
+ {
+ QWidget *widget = static_cast<QWidget*>(object);
+ QRect wr = widget->rect(), tr = toolbar->rect();
+ QPainter p( widget );
+ renderGradient(&p, wr, toolbar->colorGroup().background(),toolbar->colorGroup().background(),
+ toolbar->orientation() == Qt::Vertical);/*,
+ wr.x(), wr.y(), tr.width() - 2, tr.height() - 2);*/
+ //FIXME: check this code later
+ p.setPen( toolbar->colorGroup().dark() );
+ if ( toolbar->orientation() == Qt::Horizontal )
+ p.drawLine( wr.width()-1, 0, wr.width()-1, wr.height()-1 );
+ else
+ p.drawLine( 0, wr.height()-1, wr.width()-1, wr.height()-1 );
+ return true;
+ }
+ }
+ return false;
+}
+
+//***************
+// renderGradient from PlastikStyle
+void MandrivaStyle::renderGradient(QPainter *painter,
+ const QRect &rect,
+ const QColor &c1,
+ const QColor &c2,
+ bool horizontal) const
+{
+ if((rect.width() <= 0)||(rect.height() <= 0))
+ return;
+
+ // generate a quite unique key for this surface.
+ CacheEntry search(cGradientTile,
+ horizontal ? rect.width() : 0,
+ horizontal ? 0 : rect.height(),
+ c1.rgb(), c2.rgb(), horizontal );
+ int key = search.key();
+
+ CacheEntry *cacheEntry;
+ if( (cacheEntry = pixmapCache->find(key)) )
+ {
+ if( search == *cacheEntry ) // match! we can draw now...
+ {
+ if(cacheEntry->pixmap)
+ painter->drawTiledPixmap(rect, *(cacheEntry->pixmap) );
+
+ return;
+ }
+ else
+ {
+ // Remove old entry in case of a conflict!
+ // This shouldn't happen very often, see comment in CacheEntry.
+ pixmapCache->remove(key);
+ }
+ }
+
+ // there wasn't anything matching in the cache, create the pixmap now...
+ QPixmap *result = new QPixmap(horizontal ? rect.width() : 10,
+ horizontal ? 10 : rect.height());
+ QPainter p(result);
+
+ int r_w = result->rect().width();
+ int r_h = result->rect().height();
+ int r_x, r_y, r_x2, r_y2;
+ result->rect().coords(&r_x, &r_y, &r_x2, &r_y2);
+
+ int rDiff, gDiff, bDiff;
+ int rc, gc, bc;
+
+ register int x, y;
+
+ rDiff = ( c2.red()) - (rc = c1.red());
+ gDiff = ( c2.green()) - (gc = c1.green());
+ bDiff = ( c2.blue()) - (bc = c1.blue());
+
+ register int rl = rc << 16;
+ register int gl = gc << 16;
+ register int bl = bc << 16;
+
+ int rdelta = ((1<<16) / (horizontal ? r_w : r_h)) * rDiff;
+ int gdelta = ((1<<16) / (horizontal ? r_w : r_h)) * gDiff;
+ int bdelta = ((1<<16) / (horizontal ? r_w : r_h)) * bDiff;
+
+ // these for-loops could be merged, but the if's in the inner loop
+ // would make it slow
+ if(!horizontal)
+ {
+ for ( y = 0; y < r_h; y++ )
+ {
+ rl += rdelta;
+ gl += gdelta;
+ bl += bdelta;
+
+ p.setPen(QColor(rl>>16, gl>>16, bl>>16));
+ p.drawLine(r_x, r_y+y, r_x2, r_y+y);
+ }
+ }
+ else
+ {
+ for( x = 0; x < r_w; x++)
+ {
+ rl += rdelta;
+ gl += gdelta;
+ bl += bdelta;
+
+ p.setPen(QColor(rl>>16, gl>>16, bl>>16));
+ p.drawLine(r_x+x, r_y, r_x+x, r_y2);
+ }
+ }
+
+ p.end();
+
+ // draw the result...
+ painter->drawTiledPixmap(rect, *result);
+
+ // insert into cache using the previously created key.
+ CacheEntry *toAdd = new CacheEntry(search);
+ toAdd->pixmap = result;
+ bool insertOk = pixmapCache->insert( key, toAdd, result->width()*result->height()*result->depth()/8 );
+
+ if(!insertOk)
+ delete result;
+}
+
+void MandrivaStyle::drawButton( const MandrivaColorData *cdata, const QRect & r, QPainter *p,const QColorGroup &cg, SFlags flags)const
+{
+ QPen oldPen = p->pen();
+ bool down = flags & Style_Down;
+ bool on = flags & Style_On;
+ bool enabled = flags & Style_Enabled;
+ bool mouseOver = flags & Style_MouseOver;
+ bool defaultButton = flags & Style_ButtonDefault;
+
+ bool sunken = on || down;
+ int x, y, xw, yh;
+ x= r.x();
+ y= r.y();
+ xw = r.x()+r.width()-1;
+ yh = r.y()+r.height()-1;
+
+ if ( !formMode )
+ {
+ if ( !defaultButton || ( defaultButton &&enabled ) )
+ {
+ p->setPen( cg.background() );
+ p->drawRect( r );
+ //replace background into round
+ //left/top
+ p->drawPoint( x+1, y+1 );
+ p->drawPoint( x+2, y+1 );
+ p->drawPoint( x+1, y+2 );
+
+ //right/top
+ p->drawPoint( xw-2, y+1 );
+ p->drawPoint( xw-1, y+1 );
+ p->drawPoint( xw-1, y+2 );
+
+ //right/bottom
+ p->drawPoint( x+1, yh-2);
+ p->drawPoint( x+2, yh-1);
+ p->drawPoint( x+1, yh-1);
+
+
+ //left/bottom
+ p->drawPoint( xw-2, yh-1 );
+ p->drawPoint( xw-1, yh-1 );
+ p->drawPoint( xw-1, yh-2 );
+
+ }
+ else
+ {
+ p->setPen( cdata->blueMdkColor[4] );
+ p->drawLine( x+3, y, xw-3, y );
+ p->drawLine( x, y+3, x, yh-3 );
+ p->drawLine( x+3, yh, xw-3, yh );
+ p->drawLine( xw, y+3, xw, yh-3 );
+
+ p->drawPoint( x+2, y+1 );
+ p->drawPoint( x+1, y+2 );
+
+ p->drawPoint( x+1, yh-2 );
+ p->drawPoint( x+2, yh-1 );
+
+ p->drawPoint( xw-2, y+1 );
+ p->drawPoint( xw-1, y+2 );
+
+ p->drawPoint( xw-1, yh-2 );
+ p->drawPoint( xw-2, yh-1 );
+
+ p->setPen( cg.background() );
+ //left/top
+ p->drawLine( x, y, x+2, y );
+ p->drawLine( x, y+1, x+1, y+1 );
+ p->drawPoint( x, y+2 );
+ //right/top
+ p->drawLine( xw-2, y, xw, y );
+ p->drawLine( xw-1, y+1, xw, y+1 );
+ p->drawPoint( xw, y+2 );
+
+ //left/bottom
+ p->drawLine( x, yh-1, x+1, yh-1 );
+ p->drawLine( x, yh, x+2, yh );
+ p->drawPoint( x, yh-2 );
+
+ //right/bottom
+ p->drawLine( xw-1, yh-1, xw, yh-1 );
+ p->drawLine( xw-2, yh, xw, yh );
+ p->drawPoint( xw, yh-2 );
+
+
+
+ }
+ }
+ //FIX toggle button
+ p->setPen( enabled ? cdata->buttonColor[5] : cdata->buttonColor[4] );
+ //VERIFY it
+ p->drawLine( x+3, y+1, xw-3, y+1 );
+ p->drawLine( x+1, y+3, x+1, yh-3 );
+ p->drawPoint( x+2, y+2 );
+
+ p->setPen( cdata->buttonColor[4] );
+ p->drawLine( x+3, yh-1, xw-3, yh-1 );
+ p->drawLine( xw-1,y+3,xw-1,yh-3 );
+ p->drawPoint( x+2, yh-2 );
+ p->drawPoint( xw-2, yh-2 );
+ p->drawPoint( xw-2, y+2 );
+
+ p->setPen( ( down||sunken ) ? cg.base() : cdata->buttonColor[1] );
+ p->drawLine( xw-2, y+3, xw-2, yh-3 );
+ p->drawLine( x+3, yh-2, xw-3, yh-2 );
+
+
+ p->setPen( ( down || sunken ) ? cdata->buttonColor[2]: cg.base() );
+ p->drawLine( x+3, y+2, xw-3, y+2 );
+ p->drawLine( x+2, y+3, x+2, yh-3 );
+
+
+ if ( on )
+ renderGradient(p, QRect(x+3, y+3, xw-5, yh-5),
+ cdata->buttonColor[0] ,mouseOver ? cdata->buttonColor[1] : cdata->buttonColor[2], false);
+ else if ( down ||sunken )
+ renderGradient(p, QRect(x+3, y+3, xw-4, yh-4),
+ cdata->buttonColor[2] ,cdata->buttonColor[1], false);
+ else
+ renderGradient(p, QRect(x+3, y+3, xw-5, yh-5),
+ cdata->buttonColor[0] ,mouseOver ? cdata->buttonColor[1] :cdata->buttonColor[2], false);
+
+ p->setPen( oldPen ); // restore pen
+
+}
+
+QRect MandrivaStyle::subRect(SubRect r, const QWidget *widget) const
+{
+ switch ( r )
+ {
+ case SR_ProgressBarContents:
+ {
+ QRect wrect( widget->rect());
+ return QRect( wrect.x() , wrect.y() , wrect.width(), wrect.height());
+ }
+ case SR_PushButtonFocusRect:
+ {
+ const QPushButton* button = (const QPushButton*) widget;
+ QRect wrect(widget->rect());
+ if (button->isDefault() || button->autoDefault())
+ return QRect(wrect.x() + 6, wrect.y() + 4, wrect.width() - 12, wrect.height() - 8);
+ else
+ return QRect(wrect.x() + 4 , wrect.y() + 5, wrect.width() - 9, wrect.height() - 8);
+
+ break;
+ }
+ case SR_ComboBoxFocusRect:
+ {
+ return querySubControlMetrics( CC_ComboBox, widget, SC_ComboBoxEditField );
+ }
+ default:
+ return KStyle::subRect( r, widget );
+ }
+}
+
+//define handle point
+void MandrivaStyle::drawHandlePoint ( const MandrivaColorData *cdata,QPainter *p, int x, int y)const
+{
+ //blue-4
+ p->save();
+ p->setPen( cdata->blueMdkColor[4]);
+ //optimise it and use drawLine;
+ p->drawPoint(x+1,y);
+ p->drawPoint(x+2,y);
+ p->drawPoint(x,y+1);
+ p->drawPoint(x+1,y+1);
+ p->drawPoint(x+2,y+1);
+ p->drawPoint(x+3,y+1);
+
+ //blue-2
+ p->setPen( cdata->blueMdkColor[2]);
+ p->drawPoint(x, y+2 );
+ p->drawPoint( x+1, y+2 );
+ p->drawPoint( x+1, y+3 );
+
+ //blue-1
+ p->setPen( cdata->blueMdkColor[1] );
+ p->drawPoint( x+2, y+2 );
+ p->drawPoint( x+3, y+2 );
+ p->drawPoint( x+2, y+3 );
+ p->restore();
+}
+
+bool MandrivaStyle::excludeColor(const QColor &col, bool active) const
+{
+ if ( active )
+ {
+ if ( col == QColor( "#F7B610" )
+ || col == QColor( "#8EC7FF" )
+ || col == QColor( "#C7D3DF" ) )
+ return true;
+
+ }
+ return false;
+}
+
+bool MandrivaStyle::isFormWidget(const QWidget* widget) const
+{
+ //Form widgets are in the KHTMLView, but that has 2 further inner levels
+ //of widgets - QClipperWidget, and outside of that, QViewportWidget
+ QWidget* potentialClipPort = widget->parentWidget();
+ if ( !potentialClipPort || potentialClipPort->isTopLevel() )
+ return false;
+
+ QWidget* potentialViewPort = potentialClipPort->parentWidget();
+ if (!potentialViewPort || potentialViewPort->isTopLevel() ||
+ qstrcmp(potentialViewPort->name(), "qt_viewport") )
+ return false;
+
+ QWidget* potentialKHTML = potentialViewPort->parentWidget();
+ if (!potentialKHTML || potentialKHTML->isTopLevel() ||
+ qstrcmp(potentialKHTML->className(), "KHTMLView") )
+ return false;
+
+
+ return true;
+}
+
+// vim: ts=4 et sw=4
diff --git a/src/widget/ia_ora.h b/src/widget/ia_ora.h
new file mode 100644
index 0000000..1e96ccc
--- /dev/null
+++ b/src/widget/ia_ora.h
@@ -0,0 +1,308 @@
+/*
+ * Copyright (C) 2007 Gustavo Pichorim Boiko <boiko@mandriva.com>
+ * Copyright (C) 2006 Laurent Montel<lmontel@mandriva.com>
+ *
+ * renderGradient() code adapted from the Plastik stype
+ * Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+ *
+ * based on KDE3 HighColor Style (version 1.0)
+ * Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org>
+ * (C) 2001-2002 Fredrik Höglund <fredrik@kde.org>
+ *
+ * Drawing routines adapted from the KDE2 HCStyle,
+ * Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org>
+ * (C) 2000 Dirk Mueller <mueller@kde.org>
+ * (C) 2001 Martijn Klingens <klingens@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __MANDRIVASTYLE_H
+#define __MANDRIVASTYLE_H
+
+#include <qbitmap.h>
+#include <qintdict.h>
+#include <kdrawutil.h>
+#include <kpixmap.h>
+#include <kstyle.h>
+#include <qintcache.h>
+
+class QPopupMenu;
+
+
+class MandrivaStyle : public KStyle
+{
+ Q_OBJECT
+
+public:
+ MandrivaStyle();
+ virtual ~MandrivaStyle();
+
+ void polish( QWidget* widget );
+ void unPolish( QWidget* widget );
+ void polish( QApplication *app );
+ void renderMenuBlendPixmap( KPixmap& pix, const QColorGroup &cg,
+ const QPopupMenu* popup ) const;
+
+ void drawKStylePrimitive( KStylePrimitive kpe,
+ QPainter* p,
+ const QWidget* widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags = Style_Default,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ void drawPrimitive( PrimitiveElement pe,
+ QPainter* p,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags = Style_Default,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ void drawControl( ControlElement element,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags = Style_Default,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ void drawControlMask( ControlElement element,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ void drawComplexControl( ComplexControl control,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags = Style_Default,
+ SCFlags controls = SC_All,
+ SCFlags active = SC_None,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ void drawComplexControlMask( ComplexControl control,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ int pixelMetric( PixelMetric m,
+ const QWidget *widget = 0 ) const;
+
+ QSize sizeFromContents( ContentsType contents,
+ const QWidget *widget,
+ const QSize &contentSize,
+ const QStyleOption& opt ) const;
+
+ QRect subRect( SubRect r,
+ const QWidget *widget ) const;
+
+ // Fix Qt3's wacky image positions
+ QPixmap stylePixmap( StylePixmap stylepixmap,
+ const QWidget *widget = 0,
+ const QStyleOption& = QStyleOption::Default ) const;
+
+ QRect querySubControlMetrics( ComplexControl control,
+ const QWidget* widget,
+ SubControl subcontrol,
+ const QStyleOption& opt = QStyleOption::Default ) const;
+
+protected:
+ enum Hover
+ {
+ HoverNone = 0,
+ // scrollbar
+ HoverScrollBarSlider,
+ HoverScrollBarAddLine,
+ HoverScrollBarSubLine,
+ HoverScrollBarAddPage,
+ HoverScrollBarSubPage,
+ HoverScrollBarFirst,
+ HoverScrollBarLast,
+ // combobox
+ HoverComboBoxArrow,
+ HoverComboBoxEdit
+ };
+
+
+ bool eventFilter( QObject *object, QEvent *event );
+
+ void renderGradient(QPainter* p,
+ const QRect& r,
+ const QColor& ca,
+ const QColor& cb ,
+ bool horizontal) const;
+
+ QWidget *hoverWidget;
+ enum Hover hoverControl;
+
+ struct MandrivaColorData
+ {
+ ~MandrivaColorData();
+ QRgb spotColor;
+
+ // gradient color
+ //rename to grey
+ QColor shades[7];
+
+ // five blue color
+ QColor blueMdkColor[5];
+
+ // button gradients
+ QColor buttonColor[7];
+
+
+ QColor radioColor;
+
+ bool isGroup (const QColorGroup &cg)
+ {
+ return cg.button() == buttonColor[0] && cg.highlight().rgb() == spotColor;
+ }
+ };
+
+private:
+ enum TabPosition {Single = 0,First,Last, Middle};
+
+ // Disable copy constructor and = operator
+ MandrivaStyle( const MandrivaStyle & );
+ MandrivaStyle& operator=( const MandrivaStyle & );
+
+ void drawButton( const MandrivaColorData *cdata,
+ const QRect & r, QPainter *p,
+ const QColorGroup &cg,
+ SFlags flags) const;
+
+ void drawHandlePoint ( const MandrivaColorData *cdata,
+ QPainter *p,
+ int x,
+ int y) const;
+
+ void drawHandle( const MandrivaColorData *cdata,
+ QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ const QStyleOption& opt,
+ bool drawBorderAndGradient,
+ bool drawGradient = false ) const;
+
+ void drawGroupBox(const MandrivaColorData *cdata,
+ const QColorGroup & cg,
+ QPainter *p,
+ const QRect & r,
+ bool active,
+ bool sunken )const;
+
+ void drawLineSeparator(const MandrivaColorData *cdata,
+ const QColorGroup & cg,
+ QPainter *p,
+ const QRect & r,
+ bool horiziontal,
+ bool active,
+ bool sunken,
+ bool skipOffset = true) const;
+
+ void drawFrame( const MandrivaColorData *cdata,
+ const QColorGroup & cg,
+ QPainter *p,
+ const QRect & r,
+ bool active) const;
+
+ void drawComboboxArrow( QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ SCFlags active)const;
+
+ void drawMandrivaArrow( QPointArray a, QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ const QStyleOption& opt ) const;
+
+
+ MandrivaColorData *realizeData (const QColorGroup &cg) const;
+ const MandrivaColorData *lookupData (const QColorGroup &cg) const;
+ bool isFormWidget(const QWidget* widget) const;
+ bool excludeColor(const QColor &col, bool active) const;
+ void getShade (const QColorGroup &cg, int shadenr, QColor &res) const;
+ void updateHoverControl(const QPoint &pos);
+ QIntCache<MandrivaColorData> m_dataCache;
+ static const double shading[8];
+ mutable bool formMode;
+ bool kickerMode;
+ // For KPE_ListViewBranch
+ mutable QBitmap *verticalLine;
+ mutable QBitmap *horizontalLine;
+
+ // pixmap cache.
+ enum CacheEntryType
+ {
+ cSurface,
+ cGradientTile,
+ cAlphaDot
+ };
+ struct CacheEntry
+ {
+ CacheEntryType type;
+ int width;
+ int height;
+ QRgb c1Rgb;
+ QRgb c2Rgb;
+ bool horizontal;
+
+ QPixmap* pixmap;
+
+ CacheEntry(CacheEntryType t, int w, int h, QRgb c1, QRgb c2 = 0,
+ bool hor = false, QPixmap* p = 0 ):
+ type(t), width(w), height(h), c1Rgb(c1), c2Rgb(c2), horizontal(hor), pixmap(p)
+ {}
+
+ ~CacheEntry()
+ {
+ delete pixmap;
+ }
+
+ int key()
+ {
+ // create an int key from the properties which is used to refer to entries in the QIntCache.
+ // the result may not be 100% correct as we don't have so much space in one integer -- use
+ // == operator after find to make sure we got the right one. :)
+ return horizontal ^ (type<<1) ^ (width<<5) ^ (height<<10) ^ (c1Rgb<<19) ^ (c2Rgb<<22);
+ }
+
+ bool operator == (const CacheEntry& other)
+ {
+ bool match = (type == other.type) &&
+ (width == other.width) &&
+ (height == other.height) &&
+ (c1Rgb == other.c1Rgb) &&
+ (c1Rgb == other.c1Rgb) &&
+ (horizontal == other.horizontal);
+ return match;
+ }
+ };
+ QIntCache<CacheEntry> *pixmapCache;
+
+};
+
+#endif
+
+// vim: ts=4 et sw=4
diff --git a/src/widget/ia_ora.themerc b/src/widget/ia_ora.themerc
new file mode 100644
index 0000000..e85be6c
--- /dev/null
+++ b/src/widget/ia_ora.themerc
@@ -0,0 +1,6 @@
+[Misc]
+Name=Ia Ora
+Comment=Mandriva Widget Style
+[KDE]
+WidgetStyle=ia_ora
+