aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Szymon Tomasz Stefanek2006-12-30 14:47:50 +0000
committerGravatar Szymon Tomasz Stefanek2006-12-30 14:47:50 +0000
commit1655daf2249fa681bcf56f176b7a49c6332ff26f (patch)
tree90184ad81e1f7b5a111be3c10c5638db7dd38c36
parent*AUTOMATICALLY* updated KVI_SOURCES_DATE variable (diff)
downloadKVIrc-1655daf2249fa681bcf56f176b7a49c6332ff26f.tar.gz
KVIrc-1655daf2249fa681bcf56f176b7a49c6332ff26f.tar.bz2
KVIrc-1655daf2249fa681bcf56f176b7a49c6332ff26f.zip
Theme management stuff and other tricks
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@75 17fca916-40b9-46aa-a4ea-0a15b648b75c
-rw-r--r--ChangeLog4170
-rw-r--r--Makefile.am1
-rwxr-xr-xconfigure.in2
-rw-r--r--data/pics/coresmall/kcs_theme.pngbin0 -> 740 bytes
-rw-r--r--data/pics/coresmall/kcs_themes.pngbin0 -> 794 bytes
-rw-r--r--data/pics/kvi_bigicon_pack.pngbin0 -> 2204 bytes
-rw-r--r--data/pics/kvi_bigicon_themes.pngbin0 -> 2162 bytes
-rw-r--r--po/modules/Makefile.am3
-rw-r--r--po/modules/theme/.svnignore6
-rw-r--r--po/modules/theme/Makefile437
-rw-r--r--po/modules/theme/Makefile.am52
-rw-r--r--po/modules/theme/Makefile.in437
-rw-r--r--po/modules/theme/theme.pot0
-rw-r--r--po/modules/theme/theme_it.mo0
-rw-r--r--po/modules/theme/theme_it.po0
-rw-r--r--src/kvi_configstatus.h2
-rw-r--r--src/kvilib/build/Makefile.am63
-rw-r--r--src/kvilib/config/kvi_confignames.h46
-rw-r--r--src/kvilib/config/kvi_fileextensions.h37
-rw-r--r--src/kvilib/core/kvi_bswap.h25
-rw-r--r--src/kvilib/ext/kvi_osinfo.cpp3
-rw-r--r--src/kvilib/ext/kvi_osinfo.h2
-rw-r--r--src/kvilib/file/kvi_file.cpp105
-rw-r--r--src/kvilib/file/kvi_file.h38
-rw-r--r--src/kvilib/file/kvi_fileutils.cpp30
-rw-r--r--src/kvilib/file/kvi_fileutils.h2
-rw-r--r--src/kvilib/file/kvi_packagefile.cpp964
-rw-r--r--src/kvilib/file/kvi_packagefile.h141
-rw-r--r--src/kvilib/file/kvi_targzfile.h2
-rw-r--r--src/kvirc/kernel/kvi_coreactionnames.h2
-rw-r--r--src/kvirc/kernel/kvi_coreactions.cpp13
-rw-r--r--src/kvirc/kernel/kvi_iconmanager.cpp4
-rw-r--r--src/kvirc/kernel/kvi_iconmanager.h6
-rw-r--r--src/kvirc/kernel/kvi_ircconnectionstatedata.h4
-rw-r--r--src/kvirc/sparser/kvi_ircmessage.h8
-rw-r--r--src/kvirc/sparser/kvi_sp_numeric.cpp20
-rw-r--r--src/kvirc/sparser/kvi_sparser.cpp27
-rw-r--r--src/kvirc/ui/kvi_menubar.cpp2
-rw-r--r--src/kvirc/ui/kvi_msgbox.cpp2
-rw-r--r--src/kvirc/ui/kvi_selectors.cpp26
-rw-r--r--src/kvirc/ui/kvi_selectors.h12
-rw-r--r--src/modules/Makefile.am1
-rw-r--r--src/modules/help/libkvihelp.cpp6
-rw-r--r--src/modules/options/instances.cpp41
-rw-r--r--src/modules/options/optw_theme.cpp583
-rw-r--r--src/modules/options/optw_theme.h87
-rw-r--r--src/modules/theme/.svnignore11
-rw-r--r--src/modules/theme/Makefile.am20
-rw-r--r--src/modules/theme/libkvitheme.cpp122
-rw-r--r--src/modules/theme/managementdialog.cpp1148
-rw-r--r--src/modules/theme/managementdialog.h164
51 files changed, 5977 insertions, 2900 deletions
diff --git a/ChangeLog b/ChangeLog
index e608ffd5a..b9e2bbd30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,2074 +1,2096 @@
-27 Dec 2006
- [Noldor}
- - Alias editor module:
- added the possibility to save a selection of aliases in separated files (every file will have the alias name);
- fixed search function;
- - Script editor module:
- fixed replace command(in "replace all aliases" too);
- now syntax highlighter recognize command "function" and "internal";
- - Objects module:
- added objects.classes, objects.variables, objects.classAllHandlers;
- fixed crash in listviewitem class;
- fixed little bug in multilinnedit class (function $setWordWrap);
-17 Dec 2006
- [Pragma]
- - Committed the new german translation file by Mihai "Ionic" Moldovan
- - Switched the source control system to SVN: happy coding :)
-
-15 Dec 2006
- [Pragma]
- - Yet more work on the options dialog
- - Added an option for the "network name in taskbar": it's cool, but we want to choose :)
-
-12 Dec 2006
- [Alexey]
- - Added option to create minimized channels
- - Fixed nick selecting in userlist via ircview
- - Fixed mouse hover link effect
- - Network name now will be shown in the taskabr instead on server name
-
-07 Dec 2006
- [Pragma]
- - Yet more work on the options dialog
- - Fixed a crash related to the dialog.* module calls
-
-28 Nov 2006
- [Pragma]
- - More work on the options dialogs
- - Removed the duplicated kvc_ icon.
-
-19 Nov 2006
- [Alexey]
- - New function - $chan.getUrl
- - NickServ identity can now accept masks in nick field
-
-16 Nov 2006
- [Alexey]
- - Added a simple browser-like address bar to console
- - Clicking on nick in channel ircview now selects it in the userlist
- - Avatar dcc send rejected if avatar size greater, then max filesize, setted in options
-
-15 Nov 2006
- [HelLViS69]
- - Added a checkbox on AwayIndicator applet popup to choose to go away
- on all IRC Contexts
-
-14 Nov 2006
- [Pragma]
- - Moved the userlist feature options page to the theme option dialog
- and splitted all the userlist options in tabs
- - Corrected some typos around
- - Reworked the output options page
- - Updated the directory selection dialog under KDE
- - Avatars bigger than 1024x768 make KVIrc complain when setting them
- and are scaled to a saner size when they are received from others.
-
-13 Nov 2006
- [Pragma]
- - Added $object.instances(): useful when implementing singletons.
- - Fixed a small image dialog issue
-
-9 Nov 2006
- [Pragma]
- - Added support for chunked HTTP transfer encoding as required by HTTP/1.1
- - A fix for object toolbar position not saved properly
- - A fix for the addon management dialog not repainted correctly
- - A fix for loading of files by the means of KviFileUtils::loadFile()...
- /parse is one of them and it expects an utf8 encoded file.
- (read: all *.kvs files must be utf8 encoded, there is no other decent
- portable way to preserve the national characters...)
-
-8 Nov 2006
- [Pragma]
- - A fix for KviStr handling incorrectly multibyte strings (fixes some localization issues)
- - A simple hack-in for a protocol filter.. maybe msn ?
-
-6 Nov 2006
- [Pragma]
- - Various minor fixes around
- - Splitted the core small icons libraries in separate icons.
- - Moved the small icons to a subdirectory to speed up the loading (we are already at more than 280 icons...)
-
-1 Nov 2006
- [Alexey]
- - Added unreal NAMESX and UHNAMES support
- - Fixed $hexToAscii function
- - Make DCC File Open/Save dialogs have native look on windows
- - Fixes in filesystem handling. Fixed bug when KVIrc unable to load translation from non-latin folders
- - Fixed actions' accelerators
- - CTCP Page dialog now stays on top of desktop
- - Fixed in tray minimizing/restoring on win32
-
-Oct 2006
- [Alexey]
- - WIN32 compiling need QTTAG env var with "mtnc321" value for non-commercial QT 3.2.1 or "mt336" for QT 3.3.6
- - New win32 tray icon
- - Added snd.mute, snd.unmute, $snd.isMuted to KVS
- - Moved theme selection out from theme options to avoid partyally applying of themes
- - Added some lost functions to "painter" class
- - Fixed ignore system
- - Fixed input themeing (black on black bug)
- - "play" command is now alias for snd.play
- - IMPORTANT: fixed proper soket closing on win32
- - Fixed crash after first run wizard on *nix
- - Make possible installation on USB removable drives (WIN32). KVIrc can store settings in program folder
- - Make pathes in configs system-independent
-
-23 Sep 2006
- [Zerg] (commited by Alexey)
- - Change dock icon size to 22x22 on KDE. Fixed style of icon
- - Better in-tray minimizing
- [Alexey]
- - Setted tray icon background to transparent
-
-18 Sep 2006
- [Noldor]
- - Added alphablend in objects.blend
- - Added doc to class image and function setOpacity()
- ... now we can create some weird, cool effect :=D
-
-08 Sep 2006
- [Alexey]
- - Fixed input line painting bug: cursor goes out of visible range
-
-25 Aug - 07 Sep 2006
- [Alexey]
- - Fixed couple of bugs, include crashbug when applying a new theme
- - Rewrited channel mode handling
- - Rewrited setup wizard
- - Corrected themeing of input
- - Del key deletes selected transfer in filetransfers
- - Changed trayicon bechaviour. Now it's configurable.
-
-
-25 Aug 2006
- [Pragma]
- - uparser is definitively gone: KVS is the reality.
- - cleanups all around, removing unused code etc.
- - documentation cleanups
-
-13 Aug 2006
- [Pragma]
- - Fixed some docs about KVS
- - $boolean(), $string(), $integer() casts.
-
-27 Jul 2006
- [Alexey]
- - Classic taskbar now looks fine in os-style. It uses new frames and borders
- - Make classic taskbar resizable
- - Make Tree taskbar header hidable. Hide it by default
- - Tree taskbar change cursor to hand while moving over an item
-
-27 Jul 2006
- [Alexey]
- - New -a | --all-networks switch for away and back commands to apply their action to all connected networks
- - Fixed bug with long channellins scrolling; removed horisontal scrollbar
-
-27 Jul 2006
- [Alexey]
- - Timestamp format now can be configured via options
- - Input saves string in history when it was send via Ctrl+Return
- - Fixed case sensivity mode handling in usermode popup
-
-26 Jul 2006
- [Alexey]
- - Added option to include MSGTYPE info in theme packs
- - Added support fot ports, greater than 65536
-
-25 Jul 2006
- [Pragma]
- - Comparison operators now prefer numeric operands instead of strings.
- - Added $str.printf()
- [Alexey]
- - Fixed bug in language seletor
- - New XML load addon dialog
- - Show progress bar while indexing help
-
-24 Jul 2006
- [Alexey]
- - Added XML (single file) theme export/import
- - Added ability to delete installed themes
-
-22 Jul 2006
- [Alexey]
- - Fixed bugs in filetransfers window while operating with localized filenames
- - Renamed "orphan_servers" to "Standalone Servers"
-
-21 Jul 2006
- [Alexey]
- - Added e2k URL highlighting
-
-20 Jul 2006
- [Alexey]
- - Implemented help topics and keywords caching
- - Topic can be viewed via double-click for non-opers in read-only mode
- - Fixed PageUp/PageDown in logviewer
- - Fixed defsctipt. Kickban now uses mask from kvirc prefs
- - Fixed avatar handling while it trnsfered via DCC, filename contains space, but replacing spaces with _ enabled
- - Fixed connection to stupid win32 proxies
- - Added HTTP Proxy error displaying
- - New autojoin channel editor; fixed bugs in channel autojoining
-
-19 Jul 2006
- [Alexey]
- - Fixed DCC non-latin filenames handling
- - Fixed avatars with non-latin names handling
-
-07 Jul 2006
- [Alexey]
- - Fixed proxy connection (HTTP proxy doesn't require Server ip resolving now)
-
-
-28 Jun 2006
- [Pragma]
- - Fixed some CTCP handling as suggested by CtrlAltCa
- - foreach now doesn't iterate over empty variables unless the -a switch is used.
-
-23 Jun 2006
- [Ahinu]
- - Work on the mediaplayer module: more linux support + cmd/fnc cleaning
-
-10 Jun 2006
- [Alexey]
- - Added icons to some tooltips
- - Added Alt+DIGIT hotkey for window switching. Removed Ctrl+End hotkey(changed to Ctrl+F4)
-
-05 Jun 2006
- [Alexey]
- - Fixed join channels menu
- - Added insert text icon submenu to input editor popup
- - Added feature to autosave logs
-
-23 May 2006
- [Alexey]
- - Channel/topic input lines now have a OS-style border
- [Fiber^]
- - Added hungarian translation
-
-21 May 2006
- [Alexey]
- - Fixed crash while topic contains a text icon
- - Fixed colorizing nick as in the userlist while custom color is set for the normal users
-
-20 May 2006
- [Alexey]
- - Added automatic codepage select for servers, that doesn't insart "CODAPAGES" in RPL_ISUPPORT message
- - Now recent channels are network-dependend. For example #kvirc@Freenode and #kvirc@Azzurra are the different channels
- - Switched to 3.2.3
- - Fixed (finally?) window restoring from tray icon
- - Fixes in mIRC color handling
-
-15 May 2006
- [Alexey]
- - Fixed issues when IP specified instead of server name in server properties
-
-13 May 2006
- [Alexey]
- - Added search and document index to the help system
-
-10 May 2006
- [Alexey]
- - Added texticon module to manage text icon collection
- - Added detection if the KVIrc running to the win32 insatll script (patch contributed by Zerg)
-
-02 May 2006
- - Improved win32 insatll script (patch contributed by Zerg)
-
-22 Apr 2006
- [Alexey]
- - Now user can define position and/or tiling methood of backgrounds
-
-22 Apr 2006
- [Alexey]
- - Added visual effects to the tree taskbar
-
-19 Apr 2006
- [Alexey]
- - [WIN32] Added installer script for NSIS installer (nsis.sf.net). It can properly uninstall local data dir, automatically install Winamp plugin
- - Added ability to bind sounds on some events via options dialog
-
-18 Apr 2006
- [Alexey]
- - !KVIrc now can run from localized folder (generally WIN32 fix)!
- - Added options to strip colors from logs
- - Filelist retirned to the left in logviewer
- - Restyled win32 tray icon (now it looks similar to the *nix tray icon)
- - Added tray icon flashing
- - Added $lang function to detect user language
- - Updated default toolbars
-
-15 Apr 2006
- [Alexey]
- - updated graphical emotions
- - added ability to hide channel's tool buttons
- - options dialog is now closable by escape button
- - added ability to hide input tool buttons
- - colors and msgtypes now can be saved into the logfiles
-
-07 Apr 2006
- [Alexey]
- - added support for caculating md5, md4, md2, sha1, mdc2, ripemd160, dss1 digests via new $str.digest function
-
-01 Apr 2006
- [Alexey]
- - changed KVS_PT_STRINGLIST type to QStringList
- - added option to set default ban mask
- - added options to set maximum width of classic taskbar button
-
-17 Mar 2006
- [Alexey]
- - More intelligent word highlighting
-
-14 Mar 2006
- [Alexey]
- - Added HTTP Auth compatability
- - Redesigned log viewer
- - Added ability to remove logs in log viewer
- - Added nicer styling of Tool buttons
- - Fixed bugs in logfiles naming
-
-07 Mar 2006
- [Alexey]
- - Added ability to choose smyles from external file
- - Fixed sorting bans (invites,exempts) by date
-
-05 Mar 2006
- [Alexey]
- - Added option to sort received files by nicks
-
-26 Feb 2006
- [Pragma]
- - KVS now uses 64 bit integers, if possible
- - More work on zero port DCC handshakes (still a bit work in progress)
- - Finally managed the KviListView to display a transparent background
- picture (hopefully) without flickering. Does it work on windows ?
- - Added $hptimestamp() for high(er) precision time intervals computation
- - Recently also more work on the options dialog
- - the theme options now have its own toplevel dialog
- (some of the options still need to be moved around)
- - added a (still primitive) search function
-
-26 Feb 2006
- [Alexey]
- - added "away" section to the dockwidget menu
- - tray icon now transparent under *nix
- - added autohide indicator to notifier
-
-24 Feb 2006
- [Alexey]
- - added option for closing in tray (patch by Zerg)
- - added option for startup minimized
- - added deeper nick change customization in away
- - added "Quit" item to the main menu
- - new tray icon under *nix, more selective tray tooltip
-
-22 Feb 2006
- [Alexey]
- - improved nick colorization in KViIrcView: now registered nicks are colorised as in the userlist
- - now it is possible to assign a comment to the registered user. Comment will be shown it tooltip and WATCH join/quit messages
- - added option for colorizing own nick in different color
-
-21 Feb 2006
- [Alexey]
- - added option to disable avatar scaling if it less that required size
-
-20 Feb 2006
- - registered users can be organazid into groups
- - some fixes in maskeditor
-
-13 Feb 2006
- [Ahinu]
- - regchan.list -> regchan.showlist, added $regchan.list
- - Added $str.stripcolors
-
-05 Feb 2006
- [Pragma]
- - Started the big cleanup of the options dialog. Identity options for now.
- - Moved the translations of the options module to a specific po file.
- This makes the job units smaller (for translators) and doesn't force
- kvirc to load all these strings at startup.
- The original translations are preserved and the translators should
- remove the unused overlapping (and commented out) portions of the kvirc_*.po
- and options_*.po at the next opportunity.
-
-03 Feb 2006
- - Improved maskedior. Now it can edit masks;)
- - Fixed issues with [] symbols in Wildcard expressions
-
-02 Feb 2006
- [Pragma]
- - Added zero port request handling also for DCC CHAT.
- We support it also in outgoing requests now.
- - Fixed the problems with execution of perl script that contain warnings.
-
-27 Jan 2006
- [Pragma]
- - Again missed updated
- - Initial support for shared double buffering (will reduce memory usage)
- - Finished the cool listview initiated by Alexey (still needs testing on windows tough)
- - Some other things I have forgot :D
-
-17 Jan 2006
- [Pragma]
- - We now suppor the mIrc zero port DCC protocol both in incoming and *outgoing* transfers
- The outgoing protocol is activated by /dcc.rsend -z
- - A couple of fixes for the KVS engine
- - Some fixes for the perlcore module (almost finished: it just needs a better warning handler...)
- [Grifisx & Noldor]
- - Some projects updated
- - Fixed varius bug in object module (we hope less crashes ;) )
- - Deleted some old, unused objects classes function
- - Added function $height() and $width() in class pixmap
- - Fixed and optimized objects.blend command: now it is very cool and you can create some eyes candy effect
- very easily =)(more new graphic commands will come in the near future)
- - The porting of the module object is near to finish: only class socket is missing.
-
-14 Jan 2006
- [Grifisx & Noldor]
- - Added the new class object named "image": at this moment it is in alpha state and without docs;
- - Added command objects.blend.
- [Pragma]
- - Added the math.* module
- - Fixed comparison of variables in KVS
-
-13 Jan 2006
- [Grifisx & Noldor]
- - Fixed bugs in object classes
- [Alexey]
- - Window now saves logging state and userlist state
- - CTCP VERSION reply now shows os version and QT version
- - Added support for RPL_ENDOFSTATS (219) message
- [Pragma]
- - Missed to update this file for a while :D
- - The object classes are now persistent: they are stored on disk so one does not need to always redeclare them in aliases
- - Added the "user friendly commandline" button to the input widget and the global option to keep it automatically on/off
- - Other small fixes that I can't remember
-
-11 Jan 2006
- [Alexey]
- - Added an option to disable notifier window flashing
- - Fixed doubleclick interval in ircview
- - Added support for guessing max modes per line from RPL_ISUPPORT
- - Now you must use // prefix in nput line to use full KVS syntax. The / prefix don't parse arguments at all
-
-10 Jan 2006
- [KVirc Development Team]
- - Events now works in objects module
- - Lots of other improvements in objects module
- - Options to minimize in tray
- - New styled checkboxes are fully functional now under all OS
- - Fixed mIRC color handling
- - Fixed file handling in snd module on localized filesystems
-
-4 Jan 2006
- [Pragma]
- - Started porting events on new KVS
- [Alexey]
- - Added colors to the topic history widget
- - Added ability to count total connection time for all connections for the connection timer applet
-
-25 Dec 2005 - 3 Jan 2006
- - Removed old KVS
- - Added history to the topic editor
- - Redisigned splash screen
-
-24 Dec 2005
- [Pragma]
- - More modules ported to KVS: only dcc and dialog are partially missing
- at this point. Prepare for the big cleanup :)
- - Added JIS7 and euc-JP to the list of supported codecs (thnx hagabaka!)
- - Some small fixes to the options dialog that was going nuts recently...
-
-20 Dec 2005
- [Pragma]
- - Almost finished the work on alias namespaces: they should be usable now
- - Ported the perl modules to the new KVS
- - Ported the sharedfile module to the new KVS too, really few modules
- are missing now
- - Fixed a couple of buggies in KviCommandFormatter that prevented
- aliases from being correctly removed
- - Some work in the new KVS engine: the big cleanup is coming...be afraid!
-
-18 Dec 2005
- [Pragma]
- - Alias namespaces and other curious thingies all around
-
-10 Dec 2005
- [Alexey]
- - [Kernel] New theme package format. Now theme s\is a king of addon
- - [KVS] Fixed crash while calling $tr("") in new KVS
- - [Kernel] Other bugfixes
-
- [Pragma]
- - [Kernel] Fixed crashbugs in KVS kernel
-
-09 Dec 2005
- [Alexey]
- - [Kernel] Fixed bugs in handling modes. Now it is case sensivity
- - [UI] Fixed bug with deleting selected text from input line or topic editor
- - [UI] Pressing a key in userlist now selects the first nick with first letter, equal to the pressed key
- - [UI] Now options splitted into 3 categories: for novice,normal and experienced users. Newbies should see really simple configuration dialog
-
-07 Dec 2005
- [Alexey]
- - [Kernel] KVirc *hopefelly* supports now localized file names and file pathes! (but it really partially support it now:)))
- - [UI] Added missed option to the irc option widget. Now user can specify number of maximum send channel modes per line
-
-06 Dec 2005
- [Alexey]
- - [UI] Added themes previews to the setup wizard
-
-05 Dec 2005
- [Alexey]
- - [Kernel] Added soma additional checks to KviRegisteredUser class.
- - [Kernel] Mode work on filesystem interfave
- - [Kernel] Much better filenames encoding function from internationalization point of view. Logfile names becomes not so ugly:)
-
-01 Dec 2005
- [Alexey]
- - [UI] Fixed bug with nick completion
-
-26 Nov 2005
- [Alexey]
- - [UI] Now it is a programm option to disable splash and no more --disable-splash configure option
-27 Nov 2005
- [Alexey]
- - [Kernel] Fixed crashes in action and toolbar modules under windows
- - [Kernel] Added trick to resolve unmasked local hostname from 001 server message, even when you using +x mode
-
-26 Nov 2005
- [Alexey]
- - [UI] Fixed bug with non-latin search in ircview. Now it works:)
- - [UI] Improved \r handling in ircview. Now it can contain colors in the label title.
- - [UI] Improved smart nick and channel highlighting.
- - [UI] Escape hotkey (minimize window) replaced with Ctrl+Esc hotkey.
- - [UI] Better code highlighting and code completion in scripteditor.
-
-25 Nov 2005
- [Alexey]
- - [UI] Added smart nick and channel highlighting. Now most of channel names and nicknames are recognized and you can click on it by mouse:)
-
-24 Nov 2005
- [Alexey]
- - [KVS] config module ported
- - [KVS] mediaplayer module ported
- - [KVS] fixed _tonns_ of crashes in objects module with new KVS
-
-23 Nov 2005
- [Alexey]
- - [Kernel] Added ability to choose proxy server in irc server's preferences. You can choose different proxyes for different servers
-
-22 Nov 2005
- [Alexey]
- - [KVS] Removed ugly $insertInInput function, added commands window.setInputText,window.insertInInputText and function $windos.inputText
- - [KVS] Make new KVS allows to use '_' symbol in functions' names,commands' names and variables' names
- - [Kernel] Added support for RPL_ADMINME, RPL_ADMINLOC1, RPL_ADMINLOC2, RPL_ADMINEMAIL, RPL_COMMANDSYNTAX, RPL_INVITING, RPL_INFO, RPL_INFOSTART, RPL_ENDOFINFO, RPL_TIME, ERR_NOSUCHSERVER, ERR_NOSUCHCHANNEL, ERR_CANNOTSENDTOCHAN, ERR_NOCOLORSONCHAN server messages
- - [Kernel] Added support for gzipping logs and viewing gzipped logs
- [Pragma]
- - First step for the implementation of namespaces in aliases (new KVS only)
-
-21 Nov 2005
- [Alexey]
- - [UI] Ctrl+Enter now sends text to the channel(query,dcc chat,etc..) even if it has "/" at beginning.
- - [Kernel] Tuned output and string formatting functions. Really solves TONNS of internationalization problems:))
- - [Kernel] Code tuning: chack all sources to proper encodig data, sended to server. Make corrections.
- - [Modules] Some other internationalization fixes in DCC module
- - [UI] Added option to colorize nicks in channel messages the same, as they colorized in the userlist view
- [Pragma]
- - ported dialog.textinput
- - more fixes around
-
-20 Nov 2005
- [Pragma]
- - Started porting the dialog module
- - Added the callback object KVS base class
- - a small fix for KviInput (gcc warning)
-
-08 Nov 2005
- [Alexey]
- - [KVS] Error and warning texts are now readable in localized versions
- - [UI] Added option to enable or disable showing query information label
- - [UI] Added some items into the main menu
- - [UI] Added default menu on right click at url link
- - [KVS] Added $str.fromClipboard function and str.toClipboard command
- - [UI] Channel mode label now allows to edit chanmodes
- - [UI] Added new information label into Query window
- - [KVS] Fixed bug 0000270 with OnChannelModeChange event
- - [Kernel] Fixed click vs double click bug
- - [Kernel] Added parsing of 703(WeNet) and 020 messages
- - [UI] New topic editor
- - [Misc] Fixed some other bugs
- - [UI] Fixed permission on topiceditor and mode editors(for ircOps and halfops)
- - [Kernel] Fixed bug when message, that have raw event handlers decode 2 times
- - [Modules] Fixed internationalization issues in avatar module
- - [KVS] Window,reguser,url,term,toolbareditor,regchan modules are ported..
- - [KVS] Log module ported, porting logging system from KviStr to QString
- - [kernel] Some fixes for COMPILE_ONLY_NEW_KVS
-
- [Pragma]
- - More work on the KVS engine
- - avatar module ported...
- - Merged various small fixes done in the last days
-
-05 Nov 2005
- [Alexey]
- - added 7 new events to hangle single clicks
- - added 2 new functions to get/set/insert text in window's inut lineedit
- - added 2 new options for the proper handling of winamp encoding and ID3 tags' encodings
- - started dcc module porting from KviStr to QString
- - resolved lot of internatiolization problems in DCC module
- - improved defscript
-
-26 Oct 2005
- [Alexey]
- - Added Ctrl+A shortcut for select all
- - Total latin1() elemination
- - Fixed bugs from bugtrack
- - Improved usermode menu
- - Resolved issues with encodings in DCC chat and transfer
- - Editbox now has focus by default in search window
- - Changed /ame and /amsg behaviour
- - Make connect/disconnect button to reconnect to last used in this context server,not to last used globally
- - Added WeNet network
- - Fixed CTCP handling
- - Fixed +e and +I chanmodes handling
- - Fixed issues with non-latin symbols in scripts
- - Fixed encodings in logfiles
- - Fixed encodings in socket agent window
- - Fixed logfile names
- [Pragma]
- - A quick fix for the connect button handling
- - A fix for a crash in the listview KVS class (new parser)
- - More KVS all around
-
-19 Jun 2005
- [Grifisx/Noldor]
- - code improvements in the editor(...stil a work in progress):
- added code completition (shift+insert keys), added a dynamic help: move over a command/function.
- then right button and "help command/function" (... its in beta status, need some workaround :D) :
- an help window will appear.
- - added some options to hide graphic elements in the gui to build a very "minimalist" KVIrc.
-
-15 Jun 2005
- [Grifisx/Noldor]
- - code improvements in the editor(...a work in progress):
- added find/replace in alias editor, fixed some bugs and added some user friendly feature.
- To do: code completition;
- - win code improvements in the system module;
- - added setBackground command in window module;
-
-24 May 2005
- [Pragma]
- - Added queueing for slow paste
- - Added http.asyncGet
-
-14 Apr 2005
- [Grifisx/Noldor]
- - Add wrapper and wizard classes,
- added parameters support to all classes,
- some fix and changes in many objects classes.
- Moved commands "connect","disconnect","clearobjects","killclass" in the module objects.
-05 Apr 2005
- [Grifisx/Noldor]
- - Added mediaplayer.setVol and mediaplayer.jumpTo commands for winamp,
- painter and pixmap class optimization,
- added 'Paste file' and 'Stop slow paste' on chan and query.
-24 Mar 2005
- [Pragma]
- - Added the CIA open source project tracing script to the cvs (only for
- the kvirccvs module). Please write informative CVS comments from
- now on :)
-
-23 Mar 2005
- [Grifisx/Noldor]
- - added boolInputHistory option to disable Input History window and it's log memory
-
-20 Mar 2005
- [Grifisx/Noldor]
- - added painter, textbrowser and pixmap classes and some extensions to widget class
- - add minimize and close button to the iconstable's window
-
-13 Mar 2005
- [Grifisx/Noldor]
- - added functions and signals to manage some event in the lineedit class:
- $lostFocusEvent, $returnPressedEvent, $textChangedEvent
- - added function $str.section(<string>,<spl>,<n1>,<n2>) in 'str module'
-
-12 Mar 2005
- [Crissi]
- - mp3player module updated: kde mediaplayers
-
-09 Mar 2005
- [Grifisx/Noldor]
- - some new classes in the object module:
- mainwindow, toolbar, toolbutton
-
-08 Mar 2005
- [Grifisx/Noldor]
- - Fixed CTRL+K, CTRL+B, CTRL+U, CTRL+I...escapes in the topic widget
-
-27 Feb 2005
- [Pragma]
- - Fixed the CTRL+D terminal window crash
- - Fixed the Rijndael encryption module
-
-22 Feb 2004: 3.2.0 "Realia" released.
-
-20 Feb 2005
- [Pragma/Iakko/Noldor/Grifisx]
- - Several fixes on the notifier
- - A lot of enchancements in the objects module (some new classes
- and some extensions to the existing ones)
- - Improved auto-resume DCC handling: now files are not
- auto-resumed when the incoming size is unknown or smaller
- than the existing file. The auto-resume is disabled also
- if there is a running transfer with the same loca file name.
- - Fixed several bugtrack issues.
- - Cleaned up the -ansi -pedantic compilation. It looks that
- only one real warning remains and it is related to the "deprecated"
- flags of KApplication constructor which will be removed
- in KDE 4.0. We must live with it for a while.
- All the other warnings are due to the system headers.
- - Caught a couple of potential segmentation faults in the reguser
- module.
- - Committed the catalan translation by Marc Serra
-
-09 Feb 2005
- [Tom]
- - Fixed several positioning issues for widgets with saved geometry
- on MacOS X
-
-09 Feb 2005:
- [Noldor/Grifisx]
- - Added the KVS process class
- - Several fixes for other object classes
- - Added Drag&Drop support to the queries: now a drop operation
- triggers the OnQueryFileDropped event
- - Added support for CTRL+K, CTRL+B, CTRL+U, CTRL+I ... escapes
- in the topic widget.
-
-08 Feb 2005:
- [Noldor/Grifisx]
- - Added the KVS radiobutton class
-
-08 Feb 2005:
- [Pragma]
- - Fixed the bug of KviIrcView that caused the background to be repainted
- incorrectly when the mouse was hovering over the links
- - Private background now has priority even over the global transparency
- - Added a menu option to reset the private background pixmap when no longer needed
- - Removed the "FrameCaption" option since it was only freaking the people
- out when it wasn't updated on version change...
-
-07 Feb 2005:
- [Pragma]
- - Finally managed to handle correctly the IME events: text input for chinese/japanese
- korean etc... should work now.
- - Fixed the logging of emoticons: they are written to the log files now
- - More tricks on KviHeapObject
- - Added the fixes for the _horrible_ VC++ compiler bug that implicitly
- creates helper functions (vftable entries) residing in code sections where
- operator new is called on a class with a virtual destructor. This is
- simply destructive when it happens in a module that can be unloaded
- before the object allocated with new is destroyed: at delete time
- the code flow obviously jumps into no man's land.
- - Committed the ldcnumber class by Noldor and Griffisx
-
-04 Feb 2005:
- [Pragma]
- - Added the fixes for windows segfaults reported and bughunted by Noldor and Grifisx.
- Maybe these KviHeapObject trick will help to solve the issue.
- - Added a warning message about sending more than 20 lines of text
- at once in a query or channel. The warning can be obviously disabled
- forever by answering "Always".
- - Added the XIM "hot spot" handling for the input window.
-
-
-01 Feb 2005:
- [Pragma]
- - Bandwidth limits for DCC finished. They are configurable "on the fly" now.
- - Fixed the Ctrl+Arrows and Ctrl+Shift+Arrows behaviour: now they skip/select
- entire words in the input widget. Window switching has been moved to
- Alt+Arrows and Alt+Shift+Arrows.
-
-31 Jan 2005:
- [Noldor/Grifisx]
- - Yet more object classes: time for spinbox and slider.
-
-30 Jan 2005:
- [Pragma]
- - DCC Bandwidth limit implemented, "on the fly setting" is still missing tough
-
-29 Jan 2005:
- [Iakko]
- - Added Notifier 2.0 in a more stable and usable version, now tabs and
- "blinking onFocusOut/showing" are working. The Notifier is still on Beta version.
- - Some kvi_sp_literal.cpp and kvi_sp_ctcp.cpp (under kvirccvs/kvirc/src/kvirc/sparser) changes
- needed for notifier to work. A core recompilation is suggested even if
- not strongly necessary.. it's a matter of string output on the notifier, nothing critical.
- - Graphic features are waiting to be added asap.
-
-29 Jan 2005:
- [Noldor/Grifisx]
- - Added a new widget class "progressbar" with the following functions:
- $setProgress, $setTotalSteps, $reset, $setCenterIndicator,
- $setPercentageVisible, $isCenterIndicator, $isPercentageVisible
-
-28 Jan 2005:
- [Pragma]
- - Added the possibility of exporting toolbars from the toolbar
- customization dialog. The export function can also export
- the associated actions.
- - Moved the toolbar customization dialog to a separate module
- - Added the mircryption/blowfish crypt engine. It actually supports
- both the standard ECB mode and the (really) new CBC mode.
- - Fixed some remaining bugs in the action editor: now it should
- be ready for the public :)
- - Added a couple of object functions to the layout object class
- to support the nice minesweeper script :D
- - A full set of action.* and toolbar.* commands is now available
- - Added compatibility loading functions for old toolbars
- - Added handling of the ERROR server message.
- - Added the support for actions that can be enabled only in
- specified windows and only if there is a nonempty selection inside.
- This allows to create user toolbars that perform quick actions
- on the selected channel users. This is a *really* quick kick
- for example.
- - Fixed a couple of bugs related to the mask handling
- - Fixed a possible bug related to acknowledges in the DCC send code
- - Other small fixes all around as usual.
-
-
-27 Jan 2005:
- [Noldor/Grifisx]
- - added $setFont to the class widget,$setDragEnabled and $setInputMask
- to the lineedit class;
-
-20 Jan 2005:
- [Noldor/Grifisx]
- - added some new functions to the class widget: $setToolTip,
- $setForegroundColor,...
- - some code improvements in the win version of the filetransferwindow:
- added context menu like open,open with,delete file,open destination folder
-
-8 Jan 2005:
- [Pragma]
- - Added handling for ERROR and the relevant OnError event.
-
-7 Jan 2005:
- [Pragma]
- - Again more than 20 days of changes to report.
- - The action based toolbars are almost working and have replaced
- completely the old scriptable toolbars.
- - The toolbar customisation dialog is ready
- - Actioneditor is almost ready too, needs just minor adjustments
- - Added $chan.userJoinTime() and $chan.userLastActionTime()
- - Added several new $mask() types: now it is possible to get different
- host masks (only *.domain.ext or *.anything.anythingelse.domain.ext).
- Another mask set tries to handle correctly the hidden hostnames (+x)
- on some servers (this does not work 100% tough...)
- - Added the initial stuff for the language recognition module. Still
- don't know if it will end up in the official release: needs interfacing with
- the core... but the standalone engine is starting to work.
- - Added several "smart" encodings that will try to decode as UTF8 first
- and then apply the local encoding rules.
- - Added a couple of new emoticon images (Thnx Penny!, Thnx Sidhe! :)
- - Created the "scripts" cvs module and added a first script example
- (a simple ezbounce irc proxy interface)
- - Fixed runtime localization of the action and toolbar names: they
- should work fine now.
- - Fixed some bugs in the objects module (still needs a lot of work)
- signaled by Noldor.
- - Bumped up libtool and ltmain.sh to 1.5.10 (hoping that it will stop
- relinking the modules when installing... this is extremely annoying)
- - Suggest installing the default script if no toolbars or popups are available
- - Fixed http avatars not being correctly loaded after the transfer has finised.
- - Iakko is working hard on the new (cool!) notifier interface :)
- - Various other fixes all around
-
-15 Dec 2004:
- [Pragma]
- - Hacked the avatar cache to support masked ip addresses
- (added some new parameter options to the $mask function by the way)
- - Added the possibility of setting a temporary background for any IRC view.
- This is still an experiment.
-
-12 Dec 2004:
- [Pragma]
- - Added minimal support for /DCC ALLOW
- - Fixed config files loading that truncated lines longer than 32K
-
-8 Dec 2004:
- [Pragma]
- Yet another huge set of commits.
- The major changes are:
- - New "action" based toolbar and popup menu system.
- Now the user can just drag & drop actions to customize toolbars :)
- - The "big cleanup" has started:
- - "Scripttoolbar" is gone: the functionality is completely superseeded by
- the action based toolbars now. I already know that some people will want to kill
- me for this but from now on the actions are the only method to create toolbars.
- This is a good idea since the old method was a bit ugly (for example because
- it needed overriding events to enable/disable the actions).
- Moreover, another piece of the old non-unicode parser has been wiped out: this is Good(TM).
- - Module extension toolbars are gone: replaced by the action stuff now (see above).
- - Several structural changes to the default script that reflect the changes in the core.
- It IS a good idea to reparse it (execute default script) once now.
-
-4 Nov 2004:
- [Pragma]
- - Fixed various minor bugs introduced with the last huge commit.
- - Merged the Mirco Macrelli's patch that adds the chanowner flag
- support.
-
-1 Nov 2004:
- [Pragma]
- I've missed to update this file for a while: my fault :/
- The major changes until now are:
- - New statusbar showing the server informations.
- This is intended to replace the irc context applet which
- often has problems with space.
- - 5 moveable statusbar applets
- - Per network settings: nick,user,OnLogin,OnConnect,NickServ
- authentication etc. as per-network settings.
- - Both the servers and the networks can have a preferred
- encoding now.
- - More UNICODE support all around: the encodings are honored
- almost anywhere with the exception of the scripting engine.
- The scripting engine uses a hack that makes the encodings
- survive through trivial scripts too. This will become yet
- better when the new KVS core will be ready.
- - Support for unicode nicks and channel names.
- In fact almost anything that the server sends out may be unicode
- data encoded with some 16->8bit scheme.
- - A new rewritten lag meter that will avoid to ping the server
- if possible (when other lag-check probes are spontaneously
- being sent). The improved algorithm computes the lag better
- and does not "hang up" when the server doesn't reply at all.
- - The default quit and part messages can contain scripting identifiers
- that are evaluated at quit or part time.
- - The windows problem with keyboard input has been resolved
- - Several enchancements to the actual scripting engine including
- but not limited to echoprivmsg, query, notice, notifier.* ,
- perl.*, server, ...
- - Added OnDisconnectRequest event
- - Added support for /CODEPAGE
- - Avoided unnecessary repaints when in SDI mode: this made
- KVIrc a bit faster when switching windows and lowered
- the overall cpu usage.
- - The "unread" text in a window is now clearly marked by a horizontal
- line in the text view. If the text line is out of the view
- then a triangle in the upper corner of the view signals it.
- - KviWStr stuff definitively removed :)))
- - Several other minor bugtrack issues fixed.
-
-
-6 Aug 2004:
- [Juanjo]
- - Make some pointer = 0 after delete assignations when:
- Pointer is a member pointer or a global pointer.
- The delete is not in a destructor.
- It makes sense.
-
-1 Aug 2004:
- [Juanjo]
- - Added an autopackage dir with two (very initial) apsepc files to build a
- .autopackage autoinstaller.
- If you have not
- checked autopackage (http://autopackage.org) DO IT NOW :) is the real
- solution for Linux third party software installation across distributions
- (somewhat like autoconf at the binary installation level, but without
- damn M4 :)
-
-20 Jul 2004:
- [Pragma]
- - Now you can use perl from KVS and KVS from perl :)
- See /help perl.begin
-
-13 Jul 2004:
- [Pragma]
- - Perl support has been widely requested. Added the initial modules
- for that purpose. Needs more work tough.
- - More work on the notifier: now it's fully working.
- Added also the options to disable it in several ways (even completely).
- - Fixed various bugs all around
-
-11 Jul 2004:
- [Pragma]
- - Added /AHOST command
- - More work on the notifier, now it flashes, pops up only when really
- needed and can be temporairly disabled.
- - Hardwired the event manager of the new KVS engine and officially
- killed the old uparser based event manager. We're getting closer and
- closer...
-
-08 Jul 2004:
- [Pragma]
- - Added the notifier module: really nice!
- Thnx to Penny for the images :)
-
-06 Jul 2004:
- [Pragma]
- - Added a Always/Yes/No message box that asks the user for confirmation
- when attempting to close a connected console.
- - Added the Always/Yes/No option to the "Quit-Kvirc-On-Close-Last-Console"
- operation.
- - Fixed the input history handling bug as reported by Soliton
- - Added several fixes for UNICODE misbehaviours reported by Dusan
- - Fixed the configuration files parsing: now the entries
- and the keys have whitespace encoded separately and the UTF8
- encoding/decoding is done in the proper places.
- - Added the code to make the translation of the tips possible.
- The translations MUST be UTF8 encoded and use the
- libkvitip_<lang>.kvc name.
- - Finally fixed the copy&paste behaviour:
- In the input the selection and the middle click
- use QClipboard::Selection if supported by the operating system.
- All the other methods use QClipboard::Clipboard.
- The IRCView now copies to both QClipboard::Clipboard and
- QClipboard::Selection (if supported)
- - Again huge structural reorganizing in the networking stack
- now I start to like it :)
- - Committed several translation updates by Dusan
- - The reconnect timer can now be stopped before it triggers
- and on disconnect it uses the correct server entry.
- (see Trisk's ChangeLog entry for 12 Mar 2004).
-
-26 Jun 2004:
- [Pragma]
- - Fixed a mismatched new[]/delete pair in kvi_locale.cpp
- - More KviConsole->KviIrcConnection moving
- - Fixed a couple of potential segvs related to the connection management
- - More UNICODE fixes all around
-
-24 Jun 2004:
- [Pragma]
- - Yet more bug fixing
- - Added the cs translations of the modules and fixed some unicode issues reported by Dusan
-
-21 Jun 2004:
- [Pragma]
- - Fixed a bug introduced by the previous fix about date encodings :D
- - Fixed log files not being properly encoded to UTF-8 (question: should
- the logs be UTF-8, use the local encoding or use the source window charset ?)
- - Committed more work on kvirc_cs.po by Dusan Hokuv
-
-20 Jun 2004:
- [Pragma]
- - More reorganizing of the networking stack
- - Fixed some bugs with encoding of the dates in non-english locales
-
-16 Jun 2004:
- [Pragma]
- - Fixed a crash in the /foreach command as reported by Ahinu (thnx ;)
- - Added the OnNetsplit event
- - More reorganizing of the networking stack
-
-12 Jun 2004:
- [Pragma]
- - A lot of UNICODE updates
- - More reorganizing of the networking stack
- - Added a lot of new text encodings including the missing ISO-8859-XX variants
- and some CPXXX.
-
-4 Jun 2004:
- [Pragma]
- - Added first bulgarian translation by bugar@developer.bg
- - Completly reorganized the <KviConsole,KviIrcContext,KviIrcLink,KviIrcConnection,KviIrcSocket>
- class set. Now it should become more usable/readable/manteinable/coherent ...
- Really work in progress: expect misbehaviour and compile time warnings about
- deprecated functions...
-
-2 Jun 2004:
- [Pragma]
- - Added profiling support (--enable-profiling)
-
-31 May 2004: 3.0.1 "System Virtue" released.
-
-11-30 May 2004:
- [Pragma]
- - More console splitting , still not finished
- - Created the initial hackers guide document (this will be always work in progress)
- - Fixed some online doc bugs
- - Fixed a bug with popup menu prologues not being saved correctly
- - Fixed a SEGV related to focus management
- - Fixed a couple of translation related SEGVS
- - Preserved UNICODE in the logs by encoding to UTF-8
- (maybe this should be the local 8 bit ? feedback will be needed later)
- - Fixed several typos and dead links in the documentation signaled
- by Klaus Weidenbach
- - Added a couple of window.* module commands/functions
- - Unicode fixes related to IrcView tooltips
- - Added $msgtype function and fixed the related echo documentation
- - Added the export function in the event editor
- - Fixed a bug in the popup export function that caused extpopup entries
- without icons to be exported as simple popups (thnx again Klaus).
- - Added an option to redirect WHOIS replies to the active window (on by default)
- - Added the /echoprivmsg command
- - Added the "delete file" function to the file transfers window
- - Various fixes all around
-
-10 May 2004:
- [Pragma]
- - Fixed the problem with tooltips displaying the wrong avatar image
- - Started splitting KviConsole in smaller logical classes (irc context, irc connection)
-
-06 May 2004:
- [Trisk]
- - Changed parsing for 004 numeric, properly works with hybrid now.
-
-17 Apr 2004: 3.0.0 "Awakening" released.
-
-16 Apr 2004:
- [Pragma]
- - Fixed a bug with creation of KviWindow derived classes: the constructor
- of the base class was calling virtual functions from subclasses (it is curious
- that this was effectively failing only on Windows and not on Linux).
- - Reworked a bit the str module to avoid compiler parameter passing problems
- - Fixed a bug with $str.replacenocase
- - Fixed a bug that prevented the color option selector buttons from
- displaying the proper color
- - Miscelaneous fixes for the release
-
-15 Apr 2004:
- [Trisk]
- - Miscellaneous minor stuff (set avatars to 0 width/height to disable).
- - More reasonable defaults (seriously, the coloured nicks hurt people's
- eyes =\ ). The fact that unrecognised commands result in parse errors
- confuses new users (and annoys the heck out of me, too). Turned off
- message icons too. Rationale is that it will disgust former
- epic/BX/irssi/xchat users.
- - And, I don't think most new users will use avatars regularly, so turning
- the nicklist grid off by default, since it makes the nicklist more
- cluttered.
- * Forgot to add nick completion suffix. Oh well, the 3.0 series is just
- beginning...
- - Almost forgot to clean up really bad spelling in tip of the day. ><
-
-13 Apr 2004:
- [Pragma]
- - Added the default low-resolution (Minimalist) and high-resolution
- (fancy) themes
- - Added the selection of the default theme at first setup
- - Added one time nickname generation at first startup
- - Modified the Identity dialog to handle better the multiple
- nickname alternatives. The combobox was not that intuitive
- thus added a separate dialog for the alternatives.
- - Removed the "Change now" button from the Identity dialog: it never
- worked correctly.
- - Fixed the "concurrency" crash reported on the mailing list
- - Fixed a SEGV related to shared files
- - Fixed an infinite loop in the toolbar editor
- - Fixed a bug with the Color Selector not displaying the right color on windows
- - Adjusted acinclude.m4.in to handle the new icons added by Trisk: still not
- installed in the proper locations
- - Added a couple of GUI option pages that were really missing (mdi captions
- and toolbar applets)
- - A couple of new icons added
- - Fixed a couple of strange behaviours of the input widget
- - Some source code rearrangements all around
- - More things that I can't remember :D
-
-11 Apr 2004:
- [Trisk]
- - New application icon by Arty2 / Hercules Papatheodorou
- <papirakl@REMOVEotenet.gr>, updated icon set.
- * Too lazy to get icons installing in proper locations.
-
-08 Apr 2004:
- [Pragma]
- - Added the highly requested /exec command in the core
- - Also added an example script that runs an interactive telnet
- session and sends mail with the use of /exec: powerful :)
- - Fixed a script editor highlighting bug
- - Fixed another problem with overlapping dns queries...
- ... it should have been written this way from the beginning :D
- - Miscelaneous changes & fixes all around...
-
-06 Apr 2004:
- [Trisk]
- - Fixed null KviWStr problem.
- - Fixed /$sw(e) crash.
-
-04 Apr 2004:
- [Trisk]
- - Hacked KviWStr to use QTextCodec instead of charset translation tables. =P
- *** Chinese, Japanese, Korean seem to work!
- - Fixed encoding names.
- - Added ISO 8859-9 (Latin-5 Turkish, requested), Big5, GB18030, SJIS,
- EUC-KR, TIS-620.
- - Added options to not show tooltips in taskbar and userlist.
- - Added option to disable taskbar sorting.
-
-02 Apr 2004:
- [Trisk]
- - DCC message changes.
- - Use proper capitalisation in events, Irc->IRC.
- - Hack to allow showing +e (and +I) when used for channel modes (not user
- modes).
- * Should implement better 005 parsing.
-
-31 Mar 2004:
- [Pragma]
- - Added the quit confirmation dialog when there are active connections in the
- window being closed
- - Added some descriptive messages to the setup dialog
- - Fixed a crash related to received CTCP's
- - Fixed the theme loading that was not updating all the icons
- - Fixed some functionality of the theme selection dialog
- - Added some message color presets
- - Fixed a crash with overlapping dns queries
- - Added updating of the KDE root pixmap when autochange is active
- - Added the "execute script" menu entry
- - ...
- [Trisk]
- - Some message changes.
- - Added redirect to active window options for services notices, server
- notices, broadcast/wallops, and renamed ToConsole options.
- - Minor server parser changes.
-
-28 Mar 2004:
- [Pragma]
- - Added the default theme (useful to restore the default settings) to the distro
- - Some bug-fixes and cleanups in the theme engine
- - Added the themes section on www.kvirc.net and placed the first Marble theme by Sbrokka on ftp.kvirc.net
- - Adjusted the menubar to dynamically setup the popup menus (it reloads the icons etc..)
- - Fixed a crash in ctcp action
- - Added the option to flash the KVirc's taskbar entry when new messages arrive in a query and KVIrc is
- not the active application. Works only with KDE support and on Windows for now.
- - Added the special "all" parameter to $active to return the application active window
- - Forced eval to use the calling variable scope: in this way local variables can be passed too
- - Fixed a bug in the servers dialog "recent servers" popup: now it finds the correct entry also
- when two servers with the same name but different port are present
- - Added the exporting of aliases to external files (single aliases and the whole alias set).
- - Fixed the popup tester in the popupeditor: now it works again (it was totally disappeared :)
- - Misc hacks that I can't remember...
-
-25 Mar 2004:
- [Pragma]
- - Code cleanups all around
- - Updated various docs for the upcoming release
- - Removed the obsoleted _c2q stuff and --with-local-8bit option
- - Changed the close/maximize/restore/minimize icons to black ones: they look better
- - Added a heap mess windows workaround class
- - Re-implemented the shared files editing (still missing some code)
-
-24 Mar 2004:
- [Trisk]
- - Various input editor fixes.
- - CTCP parser improved.
- - Updated default script.
- - Options dialog fixes.
-
-21 Mar 2004:
- [Trisk]
- - Many, many more options dialog changes.
-
-20 Mar 2004:
- [Pragma]
- - Added several window.* functions
- - Redirected /whois output to the active window
- - Options dialog fixes
- - Added scripting toolbar
- - Cleaned up some documentation and forced gendoc.pl to ignore the new kvs docs that are not "hardwired" yet
- - Added some graphics for the final 3.0.0 release
- - Added a couple of keyboard shortcuts (all described in doc_keyboard.html)
-
-20 Mar 2004:
- [Trisk]
- - Some parsing of 005/RPL_ISUPPORT added. Uses PREFIX and and CHANTYPES.
-
-18 Mar 2004:
- [Trisk]
- - KviUserListView API change: set[beI]Entries -> setMaskEntries().
- - KviUserListView minimum width is 100px (due to continuing annoyance of
- mode editor resizing the thing... not a good solution, but whatever).
- - Lots of options dialog changes.
- - Classic taskbar now limits number of rows (when horizontal).
- - KviChannel API change: banMask(), etc. removed in favour of setMask().
- - Mask editor requests new list when opened after a mode change.
- * Fixes problem with CR ircd where -b messages may not match bans in list due to stupid inconsistent hostmasking.
-
-12 Mar 2004:
- [Trisk]
- - Auto-reconnect attempts are now counted, delay configurable.
- * FIXME: Make it possible to stop the reconnect timer before it triggers.
- - Several huge if() conditions replaced with switch() statements.
- - Various minor issues fixed.
-
-07 Mar 2004:
- [Trisk]
- - Improved script editor cursor location tracking and configuration dialog.
- - Input widget clean-ups, global input history fixed.
-
-03 Mar 2004:
- [Pragma]
- - Some work on the options dialog: moved some options to more appropriate places,
- rearranged some options widget orders, fixed descriptions etc..
- - Fix for OnChannelNotice not passing the target argument
- - More misc hacks that I can't remember :)
-
-02 Mar 2004:
- [Pragma]
- - Added OnQueryWindowRequest to catch and block the query window creation events.
- - Added OnQueryTargetAdded
- - Corrected a lot of bugs reported on bugtrack.kvirc.omnikron.net
- - Corrected the $mask.nick() problem
- - Removed the $ic warning when there was no current IRC context
- - Moved the server database to unicode
- - Misc hacks that I can't remember :D
-
-28 Feb 2004:
- [Pragma]
- - Fixed the "keep channels open on kick" crash
- - Probably fixed a sort of a race condition based crash between
- the socket and the console
- - More fiddling with KVS events
-
-24 Feb 2004:
- [Pragma]
- - Yet more work on the KVS engine: events this time
- - Temporairly removed the "force last server" hack since it was breaking the
- servers dialog: one couldn't select a different server to connect to.
- This is commented out until we find a more strict activation condition.
- - Activated the $sw function, this time for real :)
-
-20 Feb 2004:
- [Trisk]
- Added $date function for formatted time strings.
-
-18 Feb 2004:
- [Trisk]
- - Added "all" target for $me and $server functions.
- - Fixed possible $mask() problem, not sure why Pragma removed '*' from
- *user. Behaviour should be consistent with docs now.
- - Cleaned up channel prefix and nick mode prefix (considers invalid chars
- in nick to be a mode prefix).
- * Closes ID 200402112009267112
- * Somebody needs to update the bugtracker...
-
-14-17 Feb 2004:
- [Pragma]
- - Rewritten the script editor widget to use QTextEdit. Dropped
- the whole internal editor since it was not unicode and simply
- too huge for the feature it provided.
- - Modularized and cleaned up the localisation of the editor module
- - More work on KVS engine, module interface nearly estabilished
- - Added support for changing the order of option items in the
- options dialog tree display. Most common options should go at the top.
- - Random fixes around :)
-
-14 Feb 2004:
- [Trisk]
- - Changed 005 numeric parser output a bit, fixes issues with skipping to
- last word of messages.
- * /me hugs Aeri ;)
- - Removed check for KviProperty_FocusOwner.
-
-09 Feb 2004:
- [Juanjo]
- - Fixed a miscompilation --without-info-tips
- - Added the lag to the irc context indicator tooltip.
- - Make the irc context indicator a little bigger (but the correct way
- would be to make it resize itself depending on the inside text size).
-
-06 Feb 2004:
- [Pragma]
- - More work on the KVS engine
- - Added the IrcContextToolbar to the toolbars menu, now it can be hidden
- should the TaskBar be there too ?
- - Moved the TaskBar to be a toolbar like the other ones (and
- thus inherit the toolbars menu on right click etc...)
-
-05 Feb 2004:
- [istari]
- - reformating ChangeLog
- * please use current schema
- * break lines after 80 chars
- - intserting ChangeLog into website
-
-23 Jan 2004:
- [Pragma]
- - More work on the KVS engine : popups almost ready
- - Fixed a regusers bug that didn't allow to register channels with a '@'
- character in it
- - More windows port: kvilib, kvirc and several modules are already working
- - Fixed an expression parser bug related to string/number comparisons
- - Added $sw() function for switch handling in aliases
-
-20 Jan 2004:
- [Trisk]
- - Dock icon menu bug fixed, new entries added.
- * Problem with switching to console on frame window restore still present,
- Pragma: Please fix
- - Input right-click menu shows shortcut keys.
-
-19 Jan 2004:
- [Trisk]
- - Adding multiple servers wtih the same hostname (different port) works.
-
-17 Jan 2004:
- [Trisk]
- - Fixed some more encoding issues.
- - mkprocinstances.sh doesn't use zsh/bash-specific variable arrays now.
-
-15 Jan 2004:
- [Trisk]
- * PragmaOff's been idle for a long time. =\
- - Made logfiles lowercase (helps sorting, if any issues contact me).
- - Made channel and query windows's default logfile contain network name
- instead of console #... makes more sense.
- - Massive server parser changes to ensure text is converted to current
- encoding (fixes issues displaying ISO 8859-1 extended ascii (127+) text).
- - Changed all %d d %d h %d m %d s to %dd %dh %dm %ds.
-
-09 Jan 2004:
- [Trisk]
- - Lots of notify list message changes.
-
-08 Jan 2004:
- [Trisk]
- - More widget width problems fixed (presumably).
- - WHO reply is more informative now.
- - Shortened some taskbar button captions.
- - KviConsole::createQuery() tries to prevent duplicate single-target queries.
-
-06 Jan 2003:
- [Pragma]
- - More work on the new KVS engine
- - Added a -nosplash commandline argument to avoid showing the splash screen
- - Reverted the kvi_activitymeter.png icon: the bars should eventually grow
- from left to right (in the image) instead of top to bottom.
- - Re-added $window to kvi_kvs_corefunctions_sz.cpp : it's the new parser
- version and it will replace the old parser's version in the near future.
- If you want to test the new parser capabilities then run the commands
- by preceding them with a dash:
- /- echo "This is the new parser's version of echo"
- /- echo $window this is the new parser's version of echo \$window
- ...
- - Added four ways of painting the user list view grid. It is user selectable
- now.
- Please tell me which is the best one (to choose the default)
-
-04 Jan 2004:
- [Trisk]
- - Removed duplicate of $window from KviKvsCoreFunctions
- (kvi_kvs_corefunctions_sz.cpp), original is in the uparser...
- - Fixed all the "Jan 2003" dates in the ChangeLog. =)
- - Fixed KviStringSelector etc. width problem.
-
-03 Jan 2004:
- [Trisk]
- - New images, help browser uses Bluecurve ones (temporarily).
- - Taskbar now displays same number of buttons per row.
- - Various spacing changes to selectors again.
- - Fixes to identity dialog.
- * For some reason, the 4th nickname stays blank... not sure why.
- - Various QFrame::Panel -> QFrame::StyledPanel.
- - Dead channels unset limit and key too.
- - Window list shows same name for dead channels and queries.
-
-02 Jan 2004:
- [Pragma]
- - Solaris Forte 7 port (still needs hacking to compile and run flawlessly)
- - Fix for Solaris dns resolver
- - More work on the new KVS engine
- - stdarg.h wrapper to accomodate ugly compilers
-
-01 Jan 2004:
- [Trisk]
- - Dotted line drawn next to nick/avatar in nicklist instead.
- - Changed IP addy editor widget to properly accept '.' and ':'.
- - Redid identity config dialog.
-
-New Years Eve, 2003:
- [Trisk]
- - Draw separator lines above and below avatar and nick.
- - Join channels dialog cleanup.
- - Dock widget minor header changes.
-
-30 Dec 2003:
- [Trisk]
- - Cleaned up some options dialog stuff.
- - Added $version function.
-
- [Pragma]
- - HTTP avatar option support
- - More unicode porting all around
- - Windows port (kvirc and kvilib projects nearly working)
-
-29 Dec 2003:
- [Trisk]
- - Fixed problem with toolbar options dialog command.
- - Changed ident, proxy, SSL, and transport options pages to use QGroupBox to
- organise options. Maybe add add*SelectorToGroupBox functions later.
-
-28 Dec 2003:
- [Trisk]
- - More new toolbar icons, currently using Bluecurve/Crystal mix.
- - Recent channel, server, and nickname list removes duplicates even if case
- differs.
-
-27 Dec 2003:
- [Trisk]
- - Possible fix for crash if m_pConnectionInfo->szNickName is not set when
- server disconnects the client (before login).
- - Sets AsyncServerCommand on disconnect only if nonexistant; /SERVER works
- now (sorry about that, Pragma).
- - New Connect/Connecting/Disconnected icons.
- - Removed border from channel state and mode icons in user list view and
- lined up icons with text when avatar is used.
-
- [Pragma]
- - Added avatar caching
- - Reworked the code that remembers the last irc server connected in each
- console now it doesn't break the servers dialog.
- After the commit I've discovered that it collided with the Trisk's solution:
- merged the two solutions in something yet better.
- - Obscure internals: reworked KviIrcMask interface a bit...
- still needs QString porting
- - Written a ChangeLog entry after months of "hidden changes" :D
-
-Christmas Eve (Western Hemisphere) 2003:
- [Trisk]
- - Modified window tooltips a bit...
- - Unset channel mode for dead channels
- - Fixed (hopefully) crash on closing dead channels if disconnected.
- - Remove src/kvirc/kvs/moc_kvi_kvs_object.cpp from repository.
- * Merry Christmas everyone! =)
-
-21 Dec 2003:
- [Trisk]
- - Output correct message when RPL_CHANNELMODEIS is used for user modes.
- - URL highlighting matches only if followed by char greater than 46.
- - Selected text includes control codes (this is a bit of a hack, gets them
- from block attributes). Shift-select strips codes from the selection.
- - Consoles remember last nick (correctly now).
- - PART, TOPIC, and MODE messages will use current channel if no argument.
- KICK will send proper command if no reason specified.
- - Non-query notices and privmsgs go to active window if it is a common
- channel, else to first common channel.
-
-16 Dec 2003:
- [Trisk]
- - GRAMMAR FIXES EVERYWHERE
- * Breaks translations!
- * Breaks stats program log parsers too (pisg)
- - Cleaned up gendocs.pl link names.
- - Rearranged menubar to conform to KDE style standard.
- - Edit menus and buttons for "Book Title" style, changed some item names.
- * PLEASE FELLOW THE KDE STYLE STANDARD, it looks better and is less confusing
- - Made KviUIntSelector use QSpinBox instead of QLineEdit (again).
- - Added uop/userop (+u) support. Currently uses +h icon, will change later.
- - Removed many hardcoded font references.
- - Made logfiles rotate at midnight to update date.
- * Put timer in KviTimerManager for lack of a better place, somebody check
- that this is correct, please...
- - Changed tree window list to show server name for consoles of console caption
- (too long to view). Set bold font for consoles.
- - Fixed channel name showing up twice on part when no message is specified
- - Made external messages (whois info, server notices, etc.) go to console by
- default, added option ExternalMessagesToActiveWindow to override this.
- - Also fixed opnotice (NOTICE @#chan) and made non-query private notices and
- privmsg go to common channel.
- - Replaced CPPFLAGS in all Makefile.am with AM_CPPFLAGS.
- - Made channels missing request mask list when mask list editor is opened.
- - Changed KviIrcMask::getHostDomainMaskPtr() to strip only first part of host;
- user@x.y.z.tld.cc returns user@*.y.z.tld.cc, not user@*.tld.cc - much
- more specific bans, same as getIpDomainMaskLen().
- * This code was already there, but commented out - why?
- - Made console windows remember last server and nickname.
-
-21 Oct 2003:
- [Crissi]
- - 'Always highlight messages with my nick on them' added: Check
- irc::output::highlight tab on options.
- - 'Hightlight only at normal msg' added: Check irc::output::highlight
- tab on options.
- - 'Highlight at highlight msg too' added: Check irc::output::highlight
- tab on options.
- - 'Highlight at query msg too' added: Check irc::output::highlight
- tab on options.
- - 'Highlight only at costum alert level reached' added: Check
- irc::output::highlight tab on options.
- - Translation updated
- - 'Old Tools' menu moved into 'Tools' menu.
- - convert all source files to unix line end because bug in gettext for
- extracting strings from window lineend
-
-
-12 Oct 2003:
- [Crissi]
- - auto connect of servers after succuessful KVirc startup. Look into advanced
- server info, connection tab.
- For each server you can specify if should autoconnect.
-
-11 Oct 2003:
- [Crissi]
- - Channels can now stored for each server and then auto join them if
- successfully connected to the server. Look into advanced server info,
- 'After login join channels' tab. Simply check the channels (from history)
- you want to join. Also you can add a new channel (current bug: after
- adding close/reopen the dialog for showing new channel in list).
- - Minimize console after successful login. Look into Preferences - Options -
- Connection.
-
-12 Aug 2003:
- [Crissi]
- - 'Minimize all windows' and 'Restore all windows' added. Check Menu -
- Window and window action toolbar.
-
-01 Aug 2003:
- [Juanjo]
- - I'm back, ahhh nothing like vacations to do some free software ;)
- - The channel completion will also complete on the list of recent channels.
- - New server completion, if the first four letters of something written on
- the input are "irc." it will try to complete on the list of recent servers.
-
-18 Apr 2003:
- [Crissi]
- - exec module added. Check kvirccvs/modules/exec/README for more info.
-
-26 Mar 2003:
- [Crissi]
- - GUI option 'Use taskbar activity meter' added.
- - GUI option 'Disable ban list request on join' added.
- - GUI option 'Disable ban exception list request on join' added.
- - GUI option 'Disable invite list request on join' added.
- - GUI option 'Use taskbar activity meter' added.
- - Translation extract script fixed
- - Translations and translation template updated.
- - Some comments in kvi_options.h added.
-
-26 Mar 2003:
- [Pragma]
- - Option 'Use taskbar activity meter' added.
-
-28 Feb 2003:
- [Crissi]
- - The width of the taskbar entries is now custoumizable.
- - GUI option 'Minimal width of taskbar buttons' added.
-
-25 Feb 2003:
- [Istari]
- - Moved to the new CVS machine
-
-25 Feb 2003:
- [Crissi]
- - GUI options for symbols on taskbar and disabling global who added.
- - Try to show emoticons with start not with : correctly (not from me...)...
- tell me if you got problems with this...
-
-25 Feb 2003:
- [Pragma]
- - Option for disabling icons in taskbar added.
-
-21 Feb 2003:
- [Crissi]
- - Fixed text on first setup page, Translation possibility for buttons in
- wizard added.
-
-20 Feb 2003:
- [Pragma]
- - Auto-resume transfers when auto-accepted (also GUI option) added.
-
-19 Feb 2003:
- [Crissi]
- - Password field for server shows now only stars instead not plain password.
-
-18 Feb 2003:
- [Crissi]
- - Size of toolbar icon fixed. Right size s now selected if toolbar size if
- changed.
-
-18 Feb 2003:
- [Pragma]
- - Support for broken filename RESUME requests (mIrc's file.ext) added.
-
-15 Feb 2003:
- [Crissi]
- - $mp3player.getmp3tag_album added => get the album
-
-12 Feb 2003:
- [Crissi]
- - The mp3player module now supports reading of mp3 tags.
- - New commands are:
- - $mp3player.getmp3tag_artist => get the artist
- - $mp3player.getmp3tag_comment => get the comment
- - $mp3player.getmp3tag_copright => get the copyright
- - $mp3player.getmp3tag_crc =) get the crc
- - $mp3player.getmp3tag_date => get the year
- - $mp3player.getmp3tag_emphasis => get the emphasis
- - $mp3player.getmp3tag_genre => get the genre
- - $mp3player.getmp3tag_layer => get the MPEG layer
- - $mp3player.getmp3tag_original => get the orginal flag
- - $mp3player.getmp3tag_title => get the title
- - $mp3player.getmp3tag_tracknumber => get the track number
- - $mp3player.getmp3tag_version => get MPEG version
- - A example script was added (kvirccvs/kvirc/doc/scriptexamples/mp3info.kvs)
-
-4 November 2002:
- [Juanjo]
- - Added widgets to the identity an server dialogs to set a default user mode
- after a conexion to the server.
-
-24 Oct 2002:
- [Juanjo]
- - Reworked a little the Tools menu.
- - Spanish translation updates (only 1000 translations to go, hehe).
-
-19 Oct 2002:
- [Juanjo]
- - Added the alias 'lag' to the default script (it just returns the lag
- using $lag.lag()).
- - Added the event 'OnLagCheck' that get triggered every time there is a
- new lag data. This should help scripters to write their own lagmeters
- without having to poll KVIrc.
- - Added an option to display the lag on the IRC context indicator, making
- all those changes actually useful for the final user :)
-
-18 Oct 2002:
- [Juanjo]
- - Added a new (and very simple) Lagmeter (see the new 'lag' module
- commands and functions), the 'Lag Options' dialog in the options/irc
- window and the 'OnLagAlarmTimeUp' and 'OnLagAlarmTimeDown' events. I'll
- add an applet displaying the lag to the lag module as soon as I figure
- how to do it :)
- - Added the OnPong event.
- - Fixed bug 200210130200522026
-
-
-10 Oct 2002:
- [Juanjo]
- - I'm back, prepare your debuggers
- - Added a 'Ignore' menu to the userlist users menu.
- - New feature: User highlights (argh, I hate that word). Just update your
- default.kvs and right-click on a user to see how it works. Very
- usefull on very crowded channels with lots of parallel conversations
- running and you trying to keep track of one (hello #debian). Also
- added the pertinent commands on the module tmphighlight.
- - The 'clear' command now also clears the message view on channels.
-
-06-24 Jun 2002:
- [Pragma]
- - Pre-release fixes all around
- - SSL stuff..
- - About dialog
- - Fixes for KviIrcView
- - Windows porting
- - uh... I forgot all the things I did :D
-
-29 May - 06 Jun 2002:
- [Pragma]
- - More SSL support
- - A lot of bugfixes (see bugtrack.kvirc.omnikron.net)
- - Arrays support in the whole user parser (uh...this was huge , but
- necessary) a huge set of functions has been moved to the new array
- interface WARNING: the dictionaries have a new syntax now! %dict{key}
- %something[id] is now reserved to arrays (with numeric id).[br]
- - FOR command added
- - Updated all the example scripts to support the new syntax
-
-23-28 May 2002:
- [Pragma]
- - Preliminary SSL support (try /server -s)
- - Fix for the messed default.kvs (dialog problem)
- - A lot of mem-leaks catched with valgdind
- - Various fixes
-
-22 May 2002:
- [Pragma]
- - KDE Terminal window fix
- - Some new icons
-
-21 May 2002:
- [Juanjo]
- - Using Pragma's support for text icons, added the option to substitute
- some icons (currently ':)', ':D', ':-)', ':-D' and ':-O') in the irc view
- (Options -> Look & Feel -> Irc View). Still not finished.
-
-18-21 May 2002:
- [Pragma]
- - More fixes for windoze
- - Some reguser hacks
- - Command, channel, function and directory completion in the input widget
- - Various thingies all around
- - CTCP Page support (partial for now , need some more options)
-
-7-17 May 2002:
- [Pragma]
- - Tons of fixes for windoze
- - More modules ported to windoze (snd, dockwidget)
- - Text icons initial implementation (try CTRL+I and have fun :)
- - On*Created and OnWindowActivated are now called in the correct order
- - Various thingies all around
-
-6 May 2002:
- [Juanjo]
- - spaste module completed (spaste.setdelay,spaste.list,spaste.stop,etc)
- - Workaround for the tooltips-following-desktops problem (close tooltips
- on input widget keyevent).
-
-1-6 May 2002:
- [Pragma]
- - Fixes for Solaris compilation: thanks to Kenneth Larea for the hints :)
- - Random fixes for make dist
- - Support for anti-flood on CTCP DCC *
- - Failed DCC Handshakes are now optionally reported to the sender with a
- CTCP ERRMSG. The options in the dialog are still missing
- - Fixes for the "bad console repainting" problem
- - es.po charset fixed
- - Added sr.po (thnx Prethorian :)
- - Added auto-windows-tiling feature to the MDI manager
- - Other cleanups here and there...
-
-27 Apr 2002:
- [Juanjo]
- - New module 'spaste' to send text slowly to a conversation window.
- - New option for the input widget right button men in conversation
- windows: 'Paste (slowly)'.
-
-25 Apr 2002:
- [Juanjo]
- - Now the log viewer can be also a MDI window
- - Log viewer listview icons
-
-21 Apr 2002:
- [Juanjo]
- - snd module
-
-1-12 Apr 2002:
- [Pragma]
- - Minor fixes around
- - Fix for the KDE style toolbars
- - Fixes for the liquid KDE theme (transparency).
- not everything works... some label stuff must be fixed in the theme
- engine...
- - Query user list view invisible by default (also saved in the window state)
- - Same for the channel double view
- - Removed /tbutton and /wbutton and added generic /button and /buttonctl
- instead updated the example scripts accordingly
- - Merged the libtool update patch and added more fixes for this
- - Fixes for --with-local-8bit compilation
- - Added kvi_list.h and the compatibility KviPtrList defines to work both
- with qt2 and qt3
-
-31 Mar 2002:
- [Pragma]
- - Mini-Fixes for the snd module (threading arguments) for gcc 3.0.0
- - Mini-fix for libaudiofile check in configure
- - More work on window position saving
- - More work on the offer list window stuff.
- - General fixes for gcc 3.0.0 (can anybody test it ?)
-
-30 Mar 2002:
- [Pragma]
- - Added the beginning of the offer list window
- - Preliminary window properties saving... now handling defaults too
- - Minor utility-functions in the window popup menus
- - Preliminary rearrangements of code for KviConsole.... the header is
- becoming a mess need to order the code syntactically and then maybe extract
- some code to be put in external classes. KviIrcConnection could be an idea.
- - Beginning of code for the toolbar button management... need a module ?
-
-29 Mar 2002:
- [Pragma]
- - Will I ever start to use this ChangeLog ? :D
-
-7 Mar 2002:
- [Juanjo]
- - kvisounds script, the sound on OnMeNamed event is usefull, really ;)
-
-28 Feb 2002:
- [Juanjo]
- - Pragma branded str module optimizations, docs for all the implemented
- functions.
-
-26 Feb 2002:
- [Juanjo]
- - More str functions, removed strFindFirst for str.findfirst and updated
- the scripts using it (UPDATE YOUR SCRIPTS!!!)
-
-21 Feb 2002:
- [Juanjo]
- - More str functions (still no docs)
-
-19 Feb 2002:
- [Juanjo]
- - Some new functions in the str module
-
-13 Feb 2002:
- [Juanjo]
- - /IGNORE && /UNIGNORE support
- BTW the other guys are also making things, they just don't update the
- Changelog :P
-
-10 Feb 2002:
- [Juanjo]
- - $isOp() $isMeVoice() $isVoice() $isMeHalfOp() and $isHalfOp() added
-
-9 Feb 2002:
- [Juanjo]
- - New log viewer module (logview.open)
- - Fix for the editor not saving his options
-
-4 Feb 2002:
- [Juanjo]
- - Fixes so pragma could add --with-qt-embedded to compile againt Qt Embedded
- (wow!)
- - Get rid of the 'commit' and 'discard' buttons on the user editor; now
- all changes are synced with the local db.
-
-25 Jan 2002:
- [Juanjo]
- - New notify list editor
-
-21 Jan 2002:
- [Juanjo]
- - New identity button on the toolbar, posibility to change nick from the
- identity dialog if we're connected and es.po work
-
-20 Jan 2002:
- [Juanjo]
- - Added the config widget for the create query on server notice option.
- - Events and events doc: OnDCCChatConnected, OnDCCChatMessage,
- OnDCCSendTransferComplete, OnDCCGetTransferComplete, OnCTCPFlood,
- OnServerNotice, OnChannelNotice...
-
-19 Jan 2002:
- [Juanjo]
- - Added a 'close after join' checkbox to the join channels dialog & fixes.
-
-18 Jan 2002:
- [Juanjo]
- - Added OnAction event
- - Fixes
-
-17 Jan 2002:
- [balboy]
- - updated po file
- - anti idle script changed... but pragma's syntax he gave me is not working
- yet :p
-
- [Juanjo, which is alive]
- - Added the 'recent servers' Qlist to the servers dialog
- - Added the 'Show after connecting to server' checkbox to the channelsjoin
- widget
- - Servers widget bug fixed
- - Default nick link actions & men
- - Config widget for the tree-taskbar minimum? width option
-
-07 Jan 2002:
- [balboy]
- - minor changes to the default script
-
-05 Jan 2002:
- [balboy]
- - anti idle script added
- - dcc bug alias fixed
-
-22 Nov 2001:
- [Juanjo]
- - Added a bunch of events (On[me]ban/deban, On[me]op/deop,
- On[me]voice/devoice, OnChannelMessage, OnQueryMessage, OnLimitSet/Unset,
- OnKeySet/Unset, OnInvite, On[me]BanException, On[me]BanExceptionRemove,
- etc).
-
-18 Nov 2001:
- [Juanjo]
- - Added a 'Connect to servers' dialog (serversjoin.open) -> update:
- serversconnec.open
- - Added scripted buttons for the channels and servers dialogs.
- - Added $anyConsoleConnected() function.
- - Fixes
-
-12 Nov 2001:
- [YaP]
- - Added DCC user defined port range
-
-10 Nov 2001:
- [Juanjo]
- - Now it has all the functionality ;)
-
- [YaP]
- - IPv6 porting from Win XP to Win 2000 (Preprocessor definition: WIN2K)
-
-8 Nov 2001:
- [Juanjo]
- - Added a 'Join Channels' widget. It still don't have all the
- funcionality.
-
-4 Nov 2001:
- [Juanjo]
- - Improved away system
- - Option to always highlight own nick on messages
- - Made the splash screen a managed window
- - Added an 'apply' button to the general options dialog
-
-24 Sep 2001:
- [Kristoff]
- - Made Dcc Voice completely configurable, options dialog also added
- - Volume slider for dcc voice added
- - Fixed a bug in alt+arrows switching (sigsegv when window had no context
- assigned)
-
-23 Sep 2001:
- [Kristoff]
- - Switching between windows using ctrl/alt + arrows
-
-13 Sep 2001:
- [Balboy]
- - some more changes to the defscript
-
-12 Sep 2001:
- [Kristoff]
- - Text selected in Help Browser window is now automagically copied into the
- clipboard and can be pasted (Balboy's request).
- - Pressing Enter in Help Browser's lineedit starts search. When the search
- starts the cursor changes into waitCursor (cosmetical improvement :))
- - 22 Mar - 12 Sep... man...
- - biff module added - not functional at all - adding some code not to mess
- with makefiles anymore
-
-12 Sep 2001:
- [Balboy]
- - updated the changelog :p
- - added some functions to the defscript
-
-30 Mar 2001:
- [Balboy]
- - quit function added
-
-22 Mar 2001:
- [Kristoff]
- - combobox object added
-
-17 Mar 2001:
- [Pragma]:
- - A lot of unreported changes again
- - Added anti-aliased font support
-
-17 Feb 2001:
- [Pragma]
- - A lot of changes: removed the libkvigui, it was rather useless, and it is
- better to have all the GUI code into the core executable...(for many
- reasons).
- - Added the first "shy" icq module.
-
-15 Feb 2001:
- [Kristoff]
- - Added urllabel object
- Note: I'm proud to be the first person, that uses this file in the
- year 2001 :-)
-
-05 Dec 2000:
- [Number1]
- - Cleaned up the about dialog, added some new entries and fixed the
- background bug.
- Note: Could people start using this log again please? ;)
-
-12 Sep 2000:
- [Kristoff]
- - started this ChangeLog (to avoid confusion: newset entries go above
- this one ;))
- - added widget object
+28 Dec 2006
+ [Pragma]
+ - Added handling of unknown RPL_WHOIS* numeric replies by implementing a nice
+ "guessing" algorithm suggested by Elephantman
+ - Added a file with KVIrc file extension definitions. We should use the defs instead
+ of hardcoding extensions like .kvt, .kvs or .kvp.
+ - Added a fast generic packaging engine. A KVIrc package is a kind of zip archive
+ with an uncompressed metadata header. It can be used to distribute both themes and addons.
+ - First works on the theme exporting engine. Saving and packaging are now different operations.
+ One first saves his theme to disk, eventually edits it manually (maybe by adding a nice
+ splash screen or fixing some icons) and finally packages it by invoking a nice
+ wizard based procedure. Still need to write the installation dialog.
+ - Moved the whole theme management engine to a new module. It exports the
+ management dialogs and some utility commands. There is no reason to load
+ all this stuff at startup with the options dialog now.
+
+27 Dec 2006
+ [Noldor]
+ - Alias editor module:
+ added the possibility to save a selection of aliases in separated files (every file will have the alias name);
+ fixed search function;
+ - Script editor module:
+ fixed replace command(in "replace all aliases" too);
+ now syntax highlighter recognize command "function" and "internal";
+ - Objects module:
+ added objects.classes, objects.variables, objects.classAllHandlers;
+ fixed crash in listviewitem class;
+ fixed little bug in multilinnedit class (function $setWordWrap);
+
+
+19 Dec 2006
+ [Pragma]
+ - help.open: open only one help window unless -n is used
+
+17 Dec 2006
+ [Pragma]
+ - Committed the new german translation file by Mihai "Ionic" Moldovan
+ - Switched the source control system to SVN: happy coding :)
+
+15 Dec 2006
+ [Pragma]
+ - Yet more work on the options dialog
+ - Added an option for the "network name in taskbar": it's cool, but we want to choose :)
+
+12 Dec 2006
+ [Alexey]
+ - Added option to create minimized channels
+ - Fixed nick selecting in userlist via ircview
+ - Fixed mouse hover link effect
+ - Network name now will be shown in the taskabr instead on server name
+
+07 Dec 2006
+ [Pragma]
+ - Yet more work on the options dialog
+ - Fixed a crash related to the dialog.* module calls
+
+28 Nov 2006
+ [Pragma]
+ - More work on the options dialogs
+ - Removed the duplicated kvc_ icon.
+
+19 Nov 2006
+ [Alexey]
+ - New function - $chan.getUrl
+ - NickServ identity can now accept masks in nick field
+
+16 Nov 2006
+ [Alexey]
+ - Added a simple browser-like address bar to console
+ - Clicking on nick in channel ircview now selects it in the userlist
+ - Avatar dcc send rejected if avatar size greater, then max filesize, setted in options
+
+15 Nov 2006
+ [HelLViS69]
+ - Added a checkbox on AwayIndicator applet popup to choose to go away
+ on all IRC Contexts
+
+14 Nov 2006
+ [Pragma]
+ - Moved the userlist feature options page to the theme option dialog
+ and splitted all the userlist options in tabs
+ - Corrected some typos around
+ - Reworked the output options page
+ - Updated the directory selection dialog under KDE
+ - Avatars bigger than 1024x768 make KVIrc complain when setting them
+ and are scaled to a saner size when they are received from others.
+
+13 Nov 2006
+ [Pragma]
+ - Added $object.instances(): useful when implementing singletons.
+ - Fixed a small image dialog issue
+
+9 Nov 2006
+ [Pragma]
+ - Added support for chunked HTTP transfer encoding as required by HTTP/1.1
+ - A fix for object toolbar position not saved properly
+ - A fix for the addon management dialog not repainted correctly
+ - A fix for loading of files by the means of KviFileUtils::loadFile()...
+ /parse is one of them and it expects an utf8 encoded file.
+ (read: all *.kvs files must be utf8 encoded, there is no other decent
+ portable way to preserve the national characters...)
+
+8 Nov 2006
+ [Pragma]
+ - A fix for KviStr handling incorrectly multibyte strings (fixes some localization issues)
+ - A simple hack-in for a protocol filter.. maybe msn ?
+
+6 Nov 2006
+ [Pragma]
+ - Various minor fixes around
+ - Splitted the core small icons libraries in separate icons.
+ - Moved the small icons to a subdirectory to speed up the loading (we are already at more than 280 icons...)
+
+1 Nov 2006
+ [Alexey]
+ - Added unreal NAMESX and UHNAMES support
+ - Fixed $hexToAscii function
+ - Make DCC File Open/Save dialogs have native look on windows
+ - Fixes in filesystem handling. Fixed bug when KVIrc unable to load translation from non-latin folders
+ - Fixed actions' accelerators
+ - CTCP Page dialog now stays on top of desktop
+ - Fixed in tray minimizing/restoring on win32
+
+Oct 2006
+ [Alexey]
+ - WIN32 compiling need QTTAG env var with "mtnc321" value for non-commercial QT 3.2.1 or "mt336" for QT 3.3.6
+ - New win32 tray icon
+ - Added snd.mute, snd.unmute, $snd.isMuted to KVS
+ - Moved theme selection out from theme options to avoid partyally applying of themes
+ - Added some lost functions to "painter" class
+ - Fixed ignore system
+ - Fixed input themeing (black on black bug)
+ - "play" command is now alias for snd.play
+ - IMPORTANT: fixed proper soket closing on win32
+ - Fixed crash after first run wizard on *nix
+ - Make possible installation on USB removable drives (WIN32). KVIrc can store settings in program folder
+ - Make pathes in configs system-independent
+
+23 Sep 2006
+ [Zerg] (commited by Alexey)
+ - Change dock icon size to 22x22 on KDE. Fixed style of icon
+ - Better in-tray minimizing
+ [Alexey]
+ - Setted tray icon background to transparent
+
+18 Sep 2006
+ [Noldor]
+ - Added alphablend in objects.blend
+ - Added doc to class image and function setOpacity()
+ ... now we can create some weird, cool effect :=D
+
+08 Sep 2006
+ [Alexey]
+ - Fixed input line painting bug: cursor goes out of visible range
+
+25 Aug - 07 Sep 2006
+ [Alexey]
+ - Fixed couple of bugs, include crashbug when applying a new theme
+ - Rewrited channel mode handling
+ - Rewrited setup wizard
+ - Corrected themeing of input
+ - Del key deletes selected transfer in filetransfers
+ - Changed trayicon bechaviour. Now it's configurable.
+
+
+25 Aug 2006
+ [Pragma]
+ - uparser is definitively gone: KVS is the reality.
+ - cleanups all around, removing unused code etc.
+ - documentation cleanups
+
+13 Aug 2006
+ [Pragma]
+ - Fixed some docs about KVS
+ - $boolean(), $string(), $integer() casts.
+
+27 Jul 2006
+ [Alexey]
+ - Classic taskbar now looks fine in os-style. It uses new frames and borders
+ - Make classic taskbar resizable
+ - Make Tree taskbar header hidable. Hide it by default
+ - Tree taskbar change cursor to hand while moving over an item
+
+27 Jul 2006
+ [Alexey]
+ - New -a | --all-networks switch for away and back commands to apply their action to all connected networks
+ - Fixed bug with long channellins scrolling; removed horisontal scrollbar
+
+27 Jul 2006
+ [Alexey]
+ - Timestamp format now can be configured via options
+ - Input saves string in history when it was send via Ctrl+Return
+ - Fixed case sensivity mode handling in usermode popup
+
+26 Jul 2006
+ [Alexey]
+ - Added option to include MSGTYPE info in theme packs
+ - Added support fot ports, greater than 65536
+
+25 Jul 2006
+ [Pragma]
+ - Comparison operators now prefer numeric operands instead of strings.
+ - Added $str.printf()
+ [Alexey]
+ - Fixed bug in language seletor
+ - New XML load addon dialog
+ - Show progress bar while indexing help
+
+24 Jul 2006
+ [Alexey]
+ - Added XML (single file) theme export/import
+ - Added ability to delete installed themes
+
+22 Jul 2006
+ [Alexey]
+ - Fixed bugs in filetransfers window while operating with localized filenames
+ - Renamed "orphan_servers" to "Standalone Servers"
+
+21 Jul 2006
+ [Alexey]
+ - Added e2k URL highlighting
+
+20 Jul 2006
+ [Alexey]
+ - Implemented help topics and keywords caching
+ - Topic can be viewed via double-click for non-opers in read-only mode
+ - Fixed PageUp/PageDown in logviewer
+ - Fixed defsctipt. Kickban now uses mask from kvirc prefs
+ - Fixed avatar handling while it trnsfered via DCC, filename contains space, but replacing spaces with _ enabled
+ - Fixed connection to stupid win32 proxies
+ - Added HTTP Proxy error displaying
+ - New autojoin channel editor; fixed bugs in channel autojoining
+
+19 Jul 2006
+ [Alexey]
+ - Fixed DCC non-latin filenames handling
+ - Fixed avatars with non-latin names handling
+
+07 Jul 2006
+ [Alexey]
+ - Fixed proxy connection (HTTP proxy doesn't require Server ip resolving now)
+
+
+28 Jun 2006
+ [Pragma]
+ - Fixed some CTCP handling as suggested by CtrlAltCa
+ - foreach now doesn't iterate over empty variables unless the -a switch is used.
+
+23 Jun 2006
+ [Ahinu]
+ - Work on the mediaplayer module: more linux support + cmd/fnc cleaning
+
+10 Jun 2006
+ [Alexey]
+ - Added icons to some tooltips
+ - Added Alt+DIGIT hotkey for window switching. Removed Ctrl+End hotkey(changed to Ctrl+F4)
+
+05 Jun 2006
+ [Alexey]
+ - Fixed join channels menu
+ - Added insert text icon submenu to input editor popup
+ - Added feature to autosave logs
+
+23 May 2006
+ [Alexey]
+ - Channel/topic input lines now have a OS-style border
+ [Fiber^]
+ - Added hungarian translation
+
+21 May 2006
+ [Alexey]
+ - Fixed crash while topic contains a text icon
+ - Fixed colorizing nick as in the userlist while custom color is set for the normal users
+
+20 May 2006
+ [Alexey]
+ - Added automatic codepage select for servers, that doesn't insart "CODAPAGES" in RPL_ISUPPORT message
+ - Now recent channels are network-dependend. For example #kvirc@Freenode and #kvirc@Azzurra are the different channels
+ - Switched to 3.2.3
+ - Fixed (finally?) window restoring from tray icon
+ - Fixes in mIRC color handling
+
+15 May 2006
+ [Alexey]
+ - Fixed issues when IP specified instead of server name in server properties
+
+13 May 2006
+ [Alexey]
+ - Added search and document index to the help system
+
+10 May 2006
+ [Alexey]
+ - Added texticon module to manage text icon collection
+ - Added detection if the KVIrc running to the win32 insatll script (patch contributed by Zerg)
+
+02 May 2006
+ - Improved win32 insatll script (patch contributed by Zerg)
+
+22 Apr 2006
+ [Alexey]
+ - Now user can define position and/or tiling methood of backgrounds
+
+22 Apr 2006
+ [Alexey]
+ - Added visual effects to the tree taskbar
+
+19 Apr 2006
+ [Alexey]
+ - [WIN32] Added installer script for NSIS installer (nsis.sf.net). It can properly uninstall local data dir, automatically install Winamp plugin
+ - Added ability to bind sounds on some events via options dialog
+
+18 Apr 2006
+ [Alexey]
+ - !KVIrc now can run from localized folder (generally WIN32 fix)!
+ - Added options to strip colors from logs
+ - Filelist retirned to the left in logviewer
+ - Restyled win32 tray icon (now it looks similar to the *nix tray icon)
+ - Added tray icon flashing
+ - Added $lang function to detect user language
+ - Updated default toolbars
+
+15 Apr 2006
+ [Alexey]
+ - updated graphical emotions
+ - added ability to hide channel's tool buttons
+ - options dialog is now closable by escape button
+ - added ability to hide input tool buttons
+ - colors and msgtypes now can be saved into the logfiles
+
+07 Apr 2006
+ [Alexey]
+ - added support for caculating md5, md4, md2, sha1, mdc2, ripemd160, dss1 digests via new $str.digest function
+
+01 Apr 2006
+ [Alexey]
+ - changed KVS_PT_STRINGLIST type to QStringList
+ - added option to set default ban mask
+ - added options to set maximum width of classic taskbar button
+
+17 Mar 2006
+ [Alexey]
+ - More intelligent word highlighting
+
+14 Mar 2006
+ [Alexey]
+ - Added HTTP Auth compatability
+ - Redesigned log viewer
+ - Added ability to remove logs in log viewer
+ - Added nicer styling of Tool buttons
+ - Fixed bugs in logfiles naming
+
+07 Mar 2006
+ [Alexey]
+ - Added ability to choose smyles from external file
+ - Fixed sorting bans (invites,exempts) by date
+
+05 Mar 2006
+ [Alexey]
+ - Added option to sort received files by nicks
+
+26 Feb 2006
+ [Pragma]
+ - KVS now uses 64 bit integers, if possible
+ - More work on zero port DCC handshakes (still a bit work in progress)
+ - Finally managed the KviListView to display a transparent background
+ picture (hopefully) without flickering. Does it work on windows ?
+ - Added $hptimestamp() for high(er) precision time intervals computation
+ - Recently also more work on the options dialog
+ - the theme options now have its own toplevel dialog
+ (some of the options still need to be moved around)
+ - added a (still primitive) search function
+
+26 Feb 2006
+ [Alexey]
+ - added "away" section to the dockwidget menu
+ - tray icon now transparent under *nix
+ - added autohide indicator to notifier
+
+24 Feb 2006
+ [Alexey]
+ - added option for closing in tray (patch by Zerg)
+ - added option for startup minimized
+ - added deeper nick change customization in away
+ - added "Quit" item to the main menu
+ - new tray icon under *nix, more selective tray tooltip
+
+22 Feb 2006
+ [Alexey]
+ - improved nick colorization in KViIrcView: now registered nicks are colorised as in the userlist
+ - now it is possible to assign a comment to the registered user. Comment will be shown it tooltip and WATCH join/quit messages
+ - added option for colorizing own nick in different color
+
+21 Feb 2006
+ [Alexey]
+ - added option to disable avatar scaling if it less that required size
+
+20 Feb 2006
+ - registered users can be organazid into groups
+ - some fixes in maskeditor
+
+13 Feb 2006
+ [Ahinu]
+ - regchan.list -> regchan.showlist, added $regchan.list
+ - Added $str.stripcolors
+
+05 Feb 2006
+ [Pragma]
+ - Started the big cleanup of the options dialog. Identity options for now.
+ - Moved the translations of the options module to a specific po file.
+ This makes the job units smaller (for translators) and doesn't force
+ kvirc to load all these strings at startup.
+ The original translations are preserved and the translators should
+ remove the unused overlapping (and commented out) portions of the kvirc_*.po
+ and options_*.po at the next opportunity.
+
+03 Feb 2006
+ - Improved maskedior. Now it can edit masks;)
+ - Fixed issues with [] symbols in Wildcard expressions
+
+02 Feb 2006
+ [Pragma]
+ - Added zero port request handling also for DCC CHAT.
+ We support it also in outgoing requests now.
+ - Fixed the problems with execution of perl script that contain warnings.
+
+27 Jan 2006
+ [Pragma]
+ - Again missed updated
+ - Initial support for shared double buffering (will reduce memory usage)
+ - Finished the cool listview initiated by Alexey (still needs testing on windows tough)
+ - Some other things I have forgot :D
+
+17 Jan 2006
+ [Pragma]
+ - We now suppor the mIrc zero port DCC protocol both in incoming and *outgoing* transfers
+ The outgoing protocol is activated by /dcc.rsend -z
+ - A couple of fixes for the KVS engine
+ - Some fixes for the perlcore module (almost finished: it just needs a better warning handler...)
+ [Grifisx & Noldor]
+ - Some projects updated
+ - Fixed varius bug in object module (we hope less crashes ;) )
+ - Deleted some old, unused objects classes function
+ - Added function $height() and $width() in class pixmap
+ - Fixed and optimized objects.blend command: now it is very cool and you can create some eyes candy effect
+ very easily =)(more new graphic commands will come in the near future)
+ - The porting of the module object is near to finish: only class socket is missing.
+
+14 Jan 2006
+ [Grifisx & Noldor]
+ - Added the new class object named "image": at this moment it is in alpha state and without docs;
+ - Added command objects.blend.
+ [Pragma]
+ - Added the math.* module
+ - Fixed comparison of variables in KVS
+
+13 Jan 2006
+ [Grifisx & Noldor]
+ - Fixed bugs in object classes
+ [Alexey]
+ - Window now saves logging state and userlist state
+ - CTCP VERSION reply now shows os version and QT version
+ - Added support for RPL_ENDOFSTATS (219) message
+ [Pragma]
+ - Missed to update this file for a while :D
+ - The object classes are now persistent: they are stored on disk so one does not need to always redeclare them in aliases
+ - Added the "user friendly commandline" button to the input widget and the global option to keep it automatically on/off
+ - Other small fixes that I can't remember
+
+11 Jan 2006
+ [Alexey]
+ - Added an option to disable notifier window flashing
+ - Fixed doubleclick interval in ircview
+ - Added support for guessing max modes per line from RPL_ISUPPORT
+ - Now you must use // prefix in nput line to use full KVS syntax. The / prefix don't parse arguments at all
+
+10 Jan 2006
+ [KVirc Development Team]
+ - Events now works in objects module
+ - Lots of other improvements in objects module
+ - Options to minimize in tray
+ - New styled checkboxes are fully functional now under all OS
+ - Fixed mIRC color handling
+ - Fixed file handling in snd module on localized filesystems
+
+4 Jan 2006
+ [Pragma]
+ - Started porting events on new KVS
+ [Alexey]
+ - Added colors to the topic history widget
+ - Added ability to count total connection time for all connections for the connection timer applet
+
+25 Dec 2005 - 3 Jan 2006
+ - Removed old KVS
+ - Added history to the topic editor
+ - Redisigned splash screen
+
+24 Dec 2005
+ [Pragma]
+ - More modules ported to KVS: only dcc and dialog are partially missing
+ at this point. Prepare for the big cleanup :)
+ - Added JIS7 and euc-JP to the list of supported codecs (thnx hagabaka!)
+ - Some small fixes to the options dialog that was going nuts recently...
+
+20 Dec 2005
+ [Pragma]
+ - Almost finished the work on alias namespaces: they should be usable now
+ - Ported the perl modules to the new KVS
+ - Ported the sharedfile module to the new KVS too, really few modules
+ are missing now
+ - Fixed a couple of buggies in KviCommandFormatter that prevented
+ aliases from being correctly removed
+ - Some work in the new KVS engine: the big cleanup is coming...be afraid!
+
+18 Dec 2005
+ [Pragma]
+ - Alias namespaces and other curious thingies all around
+
+10 Dec 2005
+ [Alexey]
+ - [Kernel] New theme package format. Now theme s\is a king of addon
+ - [KVS] Fixed crash while calling $tr("") in new KVS
+ - [Kernel] Other bugfixes
+
+ [Pragma]
+ - [Kernel] Fixed crashbugs in KVS kernel
+
+09 Dec 2005
+ [Alexey]
+ - [Kernel] Fixed bugs in handling modes. Now it is case sensivity
+ - [UI] Fixed bug with deleting selected text from input line or topic editor
+ - [UI] Pressing a key in userlist now selects the first nick with first letter, equal to the pressed key
+ - [UI] Now options splitted into 3 categories: for novice,normal and experienced users. Newbies should see really simple configuration dialog
+
+07 Dec 2005
+ [Alexey]
+ - [Kernel] KVirc *hopefelly* supports now localized file names and file pathes! (but it really partially support it now:)))
+ - [UI] Added missed option to the irc option widget. Now user can specify number of maximum send channel modes per line
+
+06 Dec 2005
+ [Alexey]
+ - [UI] Added themes previews to the setup wizard
+
+05 Dec 2005
+ [Alexey]
+ - [Kernel] Added soma additional checks to KviRegisteredUser class.
+ - [Kernel] Mode work on filesystem interfave
+ - [Kernel] Much better filenames encoding function from internationalization point of view. Logfile names becomes not so ugly:)
+
+01 Dec 2005
+ [Alexey]
+ - [UI] Fixed bug with nick completion
+
+26 Nov 2005
+ [Alexey]
+ - [UI] Now it is a programm option to disable splash and no more --disable-splash configure option
+27 Nov 2005
+ [Alexey]
+ - [Kernel] Fixed crashes in action and toolbar modules under windows
+ - [Kernel] Added trick to resolve unmasked local hostname from 001 server message, even when you using +x mode
+
+26 Nov 2005
+ [Alexey]
+ - [UI] Fixed bug with non-latin search in ircview. Now it works:)
+ - [UI] Improved \r handling in ircview. Now it can contain colors in the label title.
+ - [UI] Improved smart nick and channel highlighting.
+ - [UI] Escape hotkey (minimize window) replaced with Ctrl+Esc hotkey.
+ - [UI] Better code highlighting and code completion in scripteditor.
+
+25 Nov 2005
+ [Alexey]
+ - [UI] Added smart nick and channel highlighting. Now most of channel names and nicknames are recognized and you can click on it by mouse:)
+
+24 Nov 2005
+ [Alexey]
+ - [KVS] config module ported
+ - [KVS] mediaplayer module ported
+ - [KVS] fixed _tonns_ of crashes in objects module with new KVS
+
+23 Nov 2005
+ [Alexey]
+ - [Kernel] Added ability to choose proxy server in irc server's preferences. You can choose different proxyes for different servers
+
+22 Nov 2005
+ [Alexey]
+ - [KVS] Removed ugly $insertInInput function, added commands window.setInputText,window.insertInInputText and function $windos.inputText
+ - [KVS] Make new KVS allows to use '_' symbol in functions' names,commands' names and variables' names
+ - [Kernel] Added support for RPL_ADMINME, RPL_ADMINLOC1, RPL_ADMINLOC2, RPL_ADMINEMAIL, RPL_COMMANDSYNTAX, RPL_INVITING, RPL_INFO, RPL_INFOSTART, RPL_ENDOFINFO, RPL_TIME, ERR_NOSUCHSERVER, ERR_NOSUCHCHANNEL, ERR_CANNOTSENDTOCHAN, ERR_NOCOLORSONCHAN server messages
+ - [Kernel] Added support for gzipping logs and viewing gzipped logs
+ [Pragma]
+ - First step for the implementation of namespaces in aliases (new KVS only)
+
+21 Nov 2005
+ [Alexey]
+ - [UI] Ctrl+Enter now sends text to the channel(query,dcc chat,etc..) even if it has "/" at beginning.
+ - [Kernel] Tuned output and string formatting functions. Really solves TONNS of internationalization problems:))
+ - [Kernel] Code tuning: chack all sources to proper encodig data, sended to server. Make corrections.
+ - [Modules] Some other internationalization fixes in DCC module
+ - [UI] Added option to colorize nicks in channel messages the same, as they colorized in the userlist view
+ [Pragma]
+ - ported dialog.textinput
+ - more fixes around
+
+20 Nov 2005
+ [Pragma]
+ - Started porting the dialog module
+ - Added the callback object KVS base class
+ - a small fix for KviInput (gcc warning)
+
+08 Nov 2005
+ [Alexey]
+ - [KVS] Error and warning texts are now readable in localized versions
+ - [UI] Added option to enable or disable showing query information label
+ - [UI] Added some items into the main menu
+ - [UI] Added default menu on right click at url link
+ - [KVS] Added $str.fromClipboard function and str.toClipboard command
+ - [UI] Channel mode label now allows to edit chanmodes
+ - [UI] Added new information label into Query window
+ - [KVS] Fixed bug 0000270 with OnChannelModeChange event
+ - [Kernel] Fixed click vs double click bug
+ - [Kernel] Added parsing of 703(WeNet) and 020 messages
+ - [UI] New topic editor
+ - [Misc] Fixed some other bugs
+ - [UI] Fixed permission on topiceditor and mode editors(for ircOps and halfops)
+ - [Kernel] Fixed bug when message, that have raw event handlers decode 2 times
+ - [Modules] Fixed internationalization issues in avatar module
+ - [KVS] Window,reguser,url,term,toolbareditor,regchan modules are ported..
+ - [KVS] Log module ported, porting logging system from KviStr to QString
+ - [kernel] Some fixes for COMPILE_ONLY_NEW_KVS
+
+ [Pragma]
+ - More work on the KVS engine
+ - avatar module ported...
+ - Merged various small fixes done in the last days
+
+05 Nov 2005
+ [Alexey]
+ - added 7 new events to hangle single clicks
+ - added 2 new functions to get/set/insert text in window's inut lineedit
+ - added 2 new options for the proper handling of winamp encoding and ID3 tags' encodings
+ - started dcc module porting from KviStr to QString
+ - resolved lot of internatiolization problems in DCC module
+ - improved defscript
+
+26 Oct 2005
+ [Alexey]
+ - Added Ctrl+A shortcut for select all
+ - Total latin1() elemination
+ - Fixed bugs from bugtrack
+ - Improved usermode menu
+ - Resolved issues with encodings in DCC chat and transfer
+ - Editbox now has focus by default in search window
+ - Changed /ame and /amsg behaviour
+ - Make connect/disconnect button to reconnect to last used in this context server,not to last used globally
+ - Added WeNet network
+ - Fixed CTCP handling
+ - Fixed +e and +I chanmodes handling
+ - Fixed issues with non-latin symbols in scripts
+ - Fixed encodings in logfiles
+ - Fixed encodings in socket agent window
+ - Fixed logfile names
+ [Pragma]
+ - A quick fix for the connect button handling
+ - A fix for a crash in the listview KVS class (new parser)
+ - More KVS all around
+
+19 Jun 2005
+ [Grifisx/Noldor]
+ - code improvements in the editor(...stil a work in progress):
+ added code completition (shift+insert keys), added a dynamic help: move over a command/function.
+ then right button and "help command/function" (... its in beta status, need some workaround :D) :
+ an help window will appear.
+ - added some options to hide graphic elements in the gui to build a very "minimalist" KVIrc.
+
+15 Jun 2005
+ [Grifisx/Noldor]
+ - code improvements in the editor(...a work in progress):
+ added find/replace in alias editor, fixed some bugs and added some user friendly feature.
+ To do: code completition;
+ - win code improvements in the system module;
+ - added setBackground command in window module;
+
+24 May 2005
+ [Pragma]
+ - Added queueing for slow paste
+ - Added http.asyncGet
+
+14 Apr 2005
+ [Grifisx/Noldor]
+ - Add wrapper and wizard classes,
+ added parameters support to all classes,
+ some fix and changes in many objects classes.
+ Moved commands "connect","disconnect","clearobjects","killclass" in the module objects.
+05 Apr 2005
+ [Grifisx/Noldor]
+ - Added mediaplayer.setVol and mediaplayer.jumpTo commands for winamp,
+ painter and pixmap class optimization,
+ added 'Paste file' and 'Stop slow paste' on chan and query.
+24 Mar 2005
+ [Pragma]
+ - Added the CIA open source project tracing script to the cvs (only for
+ the kvirccvs module). Please write informative CVS comments from
+ now on :)
+
+23 Mar 2005
+ [Grifisx/Noldor]
+ - added boolInputHistory option to disable Input History window and it's log memory
+
+20 Mar 2005
+ [Grifisx/Noldor]
+ - added painter, textbrowser and pixmap classes and some extensions to widget class
+ - add minimize and close button to the iconstable's window
+
+13 Mar 2005
+ [Grifisx/Noldor]
+ - added functions and signals to manage some event in the lineedit class:
+ $lostFocusEvent, $returnPressedEvent, $textChangedEvent
+ - added function $str.section(<string>,<spl>,<n1>,<n2>) in 'str module'
+
+12 Mar 2005
+ [Crissi]
+ - mp3player module updated: kde mediaplayers
+
+09 Mar 2005
+ [Grifisx/Noldor]
+ - some new classes in the object module:
+ mainwindow, toolbar, toolbutton
+
+08 Mar 2005
+ [Grifisx/Noldor]
+ - Fixed CTRL+K, CTRL+B, CTRL+U, CTRL+I...escapes in the topic widget
+
+27 Feb 2005
+ [Pragma]
+ - Fixed the CTRL+D terminal window crash
+ - Fixed the Rijndael encryption module
+
+22 Feb 2004: 3.2.0 "Realia" released.
+
+20 Feb 2005
+ [Pragma/Iakko/Noldor/Grifisx]
+ - Several fixes on the notifier
+ - A lot of enchancements in the objects module (some new classes
+ and some extensions to the existing ones)
+ - Improved auto-resume DCC handling: now files are not
+ auto-resumed when the incoming size is unknown or smaller
+ than the existing file. The auto-resume is disabled also
+ if there is a running transfer with the same loca file name.
+ - Fixed several bugtrack issues.
+ - Cleaned up the -ansi -pedantic compilation. It looks that
+ only one real warning remains and it is related to the "deprecated"
+ flags of KApplication constructor which will be removed
+ in KDE 4.0. We must live with it for a while.
+ All the other warnings are due to the system headers.
+ - Caught a couple of potential segmentation faults in the reguser
+ module.
+ - Committed the catalan translation by Marc Serra
+
+09 Feb 2005
+ [Tom]
+ - Fixed several positioning issues for widgets with saved geometry
+ on MacOS X
+
+09 Feb 2005:
+ [Noldor/Grifisx]
+ - Added the KVS process class
+ - Several fixes for other object classes
+ - Added Drag&Drop support to the queries: now a drop operation
+ triggers the OnQueryFileDropped event
+ - Added support for CTRL+K, CTRL+B, CTRL+U, CTRL+I ... escapes
+ in the topic widget.
+
+08 Feb 2005:
+ [Noldor/Grifisx]
+ - Added the KVS radiobutton class
+
+08 Feb 2005:
+ [Pragma]
+ - Fixed the bug of KviIrcView that caused the background to be repainted
+ incorrectly when the mouse was hovering over the links
+ - Private background now has priority even over the global transparency
+ - Added a menu option to reset the private background pixmap when no longer needed
+ - Removed the "FrameCaption" option since it was only freaking the people
+ out when it wasn't updated on version change...
+
+07 Feb 2005:
+ [Pragma]
+ - Finally managed to handle correctly the IME events: text input for chinese/japanese
+ korean etc... should work now.
+ - Fixed the logging of emoticons: they are written to the log files now
+ - More tricks on KviHeapObject
+ - Added the fixes for the _horrible_ VC++ compiler bug that implicitly
+ creates helper functions (vftable entries) residing in code sections where
+ operator new is called on a class with a virtual destructor. This is
+ simply destructive when it happens in a module that can be unloaded
+ before the object allocated with new is destroyed: at delete time
+ the code flow obviously jumps into no man's land.
+ - Committed the ldcnumber class by Noldor and Griffisx
+
+04 Feb 2005:
+ [Pragma]
+ - Added the fixes for windows segfaults reported and bughunted by Noldor and Grifisx.
+ Maybe these KviHeapObject trick will help to solve the issue.
+ - Added a warning message about sending more than 20 lines of text
+ at once in a query or channel. The warning can be obviously disabled
+ forever by answering "Always".
+ - Added the XIM "hot spot" handling for the input window.
+
+
+01 Feb 2005:
+ [Pragma]
+ - Bandwidth limits for DCC finished. They are configurable "on the fly" now.
+ - Fixed the Ctrl+Arrows and Ctrl+Shift+Arrows behaviour: now they skip/select
+ entire words in the input widget. Window switching has been moved to
+ Alt+Arrows and Alt+Shift+Arrows.
+
+31 Jan 2005:
+ [Noldor/Grifisx]
+ - Yet more object classes: time for spinbox and slider.
+
+30 Jan 2005:
+ [Pragma]
+ - DCC Bandwidth limit implemented, "on the fly setting" is still missing tough
+
+29 Jan 2005:
+ [Iakko]
+ - Added Notifier 2.0 in a more stable and usable version, now tabs and
+ "blinking onFocusOut/showing" are working. The Notifier is still on Beta version.
+ - Some kvi_sp_literal.cpp and kvi_sp_ctcp.cpp (under kvirccvs/kvirc/src/kvirc/sparser) changes
+ needed for notifier to work. A core recompilation is suggested even if
+ not strongly necessary.. it's a matter of string output on the notifier, nothing critical.
+ - Graphic features are waiting to be added asap.
+
+29 Jan 2005:
+ [Noldor/Grifisx]
+ - Added a new widget class "progressbar" with the following functions:
+ $setProgress, $setTotalSteps, $reset, $setCenterIndicator,
+ $setPercentageVisible, $isCenterIndicator, $isPercentageVisible
+
+28 Jan 2005:
+ [Pragma]
+ - Added the possibility of exporting toolbars from the toolbar
+ customization dialog. The export function can also export
+ the associated actions.
+ - Moved the toolbar customization dialog to a separate module
+ - Added the mircryption/blowfish crypt engine. It actually supports
+ both the standard ECB mode and the (really) new CBC mode.
+ - Fixed some remaining bugs in the action editor: now it should
+ be ready for the public :)
+ - Added a couple of object functions to the layout object class
+ to support the nice minesweeper script :D
+ - A full set of action.* and toolbar.* commands is now available
+ - Added compatibility loading functions for old toolbars
+ - Added handling of the ERROR server message.
+ - Added the support for actions that can be enabled only in
+ specified windows and only if there is a nonempty selection inside.
+ This allows to create user toolbars that perform quick actions
+ on the selected channel users. This is a *really* quick kick
+ for example.
+ - Fixed a couple of bugs related to the mask handling
+ - Fixed a possible bug related to acknowledges in the DCC send code
+ - Other small fixes all around as usual.
+
+
+27 Jan 2005:
+ [Noldor/Grifisx]
+ - added $setFont to the class widget,$setDragEnabled and $setInputMask
+ to the lineedit class;
+
+20 Jan 2005:
+ [Noldor/Grifisx]
+ - added some new functions to the class widget: $setToolTip,
+ $setForegroundColor,...
+ - some code improvements in the win version of the filetransferwindow:
+ added context menu like open,open with,delete file,open destination folder
+
+8 Jan 2005:
+ [Pragma]
+ - Added handling for ERROR and the relevant OnError event.
+
+7 Jan 2005:
+ [Pragma]
+ - Again more than 20 days of changes to report.
+ - The action based toolbars are almost working and have replaced
+ completely the old scriptable toolbars.
+ - The toolbar customisation dialog is ready
+ - Actioneditor is almost ready too, needs just minor adjustments
+ - Added $chan.userJoinTime() and $chan.userLastActionTime()
+ - Added several new $mask() types: now it is possible to get different
+ host masks (only *.domain.ext or *.anything.anythingelse.domain.ext).
+ Another mask set tries to handle correctly the hidden hostnames (+x)
+ on some servers (this does not work 100% tough...)
+ - Added the initial stuff for the language recognition module. Still
+ don't know if it will end up in the official release: needs interfacing with
+ the core... but the standalone engine is starting to work.
+ - Added several "smart" encodings that will try to decode as UTF8 first
+ and then apply the local encoding rules.
+ - Added a couple of new emoticon images (Thnx Penny!, Thnx Sidhe! :)
+ - Created the "scripts" cvs module and added a first script example
+ (a simple ezbounce irc proxy interface)
+ - Fixed runtime localization of the action and toolbar names: they
+ should work fine now.
+ - Fixed some bugs in the objects module (still needs a lot of work)
+ signaled by Noldor.
+ - Bumped up libtool and ltmain.sh to 1.5.10 (hoping that it will stop
+ relinking the modules when installing... this is extremely annoying)
+ - Suggest installing the default script if no toolbars or popups are available
+ - Fixed http avatars not being correctly loaded after the transfer has finised.
+ - Iakko is working hard on the new (cool!) notifier interface :)
+ - Various other fixes all around
+
+15 Dec 2004:
+ [Pragma]
+ - Hacked the avatar cache to support masked ip addresses
+ (added some new parameter options to the $mask function by the way)
+ - Added the possibility of setting a temporary background for any IRC view.
+ This is still an experiment.
+
+12 Dec 2004:
+ [Pragma]
+ - Added minimal support for /DCC ALLOW
+ - Fixed config files loading that truncated lines longer than 32K
+
+8 Dec 2004:
+ [Pragma]
+ Yet another huge set of commits.
+ The major changes are:
+ - New "action" based toolbar and popup menu system.
+ Now the user can just drag & drop actions to customize toolbars :)
+ - The "big cleanup" has started:
+ - "Scripttoolbar" is gone: the functionality is completely superseeded by
+ the action based toolbars now. I already know that some people will want to kill
+ me for this but from now on the actions are the only method to create toolbars.
+ This is a good idea since the old method was a bit ugly (for example because
+ it needed overriding events to enable/disable the actions).
+ Moreover, another piece of the old non-unicode parser has been wiped out: this is Good(TM).
+ - Module extension toolbars are gone: replaced by the action stuff now (see above).
+ - Several structural changes to the default script that reflect the changes in the core.
+ It IS a good idea to reparse it (execute default script) once now.
+
+4 Nov 2004:
+ [Pragma]
+ - Fixed various minor bugs introduced with the last huge commit.
+ - Merged the Mirco Macrelli's patch that adds the chanowner flag
+ support.
+
+1 Nov 2004:
+ [Pragma]
+ I've missed to update this file for a while: my fault :/
+ The major changes until now are:
+ - New statusbar showing the server informations.
+ This is intended to replace the irc context applet which
+ often has problems with space.
+ - 5 moveable statusbar applets
+ - Per network settings: nick,user,OnLogin,OnConnect,NickServ
+ authentication etc. as per-network settings.
+ - Both the servers and the networks can have a preferred
+ encoding now.
+ - More UNICODE support all around: the encodings are honored
+ almost anywhere with the exception of the scripting engine.
+ The scripting engine uses a hack that makes the encodings
+ survive through trivial scripts too. This will become yet
+ better when the new KVS core will be ready.
+ - Support for unicode nicks and channel names.
+ In fact almost anything that the server sends out may be unicode
+ data encoded with some 16->8bit scheme.
+ - A new rewritten lag meter that will avoid to ping the server
+ if possible (when other lag-check probes are spontaneously
+ being sent). The improved algorithm computes the lag better
+ and does not "hang up" when the server doesn't reply at all.
+ - The default quit and part messages can contain scripting identifiers
+ that are evaluated at quit or part time.
+ - The windows problem with keyboard input has been resolved
+ - Several enchancements to the actual scripting engine including
+ but not limited to echoprivmsg, query, notice, notifier.* ,
+ perl.*, server, ...
+ - Added OnDisconnectRequest event
+ - Added support for /CODEPAGE
+ - Avoided unnecessary repaints when in SDI mode: this made
+ KVIrc a bit faster when switching windows and lowered
+ the overall cpu usage.
+ - The "unread" text in a window is now clearly marked by a horizontal
+ line in the text view. If the text line is out of the view
+ then a triangle in the upper corner of the view signals it.
+ - KviWStr stuff definitively removed :)))
+ - Several other minor bugtrack issues fixed.
+
+
+6 Aug 2004:
+ [Juanjo]
+ - Make some pointer = 0 after delete assignations when:
+ Pointer is a member pointer or a global pointer.
+ The delete is not in a destructor.
+ It makes sense.
+
+1 Aug 2004:
+ [Juanjo]
+ - Added an autopackage dir with two (very initial) apsepc files to build a
+ .autopackage autoinstaller.
+ If you have not
+ checked autopackage (http://autopackage.org) DO IT NOW :) is the real
+ solution for Linux third party software installation across distributions
+ (somewhat like autoconf at the binary installation level, but without
+ damn M4 :)
+
+20 Jul 2004:
+ [Pragma]
+ - Now you can use perl from KVS and KVS from perl :)
+ See /help perl.begin
+
+13 Jul 2004:
+ [Pragma]
+ - Perl support has been widely requested. Added the initial modules
+ for that purpose. Needs more work tough.
+ - More work on the notifier: now it's fully working.
+ Added also the options to disable it in several ways (even completely).
+ - Fixed various bugs all around
+
+11 Jul 2004:
+ [Pragma]
+ - Added /AHOST command
+ - More work on the notifier, now it flashes, pops up only when really
+ needed and can be temporairly disabled.
+ - Hardwired the event manager of the new KVS engine and officially
+ killed the old uparser based event manager. We're getting closer and
+ closer...
+
+08 Jul 2004:
+ [Pragma]
+ - Added the notifier module: really nice!
+ Thnx to Penny for the images :)
+
+06 Jul 2004:
+ [Pragma]
+ - Added a Always/Yes/No message box that asks the user for confirmation
+ when attempting to close a connected console.
+ - Added the Always/Yes/No option to the "Quit-Kvirc-On-Close-Last-Console"
+ operation.
+ - Fixed the input history handling bug as reported by Soliton
+ - Added several fixes for UNICODE misbehaviours reported by Dusan
+ - Fixed the configuration files parsing: now the entries
+ and the keys have whitespace encoded separately and the UTF8
+ encoding/decoding is done in the proper places.
+ - Added the code to make the translation of the tips possible.
+ The translations MUST be UTF8 encoded and use the
+ libkvitip_<lang>.kvc name.
+ - Finally fixed the copy&paste behaviour:
+ In the input the selection and the middle click
+ use QClipboard::Selection if supported by the operating system.
+ All the other methods use QClipboard::Clipboard.
+ The IRCView now copies to both QClipboard::Clipboard and
+ QClipboard::Selection (if supported)
+ - Again huge structural reorganizing in the networking stack
+ now I start to like it :)
+ - Committed several translation updates by Dusan
+ - The reconnect timer can now be stopped before it triggers
+ and on disconnect it uses the correct server entry.
+ (see Trisk's ChangeLog entry for 12 Mar 2004).
+
+26 Jun 2004:
+ [Pragma]
+ - Fixed a mismatched new[]/delete pair in kvi_locale.cpp
+ - More KviConsole->KviIrcConnection moving
+ - Fixed a couple of potential segvs related to the connection management
+ - More UNICODE fixes all around
+
+24 Jun 2004:
+ [Pragma]
+ - Yet more bug fixing
+ - Added the cs translations of the modules and fixed some unicode issues reported by Dusan
+
+21 Jun 2004:
+ [Pragma]
+ - Fixed a bug introduced by the previous fix about date encodings :D
+ - Fixed log files not being properly encoded to UTF-8 (question: should
+ the logs be UTF-8, use the local encoding or use the source window charset ?)
+ - Committed more work on kvirc_cs.po by Dusan Hokuv
+
+20 Jun 2004:
+ [Pragma]
+ - More reorganizing of the networking stack
+ - Fixed some bugs with encoding of the dates in non-english locales
+
+16 Jun 2004:
+ [Pragma]
+ - Fixed a crash in the /foreach command as reported by Ahinu (thnx ;)
+ - Added the OnNetsplit event
+ - More reorganizing of the networking stack
+
+12 Jun 2004:
+ [Pragma]
+ - A lot of UNICODE updates
+ - More reorganizing of the networking stack
+ - Added a lot of new text encodings including the missing ISO-8859-XX variants
+ and some CPXXX.
+
+4 Jun 2004:
+ [Pragma]
+ - Added first bulgarian translation by bugar@developer.bg
+ - Completly reorganized the <KviConsole,KviIrcContext,KviIrcLink,KviIrcConnection,KviIrcSocket>
+ class set. Now it should become more usable/readable/manteinable/coherent ...
+ Really work in progress: expect misbehaviour and compile time warnings about
+ deprecated functions...
+
+2 Jun 2004:
+ [Pragma]
+ - Added profiling support (--enable-profiling)
+
+31 May 2004: 3.0.1 "System Virtue" released.
+
+11-30 May 2004:
+ [Pragma]
+ - More console splitting , still not finished
+ - Created the initial hackers guide document (this will be always work in progress)
+ - Fixed some online doc bugs
+ - Fixed a bug with popup menu prologues not being saved correctly
+ - Fixed a SEGV related to focus management
+ - Fixed a couple of translation related SEGVS
+ - Preserved UNICODE in the logs by encoding to UTF-8
+ (maybe this should be the local 8 bit ? feedback will be needed later)
+ - Fixed several typos and dead links in the documentation signaled
+ by Klaus Weidenbach
+ - Added a couple of window.* module commands/functions
+ - Unicode fixes related to IrcView tooltips
+ - Added $msgtype function and fixed the related echo documentation
+ - Added the export function in the event editor
+ - Fixed a bug in the popup export function that caused extpopup entries
+ without icons to be exported as simple popups (thnx again Klaus).
+ - Added an option to redirect WHOIS replies to the active window (on by default)
+ - Added the /echoprivmsg command
+ - Added the "delete file" function to the file transfers window
+ - Various fixes all around
+
+10 May 2004:
+ [Pragma]
+ - Fixed the problem with tooltips displaying the wrong avatar image
+ - Started splitting KviConsole in smaller logical classes (irc context, irc connection)
+
+06 May 2004:
+ [Trisk]
+ - Changed parsing for 004 numeric, properly works with hybrid now.
+
+17 Apr 2004: 3.0.0 "Awakening" released.
+
+16 Apr 2004:
+ [Pragma]
+ - Fixed a bug with creation of KviWindow derived classes: the constructor
+ of the base class was calling virtual functions from subclasses (it is curious
+ that this was effectively failing only on Windows and not on Linux).
+ - Reworked a bit the str module to avoid compiler parameter passing problems
+ - Fixed a bug with $str.replacenocase
+ - Fixed a bug that prevented the color option selector buttons from
+ displaying the proper color
+ - Miscelaneous fixes for the release
+
+15 Apr 2004:
+ [Trisk]
+ - Miscellaneous minor stuff (set avatars to 0 width/height to disable).
+ - More reasonable defaults (seriously, the coloured nicks hurt people's
+ eyes =\ ). The fact that unrecognised commands result in parse errors
+ confuses new users (and annoys the heck out of me, too). Turned off
+ message icons too. Rationale is that it will disgust former
+ epic/BX/irssi/xchat users.
+ - And, I don't think most new users will use avatars regularly, so turning
+ the nicklist grid off by default, since it makes the nicklist more
+ cluttered.
+ * Forgot to add nick completion suffix. Oh well, the 3.0 series is just
+ beginning...
+ - Almost forgot to clean up really bad spelling in tip of the day. ><
+
+13 Apr 2004:
+ [Pragma]
+ - Added the default low-resolution (Minimalist) and high-resolution
+ (fancy) themes
+ - Added the selection of the default theme at first setup
+ - Added one time nickname generation at first startup
+ - Modified the Identity dialog to handle better the multiple
+ nickname alternatives. The combobox was not that intuitive
+ thus added a separate dialog for the alternatives.
+ - Removed the "Change now" button from the Identity dialog: it never
+ worked correctly.
+ - Fixed the "concurrency" crash reported on the mailing list
+ - Fixed a SEGV related to shared files
+ - Fixed an infinite loop in the toolbar editor
+ - Fixed a bug with the Color Selector not displaying the right color on windows
+ - Adjusted acinclude.m4.in to handle the new icons added by Trisk: still not
+ installed in the proper locations
+ - Added a couple of GUI option pages that were really missing (mdi captions
+ and toolbar applets)
+ - A couple of new icons added
+ - Fixed a couple of strange behaviours of the input widget
+ - Some source code rearrangements all around
+ - More things that I can't remember :D
+
+11 Apr 2004:
+ [Trisk]
+ - New application icon by Arty2 / Hercules Papatheodorou
+ <papirakl@REMOVEotenet.gr>, updated icon set.
+ * Too lazy to get icons installing in proper locations.
+
+08 Apr 2004:
+ [Pragma]
+ - Added the highly requested /exec command in the core
+ - Also added an example script that runs an interactive telnet
+ session and sends mail with the use of /exec: powerful :)
+ - Fixed a script editor highlighting bug
+ - Fixed another problem with overlapping dns queries...
+ ... it should have been written this way from the beginning :D
+ - Miscelaneous changes & fixes all around...
+
+06 Apr 2004:
+ [Trisk]
+ - Fixed null KviWStr problem.
+ - Fixed /$sw(e) crash.
+
+04 Apr 2004:
+ [Trisk]
+ - Hacked KviWStr to use QTextCodec instead of charset translation tables. =P
+ *** Chinese, Japanese, Korean seem to work!
+ - Fixed encoding names.
+ - Added ISO 8859-9 (Latin-5 Turkish, requested), Big5, GB18030, SJIS,
+ EUC-KR, TIS-620.
+ - Added options to not show tooltips in taskbar and userlist.
+ - Added option to disable taskbar sorting.
+
+02 Apr 2004:
+ [Trisk]
+ - DCC message changes.
+ - Use proper capitalisation in events, Irc->IRC.
+ - Hack to allow showing +e (and +I) when used for channel modes (not user
+ modes).
+ * Should implement better 005 parsing.
+
+31 Mar 2004:
+ [Pragma]
+ - Added the quit confirmation dialog when there are active connections in the
+ window being closed
+ - Added some descriptive messages to the setup dialog
+ - Fixed a crash related to received CTCP's
+ - Fixed the theme loading that was not updating all the icons
+ - Fixed some functionality of the theme selection dialog
+ - Added some message color presets
+ - Fixed a crash with overlapping dns queries
+ - Added updating of the KDE root pixmap when autochange is active
+ - Added the "execute script" menu entry
+ - ...
+ [Trisk]
+ - Some message changes.
+ - Added redirect to active window options for services notices, server
+ notices, broadcast/wallops, and renamed ToConsole options.
+ - Minor server parser changes.
+
+28 Mar 2004:
+ [Pragma]
+ - Added the default theme (useful to restore the default settings) to the distro
+ - Some bug-fixes and cleanups in the theme engine
+ - Added the themes section on www.kvirc.net and placed the first Marble theme by Sbrokka on ftp.kvirc.net
+ - Adjusted the menubar to dynamically setup the popup menus (it reloads the icons etc..)
+ - Fixed a crash in ctcp action
+ - Added the option to flash the KVirc's taskbar entry when new messages arrive in a query and KVIrc is
+ not the active application. Works only with KDE support and on Windows for now.
+ - Added the special "all" parameter to $active to return the application active window
+ - Forced eval to use the calling variable scope: in this way local variables can be passed too
+ - Fixed a bug in the servers dialog "recent servers" popup: now it finds the correct entry also
+ when two servers with the same name but different port are present
+ - Added the exporting of aliases to external files (single aliases and the whole alias set).
+ - Fixed the popup tester in the popupeditor: now it works again (it was totally disappeared :)
+ - Misc hacks that I can't remember...
+
+25 Mar 2004:
+ [Pragma]
+ - Code cleanups all around
+ - Updated various docs for the upcoming release
+ - Removed the obsoleted _c2q stuff and --with-local-8bit option
+ - Changed the close/maximize/restore/minimize icons to black ones: they look better
+ - Added a heap mess windows workaround class
+ - Re-implemented the shared files editing (still missing some code)
+
+24 Mar 2004:
+ [Trisk]
+ - Various input editor fixes.
+ - CTCP parser improved.
+ - Updated default script.
+ - Options dialog fixes.
+
+21 Mar 2004:
+ [Trisk]
+ - Many, many more options dialog changes.
+
+20 Mar 2004:
+ [Pragma]
+ - Added several window.* functions
+ - Redirected /whois output to the active window
+ - Options dialog fixes
+ - Added scripting toolbar
+ - Cleaned up some documentation and forced gendoc.pl to ignore the new kvs docs that are not "hardwired" yet
+ - Added some graphics for the final 3.0.0 release
+ - Added a couple of keyboard shortcuts (all described in doc_keyboard.html)
+
+20 Mar 2004:
+ [Trisk]
+ - Some parsing of 005/RPL_ISUPPORT added. Uses PREFIX and and CHANTYPES.
+
+18 Mar 2004:
+ [Trisk]
+ - KviUserListView API change: set[beI]Entries -> setMaskEntries().
+ - KviUserListView minimum width is 100px (due to continuing annoyance of
+ mode editor resizing the thing... not a good solution, but whatever).
+ - Lots of options dialog changes.
+ - Classic taskbar now limits number of rows (when horizontal).
+ - KviChannel API change: banMask(), etc. removed in favour of setMask().
+ - Mask editor requests new list when opened after a mode change.
+ * Fixes problem with CR ircd where -b messages may not match bans in list due to stupid inconsistent hostmasking.
+
+12 Mar 2004:
+ [Trisk]
+ - Auto-reconnect attempts are now counted, delay configurable.
+ * FIXME: Make it possible to stop the reconnect timer before it triggers.
+ - Several huge if() conditions replaced with switch() statements.
+ - Various minor issues fixed.
+
+07 Mar 2004:
+ [Trisk]
+ - Improved script editor cursor location tracking and configuration dialog.
+ - Input widget clean-ups, global input history fixed.
+
+03 Mar 2004:
+ [Pragma]
+ - Some work on the options dialog: moved some options to more appropriate places,
+ rearranged some options widget orders, fixed descriptions etc..
+ - Fix for OnChannelNotice not passing the target argument
+ - More misc hacks that I can't remember :)
+
+02 Mar 2004:
+ [Pragma]
+ - Added OnQueryWindowRequest to catch and block the query window creation events.
+ - Added OnQueryTargetAdded
+ - Corrected a lot of bugs reported on bugtrack.kvirc.omnikron.net
+ - Corrected the $mask.nick() problem
+ - Removed the $ic warning when there was no current IRC context
+ - Moved the server database to unicode
+ - Misc hacks that I can't remember :D
+
+28 Feb 2004:
+ [Pragma]
+ - Fixed the "keep channels open on kick" crash
+ - Probably fixed a sort of a race condition based crash between
+ the socket and the console
+ - More fiddling with KVS events
+
+24 Feb 2004:
+ [Pragma]
+ - Yet more work on the KVS engine: events this time
+ - Temporairly removed the "force last server" hack since it was breaking the
+ servers dialog: one couldn't select a different server to connect to.
+ This is commented out until we find a more strict activation condition.
+ - Activated the $sw function, this time for real :)
+
+20 Feb 2004:
+ [Trisk]
+ Added $date function for formatted time strings.
+
+18 Feb 2004:
+ [Trisk]
+ - Added "all" target for $me and $server functions.
+ - Fixed possible $mask() problem, not sure why Pragma removed '*' from
+ *user. Behaviour should be consistent with docs now.
+ - Cleaned up channel prefix and nick mode prefix (considers invalid chars
+ in nick to be a mode prefix).
+ * Closes ID 200402112009267112
+ * Somebody needs to update the bugtracker...
+
+14-17 Feb 2004:
+ [Pragma]
+ - Rewritten the script editor widget to use QTextEdit. Dropped
+ the whole internal editor since it was not unicode and simply
+ too huge for the feature it provided.
+ - Modularized and cleaned up the localisation of the editor module
+ - More work on KVS engine, module interface nearly estabilished
+ - Added support for changing the order of option items in the
+ options dialog tree display. Most common options should go at the top.
+ - Random fixes around :)
+
+14 Feb 2004:
+ [Trisk]
+ - Changed 005 numeric parser output a bit, fixes issues with skipping to
+ last word of messages.
+ * /me hugs Aeri ;)
+ - Removed check for KviProperty_FocusOwner.
+
+09 Feb 2004:
+ [Juanjo]
+ - Fixed a miscompilation --without-info-tips
+ - Added the lag to the irc context indicator tooltip.
+ - Make the irc context indicator a little bigger (but the correct way
+ would be to make it resize itself depending on the inside text size).
+
+06 Feb 2004:
+ [Pragma]
+ - More work on the KVS engine
+ - Added the IrcContextToolbar to the toolbars menu, now it can be hidden
+ should the TaskBar be there too ?
+ - Moved the TaskBar to be a toolbar like the other ones (and
+ thus inherit the toolbars menu on right click etc...)
+
+05 Feb 2004:
+ [istari]
+ - reformating ChangeLog
+ * please use current schema
+ * break lines after 80 chars
+ - intserting ChangeLog into website
+
+23 Jan 2004:
+ [Pragma]
+ - More work on the KVS engine : popups almost ready
+ - Fixed a regusers bug that didn't allow to register channels with a '@'
+ character in it
+ - More windows port: kvilib, kvirc and several modules are already working
+ - Fixed an expression parser bug related to string/number comparisons
+ - Added $sw() function for switch handling in aliases
+
+20 Jan 2004:
+ [Trisk]
+ - Dock icon menu bug fixed, new entries added.
+ * Problem with switching to console on frame window restore still present,
+ Pragma: Please fix
+ - Input right-click menu shows shortcut keys.
+
+19 Jan 2004:
+ [Trisk]
+ - Adding multiple servers wtih the same hostname (different port) works.
+
+17 Jan 2004:
+ [Trisk]
+ - Fixed some more encoding issues.
+ - mkprocinstances.sh doesn't use zsh/bash-specific variable arrays now.
+
+15 Jan 2004:
+ [Trisk]
+ * PragmaOff's been idle for a long time. =\
+ - Made logfiles lowercase (helps sorting, if any issues contact me).
+ - Made channel and query windows's default logfile contain network name
+ instead of console #... makes more sense.
+ - Massive server parser changes to ensure text is converted to current
+ encoding (fixes issues displaying ISO 8859-1 extended ascii (127+) text).
+ - Changed all %d d %d h %d m %d s to %dd %dh %dm %ds.
+
+09 Jan 2004:
+ [Trisk]
+ - Lots of notify list message changes.
+
+08 Jan 2004:
+ [Trisk]
+ - More widget width problems fixed (presumably).
+ - WHO reply is more informative now.
+ - Shortened some taskbar button captions.
+ - KviConsole::createQuery() tries to prevent duplicate single-target queries.
+
+06 Jan 2003:
+ [Pragma]
+ - More work on the new KVS engine
+ - Added a -nosplash commandline argument to avoid showing the splash screen
+ - Reverted the kvi_activitymeter.png icon: the bars should eventually grow
+ from left to right (in the image) instead of top to bottom.
+ - Re-added $window to kvi_kvs_corefunctions_sz.cpp : it's the new parser
+ version and it will replace the old parser's version in the near future.
+ If you want to test the new parser capabilities then run the commands
+ by preceding them with a dash:
+ /- echo "This is the new parser's version of echo"
+ /- echo $window this is the new parser's version of echo \$window
+ ...
+ - Added four ways of painting the user list view grid. It is user selectable
+ now.
+ Please tell me which is the best one (to choose the default)
+
+04 Jan 2004:
+ [Trisk]
+ - Removed duplicate of $window from KviKvsCoreFunctions
+ (kvi_kvs_corefunctions_sz.cpp), original is in the uparser...
+ - Fixed all the "Jan 2003" dates in the ChangeLog. =)
+ - Fixed KviStringSelector etc. width problem.
+
+03 Jan 2004:
+ [Trisk]
+ - New images, help browser uses Bluecurve ones (temporarily).
+ - Taskbar now displays same number of buttons per row.
+ - Various spacing changes to selectors again.
+ - Fixes to identity dialog.
+ * For some reason, the 4th nickname stays blank... not sure why.
+ - Various QFrame::Panel -> QFrame::StyledPanel.
+ - Dead channels unset limit and key too.
+ - Window list shows same name for dead channels and queries.
+
+02 Jan 2004:
+ [Pragma]
+ - Solaris Forte 7 port (still needs hacking to compile and run flawlessly)
+ - Fix for Solaris dns resolver
+ - More work on the new KVS engine
+ - stdarg.h wrapper to accomodate ugly compilers
+
+01 Jan 2004:
+ [Trisk]
+ - Dotted line drawn next to nick/avatar in nicklist instead.
+ - Changed IP addy editor widget to properly accept '.' and ':'.
+ - Redid identity config dialog.
+
+New Years Eve, 2003:
+ [Trisk]
+ - Draw separator lines above and below avatar and nick.
+ - Join channels dialog cleanup.
+ - Dock widget minor header changes.
+
+30 Dec 2003:
+ [Trisk]
+ - Cleaned up some options dialog stuff.
+ - Added $version function.
+
+ [Pragma]
+ - HTTP avatar option support
+ - More unicode porting all around
+ - Windows port (kvirc and kvilib projects nearly working)
+
+29 Dec 2003:
+ [Trisk]
+ - Fixed problem with toolbar options dialog command.
+ - Changed ident, proxy, SSL, and transport options pages to use QGroupBox to
+ organise options. Maybe add add*SelectorToGroupBox functions later.
+
+28 Dec 2003:
+ [Trisk]
+ - More new toolbar icons, currently using Bluecurve/Crystal mix.
+ - Recent channel, server, and nickname list removes duplicates even if case
+ differs.
+
+27 Dec 2003:
+ [Trisk]
+ - Possible fix for crash if m_pConnectionInfo->szNickName is not set when
+ server disconnects the client (before login).
+ - Sets AsyncServerCommand on disconnect only if nonexistant; /SERVER works
+ now (sorry about that, Pragma).
+ - New Connect/Connecting/Disconnected icons.
+ - Removed border from channel state and mode icons in user list view and
+ lined up icons with text when avatar is used.
+
+ [Pragma]
+ - Added avatar caching
+ - Reworked the code that remembers the last irc server connected in each
+ console now it doesn't break the servers dialog.
+ After the commit I've discovered that it collided with the Trisk's solution:
+ merged the two solutions in something yet better.
+ - Obscure internals: reworked KviIrcMask interface a bit...
+ still needs QString porting
+ - Written a ChangeLog entry after months of "hidden changes" :D
+
+Christmas Eve (Western Hemisphere) 2003:
+ [Trisk]
+ - Modified window tooltips a bit...
+ - Unset channel mode for dead channels
+ - Fixed (hopefully) crash on closing dead channels if disconnected.
+ - Remove src/kvirc/kvs/moc_kvi_kvs_object.cpp from repository.
+ * Merry Christmas everyone! =)
+
+21 Dec 2003:
+ [Trisk]
+ - Output correct message when RPL_CHANNELMODEIS is used for user modes.
+ - URL highlighting matches only if followed by char greater than 46.
+ - Selected text includes control codes (this is a bit of a hack, gets them
+ from block attributes). Shift-select strips codes from the selection.
+ - Consoles remember last nick (correctly now).
+ - PART, TOPIC, and MODE messages will use current channel if no argument.
+ KICK will send proper command if no reason specified.
+ - Non-query notices and privmsgs go to active window if it is a common
+ channel, else to first common channel.
+
+16 Dec 2003:
+ [Trisk]
+ - GRAMMAR FIXES EVERYWHERE
+ * Breaks translations!
+ * Breaks stats program log parsers too (pisg)
+ - Cleaned up gendocs.pl link names.
+ - Rearranged menubar to conform to KDE style standard.
+ - Edit menus and buttons for "Book Title" style, changed some item names.
+ * PLEASE FELLOW THE KDE STYLE STANDARD, it looks better and is less confusing
+ - Made KviUIntSelector use QSpinBox instead of QLineEdit (again).
+ - Added uop/userop (+u) support. Currently uses +h icon, will change later.
+ - Removed many hardcoded font references.
+ - Made logfiles rotate at midnight to update date.
+ * Put timer in KviTimerManager for lack of a better place, somebody check
+ that this is correct, please...
+ - Changed tree window list to show server name for consoles of console caption
+ (too long to view). Set bold font for consoles.
+ - Fixed channel name showing up twice on part when no message is specified
+ - Made external messages (whois info, server notices, etc.) go to console by
+ default, added option ExternalMessagesToActiveWindow to override this.
+ - Also fixed opnotice (NOTICE @#chan) and made non-query private notices and
+ privmsg go to common channel.
+ - Replaced CPPFLAGS in all Makefile.am with AM_CPPFLAGS.
+ - Made channels missing request mask list when mask list editor is opened.
+ - Changed KviIrcMask::getHostDomainMaskPtr() to strip only first part of host;
+ user@x.y.z.tld.cc returns user@*.y.z.tld.cc, not user@*.tld.cc - much
+ more specific bans, same as getIpDomainMaskLen().
+ * This code was already there, but commented out - why?
+ - Made console windows remember last server and nickname.
+
+21 Oct 2003:
+ [Crissi]
+ - 'Always highlight messages with my nick on them' added: Check
+ irc::output::highlight tab on options.
+ - 'Hightlight only at normal msg' added: Check irc::output::highlight
+ tab on options.
+ - 'Highlight at highlight msg too' added: Check irc::output::highlight
+ tab on options.
+ - 'Highlight at query msg too' added: Check irc::output::highlight
+ tab on options.
+ - 'Highlight only at costum alert level reached' added: Check
+ irc::output::highlight tab on options.
+ - Translation updated
+ - 'Old Tools' menu moved into 'Tools' menu.
+ - convert all source files to unix line end because bug in gettext for
+ extracting strings from window lineend
+
+
+12 Oct 2003:
+ [Crissi]
+ - auto connect of servers after succuessful KVirc startup. Look into advanced
+ server info, connection tab.
+ For each server you can specify if should autoconnect.
+
+11 Oct 2003:
+ [Crissi]
+ - Channels can now stored for each server and then auto join them if
+ successfully connected to the server. Look into advanced server info,
+ 'After login join channels' tab. Simply check the channels (from history)
+ you want to join. Also you can add a new channel (current bug: after
+ adding close/reopen the dialog for showing new channel in list).
+ - Minimize console after successful login. Look into Preferences - Options -
+ Connection.
+
+12 Aug 2003:
+ [Crissi]
+ - 'Minimize all windows' and 'Restore all windows' added. Check Menu -
+ Window and window action toolbar.
+
+01 Aug 2003:
+ [Juanjo]
+ - I'm back, ahhh nothing like vacations to do some free software ;)
+ - The channel completion will also complete on the list of recent channels.
+ - New server completion, if the first four letters of something written on
+ the input are "irc." it will try to complete on the list of recent servers.
+
+18 Apr 2003:
+ [Crissi]
+ - exec module added. Check kvirccvs/modules/exec/README for more info.
+
+26 Mar 2003:
+ [Crissi]
+ - GUI option 'Use taskbar activity meter' added.
+ - GUI option 'Disable ban list request on join' added.
+ - GUI option 'Disable ban exception list request on join' added.
+ - GUI option 'Disable invite list request on join' added.
+ - GUI option 'Use taskbar activity meter' added.
+ - Translation extract script fixed
+ - Translations and translation template updated.
+ - Some comments in kvi_options.h added.
+
+26 Mar 2003:
+ [Pragma]
+ - Option 'Use taskbar activity meter' added.
+
+28 Feb 2003:
+ [Crissi]
+ - The width of the taskbar entries is now custoumizable.
+ - GUI option 'Minimal width of taskbar buttons' added.
+
+25 Feb 2003:
+ [Istari]
+ - Moved to the new CVS machine
+
+25 Feb 2003:
+ [Crissi]
+ - GUI options for symbols on taskbar and disabling global who added.
+ - Try to show emoticons with start not with : correctly (not from me...)...
+ tell me if you got problems with this...
+
+25 Feb 2003:
+ [Pragma]
+ - Option for disabling icons in taskbar added.
+
+21 Feb 2003:
+ [Crissi]
+ - Fixed text on first setup page, Translation possibility for buttons in
+ wizard added.
+
+20 Feb 2003:
+ [Pragma]
+ - Auto-resume transfers when auto-accepted (also GUI option) added.
+
+19 Feb 2003:
+ [Crissi]
+ - Password field for server shows now only stars instead not plain password.
+
+18 Feb 2003:
+ [Crissi]
+ - Size of toolbar icon fixed. Right size s now selected if toolbar size if
+ changed.
+
+18 Feb 2003:
+ [Pragma]
+ - Support for broken filename RESUME requests (mIrc's file.ext) added.
+
+15 Feb 2003:
+ [Crissi]
+ - $mp3player.getmp3tag_album added => get the album
+
+12 Feb 2003:
+ [Crissi]
+ - The mp3player module now supports reading of mp3 tags.
+ - New commands are:
+ - $mp3player.getmp3tag_artist => get the artist
+ - $mp3player.getmp3tag_comment => get the comment
+ - $mp3player.getmp3tag_copright => get the copyright
+ - $mp3player.getmp3tag_crc =) get the crc
+ - $mp3player.getmp3tag_date => get the year
+ - $mp3player.getmp3tag_emphasis => get the emphasis
+ - $mp3player.getmp3tag_genre => get the genre
+ - $mp3player.getmp3tag_layer => get the MPEG layer
+ - $mp3player.getmp3tag_original => get the orginal flag
+ - $mp3player.getmp3tag_title => get the title
+ - $mp3player.getmp3tag_tracknumber => get the track number
+ - $mp3player.getmp3tag_version => get MPEG version
+ - A example script was added (kvirccvs/kvirc/doc/scriptexamples/mp3info.kvs)
+
+4 November 2002:
+ [Juanjo]
+ - Added widgets to the identity an server dialogs to set a default user mode
+ after a conexion to the server.
+
+24 Oct 2002:
+ [Juanjo]
+ - Reworked a little the Tools menu.
+ - Spanish translation updates (only 1000 translations to go, hehe).
+
+19 Oct 2002:
+ [Juanjo]
+ - Added the alias 'lag' to the default script (it just returns the lag
+ using $lag.lag()).
+ - Added the event 'OnLagCheck' that get triggered every time there is a
+ new lag data. This should help scripters to write their own lagmeters
+ without having to poll KVIrc.
+ - Added an option to display the lag on the IRC context indicator, making
+ all those changes actually useful for the final user :)
+
+18 Oct 2002:
+ [Juanjo]
+ - Added a new (and very simple) Lagmeter (see the new 'lag' module
+ commands and functions), the 'Lag Options' dialog in the options/irc
+ window and the 'OnLagAlarmTimeUp' and 'OnLagAlarmTimeDown' events. I'll
+ add an applet displaying the lag to the lag module as soon as I figure
+ how to do it :)
+ - Added the OnPong event.
+ - Fixed bug 200210130200522026
+
+
+10 Oct 2002:
+ [Juanjo]
+ - I'm back, prepare your debuggers
+ - Added a 'Ignore' menu to the userlist users menu.
+ - New feature: User highlights (argh, I hate that word). Just update your
+ default.kvs and right-click on a user to see how it works. Very
+ usefull on very crowded channels with lots of parallel conversations
+ running and you trying to keep track of one (hello #debian). Also
+ added the pertinent commands on the module tmphighlight.
+ - The 'clear' command now also clears the message view on channels.
+
+06-24 Jun 2002:
+ [Pragma]
+ - Pre-release fixes all around
+ - SSL stuff..
+ - About dialog
+ - Fixes for KviIrcView
+ - Windows porting
+ - uh... I forgot all the things I did :D
+
+29 May - 06 Jun 2002:
+ [Pragma]
+ - More SSL support
+ - A lot of bugfixes (see bugtrack.kvirc.omnikron.net)
+ - Arrays support in the whole user parser (uh...this was huge , but
+ necessary) a huge set of functions has been moved to the new array
+ interface WARNING: the dictionaries have a new syntax now! %dict{key}
+ %something[id] is now reserved to arrays (with numeric id).[br]
+ - FOR command added
+ - Updated all the example scripts to support the new syntax
+
+23-28 May 2002:
+ [Pragma]
+ - Preliminary SSL support (try /server -s)
+ - Fix for the messed default.kvs (dialog problem)
+ - A lot of mem-leaks catched with valgdind
+ - Various fixes
+
+22 May 2002:
+ [Pragma]
+ - KDE Terminal window fix
+ - Some new icons
+
+21 May 2002:
+ [Juanjo]
+ - Using Pragma's support for text icons, added the option to substitute
+ some icons (currently ':)', ':D', ':-)', ':-D' and ':-O') in the irc view
+ (Options -> Look & Feel -> Irc View). Still not finished.
+
+18-21 May 2002:
+ [Pragma]
+ - More fixes for windoze
+ - Some reguser hacks
+ - Command, channel, function and directory completion in the input widget
+ - Various thingies all around
+ - CTCP Page support (partial for now , need some more options)
+
+7-17 May 2002:
+ [Pragma]
+ - Tons of fixes for windoze
+ - More modules ported to windoze (snd, dockwidget)
+ - Text icons initial implementation (try CTRL+I and have fun :)
+ - On*Created and OnWindowActivated are now called in the correct order
+ - Various thingies all around
+
+6 May 2002:
+ [Juanjo]
+ - spaste module completed (spaste.setdelay,spaste.list,spaste.stop,etc)
+ - Workaround for the tooltips-following-desktops problem (close tooltips
+ on input widget keyevent).
+
+1-6 May 2002:
+ [Pragma]
+ - Fixes for Solaris compilation: thanks to Kenneth Larea for the hints :)
+ - Random fixes for make dist
+ - Support for anti-flood on CTCP DCC *
+ - Failed DCC Handshakes are now optionally reported to the sender with a
+ CTCP ERRMSG. The options in the dialog are still missing
+ - Fixes for the "bad console repainting" problem
+ - es.po charset fixed
+ - Added sr.po (thnx Prethorian :)
+ - Added auto-windows-tiling feature to the MDI manager
+ - Other cleanups here and there...
+
+27 Apr 2002:
+ [Juanjo]
+ - New module 'spaste' to send text slowly to a conversation window.
+ - New option for the input widget right button men in conversation
+ windows: 'Paste (slowly)'.
+
+25 Apr 2002:
+ [Juanjo]
+ - Now the log viewer can be also a MDI window
+ - Log viewer listview icons
+
+21 Apr 2002:
+ [Juanjo]
+ - snd module
+
+1-12 Apr 2002:
+ [Pragma]
+ - Minor fixes around
+ - Fix for the KDE style toolbars
+ - Fixes for the liquid KDE theme (transparency).
+ not everything works... some label stuff must be fixed in the theme
+ engine...
+ - Query user list view invisible by default (also saved in the window state)
+ - Same for the channel double view
+ - Removed /tbutton and /wbutton and added generic /button and /buttonctl
+ instead updated the example scripts accordingly
+ - Merged the libtool update patch and added more fixes for this
+ - Fixes for --with-local-8bit compilation
+ - Added kvi_list.h and the compatibility KviPtrList defines to work both
+ with qt2 and qt3
+
+31 Mar 2002:
+ [Pragma]
+ - Mini-Fixes for the snd module (threading arguments) for gcc 3.0.0
+ - Mini-fix for libaudiofile check in configure
+ - More work on window position saving
+ - More work on the offer list window stuff.
+ - General fixes for gcc 3.0.0 (can anybody test it ?)
+
+30 Mar 2002:
+ [Pragma]
+ - Added the beginning of the offer list window
+ - Preliminary window properties saving... now handling defaults too
+ - Minor utility-functions in the window popup menus
+ - Preliminary rearrangements of code for KviConsole.... the header is
+ becoming a mess need to order the code syntactically and then maybe extract
+ some code to be put in external classes. KviIrcConnection could be an idea.
+ - Beginning of code for the toolbar button management... need a module ?
+
+29 Mar 2002:
+ [Pragma]
+ - Will I ever start to use this ChangeLog ? :D
+
+7 Mar 2002:
+ [Juanjo]
+ - kvisounds script, the sound on OnMeNamed event is usefull, really ;)
+
+28 Feb 2002:
+ [Juanjo]
+ - Pragma branded str module optimizations, docs for all the implemented
+ functions.
+
+26 Feb 2002:
+ [Juanjo]
+ - More str functions, removed strFindFirst for str.findfirst and updated
+ the scripts using it (UPDATE YOUR SCRIPTS!!!)
+
+21 Feb 2002:
+ [Juanjo]
+ - More str functions (still no docs)
+
+19 Feb 2002:
+ [Juanjo]
+ - Some new functions in the str module
+
+13 Feb 2002:
+ [Juanjo]
+ - /IGNORE && /UNIGNORE support
+ BTW the other guys are also making things, they just don't update the
+ Changelog :P
+
+10 Feb 2002:
+ [Juanjo]
+ - $isOp() $isMeVoice() $isVoice() $isMeHalfOp() and $isHalfOp() added
+
+9 Feb 2002:
+ [Juanjo]
+ - New log viewer module (logview.open)
+ - Fix for the editor not saving his options
+
+4 Feb 2002:
+ [Juanjo]
+ - Fixes so pragma could add --with-qt-embedded to compile againt Qt Embedded
+ (wow!)
+ - Get rid of the 'commit' and 'discard' buttons on the user editor; now
+ all changes are synced with the local db.
+
+25 Jan 2002:
+ [Juanjo]
+ - New notify list editor
+
+21 Jan 2002:
+ [Juanjo]
+ - New identity button on the toolbar, posibility to change nick from the
+ identity dialog if we're connected and es.po work
+
+20 Jan 2002:
+ [Juanjo]
+ - Added the config widget for the create query on server notice option.
+ - Events and events doc: OnDCCChatConnected, OnDCCChatMessage,
+ OnDCCSendTransferComplete, OnDCCGetTransferComplete, OnCTCPFlood,
+ OnServerNotice, OnChannelNotice...
+
+19 Jan 2002:
+ [Juanjo]
+ - Added a 'close after join' checkbox to the join channels dialog & fixes.
+
+18 Jan 2002:
+ [Juanjo]
+ - Added OnAction event
+ - Fixes
+
+17 Jan 2002:
+ [balboy]
+ - updated po file
+ - anti idle script changed... but pragma's syntax he gave me is not working
+ yet :p
+
+ [Juanjo, which is alive]
+ - Added the 'recent servers' Qlist to the servers dialog
+ - Added the 'Show after connecting to server' checkbox to the channelsjoin
+ widget
+ - Servers widget bug fixed
+ - Default nick link actions & men
+ - Config widget for the tree-taskbar minimum? width option
+
+07 Jan 2002:
+ [balboy]
+ - minor changes to the default script
+
+05 Jan 2002:
+ [balboy]
+ - anti idle script added
+ - dcc bug alias fixed
+
+22 Nov 2001:
+ [Juanjo]
+ - Added a bunch of events (On[me]ban/deban, On[me]op/deop,
+ On[me]voice/devoice, OnChannelMessage, OnQueryMessage, OnLimitSet/Unset,
+ OnKeySet/Unset, OnInvite, On[me]BanException, On[me]BanExceptionRemove,
+ etc).
+
+18 Nov 2001:
+ [Juanjo]
+ - Added a 'Connect to servers' dialog (serversjoin.open) -> update:
+ serversconnec.open
+ - Added scripted buttons for the channels and servers dialogs.
+ - Added $anyConsoleConnected() function.
+ - Fixes
+
+12 Nov 2001:
+ [YaP]
+ - Added DCC user defined port range
+
+10 Nov 2001:
+ [Juanjo]
+ - Now it has all the functionality ;)
+
+ [YaP]
+ - IPv6 porting from Win XP to Win 2000 (Preprocessor definition: WIN2K)
+
+8 Nov 2001:
+ [Juanjo]
+ - Added a 'Join Channels' widget. It still don't have all the
+ funcionality.
+
+4 Nov 2001:
+ [Juanjo]
+ - Improved away system
+ - Option to always highlight own nick on messages
+ - Made the splash screen a managed window
+ - Added an 'apply' button to the general options dialog
+
+24 Sep 2001:
+ [Kristoff]
+ - Made Dcc Voice completely configurable, options dialog also added
+ - Volume slider for dcc voice added
+ - Fixed a bug in alt+arrows switching (sigsegv when window had no context
+ assigned)
+
+23 Sep 2001:
+ [Kristoff]
+ - Switching between windows using ctrl/alt + arrows
+
+13 Sep 2001:
+ [Balboy]
+ - some more changes to the defscript
+
+12 Sep 2001:
+ [Kristoff]
+ - Text selected in Help Browser window is now automagically copied into the
+ clipboard and can be pasted (Balboy's request).
+ - Pressing Enter in Help Browser's lineedit starts search. When the search
+ starts the cursor changes into waitCursor (cosmetical improvement :))
+ - 22 Mar - 12 Sep... man...
+ - biff module added - not functional at all - adding some code not to mess
+ with makefiles anymore
+
+12 Sep 2001:
+ [Balboy]
+ - updated the changelog :p
+ - added some functions to the defscript
+
+30 Mar 2001:
+ [Balboy]
+ - quit function added
+
+22 Mar 2001:
+ [Kristoff]
+ - combobox object added
+
+17 Mar 2001:
+ [Pragma]:
+ - A lot of unreported changes again
+ - Added anti-aliased font support
+
+17 Feb 2001:
+ [Pragma]
+ - A lot of changes: removed the libkvigui, it was rather useless, and it is
+ better to have all the GUI code into the core executable...(for many
+ reasons).
+ - Added the first "shy" icq module.
+
+15 Feb 2001:
+ [Kristoff]
+ - Added urllabel object
+ Note: I'm proud to be the first person, that uses this file in the
+ year 2001 :-)
+
+05 Dec 2000:
+ [Number1]
+ - Cleaned up the about dialog, added some new entries and fixed the
+ background bug.
+ Note: Could people start using this log again please? ;)
+
+12 Sep 2000:
+ [Kristoff]
+ - started this ChangeLog (to avoid confusion: newset entries go above
+ this one ;))
+ - added widget object
diff --git a/Makefile.am b/Makefile.am
index 5a7ff74b3..2be1557c5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -51,6 +51,7 @@ messages:
cd $(topdir)/po/modules/perl && make messages
cd $(topdir)/po/modules/perlcore && make messages
cd $(topdir)/po/modules/sharedfileswindow && make messages
+ cd $(topdir)/po/modules/theme && make messages
###############################################################################
# Generate documentation
diff --git a/configure.in b/configure.in
index b704022f1..a9ac77a24 100755
--- a/configure.in
+++ b/configure.in
@@ -158,6 +158,7 @@ AC_OUTPUT( \
po/modules/perl/Makefile \
po/modules/perlcore/Makefile \
po/modules/sharedfileswindow/Makefile \
+ po/modules/theme/Makefile \
scripts/Makefile \
scripts/browser/Makefile \
scripts/config/Makefile \
@@ -246,6 +247,7 @@ AC_OUTPUT( \
src/modules/system/Makefile \
src/modules/term/Makefile \
src/modules/texticons/Makefile \
+ src/modules/theme/Makefile \
src/modules/tip/Makefile \
src/modules/tmphighlight/Makefile \
src/modules/toolbar/Makefile \
diff --git a/data/pics/coresmall/kcs_theme.png b/data/pics/coresmall/kcs_theme.png
new file mode 100644
index 000000000..3afbfcd0c
--- /dev/null
+++ b/data/pics/coresmall/kcs_theme.png
Binary files differ
diff --git a/data/pics/coresmall/kcs_themes.png b/data/pics/coresmall/kcs_themes.png
new file mode 100644
index 000000000..b54c1d06b
--- /dev/null
+++ b/data/pics/coresmall/kcs_themes.png
Binary files differ
diff --git a/data/pics/kvi_bigicon_pack.png b/data/pics/kvi_bigicon_pack.png
new file mode 100644
index 000000000..0ff6bed99
--- /dev/null
+++ b/data/pics/kvi_bigicon_pack.png
Binary files differ
diff --git a/data/pics/kvi_bigicon_themes.png b/data/pics/kvi_bigicon_themes.png
new file mode 100644
index 000000000..9c945fd51
--- /dev/null
+++ b/data/pics/kvi_bigicon_themes.png
Binary files differ
diff --git a/po/modules/Makefile.am b/po/modules/Makefile.am
index d114d5298..b26f78480 100644
--- a/po/modules/Makefile.am
+++ b/po/modules/Makefile.am
@@ -9,4 +9,5 @@ SUBDIRS = about \
options \
perl \
perlcore \
- sharedfileswindow
+ sharedfileswindow \
+ theme
diff --git a/po/modules/theme/.svnignore b/po/modules/theme/.svnignore
new file mode 100644
index 000000000..567a836b3
--- /dev/null
+++ b/po/modules/theme/.svnignore
@@ -0,0 +1,6 @@
+*.mo
+Makefile.in
+Makefile
+*.pot
+.pics
+.xvpics \ No newline at end of file
diff --git a/po/modules/theme/Makefile b/po/modules/theme/Makefile
new file mode 100644
index 000000000..c6d775f3c
--- /dev/null
+++ b/po/modules/theme/Makefile
@@ -0,0 +1,437 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# po/modules/theme/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+###############################################################################
+# KVirc IRC client Makefile - 18.09.99 Szymon Stefanek <pragma at kvirc dot net>
+###############################################################################
+
+srcdir = .
+top_srcdir = ../../..
+
+pkgdatadir = $(datadir)/kvirc
+pkglibdir = $(libdir)/kvirc
+pkgincludedir = $(includedir)/kvirc
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+target_triplet = x86_64-unknown-linux-gnu
+subdir = po/modules/theme
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(tmpdir)"
+tmpDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(tmp_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/missing --run tar
+AR = ar
+AUTOCONF = ${SHELL} /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/missing --run autoconf
+AUTOHEADER = ${SHELL} /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/missing --run autoheader
+AUTOMAKE = ${SHELL} /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPP = gcc -E
+CPPFLAGS =
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS = -g
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO = echo
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EGREP = grep -E
+EXEEXT =
+F77 =
+FFLAGS =
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LN_S = ln -s
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/missing --run makeinfo
+OBJEXT = o
+PACKAGE = kvirc
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+RANLIB = ranlib
+SET_MAKE =
+SHELL = /bin/sh
+SS_CPPFLAGS = -D_REENTRANT -DREENTRANT
+SS_INCDIRS = -I/usr/qt/3/include -I/usr/include -I/usr/include -I/usr/kde/3.5/include
+SS_LDFLAGS = -lSM -lICE -L/usr/lib64
+SS_LIBDIRS = -L/usr/build/svn.kvirc.de/svn/trunk/kvirc/src/kvilib/build/ -L/usr/qt/3/lib -L/usr/lib64 -L/usr/kde/3.5/lib
+SS_LIBLINK = -lkdecore -lkdeui -lkparts -lqt-mt -lX11 -lXext -lpthread -lssl -lcrypto -lesd -laudiofile -lm -ldl -lz -lXss
+SS_MSGFMT = /usr/bin/msgfmt
+SS_PERL_BINARY = /usr/bin/perl
+SS_PERL_CCFLAGS = -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -fno-strict-aliasing -pipe -Wdeclaration-after-statement -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE
+SS_PERL_LDFLAGS = -rdynamic -L/usr/local/lib64 /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/DynaLoader/DynaLoader.a -L/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE -lperl -lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
+SS_QT_MOC = /usr/qt/3/bin/moc
+SS_RPATH = -rpath /usr/qt/3/lib -rpath ${exec_prefix}/lib -rpath /usr/lib64 -rpath /usr/kde/3.5/lib
+SS_TOPSRCDIR = /usr/build/svn.kvirc.de/svn/trunk/kvirc
+STRIP = strip
+VERSION = 3.2.5
+X_CFLAGS =
+X_EXTRA_LIBS =
+X_LIBS = -L/usr/lib64
+X_PRE_LIBS = -lSM -lICE
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_F77 =
+ac_ct_RANLIB = ranlib
+ac_ct_STRIP = strip
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE =
+am__fastdepCXX_FALSE = #
+am__fastdepCXX_TRUE =
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+applnkdir = /usr/kde/3.5/./share/applnk/Internet
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias =
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+configdir = ${globalkvircdir}/config
+configmodulesdir = ${globalkvircdir}/config/modules
+datadir = ${prefix}/share
+defscriptdir = ${globalkvircdir}/defscript
+exec_prefix = ${prefix}
+globalkvircdir = ${datadir}/kvirc/3.2
+headersdir = ${exec_prefix}/include/kvirc/3.2.5
+helpdir = ${globalkvircdir}/help/en
+host = x86_64-unknown-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+iconapps16datadir = /usr/kde/3.5/./share/icons/hicolor/16x16/apps
+iconapps32datadir = /usr/kde/3.5/./share/icons/hicolor/32x32/apps
+iconapps48datadir = /usr/kde/3.5/./share/icons/hicolor/48x48/apps
+iconapps64datadir = /usr/kde/3.5/./share/icons/hicolor/64x64/apps
+iconmime16datadir = /usr/kde/3.5/./share/icons/hicolor/16x16/mimetypes
+iconmime32datadir = /usr/kde/3.5/./share/icons/hicolor/32x32/mimetypes
+iconmime48datadir = /usr/kde/3.5/./share/icons/hicolor/48x48/mimetypes
+iconmime64datadir = /usr/kde/3.5/./share/icons/hicolor/64x64/mimetypes
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /usr/build/svn.kvirc.de/svn/trunk/kvirc/admin/install-sh
+kdeservicesdir = /usr/kde/3.5/share/services
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+licensedir = ${globalkvircdir}/license
+localedir = ${globalkvircdir}/locale
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mimelnkdir = /usr/kde/3.5/./share/mimelnk/text
+mkdir_p = mkdir -p --
+modulelibdir = ${globalkvircdir}/modules
+msgcolorsdir = ${globalkvircdir}/msgcolors
+oldincludedir = /usr/include
+picsdir = ${globalkvircdir}/pics
+pluglibdir = ${globalkvircdir}/modules
+prefix = /usr/local
+program_transform_name = s,x,x,
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target = x86_64-unknown-linux-gnu
+target_alias =
+target_cpu = x86_64
+target_os = linux-gnu
+target_vendor = unknown
+themedir = ${globalkvircdir}/themes
+topdir = /usr/build/svn.kvirc.de/svn/trunk/kvirc
+
+# The name of this module
+THISMODULE = theme
+
+# Don't touch this
+tmpdir = $(localedir)
+
+# The *.mo files to generate
+tmp_DATA = theme_it.mo
+
+# The *.po files to generate
+POFILES = theme_it.po
+
+###############################################################################
+# STOP EDITING HERE
+###############################################################################
+
+# Killed the fuzzy entries: don't use them , they may SEGV
+# - touch $@ && $(SS_MSGFMT) -fvo $@ $<
+CLEANFILES = $(tmp_DATA)
+EXTRA_DIST = $(POFILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/modules/theme/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu po/modules/theme/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-tmpDATA: $(tmp_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(tmpdir)" || $(mkdir_p) "$(DESTDIR)$(tmpdir)"
+ @list='$(tmp_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(tmpDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(tmpdir)/$$f'"; \
+ $(tmpDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(tmpdir)/$$f"; \
+ done
+
+uninstall-tmpDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(tmp_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(tmpdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(tmpdir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(tmpdir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-tmpDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-tmpDATA
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ install-tmpDATA installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ uninstall uninstall-am uninstall-info-am uninstall-tmpDATA
+
+
+%.mo: %.po
+ -touch $@ && $(SS_MSGFMT) -vo $@ $<
+
+messages-extract:
+ @find $(topdir)/src/modules/$(THISMODULE)/ -maxdepth 10 -name *.cpp > files; \
+ find $(topdir)/src/modules/$(THISMODULE)/ -maxdepth 10 -name *.h >> files; \
+ xgettext -o $(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot -k__tr_ctx -k__tr_no_lookup_ctx -k__tr2qs_ctx -k__tr2wc_ctx -k__tr2ws_ctx -f files; \
+ rm files; \
+ echo "Messages extracted to $(THISMODULE).pot";
+
+messages-update:
+ @old=_old; \
+ if test -f "$(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot"; then \
+ for lang in $(POFILES); do \
+ echo "Updating file $$lang"; \
+ mv -f $$lang $$lang$$old; \
+ msgmerge -o $$lang $$lang$$old $(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot && rm -f $$lang$$old; \
+ done; \
+ else \
+ echo "----------------------------------------------------"; \
+ echo "- WARNING: ./$(THISMODULE).pot does not exist"; \
+ echo "- WARNING: You must run make messages-extract first"; \
+ echo "----------------------------------------------------"; \
+ fi
+messages: messages-extract messages-update
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/modules/theme/Makefile.am b/po/modules/theme/Makefile.am
new file mode 100644
index 000000000..a4acd9b81
--- /dev/null
+++ b/po/modules/theme/Makefile.am
@@ -0,0 +1,52 @@
+###############################################################################
+# KVirc IRC client Makefile - 18.09.99 Szymon Stefanek <pragma at kvirc dot net>
+###############################################################################
+
+# The name of this module
+THISMODULE = theme
+
+# Don't touch this
+tmpdir = $(localedir)
+
+# The *.mo files to generate
+tmp_DATA = theme_it.mo
+
+# The *.po files to generate
+POFILES = theme_it.po
+
+
+###############################################################################
+# STOP EDITING HERE
+###############################################################################
+
+# Killed the fuzzy entries: don't use them , they may SEGV
+# - touch $@ && $(SS_MSGFMT) -fvo $@ $<
+
+CLEANFILES = $(tmp_DATA)
+EXTRA_DIST = $(POFILES)
+
+%.mo: %.po
+ -touch $@ && $(SS_MSGFMT) -vo $@ $<
+
+messages-extract:
+ @find $(topdir)/src/modules/$(THISMODULE)/ -maxdepth 10 -name *.cpp > files; \
+ find $(topdir)/src/modules/$(THISMODULE)/ -maxdepth 10 -name *.h >> files; \
+ xgettext -o $(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot -k__tr_ctx -k__tr_no_lookup_ctx -k__tr2qs_ctx -k__tr2wc_ctx -k__tr2ws_ctx -f files; \
+ rm files; \
+ echo "Messages extracted to $(THISMODULE).pot";
+
+messages-update:
+ @old=_old; \
+ if test -f "$(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot"; then \
+ for lang in $(POFILES); do \
+ echo "Updating file $$lang"; \
+ mv -f $$lang $$lang$$old; \
+ msgmerge -o $$lang $$lang$$old $(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot && rm -f $$lang$$old; \
+ done; \
+ else \
+ echo "----------------------------------------------------"; \
+ echo "- WARNING: ./$(THISMODULE).pot does not exist"; \
+ echo "- WARNING: You must run make messages-extract first"; \
+ echo "----------------------------------------------------"; \
+ fi
+messages: messages-extract messages-update
diff --git a/po/modules/theme/Makefile.in b/po/modules/theme/Makefile.in
new file mode 100644
index 000000000..ebd79845b
--- /dev/null
+++ b/po/modules/theme/Makefile.in
@@ -0,0 +1,437 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+###############################################################################
+# KVirc IRC client Makefile - 18.09.99 Szymon Stefanek <pragma at kvirc dot net>
+###############################################################################
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = po/modules/theme
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(tmpdir)"
+tmpDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(tmp_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SS_CPPFLAGS = @SS_CPPFLAGS@
+SS_INCDIRS = @SS_INCDIRS@
+SS_LDFLAGS = @SS_LDFLAGS@
+SS_LIBDIRS = @SS_LIBDIRS@
+SS_LIBLINK = @SS_LIBLINK@
+SS_MSGFMT = @SS_MSGFMT@
+SS_PERL_BINARY = @SS_PERL_BINARY@
+SS_PERL_CCFLAGS = @SS_PERL_CCFLAGS@
+SS_PERL_LDFLAGS = @SS_PERL_LDFLAGS@
+SS_QT_MOC = @SS_QT_MOC@
+SS_RPATH = @SS_RPATH@
+SS_TOPSRCDIR = @SS_TOPSRCDIR@
+STRIP = @STRIP@
+VERSION = @VERSION@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+applnkdir = @applnkdir@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+configdir = @configdir@
+configmodulesdir = @configmodulesdir@
+datadir = @datadir@
+defscriptdir = @defscriptdir@
+exec_prefix = @exec_prefix@
+globalkvircdir = @globalkvircdir@
+headersdir = @headersdir@
+helpdir = @helpdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+iconapps16datadir = @iconapps16datadir@
+iconapps32datadir = @iconapps32datadir@
+iconapps48datadir = @iconapps48datadir@
+iconapps64datadir = @iconapps64datadir@
+iconmime16datadir = @iconmime16datadir@
+iconmime32datadir = @iconmime32datadir@
+iconmime48datadir = @iconmime48datadir@
+iconmime64datadir = @iconmime64datadir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+kdeservicesdir = @kdeservicesdir@
+libdir = @libdir@
+libexecdir = @libexecdir@
+licensedir = @licensedir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mimelnkdir = @mimelnkdir@
+mkdir_p = @mkdir_p@
+modulelibdir = @modulelibdir@
+msgcolorsdir = @msgcolorsdir@
+oldincludedir = @oldincludedir@
+picsdir = @picsdir@
+pluglibdir = @pluglibdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+themedir = @themedir@
+topdir = @topdir@
+
+# The name of this module
+THISMODULE = theme
+
+# Don't touch this
+tmpdir = $(localedir)
+
+# The *.mo files to generate
+tmp_DATA = theme_it.mo
+
+# The *.po files to generate
+POFILES = theme_it.po
+
+###############################################################################
+# STOP EDITING HERE
+###############################################################################
+
+# Killed the fuzzy entries: don't use them , they may SEGV
+# - touch $@ && $(SS_MSGFMT) -fvo $@ $<
+CLEANFILES = $(tmp_DATA)
+EXTRA_DIST = $(POFILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/modules/theme/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu po/modules/theme/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-tmpDATA: $(tmp_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(tmpdir)" || $(mkdir_p) "$(DESTDIR)$(tmpdir)"
+ @list='$(tmp_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(tmpDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(tmpdir)/$$f'"; \
+ $(tmpDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(tmpdir)/$$f"; \
+ done
+
+uninstall-tmpDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(tmp_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(tmpdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(tmpdir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(tmpdir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-tmpDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-tmpDATA
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ install-tmpDATA installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ uninstall uninstall-am uninstall-info-am uninstall-tmpDATA
+
+
+%.mo: %.po
+ -touch $@ && $(SS_MSGFMT) -vo $@ $<
+
+messages-extract:
+ @find $(topdir)/src/modules/$(THISMODULE)/ -maxdepth 10 -name *.cpp > files; \
+ find $(topdir)/src/modules/$(THISMODULE)/ -maxdepth 10 -name *.h >> files; \
+ xgettext -o $(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot -k__tr_ctx -k__tr_no_lookup_ctx -k__tr2qs_ctx -k__tr2wc_ctx -k__tr2ws_ctx -f files; \
+ rm files; \
+ echo "Messages extracted to $(THISMODULE).pot";
+
+messages-update:
+ @old=_old; \
+ if test -f "$(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot"; then \
+ for lang in $(POFILES); do \
+ echo "Updating file $$lang"; \
+ mv -f $$lang $$lang$$old; \
+ msgmerge -o $$lang $$lang$$old $(topdir)/po/modules/$(THISMODULE)/$(THISMODULE).pot && rm -f $$lang$$old; \
+ done; \
+ else \
+ echo "----------------------------------------------------"; \
+ echo "- WARNING: ./$(THISMODULE).pot does not exist"; \
+ echo "- WARNING: You must run make messages-extract first"; \
+ echo "----------------------------------------------------"; \
+ fi
+messages: messages-extract messages-update
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/modules/theme/theme.pot b/po/modules/theme/theme.pot
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/po/modules/theme/theme.pot
diff --git a/po/modules/theme/theme_it.mo b/po/modules/theme/theme_it.mo
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/po/modules/theme/theme_it.mo
diff --git a/po/modules/theme/theme_it.po b/po/modules/theme/theme_it.po
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/po/modules/theme/theme_it.po
diff --git a/src/kvi_configstatus.h b/src/kvi_configstatus.h
index 5c3b21537..f4edc813c 100644
--- a/src/kvi_configstatus.h
+++ b/src/kvi_configstatus.h
@@ -8,7 +8,7 @@
/* #undef BIG_ENDIAN_MACHINE_BYTE_ORDER */
/* this is the build date (configure date rather) */
-#define BUILD_DATE "Mon Dec 18 04:12:50 UTC 2006"
+#define BUILD_DATE "Sat Dec 30 13:42:43 UTC 2006"
/* these are the build flags */
#define BUILD_FLAGS "x86_64-cefgikopsAGTZ"
diff --git a/src/kvilib/build/Makefile.am b/src/kvilib/build/Makefile.am
index 4a94ec214..cf7bbbbea 100644
--- a/src/kvilib/build/Makefile.am
+++ b/src/kvilib/build/Makefile.am
@@ -58,6 +58,7 @@ libkvilib_la_SOURCES = \
../ext/kvi_stringconversion.cpp \
../file/kvi_file.cpp \
../file/kvi_fileutils.cpp \
+ ../file/kvi_packagefile.cpp \
../file/kvi_targzfile.cpp \
../irc/kvi_avatar.cpp \
../irc/kvi_avatarcache.cpp \
@@ -91,21 +92,50 @@ libkvilib_la_SOURCES = \
#
-headers_HEADERS = ../config/kvi_confignames.h ../config/kvi_debug.h ../config/kvi_defaults.h \
-../config/kvi_settings.h ../config/kvi_sourcesdate.h ../config/kvi_wincfg.h ../core/kvi_bswap.h ../core/kvi_error.h \
-../core/kvi_heapobject.h ../core/kvi_inttypes.h ../core/kvi_list.h ../core/kvi_malloc.h \
-../core/kvi_memmove.h ../core/kvi_qstring.h ../core/kvi_strasm.h ../core/kvi_string.h \
-../core/kvi_stringarray.h \
-../ext/kvi_cmdformatter.h ../ext/kvi_config.h \
-../ext/kvi_crypt.h ../ext/kvi_databuffer.h \
-../ext/kvi_datacontainer.h \
-../ext/kvi_doublebuffer.h \
-../ext/kvi_osinfo.h \
-../ext/kvi_garbage.h ../ext/kvi_imagelib.h \
-../ext/kvi_md5.h ../ext/kvi_mediatype.h ../ext/kvi_msgtype.h ../ext/kvi_parameterlist.h ../ext/kvi_pixmap.h \
-../ext/kvi_proxydb.h ../ext/kvi_regchan.h ../ext/kvi_regusersdb.h ../ext/kvi_sharedfiles.h \
-../ext/kvi_stringconversion.h ../ext/kvi_xlib.h ../file/kvi_file.h \
-../file/kvi_fileutils.h ../file/kvi_targzfile.h ../irc/kvi_avatar.h ../irc/kvi_avatarcache.h ../irc/kvi_ircmask.h \
+headers_HEADERS = \
+ ../config/kvi_confignames.h \
+ ../config/kvi_debug.h \
+ ../config/kvi_defaults.h \
+ ../config/kvi_fileextensions.h \
+ ../config/kvi_settings.h \
+ ../config/kvi_sourcesdate.h \
+ ../config/kvi_wincfg.h \
+ ../core/kvi_bswap.h \
+ ../core/kvi_error.h \
+ ../core/kvi_heapobject.h \
+ ../core/kvi_inttypes.h \
+ ../core/kvi_list.h \
+ ../core/kvi_malloc.h \
+ ../core/kvi_memmove.h \
+ ../core/kvi_qstring.h \
+ ../core/kvi_strasm.h \
+ ../core/kvi_string.h \
+ ../core/kvi_stringarray.h \
+ ../ext/kvi_cmdformatter.h \
+ ../ext/kvi_config.h \
+ ../ext/kvi_crypt.h \
+ ../ext/kvi_databuffer.h \
+ ../ext/kvi_datacontainer.h \
+ ../ext/kvi_doublebuffer.h \
+ ../ext/kvi_osinfo.h \
+ ../ext/kvi_garbage.h \
+ ../ext/kvi_imagelib.h \
+ ../ext/kvi_md5.h \
+ ../ext/kvi_mediatype.h \
+ ../ext/kvi_msgtype.h \
+ ../ext/kvi_parameterlist.h \
+ ../ext/kvi_pixmap.h \
+ ../ext/kvi_proxydb.h \
+ ../ext/kvi_regchan.h \
+ ../ext/kvi_regusersdb.h \
+ ../ext/kvi_sharedfiles.h \
+ ../ext/kvi_stringconversion.h \
+ ../ext/kvi_xlib.h \
+ ../file/kvi_file.h \
+ ../file/kvi_fileutils.h \
+ ../file/kvi_packagefile.h \
+ ../file/kvi_targzfile.h \
+ ../irc/kvi_avatar.h ../irc/kvi_avatarcache.h ../irc/kvi_ircmask.h \
../irc/kvi_ircserverdb.h ../irc/kvi_ircserver.h ../irc/kvi_ircuserdb.h ../irc/kvi_mirccntrl.h \
../irc/kvi_nickserv.h ../net/kvi_dns.h ../net/kvi_http.h ../net/kvi_netutils.h ../net/kvi_socket.h \
../net/kvi_sockettype.h ../net/kvi_ssl.h ../net/kvi_url.h ../system/kvi_env.h \
@@ -123,6 +153,9 @@ headers_HEADERS = ../config/kvi_confignames.h ../config/kvi_debug.h ../con
../ext/moc_%.cpp: ../ext/%.h
$(SS_QT_MOC) $< -o $@
+../file/moc_%.cpp: ../file/%.h
+ $(SS_QT_MOC) $< -o $@
+
../irc/moc_%.cpp: ../irc/%.h
$(SS_QT_MOC) $< -o $@
diff --git a/src/kvilib/config/kvi_confignames.h b/src/kvilib/config/kvi_confignames.h
index 3005ef725..81612d226 100644
--- a/src/kvilib/config/kvi_confignames.h
+++ b/src/kvilib/config/kvi_confignames.h
@@ -25,6 +25,8 @@
//
//=============================================================================
+#include "kvi_fileextensions.h"
+
//=============================================================================
// This file contains the config file names used in KVIrc
//
@@ -32,27 +34,27 @@
// may find themselves in trouble
//=============================================================================
-#define KVI_CONFIGFILE_MAIN "main.kvc"
-#define KVI_CONFIGFILE_WINPROPERTIES "winproperties.kvc"
-#define KVI_CONFIGFILE_SERVERDB "serverdb.kvc"
-#define KVI_CONFIGFILE_PROXYDB "proxydb.kvc"
-#define KVI_CONFIGFILE_EVENTS "events.kvc"
-#define KVI_CONFIGFILE_RAWEVENTS "rawevents.kvc"
-#define KVI_CONFIGFILE_POPUPS "popups.kvc"
-#define KVI_CONFIGFILE_SCRIPTTOOLBARS "toolbars.kvc"
-#define KVI_CONFIGFILE_CUSTOMTOOLBARS "customtoolbars.kvc"
-#define KVI_CONFIGFILE_MEDIATYPES "mediatypes.kvc"
-#define KVI_CONFIGFILE_REGUSERDB "reguserdb.kvc"
-#define KVI_CONFIGFILE_SHAREDFILES "sharedfiles.kvc"
-#define KVI_CONFIGFILE_RECENT "recent.kvc"
-#define KVI_CONFIGFILE_TOOLBARS "toolbarpos.kvc"
-#define KVI_CONFIGFILE_ALIASES "aliases.kvc"
-#define KVI_CONFIGFILE_NICKSERVDATABASE "nickserv.kvc"
-#define KVI_CONFIGFILE_TEXTICONS "texticons.kvc"
-#define KVI_CONFIGFILE_REGCHANDB "regchan.kvc"
-#define KVI_CONFIGFILE_INPUTHISTORY "inputhistory.kvc"
-#define KVI_CONFIGFILE_AVATARCACHE "avatarcache.kvc"
-#define KVI_CONFIGFILE_USERACTIONS "useractions.kvc"
-#define KVI_CONFIGFILE_SCRIPTADDONS "scriptaddons.kvc"
+#define KVI_CONFIGFILE_MAIN "main." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_WINPROPERTIES "winproperties." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_SERVERDB "serverdb." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_PROXYDB "proxydb." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_EVENTS "events." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_RAWEVENTS "rawevents." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_POPUPS "popups." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_SCRIPTTOOLBARS "toolbars." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_CUSTOMTOOLBARS "customtoolbars." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_MEDIATYPES "mediatypes." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_REGUSERDB "reguserdb." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_SHAREDFILES "sharedfiles." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_RECENT "recent." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_TOOLBARS "toolbarpos." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_ALIASES "aliases." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_NICKSERVDATABASE "nickserv." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_TEXTICONS "texticons." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_REGCHANDB "regchan." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_INPUTHISTORY "inputhistory." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_AVATARCACHE "avatarcache." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_USERACTIONS "useractions." KVI_FILEEXTENSION_CONFIG
+#define KVI_CONFIGFILE_SCRIPTADDONS "scriptaddons." KVI_FILEEXTENSION_CONFIG
#endif //_KVI_CONFIGNAMES_H_
diff --git a/src/kvilib/config/kvi_fileextensions.h b/src/kvilib/config/kvi_fileextensions.h
new file mode 100644
index 000000000..7036e6d8d
--- /dev/null
+++ b/src/kvilib/config/kvi_fileextensions.h
@@ -0,0 +1,37 @@
+#ifndef _KVI_FILEEXTENSIONS_H_
+#define _KVI_FILEEXTENSIONS_H_
+
+//=============================================================================
+//
+// File : kvi_fileextensions.h
+// Creation date : Tue Dec 26 2006 05:09:22 CEST by Szymon Stefanek
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 2006 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) 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.
+//
+//=============================================================================
+
+//=============================================================================
+// This file contains the file extensions used by KVIrc
+//=============================================================================
+
+#define KVI_FILEEXTENSION_CONFIG "kvc"
+#define KVI_FILEEXTENSION_SCRIPT "kvs"
+#define KVI_FILEEXTENSION_THEMEPACKAGE "kvt"
+#define KVI_FILEEXTENSION_ADDONPACKAGE "kva"
+
+#endif //_KVI_FILEEXTENSIONS_H_
diff --git a/src/kvilib/core/kvi_bswap.h b/src/kvilib/core/kvi_bswap.h
index 5f0c959bc..6da000f2a 100644
--- a/src/kvilib/core/kvi_bswap.h
+++ b/src/kvilib/core/kvi_bswap.h
@@ -7,7 +7,7 @@
// Creation date : Fri Mar 19 1999 03:15:21 CEST by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
-// Copyright (C) 1999-2001 Szymon Stefanek (pragma at kvirc dot net)
+// Copyright (C) 1999-2006 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -26,23 +26,38 @@
//=============================================================================
#include "kvi_settings.h"
+#include "kvi_inttypes.h"
-// Removed : kvi_settings.h includes qglobal.h for debug()
-//#include <qglobal.h> // for Q_UINT* and Q_INT*
// KVILIB_API has been removed from therse two functions
// these should always go inlined
-inline Q_UINT32 kvi_swap32(Q_UINT32 i)
+inline kvi_u64_t kvi_swap64(kvi_u64_t i)
{
+ // abcdefgh to hgfedcba
+ return ((i << 56) | /* h to a */
+ ((i & 0xff00) << 40) | /* g to b */
+ ((i & 0xff0000) << 24) | /* f to c */
+ ((i & 0xff000000) << 8) | /* e to d */
+ ((i >> 8) & 0xff000000) | /* d to e */
+ ((i >> 24) & 0xff0000) | /* c to f */
+ ((i >> 40) & 0xff00) | /* b to g */
+ (i >> 56)); /* a to h */
+}
+
+inline kvi_u32_t kvi_swap32(kvi_u32_t i)
+{
+ // abcd to dcba
return ((i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24));
}
-inline Q_UINT16 kvi_swap16(Q_UINT16 i)
+inline kvi_u16_t kvi_swap16(kvi_u16_t i)
{
+ // ab to ba
return ((i << 8) | (i >> 8));
}
+
#endif // !_KVI_BSWAP_H_
diff --git a/src/kvilib/ext/kvi_osinfo.cpp b/src/kvilib/ext/kvi_osinfo.cpp
index 3f31f5c46..a189454bf 100644
--- a/src/kvilib/ext/kvi_osinfo.cpp
+++ b/src/kvilib/ext/kvi_osinfo.cpp
@@ -376,4 +376,5 @@ namespace KviOsInfo
else
return QString::null;
}
-} \ No newline at end of file
+}
+
diff --git a/src/kvilib/ext/kvi_osinfo.h b/src/kvilib/ext/kvi_osinfo.h
index ee9052765..7409ddd12 100644
--- a/src/kvilib/ext/kvi_osinfo.h
+++ b/src/kvilib/ext/kvi_osinfo.h
@@ -40,4 +40,4 @@ namespace KviOsInfo
extern KVILIB_API QString hostname();
};
-#endif \ No newline at end of file
+#endif //!_KVI_OSINFO_H_
diff --git a/src/kvilib/file/kvi_file.cpp b/src/kvilib/file/kvi_file.cpp
index aec83daba..6d45be342 100644
--- a/src/kvilib/file/kvi_file.cpp
+++ b/src/kvilib/file/kvi_file.cpp
@@ -26,7 +26,7 @@
#include "kvi_file.h"
-#include "kvi_bswap.h"
+#include "kvi_byteorder.h"
KviFile::KviFile()
@@ -43,17 +43,48 @@ KviFile::~KviFile()
{
}
+bool KviFile::save(const QByteArray &bData)
+{
+ if(!save((kvi_u32_t)(bData.size())))return false;
+ return (writeBlock(bData.data(),bData.size()) == ((int)(bData.size())));
+}
+
+bool KviFile::load(QByteArray &bData)
+{
+ kvi_u32_t iLen;
+ if(!load(iLen))return false;
+ bData.resize(iLen);
+ if(readBlock((char *)(bData.data()),iLen) != iLen)return false;
+ return true;
+}
+
+bool KviFile::save(const QCString &szData)
+{
+ if(!save((kvi_u32_t)(szData.length())))return false;
+ return (writeBlock(szData.data(),szData.length()) == ((int)(szData.length())));
+}
+
+bool KviFile::load(QCString &szData)
+{
+ kvi_u32_t iLen;
+ if(!load(iLen))return false;
+ szData.resize(iLen + 1);
+ if(readBlock((char *)(szData.data()),iLen) != iLen)return false;
+ *(szData.data() + iLen) = 0;
+ return true;
+}
+
bool KviFile::save(const QString &szData)
{
QCString c = szData.utf8();
- if(!save(c.length()))return false;
+ if(!save((kvi_u32_t)(c.length())))return false;
return (writeBlock(c.data(),c.length()) == ((int)(c.length())));
}
bool KviFile::load(QString &szData)
{
- int iLen;
+ kvi_u32_t iLen;
if(!load(iLen))return false;
QCString tmp;
tmp.resize(iLen + 1);
@@ -65,67 +96,79 @@ bool KviFile::load(QString &szData)
bool KviFile::save(const KviStr &szData)
{
- if(!save(szData.len()))return false;
+ if(!save((kvi_u32_t)(szData.len())))return false;
return (writeBlock(szData.ptr(),szData.len()) == (int) szData.len());
}
bool KviFile::load(KviStr &szData)
{
- int iLen;
+ kvi_u32_t iLen;
if(!load(iLen))return false;
szData.setLength(iLen);
return (readBlock((char *)(szData.ptr()),iLen) == iLen);
}
-bool KviFile::save(kvi_i32_t t)
+bool KviFile::save(kvi_u32_t t)
{
-#ifdef BIGENDIAN_MACHINE_BYTE_ORDER
- t = kvi_swap32(t);
+#ifndef LOCAL_CPU_LITTLE_ENDIAN
+ t = kvi_localCpuToLittleEndian32(t);
#endif
- return (writeBlock((const char *)(&t),sizeof(kvi_i32_t)) == sizeof(kvi_i32_t));
+ return (writeBlock((const char *)(&t),sizeof(kvi_u32_t)) == sizeof(kvi_u32_t));
}
-bool KviFile::load(kvi_i32_t &t)
+bool KviFile::load(kvi_u32_t &t)
{
-#ifdef BIGENDIAN_MACHINE_BYTE_ORDER
- if(!(readBlock((char *)(&t),sizeof(kvi_i32_t)) == sizeof(kvi_i32_t)))return false;
- t = kvi_swap32(t);
- return true;
-#else
- return (readBlock((char *)(&t),sizeof(kvi_i32_t)) == sizeof(kvi_i32_t));
+ if(!(readBlock((char *)(&t),sizeof(kvi_u32_t)) == sizeof(kvi_u32_t)))return false;
+#ifndef LOCAL_CPU_LITTLE_ENDIAN
+ t = kvi_littleEndianToLocalCpu32(t)
#endif
+ return true;
}
-bool KviFile::save(kvi_i16_t t)
+bool KviFile::save(kvi_u64_t t)
{
-#ifdef BIGENDIAN_MACHINE_BYTE_ORDER
- t = kvi_swap16(t);
+#ifndef LOCAL_CPU_LITTLE_ENDIAN
+ t = kvi_localCpuToLittleEndian64(t);
#endif
- return (writeBlock((const char *)(&t),sizeof(kvi_i16_t)) == sizeof(kvi_i16_t));
+ return (writeBlock((const char *)(&t),sizeof(kvi_u64_t)) == sizeof(kvi_u64_t));
}
-bool KviFile::load(kvi_i16_t &t)
+bool KviFile::load(kvi_u64_t &t)
{
-#ifdef BIGENDIAN_MACHINE_BYTE_ORDER
- if(!(readBlock((char *)(&t),sizeof(kvi_i16_t)) == sizeof(kvi_i16_t)))return false;
- t = kvi_swap32(t);
- return true;
-#else
- return (readBlock((char *)(&t),sizeof(kvi_i16_t)) == sizeof(kvi_i16_t));
+ if(!(readBlock((char *)(&t),sizeof(kvi_u32_t)) == sizeof(kvi_u32_t)))return false;
+#ifndef LOCAL_CPU_LITTLE_ENDIAN
+ t = kvi_littleEndianToLocalCpu32(t)
#endif
+ return true;
}
-bool KviFile::save(kvi_i8_t t)
+
+bool KviFile::save(kvi_u16_t t)
{
- return (writeBlock((const char *)(&t),sizeof(kvi_i8_t)) == sizeof(kvi_i8_t));
+#ifndef LOCAL_CPU_LITTLE_ENDIAN
+ t = kvi_localCpuToLittleEndian16(t);
+#endif
+ return (writeBlock((const char *)(&t),sizeof(kvi_u16_t)) == sizeof(kvi_u16_t));
}
-bool KviFile::load(kvi_i8_t &t)
+bool KviFile::load(kvi_u16_t &t)
{
- return (readBlock((char *)(&t),sizeof(kvi_i8_t)) == sizeof(kvi_i8_t));
+ if(!(readBlock((char *)(&t),sizeof(kvi_u16_t)) == sizeof(kvi_u16_t)))return false;
+#ifndef LOCAL_CPU_LITTLE_ENDIAN
+ t = kvi_littleEndianToLocalCpu16(t);
+#endif
+ return true;
}
+bool KviFile::save(kvi_u8_t t)
+{
+ return (writeBlock((const char *)(&t),sizeof(kvi_u8_t)) == sizeof(kvi_u8_t));
+}
+bool KviFile::load(kvi_u8_t &t)
+{
+ return (readBlock((char *)(&t),sizeof(kvi_u8_t)) == sizeof(kvi_u8_t));
+}
bool KviFile::save(KviPtrList<KviStr> * pData)
diff --git a/src/kvilib/file/kvi_file.h b/src/kvilib/file/kvi_file.h
index 427944e0c..5d04fc7bd 100644
--- a/src/kvilib/file/kvi_file.h
+++ b/src/kvilib/file/kvi_file.h
@@ -30,7 +30,7 @@
#include "kvi_inttypes.h"
#include <qfile.h>
-
+#include <qcstring.h>
#include <time.h>
@@ -42,29 +42,41 @@ public:
~KviFile();
public:
// This stuff loads and saves LITTLE ENDIAN DATA!
- bool save(kvi_i32_t t);
- bool load(kvi_i32_t &t);
+ bool save(kvi_u64_t t);
+ bool load(kvi_u64_t &t);
+
+ bool save(kvi_i64_t t){ return save((kvi_u64_t)t); };
+ bool load(kvi_i64_t &t){ return load((kvi_u64_t &)t); };
- bool save(kvi_u32_t t){ return save((kvi_i32_t)t); };
- bool load(kvi_u32_t &t){ return load((kvi_i32_t &)t); };
+ bool save(kvi_u32_t t);
+ bool load(kvi_u32_t &t);
- bool save(kvi_i16_t t);
- bool load(kvi_i16_t &t);
+ bool save(kvi_i32_t t){ return save((kvi_u32_t)t); };
+ bool load(kvi_i32_t &t){ return load((kvi_u32_t &)t); };
- bool save(kvi_u16_t t){ return save((kvi_i16_t)t); };
- bool load(kvi_u16_t &t){ return load((kvi_i16_t &)t); };
+ bool save(kvi_u16_t t);
+ bool load(kvi_u16_t &t);
- bool save(kvi_i8_t t);
- bool load(kvi_i8_t &t);
+ bool save(kvi_i16_t t){ return save((kvi_u16_t)t); };
+ bool load(kvi_i16_t &t){ return load((kvi_u16_t &)t); };
- bool save(kvi_u8_t t){ return save((kvi_i8_t)t); };
- bool load(kvi_u8_t &t){ return load((kvi_i8_t &)t); };;
+ bool save(kvi_u8_t t);
+ bool load(kvi_u8_t &t);
+
+ bool save(kvi_i8_t t){ return save((kvi_u8_t)t); };
+ bool load(kvi_i8_t &t){ return load((kvi_u8_t &)t); };;
// bool save(time_t t){ return save((kvi_i32_t)t); };
// bool load(time_t &t){ return load((kvi_i32_t)t); };
bool save(const KviStr &szData);
bool load(KviStr &szData);
+
+ bool save(const QCString &szData);
+ bool load(QCString &szData);
+
+ bool save(const QByteArray &bData);
+ bool load(QByteArray &bData);
bool save(const QString &szData);
bool load(QString &szData);
diff --git a/src/kvilib/file/kvi_fileutils.cpp b/src/kvilib/file/kvi_fileutils.cpp
index 6ac83ef16..876659eb9 100644
--- a/src/kvilib/file/kvi_fileutils.cpp
+++ b/src/kvilib/file/kvi_fileutils.cpp
@@ -281,6 +281,36 @@ namespace KviFileUtils
return removeDir(szPath);
}
+ bool deleteDir(const QString &szPath)
+ {
+ QDir d(szPath);
+ QStringList sl = d.entryList(QDir::Dirs);
+ QStringList::Iterator it;
+ for(it=sl.begin();it != sl.end();it++)
+ {
+ QString szSubdir = *it;
+ if(!(KviQString::equalCS(szSubdir,"..") || KviQString::equalCS(szSubdir,".")))
+ {
+ QString szSubPath = szPath;
+ KviQString::ensureLastCharIs(szSubPath,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szSubPath += szSubdir;
+ if(!KviFileUtils::deleteDir(szSubPath))
+ return false;
+ }
+ }
+
+ sl = d.entryList(QDir::Files);
+ for(it=sl.begin();it != sl.end();it++)
+ {
+ QString szFilePath = szPath;
+ KviQString::ensureLastCharIs(szFilePath,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szFilePath += *it;
+ if(!KviFileUtils::removeFile(szFilePath))
+ return false;
+ }
+
+ return KviFileUtils::removeDir(szPath);
+ }
bool writeFile(const QString &szPath,const QString &szData,bool bAppend)
{
diff --git a/src/kvilib/file/kvi_fileutils.h b/src/kvilib/file/kvi_fileutils.h
index dbf112cb6..4a7580959 100644
--- a/src/kvilib/file/kvi_fileutils.h
+++ b/src/kvilib/file/kvi_fileutils.h
@@ -64,6 +64,8 @@ namespace KviFileUtils
// removes a dir (must be empty)
extern KVILIB_API bool removeDir(const QString &szPath);
extern KVILIB_API bool removeDir(const char* path);
+ // removes a dir recursively
+ extern KVILIB_API bool deleteDir(const QString &szPath);
// writes a complete file (utf8 version)
extern KVILIB_API bool writeFile(const QString &szPath,const QString &szData,bool bAppend = false);
extern KVILIB_API bool writeFile(const char* path,const QString &szData,bool bAppend = false);
diff --git a/src/kvilib/file/kvi_packagefile.cpp b/src/kvilib/file/kvi_packagefile.cpp
new file mode 100644
index 000000000..4c0b564c2
--- /dev/null
+++ b/src/kvilib/file/kvi_packagefile.cpp
@@ -0,0 +1,964 @@
+//=============================================================================
+//
+// File : kvi_packagefile.cpp
+// Created on Tue 26 Dec 2006 05:33:33 by Szymon Stefanek
+//
+// This file is part of the KVIrc IRC Client distribution
+// Copyright (C) 2006 Szymon Stefanek <pragma at kvirc dot net>
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) 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.
+//
+//=============================================================================
+
+#define __KVILIB__
+#include "kvi_packagefile.h"
+
+#include "kvi_file.h"
+#include "kvi_fileutils.h"
+#include "kvi_locale.h"
+#include "kvi_inttypes.h"
+
+#include <qprogressdialog.h>
+#include <qdir.h>
+
+#ifdef COMPILE_ZLIB_SUPPORT
+ #include <zlib.h>
+#endif
+
+//
+// A KVIrc Package File is basically a simple zip file with some additional meta-data.
+// The package file has the following format
+//
+
+// Field Type Bytes Description
+//-------------------------------------------------------------------------------
+ // PackageHeader:
+// Magic Bytes 4 'KVPF': Signature for the Kvirc Package File
+// Version uint32 4 0x00000001: Version of this package file
+// Flags uint32 4 0x00000000: Flags, in version 1 is reserved and must be zero
+// PackageInfo:
+// InfoFieldCount uint32 4 Number of package info fields
+// InfoField InfoField Variable A list of informational name-value pairs
+// InfoField InfoField Variable A list of informational name-value pairs
+// InfoField InfoField Variable A list of informational name-value pairs
+// .... .... ....
+// PackageData:
+// DataField DataField Variable A list of data fields with format defined below
+// DataField DataField Variable A list of data fields with format defined below
+// DataField DataField Variable A list of data fields with format defined below
+// .... .... ....
+
+// InfoField:
+// Name UniString Variable The "name" element of the info field
+// ValueType uint32 4 The type of the following ValueData field
+// ValueData ValueData Variable
+
+// ValueData for ValueType 1 (string field)
+// Value UniString Variable The value element of type string of the the info field
+
+// ValueData for ValueType 2 (binary buffer field)
+// BufferLen uint32 4 The length of the binary buffer
+// BufferData Bytes Variable The data for the binary buffer
+
+
+// UniString:
+// StringLen uint32 4 The length of the string data in BYTES (null terminator NOT included)
+// StringData Bytes StringLen An utf8 encoded string (do NOT write the NULL terminator)
+
+// Bytes:
+// Byte uint8 1 A byte
+// Byte uint8 1 A byte
+// .... .... ....
+
+// DataField:
+// FieldType uint32 4 The type of the field, see below for defined values
+// FieldLen uint32 4 FieldData length in bytes (useful for skipping a field if unsupported)
+// FieldData Variable FieldLen The data of the field, see below for defined values
+
+// FieldData for FieldType 1 (file field)
+// Flags uint32 4 Bitmask. Bits: 1=FileIsDeflated
+// Path UniString Variable A relative path expressed as utf8 string. \ AND / are considered to be separators
+// Size uint32 4 Size of the following file data
+// FilePayload Bytes Variable
+
+// Everything is stored in LITTLE ENDIAN byte order.
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Da Base Engine
+
+KviPackageIOEngine::KviPackageIOEngine()
+{
+ m_pProgressDialog = 0;
+ m_pStringInfoFields = new QDict<QString>();
+ m_pStringInfoFields->setAutoDelete(true);
+ m_pBinaryInfoFields = new QDict<QByteArray>();
+ m_pBinaryInfoFields->setAutoDelete(true);
+}
+
+KviPackageIOEngine::~KviPackageIOEngine()
+{
+ if(m_pProgressDialog)delete m_pProgressDialog;
+ delete m_pStringInfoFields;
+ delete m_pBinaryInfoFields;
+}
+
+
+bool KviPackageIOEngine::updateProgress(int iProgress,const QString &szLabel)
+{
+ if(!m_pProgressDialog)return true;
+ m_pProgressDialog->setProgress(iProgress);
+ m_pProgressDialogLabel->setText(szLabel);
+ qApp->processEvents();
+ if(m_pProgressDialog->wasCanceled())
+ {
+ setLastError(__tr2qs("Operation cancelled"));
+ return false;
+ }
+ return true;
+}
+
+void KviPackageIOEngine::showProgressDialog(const QString &szCaption,int iTotalSteps)
+{
+ m_pProgressDialog = new QProgressDialog(QString(""),__tr2qs("Cancel"),iTotalSteps,0,"",true);
+ m_pProgressDialog->setCaption(szCaption);
+ m_pProgressDialogLabel = new QLabel(m_pProgressDialog);
+ m_pProgressDialogLabel->setMaximumSize(500,300);
+ m_pProgressDialog->setLabel(m_pProgressDialogLabel);
+}
+
+void KviPackageIOEngine::hideProgressDialog()
+{
+ if(!m_pProgressDialog)return;
+ delete m_pProgressDialog;
+ m_pProgressDialog = 0;
+}
+
+bool KviPackageIOEngine::writeError()
+{
+ setLastError(__tr2qs("File write error"));
+ return false;
+}
+
+bool KviPackageIOEngine::readError()
+{
+ setLastError(__tr2qs("File read error"));
+ return false;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Da Writer
+
+
+KviPackageWriter::KviPackageWriter()
+: KviPackageIOEngine()
+{
+ m_pDataFields = new KviPtrList<DataField>();
+ m_pDataFields->setAutoDelete(true);
+}
+
+KviPackageWriter::~KviPackageWriter()
+{
+ delete m_pDataFields;
+}
+
+void KviPackageWriter::addInfoField(const QString &szName,const QString &szValue)
+{
+ m_pStringInfoFields->replace(szName,new QString(szValue));
+}
+
+void KviPackageWriter::addInfoField(const QString &szName,QByteArray * pValue)
+{
+ m_pBinaryInfoFields->replace(szName,pValue);
+}
+
+bool KviPackageWriter::addFile(const QString &szLocalFileName,const QString &szTargetFileName,kvi_u32_t uAddFileFlags)
+{
+ QFileInfo fi(szLocalFileName);
+ return addFileInternal(&fi,szLocalFileName,szTargetFileName,uAddFileFlags);
+}
+
+bool KviPackageWriter::addFileInternal(const QFileInfo * fi,const QString &szLocalFileName,const QString &szTargetFileName,kvi_u32_t uAddFileFlags)
+{
+ if(!(fi->isFile() && fi->isReadable()))
+ return false;
+
+ if(!(uAddFileFlags & FollowSymLinks))
+ {
+ if(fi->isSymLink())
+ return true; // do NOT add a symlink
+ }
+
+ DataField * f = new DataField();
+ f->m_uType = KVI_PACKAGE_DATAFIELD_TYPE_FILE;
+ f->m_bFileAllowCompression = !(uAddFileFlags & NoCompression);
+ f->m_szFileLocalName = szLocalFileName;
+ f->m_szFileTargetName = szTargetFileName;
+ m_pDataFields->append(f);
+
+ return true;
+}
+
+bool KviPackageWriter::addDirectory(const QString &szLocalDirectoryName,const QString &szTargetDirectoryPrefix,kvi_u32_t uAddFileFlags)
+{
+ QDir d(szLocalDirectoryName);
+ int iFlags = QDir::Files | QDir::Readable;
+ if(!(uAddFileFlags & FollowSymLinks))
+ iFlags |= QDir::NoSymLinks;
+ const QFileInfoList * sl = d.entryInfoList(iFlags);
+ if(!sl)return false;
+ QFileInfoListIterator it(*sl);
+ while(QFileInfo * fi = it.current())
+ {
+ QString szSFileName = szLocalDirectoryName;
+ KviQString::ensureLastCharIs(szSFileName,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szSFileName += fi->fileName();
+ QString szDFileName = szTargetDirectoryPrefix;
+ KviQString::ensureLastCharIs(szDFileName,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szDFileName += fi->fileName();
+ if(!addFileInternal(fi,szSFileName,szDFileName,uAddFileFlags))
+ return false;
+ ++it;
+ }
+ iFlags = QDir::Dirs | QDir::Readable;
+ if(!(uAddFileFlags & FollowSymLinks))
+ iFlags |= QDir::NoSymLinks;
+ sl = d.entryInfoList(iFlags);
+ if(!sl)return false;
+
+ QFileInfoListIterator it2(*sl);
+ while(QFileInfo * fi2 = it2.current())
+ {
+ QString szDir = fi2->fileName();
+ if(!KviQString::equalCS(szDir,"..") && !KviQString::equalCS(szDir,"."))
+ {
+ QString szSDirName = szLocalDirectoryName;
+ KviQString::ensureLastCharIs(szSDirName,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szSDirName += szDir;
+ QString szDDirName = szTargetDirectoryPrefix;
+ KviQString::ensureLastCharIs(szDDirName,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szDDirName += szDir;
+ if(!addDirectory(szSDirName,szDDirName,uAddFileFlags))
+ return false;
+ }
+ ++it2;
+ }
+
+ return true;
+}
+
+
+
+#define BUFFER_SIZE 32768
+
+bool KviPackageWriter::packFile(KviFile * pFile,DataField * pDataField)
+{
+ QString szProgressText;
+ KviQString::sprintf(szProgressText,__tr2qs("Packaging file %Q"),&(pDataField->m_szFileLocalName));
+ if(!updateProgress(m_iCurrentProgress,szProgressText))
+ return false; // aborted
+
+
+ KviFile source(pDataField->m_szFileLocalName);
+ if(!source.open(IO_ReadOnly))
+ {
+ setLastError(__tr2qs("Failed to open a source file for reading"));
+ return false;
+ }
+
+ kvi_u32_t uSize = source.size();
+
+ // Flags
+#ifdef COMPILE_ZLIB_SUPPORT
+ kvi_u32_t uFlags = pDataField->m_bFileAllowCompression ?
+ (uSize > 64 ? KVI_PACKAGE_DATAFIELD_FLAG_FILE_DEFLATE : 0)
+ : 0;
+#else
+ kvi_u32_t uFlags = 0;
+#endif
+
+ if(!pFile->save(uFlags))return writeError();
+
+ QCString szTargetFileName = pDataField->m_szFileTargetName.utf8();
+
+ // Path
+ if(!pFile->save(szTargetFileName))return writeError();
+
+ KviFile::Offset savedSizeOffset = pFile->at();
+
+ // Size : will update it if compression is requested
+ if(!pFile->save(uSize))return writeError();
+
+ pDataField->m_uWrittenFieldLength = 4 + 4 + 4 + szTargetFileName.length(); // sizeof(flags + uncompressed size + path len + path)
+
+ // FilePayload
+#ifdef COMPILE_ZLIB_SUPPORT
+ if(uFlags & KVI_PACKAGE_DATAFIELD_FLAG_FILE_DEFLATE)
+ {
+ unsigned char ibuffer[BUFFER_SIZE];
+ unsigned char obuffer[BUFFER_SIZE];
+
+ kvi_i32_t iReaded = source.readBlock((char *)ibuffer,BUFFER_SIZE);
+ if(iReaded < 0)
+ return readError();
+
+ z_stream zstr;
+ zstr.zalloc = Z_NULL;
+ zstr.zfree = Z_NULL;
+ zstr.opaque = Z_NULL;
+ zstr.next_in = ibuffer;
+ zstr.avail_in = iReaded;
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+
+ if(deflateInit(&zstr,9) != Z_OK)
+ {
+ setLastError(__tr2qs("Compression library initialization error"));
+ return false;
+ }
+
+ while(iReaded > 0)
+ {
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+
+ if(deflate(&zstr,Z_NO_FLUSH) != Z_OK)
+ {
+ setLastError(__tr2qs("Compression library error"));
+ return false;
+ }
+
+ if(zstr.avail_out < BUFFER_SIZE)
+ {
+ int iCompressed = zstr.next_out - obuffer;
+ pDataField->m_uWrittenFieldLength += iCompressed;
+ if(pFile->writeBlock((char *)obuffer,iCompressed) != iCompressed)
+ {
+ deflateEnd(&zstr);
+ return writeError();
+ }
+ }
+
+ if(zstr.avail_in < BUFFER_SIZE)
+ {
+ int iDataToRead = BUFFER_SIZE - zstr.avail_in;
+ if(iDataToRead < BUFFER_SIZE)
+ {
+ if(ibuffer != zstr.next_in)
+ {
+ // hum, there is still some data in the buffer to be readed
+ // and it is not at the beginning...move it to the beginning of ibuffer
+ memmove(ibuffer,zstr.next_in,zstr.avail_in);
+ }
+ }
+ iReaded = source.readBlock((char *)(ibuffer + zstr.avail_in),iDataToRead);
+ if(iReaded < 0)
+ {
+ deflateEnd(&zstr);
+ return readError();
+ }
+ zstr.avail_in += iReaded;
+ zstr.next_in = ibuffer;
+
+ if((zstr.total_in % 2000000) == 0)
+ {
+ QString szTmp;
+ KviQString::sprintf(szTmp,QString(" (%d of %d bytes)"),zstr.total_in,uSize);
+ QString szPrg = szProgressText + szTmp;
+ if(!updateProgress(m_iCurrentProgress,szPrg))
+ return false; // aborted
+ }
+
+
+ }
+ }
+
+ // flush pending output
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+
+ int ret;
+ do
+ {
+ ret = deflate(&zstr,Z_FINISH);
+
+ if((ret == Z_OK) || (ret == Z_STREAM_END))
+ {
+ if(zstr.avail_out < BUFFER_SIZE)
+ {
+ int iCompressed = zstr.next_out - obuffer;
+ pDataField->m_uWrittenFieldLength += iCompressed;
+ if(pFile->writeBlock((char *)obuffer,iCompressed) != iCompressed)
+ {
+ deflateEnd(&zstr);
+ return writeError();
+ }
+ } else {
+ deflateEnd(&zstr);
+ setLastError(__tr2qs("Compression library internal error"));
+ return false;
+ }
+
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+ }
+
+ } while(ret == Z_OK);
+
+ // store the compressed data size
+ KviFile::Offset here = pFile->at();
+ pFile->at(savedSizeOffset);
+ uSize = zstr.total_out;
+
+ deflateEnd(&zstr);
+ if(!pFile->save(uSize))return writeError();
+
+ if(ret != Z_STREAM_END)
+ {
+ setLastError(__tr2qs("Error while compressing a file stream"));
+ return false;
+ }
+
+ pFile->at(here);
+ } else {
+#endif
+ unsigned char buffer[BUFFER_SIZE];
+ int iTotalFileSize = 0;
+ kvi_i32_t iReaded = source.readBlock((char *)buffer,BUFFER_SIZE);
+ if(iReaded < 0)
+ return readError();
+ while(iReaded > 0)
+ {
+ iTotalFileSize += iReaded;
+ if((iTotalFileSize % 1000000) == 0)
+ {
+ QString szTmp;
+ KviQString::sprintf(szTmp,QString(" (%d of %d bytes)"),iTotalFileSize,uSize);
+ QString szPrg = szProgressText + szTmp;
+ if(!updateProgress(m_iCurrentProgress,szPrg))
+ return false; // aborted
+ }
+ pDataField->m_uWrittenFieldLength += iReaded;
+ if(pFile->writeBlock((char *)buffer,iReaded) != iReaded)
+ return writeError();
+ iReaded = source.readBlock((char *)buffer,BUFFER_SIZE);
+ }
+#ifdef COMPILE_ZLIB_SUPPORT
+ }
+#endif
+ source.close();
+
+ return true;
+}
+
+bool KviPackageWriter::pack(const QString &szFileName,kvi_u32_t uPackFlags)
+{
+ m_iCurrentProgress = 0;
+ if(!(uPackFlags & NoProgressDialog))
+ {
+ showProgressDialog(__tr2qs("Creating package..."),100);
+ updateProgress(m_iCurrentProgress,__tr2qs("Writing package header"));
+ }
+
+ bool bRet = packInternal(szFileName,uPackFlags);
+
+ hideProgressDialog();
+ return bRet;
+}
+
+bool KviPackageWriter::packInternal(const QString &szFileName,kvi_u32_t uPackFlags)
+{
+
+ KviFile f(szFileName);
+ if(!f.open(IO_WriteOnly | IO_Truncate))
+ {
+ setLastError(__tr2qs("Can't open file for writing"));
+ return false;
+ }
+
+ // write the PackageHeader
+
+ // Magic
+ char magic[4];
+ magic[0] = 'K';
+ magic[1] = 'V';
+ magic[2] = 'P';
+ magic[3] = 'F';
+ if(f.writeBlock(magic,4) != 4)return writeError();
+
+ // Version
+ kvi_u32_t uVersion = 0x1;
+ if(!f.save(uVersion))return writeError();
+
+ // Flags
+ kvi_u32_t uFlags = 0x0;
+ if(!f.save(uFlags))return writeError();
+
+ // write PackageInfo
+
+ // InfoFieldCount
+ kvi_u32_t uCount = m_pStringInfoFields->count() + m_pBinaryInfoFields->count();
+ if(!f.save(uCount))return writeError();
+
+ m_iCurrentProgress = 5;
+ if(!updateProgress(m_iCurrentProgress,__tr2qs("Writing informational fields")))
+ return false; // aborted
+
+ // InfoFields (string)
+ QDictIterator<QString> it(*m_pStringInfoFields);
+ while(QString * s = it.current())
+ {
+ if(!f.save(it.currentKey()))return writeError();
+ kvi_u32_t uType = KVI_PACKAGE_INFOFIELD_TYPE_STRING;
+ if(!f.save(uType))return writeError();
+ if(!f.save(*s))return writeError();
+ ++it;
+ }
+
+ // InfoFields (binary)
+ QDictIterator<QByteArray> it2(*m_pBinaryInfoFields);
+ while(QByteArray * b = it2.current())
+ {
+ if(!f.save(it2.currentKey()))return writeError();
+ kvi_u32_t uType = KVI_PACKAGE_INFOFIELD_TYPE_BINARYBUFFER;
+ if(!f.save(uType))return writeError();
+ if(!f.save(*b))return writeError();
+ ++it2;
+ }
+
+ m_iCurrentProgress = 10;
+ if(!updateProgress(m_iCurrentProgress,__tr2qs("Writing package data")))
+ return false; // aborted
+
+ // write PackageData
+ int iIdx = 0;
+ for(DataField * pDataField = m_pDataFields->first();pDataField;pDataField = m_pDataFields->next())
+ {
+ kvi_u32_t uDataFieldType = pDataField->m_uType;
+ if(!f.save(uDataFieldType))return writeError();
+
+ KviFile::Offset savedLenOffset = f.at();
+ // here we will store the length of the field once it's written
+ if(!f.save(uDataFieldType))return writeError();
+
+ m_iCurrentProgress = 10 + ((90 * iIdx) / m_pDataFields->count());
+
+ switch(pDataField->m_uType)
+ {
+ case KVI_PACKAGE_DATAFIELD_TYPE_FILE:
+ if(!packFile(&f,pDataField))
+ return false;
+ break;
+ default:
+ setLastError(__tr2qs("Internal error"));
+ return false;
+ break;
+ }
+
+ KviFile::Offset savedEndOffset = f.at();
+ f.at(savedLenOffset);
+ if(!f.save(pDataField->m_uWrittenFieldLength))
+ return writeError();
+
+ f.at(savedEndOffset);
+ iIdx++;
+ }
+
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Da Reader
+
+KviPackageReader::KviPackageReader()
+: KviPackageIOEngine()
+{
+}
+
+KviPackageReader::~KviPackageReader()
+{
+}
+
+bool KviPackageReader::readHeaderInternal(KviFile * pFile,const QString &szLocalFileName)
+{
+ // read the PackageHeader
+
+ // Magic
+ char magic[4];
+
+ if(pFile->readBlock(magic,4) != 4)return readError();
+ if((magic[0] != 'K') || (magic[1] != 'V') || (magic[2] != 'P') || (magic[3] != 'F'))
+ {
+ setLastError(__tr2qs("The file specified is not a valid KVIrc package"));
+ return false;
+ }
+
+ // Version
+ kvi_u32_t uVersion;
+ if(!pFile->load(uVersion))return readError();
+ if(uVersion != 0x1)
+ {
+ setLastError(__tr2qs("The package has an invalid version number, it might have been created by a newer KVIrc"));
+ return false;
+ }
+
+ // Flags
+ kvi_u32_t uFlags;
+ if(!pFile->load(uFlags))return readError();
+ // we ignore them at the moment
+
+ // read PackageInfo
+
+ // InfoFieldCount
+ kvi_u32_t uCount;
+ if(!pFile->load(uCount))return writeError();
+
+ m_pStringInfoFields->clear();
+ m_pBinaryInfoFields->clear();
+
+ kvi_u32_t uIdx = 0;
+ while(uIdx < uCount)
+ {
+ QString szKey;
+ if(!pFile->load(szKey))return readError();
+ kvi_u32_t uFieldType;
+ if(!pFile->load(uFieldType))return readError();
+ switch(uFieldType)
+ {
+ case KVI_PACKAGE_INFOFIELD_TYPE_STRING:
+ {
+ QString szValue;
+ if(!pFile->load(szValue))return readError();
+ m_pStringInfoFields->replace(szKey,new QString(szValue));
+ }
+ break;
+ case KVI_PACKAGE_INFOFIELD_TYPE_BINARYBUFFER:
+ {
+ QByteArray * pbValue = new QByteArray();
+ if(!pFile->load(*pbValue))
+ {
+ delete pbValue;
+ return readError();
+ }
+ m_pBinaryInfoFields->replace(szKey,pbValue);
+ }
+ break;
+ default:
+ setLastError(__tr2qs("Invalid info field: the package is probably corrupt"));
+ break;
+ }
+ uIdx++;
+ }
+
+ return true;
+}
+
+
+bool KviPackageReader::readHeader(const QString &szLocalFileName)
+{
+ KviFile f(szLocalFileName);
+ if(!f.open(IO_ReadOnly))
+ {
+ setLastError(__tr2qs("Can't open file for reading"));
+ return false;
+ }
+
+ return readHeaderInternal(&f,szLocalFileName);
+}
+
+bool KviPackageReader::unpackFile(KviFile * pFile,const QString &szUnpackPath)
+{
+ // Flags
+ kvi_u32_t uFlags;
+ if(!pFile->load(uFlags))return readError();
+
+#ifndef COMPILE_ZLIB_SUPPORT
+ if(uFlags & KVI_PACKAGE_DATAFIELD_FLAG_FILE_DEFLATE)
+ {
+ setLastError(__tr2qs("The package contains compressed data but this executable does not support compression"));
+ return false;
+ }
+#endif
+
+ // Path
+ QString szPath;
+ if(!pFile->load(szPath))return readError();
+
+ QString szFileName = szUnpackPath;
+ KviQString::ensureLastCharIs(szFileName,QChar(KVI_PATH_SEPARATOR_CHAR));
+
+ szFileName += szPath;
+
+ szFileName.replace(QString("..\\"),QString(""));
+ szFileName.replace(QString("..//"),QString(""));
+
+ KviFileUtils::adjustFilePath(szFileName);
+
+ int idx = szFileName.findRev(QChar(KVI_PATH_SEPARATOR_CHAR));
+ if(idx != -1)
+ {
+ QString szPrefixPath = szFileName.left(idx);
+ if(!KviFileUtils::makeDir(szPrefixPath))
+ {
+ setLastError(__tr2qs("Failed to create the target directory"));
+ return false;
+ }
+ }
+
+ KviFile dest(szFileName);
+ if(!dest.open(IO_WriteOnly | IO_Truncate))
+ {
+ setLastError(__tr2qs("Failed to open a source file for reading"));
+ return false;
+ }
+
+ QString szProgressText;
+ KviQString::sprintf(szProgressText,__tr2qs("Unpacking file %Q"),&szFileName);
+ if(!updateProgress(pFile->at(),szProgressText))
+ return false; // aborted
+
+ // Size
+ kvi_u32_t uSize;
+ if(!pFile->load(uSize))return readError();
+
+
+ // FilePayload
+#ifdef COMPILE_ZLIB_SUPPORT
+ if(uFlags & KVI_PACKAGE_DATAFIELD_FLAG_FILE_DEFLATE)
+ {
+ int iRemainingSize = uSize;
+ unsigned char ibuffer[BUFFER_SIZE];
+ unsigned char obuffer[BUFFER_SIZE];
+
+ int iToRead = iRemainingSize;
+ if(iToRead > BUFFER_SIZE)iToRead = BUFFER_SIZE;
+ int iReaded = pFile->readBlock((char *)ibuffer,iToRead);
+ iRemainingSize -= iReaded;
+
+ z_stream zstr;
+ zstr.zalloc = Z_NULL;
+ zstr.zfree = Z_NULL;
+ zstr.opaque = Z_NULL;
+ zstr.next_in = ibuffer;
+ zstr.avail_in = iReaded;
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+
+ if(inflateInit(&zstr) != Z_OK)
+ {
+ setLastError(__tr2qs("Compression library initialization error"));
+ return false;
+ }
+
+ while((iReaded > 0) && (iRemainingSize > 0))
+ {
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+
+ if(inflate(&zstr,Z_NO_FLUSH) != Z_OK)
+ {
+ setLastError(__tr2qs("Compression library error"));
+ return false;
+ }
+
+ if(zstr.avail_out < BUFFER_SIZE)
+ {
+ int iDecompressed = zstr.next_out - obuffer;
+ if(dest.writeBlock((char *)obuffer,iDecompressed) != iDecompressed)
+ {
+ inflateEnd(&zstr);
+ return writeError();
+ }
+ }
+
+ if(zstr.avail_in < BUFFER_SIZE)
+ {
+ int iDataToRead = BUFFER_SIZE - zstr.avail_in;
+ if(iDataToRead < BUFFER_SIZE)
+ {
+ if(ibuffer != zstr.next_in)
+ {
+ // hum, there is still some data in the buffer to be readed
+ // and it is not at the beginning...move it to the beginning of ibuffer
+ memmove(ibuffer,zstr.next_in,zstr.avail_in);
+ }
+ }
+
+ if(iDataToRead > iRemainingSize)
+ iDataToRead = iRemainingSize;
+
+ iReaded = pFile->readBlock((char *)(ibuffer + zstr.avail_in),iDataToRead);
+ if(iReaded < 0)
+ {
+ inflateEnd(&zstr);
+ return readError();
+ }
+
+ iRemainingSize -= iReaded;
+ zstr.avail_in += iReaded;
+ zstr.next_in = ibuffer;
+
+ if((zstr.total_in % 2000000) == 0)
+ {
+ QString szTmp;
+ KviQString::sprintf(szTmp,QString(" (%d of %d bytes)"),zstr.total_in,uSize);
+ QString szPrg = szProgressText + szTmp;
+ if(!updateProgress(pFile->at(),szPrg))
+ return false; // aborted
+ }
+ }
+ }
+
+ // flush pending output
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+
+ int ret;
+
+ do {
+ ret = inflate(&zstr,Z_FINISH);
+
+ if((ret == Z_OK) || (ret == Z_STREAM_END) || (ret == Z_BUF_ERROR))
+ {
+ if(zstr.avail_out < BUFFER_SIZE)
+ {
+ int iDecompressed = zstr.next_out - obuffer;
+ if(dest.writeBlock((char *)obuffer,iDecompressed) != iDecompressed)
+ {
+ inflateEnd(&zstr);
+ return writeError();
+ }
+ } /* else { THIS HAPPENS FOR ZERO SIZE FILES
+ debug("hum.... internal, rEWq (ret = %d) (avail_out = %d)",ret,zstr.avail_out);
+
+ inflateEnd(&zstr);
+ setLastError(__tr2qs("Compression library internal error"));
+ return false;
+ } */
+ zstr.next_out = obuffer;
+ zstr.avail_out = BUFFER_SIZE;
+ }
+
+ } while((ret == Z_OK) || (ret == Z_BUF_ERROR));
+
+ inflateEnd(&zstr);
+
+ if(ret != Z_STREAM_END)
+ {
+ setLastError(__tr2qs("Error in compressed file stream"));
+ return false;
+ }
+
+ } else {
+#endif
+ unsigned char buffer[BUFFER_SIZE];
+ int iTotalFileSize = 0;
+ int iRemainingData = uSize;
+ int iToRead = iRemainingData;
+ if(iToRead > BUFFER_SIZE)iToRead = BUFFER_SIZE;
+ int iReaded = 1;
+
+ while((iReaded > 0) && (iToRead > 0))
+ {
+ iReaded = pFile->readBlock((char *)buffer,iToRead);
+ if(iReaded > 0)
+ {
+ iTotalFileSize += iReaded;
+ iRemainingData -= iReaded;
+
+ if((iTotalFileSize % 3000000) == 0)
+ {
+ QString szTmp;
+ KviQString::sprintf(szTmp,QString(" (%d of %d bytes)"),iTotalFileSize,uSize);
+ QString szPrg = szProgressText + szTmp;
+ if(!updateProgress(pFile->at(),szPrg))
+ return false; // aborted
+ }
+
+ if(dest.writeBlock((char *)buffer,iReaded) != iReaded)
+ return writeError();
+ }
+
+ int iToRead = iRemainingData;
+ if(iToRead > BUFFER_SIZE)iToRead = BUFFER_SIZE;
+ }
+#ifdef COMPILE_ZLIB_SUPPORT
+ }
+#endif
+ dest.close();
+
+ return true;
+}
+
+bool KviPackageReader::unpack(const QString &szLocalFileName,const QString &szUnpackPath,kvi_u32_t uUnpackFlags)
+{
+ bool bRet = unpackInternal(szLocalFileName,szUnpackPath,uUnpackFlags);
+ hideProgressDialog();
+ return bRet;
+}
+
+bool KviPackageReader::unpackInternal(const QString &szLocalFileName,const QString &szUnpackPath,kvi_u32_t uUnpackFlags)
+{
+
+ KviFile f(szLocalFileName);
+ if(!f.open(IO_ReadOnly))
+ {
+ setLastError(__tr2qs("Can't open file for reading"));
+ return false;
+ }
+
+ KviFile::Offset size = f.size();
+
+ if(!(uUnpackFlags & NoProgressDialog))
+ {
+ showProgressDialog(__tr2qs("Reading package..."),size);
+ updateProgress(0,__tr2qs("Reading package header"));
+ }
+
+
+ if(!readHeaderInternal(&f,szLocalFileName))
+ return false;
+
+ if(!updateProgress(f.at(),__tr2qs("Reading package data")))
+ return false; // aborted
+
+ while(!f.atEnd())
+ {
+ // DataFieldType
+ kvi_u32_t uDataFieldType;
+ if(!f.load(uDataFieldType))return readError();
+ // DataFieldLen
+ kvi_u32_t uDataFieldLen;
+ if(!f.load(uDataFieldLen))return readError();
+
+ switch(uDataFieldType)
+ {
+ case KVI_PACKAGE_DATAFIELD_TYPE_FILE:
+ if(!unpackFile(&f,szUnpackPath))
+ return false;
+ break;
+ default:
+ setLastError(__tr2qs("Invalid data field: the package is probably corrupt"));
+ return false;
+ break;
+ }
+
+ }
+
+ return true;
+}
+
+
+
diff --git a/src/kvilib/file/kvi_packagefile.h b/src/kvilib/file/kvi_packagefile.h
new file mode 100644
index 000000000..f8e1439b6
--- /dev/null
+++ b/src/kvilib/file/kvi_packagefile.h
@@ -0,0 +1,141 @@
+#ifndef _KVI_PACKAGEFILE_H_
+#define _KVI_PACKAGEFILE_H_
+//=============================================================================
+//
+// File : kvi_packagefile.h
+// Created on Tue 26 Dec 2006 05:33:33 by Szymon Stefanek
+//
+// This file is part of the KVIrc IRC Client distribution
+// Copyright (C) 2006 Szymon Stefanek <pragma at kvirc dot net>
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+//=============================================================================
+
+#include "kvi_settings.h"
+#include "kvi_qstring.h"
+#include <qdict.h>
+#include <qobject.h>
+#include <qcstring.h> // QByteArray
+#include "kvi_list.h"
+
+class KviFile;
+class QProgressDialog;
+class QLabel;
+class QFileInfo;
+
+//
+// This class is used for creating KVIrc package files.
+// You simply instantiate it, add some info fields, add some files and then call pack().
+//
+
+class KVILIB_API KviPackageIOEngine
+{
+public:
+ KviPackageIOEngine();
+ virtual ~KviPackageIOEngine();
+protected:
+ QString m_szLastError;
+ QDict<QString> * m_pStringInfoFields;
+ QDict<QByteArray> * m_pBinaryInfoFields;
+ QProgressDialog * m_pProgressDialog;
+ QLabel * m_pProgressDialogLabel;
+public:
+ const QString & lastError(){ return m_szLastError; };
+ void setLastError(const QString &szLastError){ m_szLastError = szLastError; };
+ QDict<QString> * stringInfoFields(){ return m_pStringInfoFields; };
+ QDict<QByteArray> * binaryInfoFields(){ return m_pBinaryInfoFields; };
+protected:
+ void showProgressDialog(const QString &szCaption,int iTotalSteps);
+ void hideProgressDialog();
+ bool updateProgress(int iProgress,const QString &szLabel);
+ bool writeError();
+ bool readError();
+};
+
+#define KVI_PACKAGE_INFOFIELD_TYPE_STRING 1
+#define KVI_PACKAGE_INFOFIELD_TYPE_BINARYBUFFER 2
+
+#define KVI_PACKAGE_DATAFIELD_TYPE_FILE 1
+
+#define KVI_PACKAGE_DATAFIELD_FLAG_FILE_DEFLATE 1
+
+class KVILIB_API KviPackageWriter : public KviPackageIOEngine
+{
+public:
+ KviPackageWriter();
+ virtual ~KviPackageWriter();
+protected:
+
+ class DataField
+ {
+ public:
+ kvi_u32_t m_uType;
+ // output length of the field
+ kvi_u32_t m_uWrittenFieldLength;
+ // data fields for the File DataFieldType
+ bool m_bFileAllowCompression;
+ QString m_szFileLocalName;
+ QString m_szFileTargetName;
+ };
+
+ KviPtrList<DataField> * m_pDataFields;
+ int m_iCurrentProgress;
+public:
+ // Adds a file to the package. The file must be specified as absolute local
+ // path and as target path relative to the KVIrc local directory.
+ // ... more ?
+ enum AddFileFlags {
+ NoCompression = 1,
+ FollowSymLinks = 2
+ };
+ bool addFile(const QString &szLocalFileName,const QString &szTargetFileName,kvi_u32_t uAddFileFlags = 0);
+ bool addDirectory(const QString &szLocalDirectoryName,const QString &szTargetDirectoryPrefix,kvi_u32_t uAddFileFlags = 0);
+ // Adds an info field as a name=value pair
+ void addInfoField(const QString &szName,const QString &szValue);
+ void addInfoField(const QString &szName,QByteArray * pArray);
+ // Attempts to pack everything and store it as the specified file.
+ // There is no mandatory extension but you *should* use KVI_FILEEXTENSION_THEMEPACKAGE for themes
+ // and KVI_FILEEXTENSION_ADDONPACKAGE for addons. See kvi_fileextension.h
+ enum PackFlags {
+ NoProgressDialog = 1
+ };
+ bool pack(const QString &szFileName,kvi_u32_t uPackFlags = 0);
+private:
+ bool packInternal(const QString &szFileName,kvi_u32_t uPackFlags = 0);
+ bool packFile(KviFile * pFile,DataField * pDataField);
+ bool addFileInternal(const QFileInfo * fi,const QString &szLocalFileName,const QString &szTargetFileName,kvi_u32_t uAddFileFlags = 0);
+};
+
+class KVILIB_API KviPackageReader : public KviPackageIOEngine
+{
+public:
+ KviPackageReader();
+ virtual ~KviPackageReader();
+public:
+ bool readHeader(const QString &szLocalFileName);
+ enum UnpackFlags {
+ NoProgressDialog = 1
+ };
+ bool unpack(const QString &szLocalFileName,const QString &szUnpackPath,kvi_u32_t uUnpackFlags = 0);
+private:
+ bool unpackInternal(const QString &szLocalFileName,const QString &szUnpackPath,kvi_u32_t uUnpackFlags = 0);
+ bool unpackFile(KviFile * pFile,const QString &szUnpackPath);
+ bool readHeaderInternal(KviFile * pFile,const QString &szLocalFileName);
+};
+
+
+
+#endif //!_KVI_PACKAGEFILE_H_
diff --git a/src/kvilib/file/kvi_targzfile.h b/src/kvilib/file/kvi_targzfile.h
index af9462620..db38a4b82 100644
--- a/src/kvilib/file/kvi_targzfile.h
+++ b/src/kvilib/file/kvi_targzfile.h
@@ -33,4 +33,6 @@ public:
KviGzPacker(){};
~KviGzPacker(){};
}
+
+
#endif //_KVI_TARGZFILE_H_
diff --git a/src/kvirc/kernel/kvi_coreactionnames.h b/src/kvirc/kernel/kvi_coreactionnames.h
index c1635922f..18080825a 100644
--- a/src/kvirc/kernel/kvi_coreactionnames.h
+++ b/src/kvirc/kernel/kvi_coreactionnames.h
@@ -63,6 +63,6 @@
#define KVI_COREACTION_EDITREGUSERS (KVI_COREACTION_NAME_PREFIX "editregusers")
#define KVI_COREACTION_MANAGEADDONS (KVI_COREACTION_NAME_PREFIX "manageaddons")
#define KVI_COREACTION_THEMEOPTIONS (KVI_COREACTION_NAME_PREFIX "themeoptions")
-#define KVI_COREACTION_THEMESELECT (KVI_COREACTION_NAME_PREFIX "themeselect")
+#define KVI_COREACTION_MANAGETHEMES (KVI_COREACTION_NAME_PREFIX "managethemes")
#endif //!_KVI_COREACTIONNAMES_H_
diff --git a/src/kvirc/kernel/kvi_coreactions.cpp b/src/kvirc/kernel/kvi_coreactions.cpp
index 62acc8d0e..86dd1c712 100644
--- a/src/kvirc/kernel/kvi_coreactions.cpp
+++ b/src/kvirc/kernel/kvi_coreactions.cpp
@@ -68,6 +68,7 @@
// Ctrl+Alt+H : Show help index
// Ctrl+Alt+R : Edit regusers
// Ctrl+Alt+M : Manage Script Addons
+// Ctrl+Alt+L : Manage Themes
void register_core_actions(KviActionManager * m)
{
@@ -210,15 +211,15 @@ void register_core_actions(KviActionManager * m)
"Ctrl+Alt+T");
SCRIPT_ACTION(
- KVI_COREACTION_THEMESELECT,
- "options.edit KviThemeOptionsWidget",
+ KVI_COREACTION_MANAGETHEMES,
+ "theme.dialog",
__tr2qs("Manage Themes..."),
- __tr2qs("Shows the theme manager dialog"),
+ __tr2qs("Allows you to manage the themes"),
KviActionManager::categorySettings(),
- "kvi_bigicon_themeoptions.png",
- KVI_SMALLICON_THEMEOPTIONS,
+ "kvi_bigicon_themes.png",
+ KVI_SMALLICON_THEMES,
0,
- "");
+ "Ctrl+Alt+L");
SCRIPT_ACTION(
KVI_COREACTION_TOOLBAREDITOR,
diff --git a/src/kvirc/kernel/kvi_iconmanager.cpp b/src/kvirc/kernel/kvi_iconmanager.cpp
index e6da7e104..a2edb1fea 100644
--- a/src/kvirc/kernel/kvi_iconmanager.cpp
+++ b/src/kvirc/kernel/kvi_iconmanager.cpp
@@ -340,7 +340,9 @@ static const char * g_szIconNames[KVI_NUM_SMALL_ICONS]=
"saykvs", // 286
"themeoptions", // 287
"bug", // 288
- "refresh" //289
+ "refresh", //289
+ "theme", // 290
+ "themes" // 291
};
KviIconWidget::KviIconWidget()
diff --git a/src/kvirc/kernel/kvi_iconmanager.h b/src/kvirc/kernel/kvi_iconmanager.h
index 3328f810d..99e58e337 100644
--- a/src/kvirc/kernel/kvi_iconmanager.h
+++ b/src/kvirc/kernel/kvi_iconmanager.h
@@ -328,8 +328,10 @@
#define KVI_SMALLICON_THEMEOPTIONS 287
#define KVI_SMALLICON_BUG 288
#define KVI_SMALLICON_REFRESH 289
+#define KVI_SMALLICON_THEME 290
+#define KVI_SMALLICON_THEMES 291
-#define KVI_NUM_SMALL_ICONS 290
+#define KVI_NUM_SMALL_ICONS 292
#define KVI_BIGICON_DISCONNECTED "kvi_bigicon_disconnected.png"
@@ -343,6 +345,7 @@
#define KVI_BIGICON_KVS "kvi_bigicon_kvs.png"
#define KVI_BIGICON_THEME "kvi_bigicon_theme.png"
#define KVI_BIGICON_ADDONS "kvi_bigicon_addons.png"
+#define KVI_BIGICON_THEMES "kvi_bigicon_themes.png"
#define KVI_BIGICON_HELPINDEX "kvi_bigicon_helpindex.png"
#define KVI_BIGICON_HELPBACK "kvi_bigicon_helpback.png"
@@ -354,6 +357,7 @@
#define KVI_BIGICON_SAVE "kvi_bigicon_save.png"
#define KVI_BIGICON_REMOVE "kvi_bigicon_remove.png"
#define KVI_BIGICON_WWW "kvi_bigicon_www.png"
+#define KVI_BIGICON_PACK "kvi_bigicon_pack.png"
#define KVI_SMALLICONS_SUBDIRECTORY "coresmall"
#define KVI_SMALLICONS_PREFIX "kcs_"
diff --git a/src/kvirc/kernel/kvi_ircconnectionstatedata.h b/src/kvirc/kernel/kvi_ircconnectionstatedata.h
index 2860f1598..12da18bd4 100644
--- a/src/kvirc/kernel/kvi_ircconnectionstatedata.h
+++ b/src/kvirc/kernel/kvi_ircconnectionstatedata.h
@@ -50,6 +50,7 @@ protected:
bool m_bSimulateUnexpectedDisconnect; // this is set to true if we have to simulate an unexpected disconnect even if we have sent a normal quit message
kvi_time_t m_tLastReceivedChannelWhoReply; // the time that we have received our last channel who reply
kvi_time_t m_tLastSentChannelWhoRequest; // the time that we have sent our last channel who request
+ kvi_time_t m_tLastReceivedWhoisReply; // the time that we have received the last whois reply, reset to 0 when we receive an /END OF WHOIS
public:
bool sentQuit(){ return m_bSentQuit; };
void setSentQuit(){ m_bSentQuit = true; };
@@ -59,6 +60,9 @@ public:
kvi_time_t lastSentChannelWhoRequest(){ return m_tLastSentChannelWhoRequest; };
void setLastSentChannelWhoRequest(kvi_time_t tTime){ m_tLastSentChannelWhoRequest = tTime; };
+
+ kvi_time_t lastReceivedWhoisReply(){ return m_tLastReceivedWhoisReply; };
+ void setLastReceivedWhoisReply(kvi_time_t tTime){ m_tLastReceivedWhoisReply = tTime; };
bool simulateUnexpectedDisconnect(){ return m_bSimulateUnexpectedDisconnect; };
void setSimulateUnexpectedDisconnect(){ m_bSimulateUnexpectedDisconnect = true; };
diff --git a/src/kvirc/sparser/kvi_ircmessage.h b/src/kvirc/sparser/kvi_ircmessage.h
index a70d6ca3b..45d99817f 100644
--- a/src/kvirc/sparser/kvi_ircmessage.h
+++ b/src/kvirc/sparser/kvi_ircmessage.h
@@ -6,7 +6,7 @@
// Creation date : Fri Aug 2 23:08:55 2002 GMT by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
-// Copyright (C) 2002 Szymon Stefanek (pragma at kvirc dot net)
+// Copyright (C) 2002-2006 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -56,13 +56,10 @@ private:
KviStr m_szPrefix; // the extracted prefix string
KviStr m_szCommand; // the extracted command (may be numeric)
KviPtrList<KviStr> * m_pParams; // the list of parameters
- //KviPtrList<QCString> * m_pcParams; QCString has same data as KviStr and has worse management than KviStr (beside other thingies, it CAN be null)
- // the pointer was also mem-leaked :(
KviConsole * m_pConsole; // the console we're attacched to
KviIrcConnection * m_pConnection; // the connection we're attacched to
int m_iNumericCommand; // the numeric of the command (0 if non numeric)
int m_iFlags; // yes.. flags :D
- //QCString m_SafeTrailingString;
public:
KviConsole * console(){ return m_pConsole; };
KviIrcConnection * connection(){ return m_pConsole->connection(); };
@@ -82,17 +79,14 @@ public:
int paramCount(){ return m_pParams->count(); };
const char * param(unsigned int idx){ return (idx < m_pParams->count()) ? m_pParams->at(idx)->ptr() : 0; };
- //const QCString * cParam(unsigned int idx){ return (idx < m_pcParams->count()) ? m_pcParams->at(idx) : 0; };
const char * safeParam(unsigned int idx){ return (idx < m_pParams->count()) ? m_pParams->at(idx)->ptr() : KviStr::emptyString().ptr(); };
- //const QCString * cSafeParam(unsigned int idx){ return (idx < m_pcParams->count()) ? m_pcParams->at(idx) : new QCString(); }; <-- this leaks memory
KviStr * paramString(unsigned int idx){ return m_pParams->at(idx); };
const char * trailing(){ KviStr * tr = m_pParams->last(); return tr ? tr->ptr() : 0; };
KviStr * trailingString(){ return m_pParams->last(); };
KviStr & safeTrailingString(){ KviStr * tr = m_pParams->last(); return tr ? *tr : KviStr::emptyString(); };
- //QCString & qcSafeTrailingString() { return m_SafeTrailingString; };
const char * safeTrailing(){ KviStr * tr = m_pParams->last(); return tr ? tr->ptr() : KviStr::emptyString().ptr(); };
const char * allParams(){ return m_ptr; };
diff --git a/src/kvirc/sparser/kvi_sp_numeric.cpp b/src/kvirc/sparser/kvi_sp_numeric.cpp
index 0006e0f50..52f4d9f9d 100644
--- a/src/kvirc/sparser/kvi_sp_numeric.cpp
+++ b/src/kvirc/sparser/kvi_sp_numeric.cpp
@@ -1004,6 +1004,8 @@ void KviServerParser::parseNumericNicknameProblem(KviIrcMessage *msg)
void KviServerParser::parseNumericWhoisAway(KviIrcMessage * msg)
{
// FIXME: #warning "Need an icon here too: sth like KVI_OUT_WHOISSERVER, but with 'A' letter"
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
+
QString szNk = msg->connection()->decodeText(msg->safeParam(1));
KviIrcUserDataBase * db = msg->connection()->userDataBase();
KviIrcUserEntry * e = db->find(szNk);
@@ -1026,6 +1028,8 @@ void KviServerParser::parseNumericWhoisUser(KviIrcMessage *msg)
{
// 311: RPL_WHOISUSER [I,E,U,D]
// :prefix 311 <target> <nick> <user> <host> * :<real_name>
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
+
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
QString szUser = msg->connection()->decodeText(msg->safeParam(2));
QString szHost = msg->connection()->decodeText(msg->safeParam(3));
@@ -1076,6 +1080,7 @@ void KviServerParser::parseNumericWhowasUser(KviIrcMessage * msg)
{
// 314: RPL_WHOWASUSER [I,E,U,D]
// :prefix 314 <target> <nick> <user> <host> * :<real_name>
+
if(!msg->haltOutput())
{
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
@@ -1101,6 +1106,8 @@ void KviServerParser::parseNumericWhoisChannels(KviIrcMessage *msg)
// 319: RPL_WHOISCHANNELS [I,E,U,D]
// :prefix 319 <target> <nick> :<channel list>
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
+
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
QString szChans = msg->connection()->decodeText(msg->safeTrailing());
@@ -1163,6 +1170,7 @@ void KviServerParser::parseNumericWhoisIdle(KviIrcMessage *msg)
// :prefix 317 <target> <nick> <number> <number> :seconds idle, signon time
// FIXME: #warning "and NICK LINKS"
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
@@ -1218,6 +1226,7 @@ void KviServerParser::parseNumericWhoisServer(KviIrcMessage *msg)
{
// 312: RPL_WHOISSERVER [I,E,U,D] (sent also in response to WHOWAS)
// :prefix 312 <target> <nick> <server> :<server description / last whowas date>
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
QString szServ = msg->connection()->decodeText(msg->safeParam(2));
@@ -1250,6 +1259,7 @@ void KviServerParser::parseNumericWhoisAuth(KviIrcMessage *msg)
{
// :prefix RPL_WHOISAUTH <target> <nick> :is authed as
// actually seen only on Quakenet
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
QString szAuth = msg->connection()->decodeText(msg->safeParam(2));
@@ -1270,6 +1280,10 @@ void KviServerParser::parseNumericWhoisOther(KviIrcMessage *msg)
// :prefix * <target> <nick> :<description>
// used for RPL_WHOISCHANOP,RPL_WHOISADMIN,
// RPL_WHOISSADMIN,RPL_WHOISOPERATOR,RPL_WHOISREGNICK,RPL_WHOISSSL
+ // and all the other unrecognized codes that look really like a RPL_WHOIS*
+
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
+
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
QString szOth = msg->connection()->decodeText(msg->safeTrailing());
@@ -1298,6 +1312,9 @@ void KviServerParser::parseNumericEndOfWhois(KviIrcMessage *msg)
{
// 318: RPL_ENDOFWHOIS [I,E,U,D]
// :prefix 318 <target> <nick> :End of /WHOIS list
+
+ msg->connection()->stateData()->setLastReceivedWhoisReply(0);
+
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
KviAsyncWhoisInfo * i = msg->connection()->asyncWhoisData()->lookup(szNick);
@@ -1909,6 +1926,9 @@ void KviServerParser::parseNumericCodePageScheme(KviIrcMessage *msg)
// a nice extension for irc.wenet.ru
// 703: RPL_WHOISSCHEME
// :prefix 703 <mynick> <nick> <encoding> :translation scheme
+
+ msg->connection()->stateData()->setLastReceivedWhoisReply(kvi_unixTime());
+
if(msg->connection()->serverInfo()->supportsCodePages())
{
QString szNick = msg->connection()->decodeText(msg->safeParam(1));
diff --git a/src/kvirc/sparser/kvi_sparser.cpp b/src/kvirc/sparser/kvi_sparser.cpp
index cb39fb4a2..272728c91 100644
--- a/src/kvirc/sparser/kvi_sparser.cpp
+++ b/src/kvirc/sparser/kvi_sparser.cpp
@@ -32,6 +32,7 @@
#include "kvi_options.h"
#include "kvi_kvs_eventmanager.h"
#include "kvi_kvs_eventtriggers.h"
+#include "kvi_ircconnectionstatedata.h"
KviServerParser * g_pServerParser = 0;
@@ -70,6 +71,30 @@ void KviServerParser::parseMessage(const char * message,KviIrcConnection * pConn
{
(this->*proc)(&msg);
if(!msg.unrecognized())return; // parsed
+ } else {
+ // we don't have a proc for this
+
+ // special handling of unknown RPL_WHOIS* messages
+ // if
+ // - we're in the middle of a RPL_WHOIS* sequence (i.e. have received a RPL_WHOIS* message since less than 10 seconds)
+ // - we have not received RPL_ENDOFWHOIS yet (the time of the last RPL_WHOIS* is reset to zero when a RPL_ENDOFWHOIS is received)
+ // - this message is unrecognized and looks like a RPL_WHOIS*
+ // then pass it to the WhoisOther handler.
+ //
+ // Thnx Elephantman :)
+
+ if(msg.paramCount() >= 3) // might look like :prefix RPL_WHOIS* <target> <nick> [?] :<something>
+ {
+ kvi_time_t tNow = kvi_unixTime();
+
+ if((tNow - pConnection->stateData()->lastReceivedWhoisReply()) < 10)
+ {
+ // we're in the middle of a RPL_WHOIS* sequence and haven't
+ // received a RPL_ENDOFWHOIS yet.
+ parseNumericWhoisOther(&msg);
+ if(!msg.unrecognized())return;
+ }
+ }
}
} else {
for(int i=0;m_literalParseProcTable[i].msgName;i++)
@@ -97,6 +122,7 @@ void KviServerParser::parseMessage(const char * message,KviIrcConnection * pConn
}
+ // unhandled || unrecognized
if(!msg.haltOutput() && !_OUTPUT_MUTE)
{
QString szWText = pConnection->decodeText(msg.allParams());
@@ -108,7 +134,6 @@ void KviServerParser::parseMessage(const char * message,KviIrcConnection * pConn
__tr2qs("[Server parser]: [%s][%s] %Q"),msg.prefix(),msg.command(),&szWText);
pConnection->console()->output(KVI_OUT_UNRECOGNIZED,
__tr2qs("[Server parser]: %s"),m_szLastParserError.ptr());
-
} else {
// ignore spurious CRLF pairs (some servers send them a lot) unless we want PARANOID output
if((!msg.isEmpty()) || _OUTPUT_PARANOIC)
diff --git a/src/kvirc/ui/kvi_menubar.cpp b/src/kvirc/ui/kvi_menubar.cpp
index 836bf1b3c..be5ee7e88 100644
--- a/src/kvirc/ui/kvi_menubar.cpp
+++ b/src/kvirc/ui/kvi_menubar.cpp
@@ -144,7 +144,7 @@ void KviMenuBar::setupSettingsPopup()
// FIXME: #warning "Toggle these items on the fly ?"
ACTION_POPUP_ITEM(KVI_COREACTION_GENERALOPTIONS,opt)
ACTION_POPUP_ITEM(KVI_COREACTION_THEMEOPTIONS,opt)
- ACTION_POPUP_ITEM(KVI_COREACTION_THEMESELECT,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_MANAGETHEMES,opt)
ACTION_POPUP_ITEM(KVI_COREACTION_MANAGEADDONS,opt)
ACTION_POPUP_ITEM(KVI_COREACTION_SERVEROPTIONS,opt)
ACTION_POPUP_ITEM(KVI_COREACTION_TOOLBAREDITOR,opt)
diff --git a/src/kvirc/ui/kvi_msgbox.cpp b/src/kvirc/ui/kvi_msgbox.cpp
index d54ac609c..b2ed8fde9 100644
--- a/src/kvirc/ui/kvi_msgbox.cpp
+++ b/src/kvirc/ui/kvi_msgbox.cpp
@@ -52,7 +52,7 @@ namespace KviMessageBox
#endif
}
- void infoBox(const QString &fmt,...)
+ void information(const QString &fmt,...)
{
kvi_va_list list;
kvi_va_start_by_reference(list,fmt);
diff --git a/src/kvirc/ui/kvi_selectors.cpp b/src/kvirc/ui/kvi_selectors.cpp
index 43285c140..93981d756 100644
--- a/src/kvirc/ui/kvi_selectors.cpp
+++ b/src/kvirc/ui/kvi_selectors.cpp
@@ -300,9 +300,11 @@ void KviPixmapSelector::setEnabled(bool bEnabled)
// FIXME: #warning "Option for DIR_MUST_EXISTS...(this widget could be turned into a file selector too)"
-KviFileSelector::KviFileSelector(QWidget * par,const QString & txt,QString * pOption,bool bEnabled)
+KviFileSelector::KviFileSelector(QWidget * par,const QString & txt,QString * pOption,bool bEnabled,unsigned int uFlags,const QString &szFilter)
: QHBox(par), KviSelectorInterface()
{
+ m_uFlags = uFlags;
+ m_szFilter = szFilter;
m_pLabel = new QLabel(txt,this);
m_pLineEdit = new QLineEdit(this);
//m_pLineEdit->setMinimumWidth(200);
@@ -337,13 +339,29 @@ void KviFileSelector::browseClicked()
select();
}
+void KviFileSelector::setSelection(const QString &szSelection)
+{
+ m_pLineEdit->setText(szSelection);
+}
+
+
void KviFileSelector::select()
{
//KviStr tmp;
- QString tmp;
- if(KviFileDialog::askForOpenFileName(tmp,__tr2qs("Choose a File - KVIrc")))
+ QString tmp = *m_pOption;
+ if(m_uFlags & ChooseSaveFileName)
{
- m_pLineEdit->setText(tmp);
+ if(KviFileDialog::askForSaveFileName(tmp,__tr2qs("Choose a File - KVIrc"),tmp,m_szFilter,true,!(m_uFlags & DontConfirmOverwrite)))
+ {
+ m_pLineEdit->setText(tmp);
+ emit selectionChanged(tmp);
+ }
+ } else {
+ if(KviFileDialog::askForOpenFileName(tmp,__tr2qs("Choose a File - KVIrc"),tmp,m_szFilter,true))
+ {
+ m_pLineEdit->setText(tmp);
+ emit selectionChanged(tmp);
+ }
}
}
diff --git a/src/kvirc/ui/kvi_selectors.h b/src/kvirc/ui/kvi_selectors.h
index eece52d63..d0fb3cedf 100644
--- a/src/kvirc/ui/kvi_selectors.h
+++ b/src/kvirc/ui/kvi_selectors.h
@@ -181,16 +181,26 @@ class KVIRC_API KviFileSelector : public QHBox, public KviSelectorInterface
{
Q_OBJECT
public:
- KviFileSelector(QWidget * par,const QString & txt,QString * pOption,bool bEnabled);
+ KviFileSelector(QWidget * par,const QString & txt,QString * pOption,bool bEnabled,unsigned int uFlags = 0,const QString &szFilter = QString::null);
~KviFileSelector(){};
+public:
+ enum Flags {
+ ChooseSaveFileName = 1,
+ DontConfirmOverwrite = 2
+ };
protected:
QLabel * m_pLabel;
QLineEdit * m_pLineEdit;
QPushButton * m_pButton;
QString * m_pOption;
+ unsigned int m_uFlags;
+ QString m_szFilter;
public:
virtual void commit();
virtual void setEnabled(bool bEnabled);
+ void setSelection(const QString &szSelection);
+signals:
+ void selectionChanged(const QString &szNewValue);
private slots:
void browseClicked();
protected:
diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am
index f0290648e..388cb6daf 100644
--- a/src/modules/Makefile.am
+++ b/src/modules/Makefile.am
@@ -52,6 +52,7 @@ SUBDIRS = about \
system \
term \
texticons \
+ theme \
tip \
tmphighlight \
toolbar \
diff --git a/src/modules/help/libkvihelp.cpp b/src/modules/help/libkvihelp.cpp
index 46c8d8586..a9ea33eb3 100644
--- a/src/modules/help/libkvihelp.cpp
+++ b/src/modules/help/libkvihelp.cpp
@@ -135,7 +135,6 @@ static bool help_kvs_cmd_search(KviKvsModuleCommandCall * c)
static bool help_kvs_cmd_open(KviKvsModuleCommandCall * c)
{
-
QString doc;
KVSM_PARAMETERS_BEGIN(c)
KVSM_PARAMETER("document",KVS_PT_STRING,KVS_PF_OPTIONAL,doc)
@@ -150,12 +149,11 @@ static bool help_kvs_cmd_open(KviKvsModuleCommandCall * c)
if(!c->switches()->find('n',"new"))
{
- KviHelpWidget * w = (KviHelpWidget *)c->window()->frame()->child(
- "help_widget","KviHelpWidget");
-
+ KviHelpWidget * w = (KviHelpWidget *)c->window()->frame()->child("help_widget","KviHelpWidget");
if(w)
{
w->textBrowser()->setSource(doc);
+ return true;
}
}
if(c->switches()->find('m',"mdi"))
diff --git a/src/modules/options/instances.cpp b/src/modules/options/instances.cpp
index db11329f7..1e59137ae 100644
--- a/src/modules/options/instances.cpp
+++ b/src/modules/options/instances.cpp
@@ -426,11 +426,6 @@ KviOptionsWidget * classKviTextIconsOptionsWidget_createInstanceProc(QWidget * p
return new KviTextIconsOptionsWidget(parent);
}
-KviOptionsWidget * classKviThemeOptionsWidget_createInstanceProc(QWidget * parent)
-{
- return new KviThemeOptionsWidget(parent);
-}
-
KviOptionsWidget * classKviToolsOptionsWidget_createInstanceProc(QWidget * parent)
{
return new KviToolsOptionsWidget(parent);
@@ -618,8 +613,6 @@ static const char * g_szName_KviTextEncodingOptionsWidget = KVI_OPTIONS_WIDGET_N
static const char * g_szClassName_KviTextEncodingOptionsWidget = "KviTextEncodingOptionsWidget";
static const char * g_szName_KviTextIconsOptionsWidget = KVI_OPTIONS_WIDGET_NAME_KviTextIconsOptionsWidget;
static const char * g_szClassName_KviTextIconsOptionsWidget = "KviTextIconsOptionsWidget";
-static const char * g_szName_KviThemeOptionsWidget = KVI_OPTIONS_WIDGET_NAME_KviThemeOptionsWidget;
-static const char * g_szClassName_KviThemeOptionsWidget = "KviThemeOptionsWidget";
static const char * g_szName_KviToolsOptionsWidget = KVI_OPTIONS_WIDGET_NAME_KviToolsOptionsWidget;
static const char * g_szClassName_KviToolsOptionsWidget = "KviToolsOptionsWidget";
static const char * g_szName_KviTopicLabelLookOptionsWidget = KVI_OPTIONS_WIDGET_NAME_KviTopicLabelLookOptionsWidget;
@@ -3204,40 +3197,6 @@ KviOptionsInstanceManager::KviOptionsInstanceManager()
e1->pChildList = 0;
e0 = new KviOptionsWidgetInstanceEntry;
- e0->createProc = &classKviThemeOptionsWidget_createInstanceProc;
- e0->pWidget = 0;
- e0->szClassName = g_szClassName_KviThemeOptionsWidget;
- e0->iIcon = KVI_OPTIONS_WIDGET_ICON_KviThemeOptionsWidget;
- #ifdef KVI_OPTIONS_WIDGET_PRIORITY_KviThemeOptionsWidget
- e0->iPriority = KVI_OPTIONS_WIDGET_PRIORITY_KviThemeOptionsWidget;
- #else
- e0->iPriority = 0;
- #endif
- #ifdef KVI_OPTIONS_WIDGET_KEYWORDS_KviThemeOptionsWidget
- e0->szKeywordsNoLocale = KVI_OPTIONS_WIDGET_KEYWORDS_KviThemeOptionsWidget;
- e0->szKeywords = __tr2qs_ctx_no_xgettext(e0->szKeywordsNoLocale,"options");;
- #endif
- #ifdef KVI_OPTIONS_WIDGET_GROUP_KviThemeOptionsWidget
- e0->szGroup = KVI_OPTIONS_WIDGET_GROUP_KviThemeOptionsWidget;
- #else
- e0->szGroup = "general";
- #endif
- #ifdef KVI_OPTIONS_WIDGET_CONTAINER_KviThemeOptionsWidget
- e0->bIsContainer = KVI_OPTIONS_WIDGET_CONTAINER_KviThemeOptionsWidget;
- #else
- e0->bIsContainer = false;
- #endif
- #ifdef KVI_OPTIONS_WIDGET_NOTCONTAINED_KviThemeOptionsWidget
- e0->bIsNotContained = KVI_OPTIONS_WIDGET_NOTCONTAINED_KviThemeOptionsWidget;
- #else
- e0->bIsNotContained = false;
- #endif
- e0->szNameNoLocale = g_szName_KviThemeOptionsWidget;
- e0->szName = __tr2qs_ctx_no_xgettext(g_szName_KviThemeOptionsWidget,"options");
- m_pInstanceTree->append(e0);
- e0->pChildList = 0;
-
- e0 = new KviOptionsWidgetInstanceEntry;
e0->createProc = &classKviTopicLabelLookOptionsWidget_createInstanceProc;
e0->pWidget = 0;
e0->szClassName = g_szClassName_KviTopicLabelLookOptionsWidget;
diff --git a/src/modules/options/optw_theme.cpp b/src/modules/options/optw_theme.cpp
index a4eb1bb4c..9906b7ec1 100644
--- a/src/modules/options/optw_theme.cpp
+++ b/src/modules/options/optw_theme.cpp
@@ -22,588 +22,5 @@
//
//=============================================================================
-#define LVI_ICON_SIZE 32
-#define LVI_BORDER 4
-#define LVI_SPACING 8
-#define LVI_MINIMUM_TEXT_WIDTH 300
-#define LVI_MINIMUM_CELL_WIDTH (LVI_MINIMUM_TEXT_WIDTH + LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER)
-
-#include "optw_theme.h"
-#include "kvi_xmladdonloader.h"
-#include "kvi_iconmanager.h"
-#include "kvi_msgbox.h"
-
-#include <qlayout.h>
-#include <qpushbutton.h>
-#include <qlistbox.h>
-#include <qlineedit.h>
-#include <qtextedit.h>
-#include <qregexp.h>
-#include <qmessagebox.h>
-#include <qdir.h>
-#include <qstringlist.h>
-#include <qdatetime.h>
-#include <qfiledialog.h>
-#include <qpopupmenu.h>
-#include <qcombobox.h>
-#include <qpainter.h>
-#include <qtooltip.h>
-
-#include "kvi_options.h"
-#include "kvi_locale.h"
-#include "kvi_config.h"
-#include "kvi_fileutils.h"
-#include "kvi_app.h"
-#include "kvi_frame.h"
-#include "kvi_iconmanager.h"
-#include "kvi_internalcmd.h"
-#include "kvi_styled_controls.h"
-#include "kvi_doublebuffer.h"
-
-#include <stdlib.h> // rand & srand
-
-
-KviSaveThemeDialog::KviSaveThemeDialog(QWidget * par)
-: QDialog(par)
-{
- setCaption(__tr2qs_ctx("Save Current Theme","options"));
-
- QGridLayout * g = new QGridLayout(this,8,2,4,4);
-
- QLabel * l;
-
- l = new QLabel(__tr2qs_ctx("Theme name:","options"),this);
- g->addWidget(l,0,0);
-
- m_pThemeNameEdit = new QLineEdit(this);
- g->addMultiCellWidget(m_pThemeNameEdit,0,0,1,2);
- connect(m_pThemeNameEdit,SIGNAL(textChanged(const QString &)),this,SLOT(themeNameChanged(const QString &)));
-
-
- l = new QLabel(__tr2qs_ctx("Version:","options"),this);
- g->addWidget(l,1,0);
-
- m_pVersionEdit = new QLineEdit(this);
- g->addMultiCellWidget(m_pVersionEdit,1,1,1,2);
-
-
- l = new QLabel(__tr2qs_ctx("Author:","options"),this);
- g->addWidget(l,2,0);
-
- m_pAuthorEdit = new QLineEdit(this);
- g->addMultiCellWidget(m_pAuthorEdit,2,2,1,2);
-
- l = new QLabel(__tr2qs_ctx("Description:","options"),this);
- g->addWidget(l,3,0);
-
- m_pDescriptionEdit = new QTextEdit(this);
- g->addMultiCellWidget(m_pDescriptionEdit,3,4,1,2);
-
- m_pIncludeMsgcolors = new KviStyledCheckBox( __tr2qs_ctx("Include message colors information","options"), this );
- m_pIncludeMsgcolors->setChecked(TRUE);
- g->addMultiCellWidget(m_pIncludeMsgcolors,5,5,0,1);
-
- l = new QLabel(__tr2qs_ctx("Package type:","options"),this);
- g->addWidget(l,6,0);
-
- m_pFormatCombo = new QComboBox(this);
- m_pFormatCombo->insertItem(__tr2qs_ctx("KVIrc Package","options"),0);
-// m_pFormatCombo->insertItem(__tr2qs_ctx("New multi-file format","options"),1);
- m_pFormatCombo->insertItem(__tr2qs_ctx("Dublicate Theme","options"),1);
- g->addWidget(m_pFormatCombo,6,1);
-
- QHBox * h = new QHBox(this);
- h->setSpacing(7);
- g->addWidget(h,7,2);
- m_pOkButton = new QPushButton(__tr2qs_ctx("OK","options"),h);
- m_pOkButton->setEnabled(false);
- connect(m_pOkButton,SIGNAL(clicked()),this,SLOT(saveTheme()));
- m_pOkButton->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT)));
-
- QPushButton * pb = new QPushButton(__tr2qs_ctx("Cancel","options"),h);
- connect(pb,SIGNAL(clicked()),this,SLOT(reject()));
- pb->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DISCARD)));
-
-}
-
-KviSaveThemeDialog::~KviSaveThemeDialog()
-{
-
-}
-
-void KviSaveThemeDialog::themeNameChanged(const QString &txt)
-{
- m_pOkButton->setEnabled(!txt.isEmpty());
-}
-
-void KviSaveThemeDialog::saveThemeInOldFormat(KviThemeInfo& sto)
-{
- if(!KviFileUtils::directoryExists(sto.szAbsoluteDirectory))
- {
- g_pApp->getLocalKvircDirectory(sto.szAbsoluteDirectory,KviApp::Themes,sto.szSubdirectory,true);
- if(!KviFileUtils::makeDir(sto.szAbsoluteDirectory))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Unable to create theme directory.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- }
- g_pApp->saveTheme(sto);
- // write down the images
-
- QString szMsg = __tr2qs_ctx("Theme saved successfully to ","options");
- szMsg += sto.szAbsoluteDirectory;
-
- QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","options"),szMsg,QMessageBox::Ok,
- QMessageBox::NoButton,QMessageBox::NoButton);
-}
-
-void KviSaveThemeDialog::saveThemeInNewFormat(KviThemeInfo& sto)
-{
- QString szBaseDir;
- QFileDialog * d = new QFileDialog(this);
- d->setCaption(__tr2qs_ctx("Choose save directory","options"));
- d->setMode(QFileDialog::DirectoryOnly);
- if(d->exec() == QDialog::Accepted)
- {
- szBaseDir = d->selectedFile();
- KviFileUtils::adjustFilePath(szBaseDir);
- delete d;
- if(szBaseDir.isEmpty())
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("You must select save directory","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- } else {
- delete d;
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("You must select save directory","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- KviQString::ensureLastCharIs(szBaseDir,KVI_PATH_SEPARATOR_CHAR);
- sto.szAbsoluteDirectory=szBaseDir+sto.szSubdirectory;
- KviQString::ensureLastCharIs(sto.szAbsoluteDirectory,KVI_PATH_SEPARATOR_CHAR);
- QString szThemeDir=sto.szAbsoluteDirectory;
- sto.szAbsoluteDirectory+="files";
-
- if(!KviFileUtils::makeDir(sto.szAbsoluteDirectory))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Unable to create theme files directory.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
-
- g_pApp->saveTheme(sto);
-
- if(!KviFileUtils::makeDir(szThemeDir+"utils"))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Unable to create theme utils directory.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
-
- QString szInstallerScript;
- g_pApp->getGlobalKvircDirectory(szInstallerScript,KviApp::DefScript,"installer.kvs");
- if(!KviFileUtils::fileExists(szInstallerScript))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Cannot find installer.kvs.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
-
- if(!KviFileUtils::copyFile(szInstallerScript,szThemeDir+"utils/installer.kvs"))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Cannot write installer.kvs.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
-
- g_pApp->getGlobalKvircDirectory(szInstallerScript,KviApp::DefScript,"theme-install.kvs");
- QString szMainScript=szThemeDir+"install.kvs";
- if(!KviFileUtils::copyFile(szInstallerScript,szMainScript))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Cannot write install.kvs.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- QFile installFile(szMainScript);
- if(!installFile.open(IO_ReadOnly))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Cannot open install.kvs for reading.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
-
- QCString szFileContents;
- szFileContents=installFile.readAll();
- installFile.close();
-
- sto.szName.replace("\"","\\\"");
-
- szFileContents.replace("@THEMENAME@",sto.szName.utf8().data());
-// szFileContents.replace("@THEMENAME@",sto.szName.utf8().data());
- sto.szDescription.replace("\"","\\\"");
- if(sto.szDescription.isEmpty()) sto.szDescription="empty";
- szFileContents.replace("@THEMEDESCRIPTION@",sto.szDescription.utf8().data());
- sto.szVersion.replace("\"","\\\"");
- szFileContents.replace("@THEMEVERSION@",sto.szVersion.utf8().data());
- szFileContents.replace("@SUBDIR@",sto.szSubdirectory.utf8().data());
-
- QString szAliasName="";
- QString m_szId;
-
- struct timeval tv;
- kvi_gettimeofday(&tv,0);
-
- KviQString::sprintf(m_szId,"theme_%d%d%d",tv.tv_usec,rand() % 1000,rand() % 1000);
- szAliasName.prepend(m_szId);
- szFileContents.replace("@ALIASNAME@",szAliasName.utf8().data());
- if(!installFile.open(IO_WriteOnly))
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("Cannot open install.kvs for writing.","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- installFile.writeBlock(szFileContents.data(),szFileContents.length());
- installFile.close();
-
- QString szMsg = __tr2qs_ctx("Theme saved successfully to ","options");
- szMsg += szThemeDir;
-
- QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","options"),szMsg,QMessageBox::Ok,
- QMessageBox::NoButton,QMessageBox::NoButton);
-}
-
-void KviSaveThemeDialog::saveThemeInXmlFormat(KviThemeInfo& sto)
-{
- QString szFilename;
- QFileDialog * d = new QFileDialog(this);
- d->setCaption(__tr2qs_ctx("Choose filaname","options"));
- d->setMode(QFileDialog::AnyFile);
- d->setFilter( "KVIrc Packages (*.kvp)" );
- if(d->exec() == QDialog::Accepted)
- {
- szFilename = d->selectedFile();
- KviFileUtils::adjustFilePath(szFilename);
- delete d;
- if(szFilename.isEmpty())
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("You must select filename","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- } else {
- delete d;
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("You must select filename","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- if(QFileInfo(szFilename).extension()!="kvp") szFilename.append(".kvp");
- g_pApp->saveXmlTheme(sto,szFilename);
-}
-
-void KviSaveThemeDialog::saveTheme()
-{
- KviThemeInfo sto;
- sto.szName = m_pThemeNameEdit->text();
- if(sto.szName.isEmpty())
- {
- QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","options"),__tr2qs_ctx("You must choose a theme name!","options"),QMessageBox::Ok,
- QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
-
- sto.szAuthor = m_pAuthorEdit->text();
- sto.szDescription = m_pDescriptionEdit->text();
- sto.szDate = QDateTime::currentDateTime().toString();
- sto.szVersion = m_pVersionEdit->text();
- sto.szKvircVersion = KVI_VERSION;
- sto.bIncludeMsgColors=m_pIncludeMsgcolors->isChecked();
-
- if(sto.szVersion.isEmpty())sto.szVersion = "1.0.0";
-
- sto.szSubdirectory = sto.szName + QString("-") + sto.szVersion;
- sto.szSubdirectory.replace(QRegExp("[ \\\\/:][ \\\\/:]*"),"_");
-
- switch(m_pFormatCombo->currentItem())
- {
- case 0:
- saveThemeInXmlFormat(sto);
- break;
- case 1:
-/* saveThemeInNewFormat(sto);
- break;
- case 2:*/
- saveThemeInOldFormat(sto);
- break;
- }
-
- accept();
-}
-
-
-
-
-KviThemeListBoxItem::KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf)
-: QListBoxText(box)
-{
- m_pThemeInfo = inf;
- QString t;
- t = "<nobr><b>";
- t += inf->szName;
- t += "</b>";
-
- if(!inf->szVersion.isEmpty()) {
- t += "[";
- t += inf->szVersion;
- t += "]";
- }
-
- if(!inf->szAuthor.isEmpty()) {
- t += " <font color=\"#a0a0a0\"> ";
- t += __tr2qs_ctx("by","options");
- t += " ";
- t += inf->szAuthor;
- t += "</font>";
- }
-
- t += "</nobr>";
- t += "<br><nobr><font size=\"-1\">";
- t += inf->szDescription;
- t += "</font></nobr>";
- m_pText = new QSimpleRichText(t,box->font());
- int iWidth = box->visibleWidth();
- if(iWidth < LVI_MINIMUM_CELL_WIDTH)iWidth = LVI_MINIMUM_CELL_WIDTH;
- iWidth -= LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER;
- m_pText->setWidth(iWidth);
-}
-
-KviThemeListBoxItem::~KviThemeListBoxItem()
-{
- delete m_pThemeInfo;
- delete m_pText;
-}
-
-void KviThemeListBoxItem::paint ( QPainter * p )
-{
- QListBoxText::paint(p);
- p->drawPixmap(LVI_BORDER,LVI_BORDER, *(g_pIconManager->getBigIcon(QString(KVI_BIGICON_THEME))) );
- int afterIcon = LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING;
- int www = p->window().width() - (afterIcon + LVI_BORDER);
- m_pText->setWidth(www);
- m_pText->draw(p,afterIcon,LVI_BORDER,QRect(afterIcon,LVI_BORDER,www,p->window().height() - (LVI_BORDER * 2)),listBox()->viewport()->colorGroup());
-}
-
-int KviThemeListBoxItem::height ( const QListBox * lb ) const
-{
- int iHeight = m_pText->height() + (2 * LVI_BORDER);
- if(iHeight < (LVI_ICON_SIZE + (2 * LVI_BORDER)))iHeight = LVI_ICON_SIZE + (2 * LVI_BORDER);
- return iHeight;
-}
-
-KviThemeOptionsWidget::KviThemeOptionsWidget(QWidget * parent)
-: KviOptionsWidget(parent,"theme_options_widget")
-{
- m_pSaveThemeDialog = 0;
-
- createLayout(2,1);
-
- QHBox *hb = new QHBox(this);
- layout()->addWidget(hb,0,0);
-
- KviStyledToolButton * tb = new KviStyledToolButton(hb);
- tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_OPEN)));
- QToolTip::add(tb,__tr2qs_ctx("Install Theme Package","options"));
- connect(tb,SIGNAL(clicked()),this,SLOT(installFromXml()));
-
- tb = new KviStyledToolButton(hb);
- tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_SAVE)));
- QToolTip::add(tb,__tr2qs_ctx("Save Current Theme...","options"));
- connect(tb,SIGNAL(clicked()),this,SLOT(saveCurrentTheme()));
-
- tb = new KviStyledToolButton(hb);
- tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_REMOVE)));
- QToolTip::add(tb,__tr2qs_ctx("Delete Selected Theme","options"));
- connect(tb,SIGNAL(clicked()),this,SLOT(deleteTheme()));
-
- tb = new KviStyledToolButton(hb);
- tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_WWW)));
- QToolTip::add(tb,__tr2qs_ctx("Get More Themes...","options"));
- connect(tb,SIGNAL(clicked()),this,SLOT(getMoreThemes()));
-
- QWidget *w= new QWidget(hb);
- w->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum);
-
- m_pListBox = new QListBox(this);
- m_pListBox->setMinimumHeight(400);
- m_pListBox->setMinimumWidth(400);
- connect(m_pListBox,SIGNAL(doubleClicked ( QListBoxItem * )),this,SLOT(applyTheme ( QListBoxItem * )));
- connect(m_pListBox,SIGNAL(contextMenuRequested(QListBoxItem *,const QPoint &)),
- this,SLOT(contextMenuRequested(QListBoxItem *,const QPoint &)));
- layout()->addWidget(m_pListBox,1,0);
-
- layout()->setRowStretch(1,0);
- layout()->setColStretch(1,0);
-
- fillThemeBox();
- m_pContextPopup = new QPopupMenu(this);
-}
-
-KviThemeOptionsWidget::~KviThemeOptionsWidget()
-{
- if(m_pSaveThemeDialog)
- {
- delete m_pSaveThemeDialog;
- m_pSaveThemeDialog = 0;
- }
-}
-
-void KviThemeOptionsWidget::contextMenuRequested ( QListBoxItem * it, const QPoint & pos )
-{
- if(it)
- {
- m_pListBox->setCurrentItem(it);
- m_pContextPopup->clear();
- m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINUS)),__tr2qs_ctx("&Remove Theme","options"),this,SLOT(deleteTheme()));
- m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT)),__tr2qs_ctx("&Apply Theme","options"),this,SLOT(applyCurrentTheme()));
- m_pContextPopup->popup(pos);
- }
-}
-
-void KviThemeOptionsWidget::applyTheme ( QListBoxItem * it)
-{
- if(it) m_pListBox->setCurrentItem(it);
- applyCurrentTheme();
-}
-
-void KviThemeOptionsWidget::applyCurrentTheme()
-{
- KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->item(m_pListBox->currentItem());
- if(!it)return;
-
- if(KviMessageBox::yesNo(__tr2qs_ctx("Apply theme - KVIrc","options"),
- __tr2qs_ctx("Do you wish to apply theme \"%Q\" (version %Q)?","options"),
- &(it->themeInfo()->szName),&(it->themeInfo()->szVersion))) {
-
- QString szPath = it->themeInfo()->szAbsoluteDirectory;
- if(szPath.isEmpty())return;
-
- g_pApp->loadTheme(szPath);
- }
-}
-
-void KviThemeOptionsWidget::deleteTheme()
-{
- KviThemeListBoxItem* pItem=(KviThemeListBoxItem* )(m_pListBox->selectedItem());
- if(pItem)
- {
- KviThemeInfo * pInfo=pItem->themeInfo();
- QDir d(pInfo->szAbsoluteDirectory);
- KviQString::ensureLastCharIs(pInfo->szAbsoluteDirectory,KVI_PATH_SEPARATOR_CHAR);
- QStringList sl = d.entryList(QDir::Files);
- for(QStringList::Iterator it=sl.begin();it != sl.end();it++)
- {
- KviFileUtils::removeFile(pInfo->szAbsoluteDirectory+*it);
- }
- KviFileUtils::removeDir(pInfo->szAbsoluteDirectory);
- fillThemeBox();
- }
-}
-
-void KviThemeOptionsWidget::installFromXml()
-{
- QString szFilename;
- QFileDialog * d = new QFileDialog(this);
- d->setCaption(__tr2qs_ctx("Choose filaname","options"));
- d->setMode(QFileDialog::ExistingFile);
- d->setFilter( "KVIrc Packages (*.kvp, *.kvxml)" );
- if(d->exec() == QDialog::Accepted)
- {
- szFilename = d->selectedFile();
- KviFileUtils::adjustFilePath(szFilename);
- delete d;
- if(szFilename.isEmpty())
- {
- QMessageBox::critical(this,__tr2qs_ctx("Open Theme - KVIrc","options"),__tr2qs_ctx("You must select file","options"),
- QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
- return;
- }
- } else {
- delete d;
- return;
- }
- KviXmlAddonLoader * pLoader = new KviXmlAddonLoader(szFilename,this);
- pLoader->exec();
- fillThemeBox();
-}
-
-void KviThemeOptionsWidget::getMoreThemes()
-{
- if(!g_pFrame)return;
- g_pFrame->executeInternalCommand(KVI_INTERNALCOMMAND_OPENURL_KVIRC_THEMES);
-}
-
-void KviThemeOptionsWidget::saveCurrentTheme()
-{
- if(m_pSaveThemeDialog)return;
- m_pSaveThemeDialog = new KviSaveThemeDialog(this);
- m_pSaveThemeDialog->exec();
- if(m_pSaveThemeDialog)
- {
- delete m_pSaveThemeDialog;
- m_pSaveThemeDialog = 0;
- fillThemeBox();
- }
-}
-
-void KviThemeOptionsWidget::fillThemeBox(const QString &szDir)
-{
- QDir d(szDir);
-
- QStringList sl = d.entryList(QDir::Dirs);
-
- for(QStringList::Iterator it = sl.begin();it != sl.end();++it)
- {
- if(*it == ".")continue;
- if(*it == "..")continue;
-
- QString szTest = szDir;
- szTest += KVI_PATH_SEPARATOR_CHAR;
- szTest += *it;
-
- KviThemeInfo * inf = new KviThemeInfo;
- if(g_pApp->loadThemeInfo(szTest,*inf))
- {
- KviThemeListBoxItem * item = 0;
- item = new KviThemeListBoxItem(m_pListBox,inf);
- } else {
- delete inf;
- }
- }
-}
-
-void KviThemeOptionsWidget::fillThemeBox()
-{
- m_pListBox->clear();
-
- KviThemeInfo * ti = new KviThemeInfo;
- ti->szName = __tr2qs_ctx("Current Theme","options");
-
- KviThemeListBoxItem * itewrq = new KviThemeListBoxItem(m_pListBox,ti);
-
- QString szDir;
- g_pApp->getGlobalKvircDirectory(szDir,KviApp::Themes);
- fillThemeBox(szDir);
- g_pApp->getLocalKvircDirectory(szDir,KviApp::Themes);
- fillThemeBox(szDir);
-
- m_pListBox->setCurrentItem(itewrq);
-}
-
-void KviThemeOptionsWidget::commit()
-{
- KviOptionsWidget::commit();
-}
#include "m_optw_theme.moc"
diff --git a/src/modules/options/optw_theme.h b/src/modules/options/optw_theme.h
index 076e45a02..729c72e2c 100644
--- a/src/modules/options/optw_theme.h
+++ b/src/modules/options/optw_theme.h
@@ -1,12 +1,13 @@
#ifndef _OPTW_THEME_H_
#define _OPTW_THEME_H_
+//=============================================================================
//
// File : optw_theme.h
// Creation date : Sun May 25 2003 18:03:11 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
-// Copyright (C) 2003 Szymon Stefanek (pragma at kvirc dot net)
+// Copyright (C) 2003-2006 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -22,90 +23,8 @@
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
+//=============================================================================
-#include "kvi_optionswidget.h"
-#include <qdialog.h>
-#include <qsimplerichtext.h>
-#include <qlistbox.h>
-#include <qcombobox.h>
-#include <qpopupmenu.h>
-#include <qcursor.h>
-#define KVI_OPTIONS_WIDGET_ICON_KviThemeOptionsWidget KVI_SMALLICON_GUI
-#define KVI_OPTIONS_WIDGET_NAME_KviThemeOptionsWidget __tr2qs_no_lookup("Load & Save")
-#define KVI_OPTIONS_WIDGET_PRIORITY_KviThemeOptionsWidget 90000
-#define KVI_OPTIONS_WIDGET_KEYWORDS_KviThemeOptionsWidget __tr2qs_no_lookup("theme")
-#define KVI_OPTIONS_WIDGET_GROUP_KviThemeOptionsWidget "themeLoader"
-
-class QLineEdit;
-class QTextEdit;
-class QPushButton;
-class QLabel;
-class QCheckBox;
-typedef struct _KviThemeInfoTag KviThemeInfo;
-
-class KviSaveThemeDialog : public QDialog
-{
- Q_OBJECT
-public:
- KviSaveThemeDialog(QWidget *par);
- ~KviSaveThemeDialog();
-protected:
- QLineEdit * m_pAuthorEdit;
- QLineEdit * m_pThemeNameEdit;
- QLineEdit * m_pVersionEdit;
- QTextEdit * m_pDescriptionEdit;
- QPushButton * m_pOkButton;
- QComboBox * m_pFormatCombo;
- QCheckBox * m_pIncludeMsgcolors;
-
-private:
- void saveThemeInNewFormat(KviThemeInfo& info);
- void saveThemeInOldFormat(KviThemeInfo& info);
- void saveThemeInXmlFormat(KviThemeInfo& info);
-protected slots:
- void saveTheme();
- void themeNameChanged(const QString &txt);
-};
-
-class KviThemeListBoxItem : public QListBoxText
-{
-public:
- KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf);
- ~KviThemeListBoxItem();
-public:
- KviThemeInfo * m_pThemeInfo;
- QSimpleRichText * m_pText;
-public:
- KviThemeInfo * themeInfo(){ return m_pThemeInfo; };
- virtual int height ( const QListBox * lb ) const ;
-protected:
- virtual void paint ( QPainter * painter );
-};
-
-
-class KviThemeOptionsWidget : public KviOptionsWidget
-{
- Q_OBJECT
-public:
- KviThemeOptionsWidget(QWidget * parent);
- ~KviThemeOptionsWidget();
-protected:
- QListBox * m_pListBox;
- QPopupMenu * m_pContextPopup;
- KviSaveThemeDialog * m_pSaveThemeDialog;
-protected:
- virtual void commit();
- void fillThemeBox(const QString &szDir);
-protected slots:
- void saveCurrentTheme();
- void getMoreThemes();
- void installFromXml();
- void fillThemeBox();
- void deleteTheme();
- void applyTheme ( QListBoxItem * );
- void applyCurrentTheme();
- void contextMenuRequested ( QListBoxItem * item, const QPoint & pos );
-};
#endif //!_OPTW_THEME_H_
diff --git a/src/modules/theme/.svnignore b/src/modules/theme/.svnignore
new file mode 100644
index 000000000..087a502ca
--- /dev/null
+++ b/src/modules/theme/.svnignore
@@ -0,0 +1,11 @@
+Makefile.in
+Makefile
+.deps
+*.o
+*.lo
+*.la
+*.moc
+.libs
+.mospics
+moc_*.cpp
+.pics \ No newline at end of file
diff --git a/src/modules/theme/Makefile.am b/src/modules/theme/Makefile.am
new file mode 100644
index 000000000..fba495058
--- /dev/null
+++ b/src/modules/theme/Makefile.am
@@ -0,0 +1,20 @@
+###############################################################################
+# KVirc IRC client Makefile - 30.12.2006 Szymon Stefanek <pragma at kvirc dot net>
+###############################################################################
+
+AM_CPPFLAGS = -I$(SS_TOPSRCDIR)/src/kvilib/include/ -I$(SS_TOPSRCDIR)/src/kvirc/include/ \
+$(SS_INCDIRS) $(SS_CPPFLAGS) -DGLOBAL_KVIRC_DIR=\"$(globalkvircdir)\"
+
+pluglib_LTLIBRARIES = libkvitheme.la
+
+libkvitheme_la_LDFLAGS = -module -avoid-version $(SS_LDFLAGS) $(SS_LIBDIRS)
+
+libkvitheme_la_SOURCES = libkvitheme.cpp managementdialog.cpp
+nodist_libkvitheme_la_SOURCES = moc_managementdialog.cpp
+
+libkvitheme_la_LIBADD = $(SS_LIBLINK) ../../kvilib/build/libkvilib.la
+
+noinst_HEADERS= managementdialog.h
+
+moc_managementdialog.cpp: managementdialog.h
+ $(SS_QT_MOC) $< -o $@
diff --git a/src/modules/theme/libkvitheme.cpp b/src/modules/theme/libkvitheme.cpp
new file mode 100644
index 000000000..72b6261a3
--- /dev/null
+++ b/src/modules/theme/libkvitheme.cpp
@@ -0,0 +1,122 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// File : libkvitheme.cpp
+// Created on Sat 30 Dec 2006 14:54:56 by Szymon Stefanek
+//
+// This toolbar is part of the KVirc irc client distribution
+// Copyright (C) 2006 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "kvi_module.h"
+#include "kvi_locale.h"
+#include "kvi_qstring.h"
+#include "kvi_parameterlist.h"
+#include "kvi_cmdformatter.h"
+#include "kvi_qstring.h"
+#include "kvi_error.h"
+#include "kvi_out.h"
+#include "kvi_iconmanager.h"
+#include "kvi_mirccntrl.h"
+#include "kvi_config.h"
+#include "kvi_sourcesdate.h"
+
+#include "managementdialog.h"
+
+QRect g_rectManagementDialogGeometry(0,0,0,0);
+
+
+/*
+ @doc: theme.install
+ @type:
+ command
+ @title:
+ theme.install
+ @short:
+ Shows the theme theme management editor
+ @syntax:
+ theme.install <package_path:string>
+ @description:
+ Attempts to install the themes in the package specified by <package_path>.
+*/
+
+static bool theme_kvs_cmd_install(KviKvsModuleCommandCall * c)
+{
+ return true;
+}
+
+/*
+ @doc: theme.dialog
+ @type:
+ command
+ @title:
+ theme.dialog
+ @short:
+ Shows the theme theme management editor
+ @syntax:
+ theme.dialog
+ @description:
+ Shows the theme theme management editor
+*/
+
+static bool theme_kvs_cmd_dialog(KviKvsModuleCommandCall * c)
+{
+ KviThemeManagementDialog::display();
+ return true;
+}
+
+static bool theme_module_init(KviModule *m)
+{
+ KVSM_REGISTER_SIMPLE_COMMAND(m,"dialog",theme_kvs_cmd_dialog);
+ KVSM_REGISTER_SIMPLE_COMMAND(m,"install",theme_kvs_cmd_install);
+
+ QString szBuf;
+ m->getDefaultConfigFileName(szBuf);
+ KviConfig cfg(szBuf,KviConfig::Read);
+ g_rectManagementDialogGeometry = cfg.readRectEntry("EditorGeometry",QRect(10,10,390,440));
+
+ return true;
+}
+
+static bool theme_module_cleanup(KviModule *m)
+{
+ KviThemeManagementDialog::cleanup();
+
+ QString szBuf;
+ m->getDefaultConfigFileName(szBuf);
+ KviConfig cfg(szBuf,KviConfig::Write);
+ cfg.writeEntry("EditorGeometry",g_rectManagementDialogGeometry);
+
+ return true;
+}
+
+static bool theme_module_can_unload(KviModule * m)
+{
+ return (!KviThemeManagementDialog::instance());
+}
+
+
+KVIRC_MODULE(
+ "theme", // module name
+ "1.0.0", // module version
+ "Copyright (C) 2006 Szymon Stefanek (pragma at kvirc dot net)", // author & (C)
+ "Theme management functions",
+ theme_module_init,
+ theme_module_can_unload,
+ 0,
+ theme_module_cleanup
+)
diff --git a/src/modules/theme/managementdialog.cpp b/src/modules/theme/managementdialog.cpp
new file mode 100644
index 000000000..566b2691c
--- /dev/null
+++ b/src/modules/theme/managementdialog.cpp
@@ -0,0 +1,1148 @@
+//=============================================================================
+//
+// File : managementdialog.cpp
+// Created on Sat 30 Dec 2006 14:54:56 by Szymon Stefanek
+//
+// This file is part of the KVIrc IRC Client distribution
+// Copyright (C) 2006 Szymon Stefanek <pragma at kvirc dot net>
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) 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.
+//
+//=============================================================================
+
+#define LVI_ICON_SIZE 32
+#define LVI_BORDER 4
+#define LVI_SPACING 8
+#define LVI_MINIMUM_TEXT_WIDTH 300
+#define LVI_MINIMUM_CELL_WIDTH (LVI_MINIMUM_TEXT_WIDTH + LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER)
+
+#include "managementdialog.h"
+#include "kvi_xmladdonloader.h"
+#include "kvi_iconmanager.h"
+#include "kvi_msgbox.h"
+
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qlistbox.h>
+#include <qlineedit.h>
+#include <qtextedit.h>
+#include <qregexp.h>
+#include <qmessagebox.h>
+#include <qdir.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#include <qfiledialog.h>
+#include <qpopupmenu.h>
+#include <qcombobox.h>
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qimage.h>
+#include <qtextedit.h>
+#include <qmultilineedit.h>
+#include <qbuffer.h>
+
+#include "kvi_options.h"
+#include "kvi_locale.h"
+#include "kvi_config.h"
+#include "kvi_fileutils.h"
+#include "kvi_app.h"
+#include "kvi_frame.h"
+#include "kvi_iconmanager.h"
+#include "kvi_internalcmd.h"
+#include "kvi_styled_controls.h"
+#include "kvi_doublebuffer.h"
+#include "kvi_packagefile.h"
+#include "kvi_fileextensions.h"
+#include "kvi_filedialog.h"
+
+#include <stdlib.h> // rand & srand
+
+extern QRect g_rectManagementDialogGeometry;
+
+KviSaveThemeDialog::KviSaveThemeDialog(QWidget * par)
+: QDialog(par)
+{
+ setCaption(__tr2qs_ctx("Save Current Theme","theme"));
+
+ QGridLayout * g = new QGridLayout(this,8,2,4,4);
+
+ QLabel * l;
+
+ l = new QLabel(__tr2qs_ctx("Theme name:","theme"),this);
+ g->addWidget(l,0,0);
+
+ m_pThemeNameEdit = new QLineEdit(this);
+ g->addMultiCellWidget(m_pThemeNameEdit,0,0,1,2);
+ connect(m_pThemeNameEdit,SIGNAL(textChanged(const QString &)),this,SLOT(themeNameChanged(const QString &)));
+
+
+ l = new QLabel(__tr2qs_ctx("Version:","theme"),this);
+ g->addWidget(l,1,0);
+
+ m_pVersionEdit = new QLineEdit(this);
+ g->addMultiCellWidget(m_pVersionEdit,1,1,1,2);
+
+
+ l = new QLabel(__tr2qs_ctx("Author:","theme"),this);
+ g->addWidget(l,2,0);
+
+ m_pAuthorEdit = new QLineEdit(this);
+ g->addMultiCellWidget(m_pAuthorEdit,2,2,1,2);
+
+ l = new QLabel(__tr2qs_ctx("Description:","theme"),this);
+ g->addWidget(l,3,0);
+
+ m_pDescriptionEdit = new QTextEdit(this);
+ g->addMultiCellWidget(m_pDescriptionEdit,3,4,1,2);
+
+ m_pIncludeMsgcolors = new KviStyledCheckBox( __tr2qs_ctx("Include message colors information","theme"), this );
+ m_pIncludeMsgcolors->setChecked(TRUE);
+ g->addMultiCellWidget(m_pIncludeMsgcolors,5,5,0,1);
+
+// l = new QLabel(__tr2qs_ctx("Package type:","theme"),this);
+// g->addWidget(l,6,0);
+
+// m_pFormatCombo = new QComboBox(this);
+// m_pFormatCombo->insertItem(__tr2qs_ctx("KVIrc Package","theme"),0);
+// m_pFormatCombo->insertItem(__tr2qs_ctx("New multi-file format","theme"),1);
+// m_pFormatCombo->insertItem(__tr2qs_ctx("Dublicate Theme","theme"),1);
+// g->addWidget(m_pFormatCombo,6,1);
+
+ QHBox * h = new QHBox(this);
+ h->setSpacing(7);
+ g->addWidget(h,7,2);
+ m_pOkButton = new QPushButton(__tr2qs_ctx("OK","theme"),h);
+ m_pOkButton->setEnabled(false);
+ connect(m_pOkButton,SIGNAL(clicked()),this,SLOT(saveTheme()));
+ m_pOkButton->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT)));
+
+ QPushButton * pb = new QPushButton(__tr2qs_ctx("Cancel","theme"),h);
+ connect(pb,SIGNAL(clicked()),this,SLOT(reject()));
+ pb->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DISCARD)));
+
+}
+
+KviSaveThemeDialog::~KviSaveThemeDialog()
+{
+
+}
+
+void KviSaveThemeDialog::themeNameChanged(const QString &txt)
+{
+ m_pOkButton->setEnabled(!txt.isEmpty());
+}
+
+void KviSaveThemeDialog::saveThemeInOldFormat(KviThemeInfo& sto)
+{
+ if(!KviFileUtils::directoryExists(sto.szAbsoluteDirectory))
+ {
+ g_pApp->getLocalKvircDirectory(sto.szAbsoluteDirectory,KviApp::Themes,sto.szSubdirectory,true);
+ if(!KviFileUtils::makeDir(sto.szAbsoluteDirectory))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme directory.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ }
+ g_pApp->saveTheme(sto);
+ // write down the images
+
+ QString szMsg = __tr2qs_ctx("Theme saved successfully to ","theme");
+ szMsg += sto.szAbsoluteDirectory;
+
+ QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),szMsg,QMessageBox::Ok,
+ QMessageBox::NoButton,QMessageBox::NoButton);
+}
+
+void KviSaveThemeDialog::saveThemeInNewFormat(KviThemeInfo& sto)
+{
+ QString szBaseDir;
+ QFileDialog * d = new QFileDialog(this);
+ d->setCaption(__tr2qs_ctx("Choose save directory","theme"));
+ d->setMode(QFileDialog::DirectoryOnly);
+ if(d->exec() == QDialog::Accepted)
+ {
+ szBaseDir = d->selectedFile();
+ KviFileUtils::adjustFilePath(szBaseDir);
+ delete d;
+ if(szBaseDir.isEmpty())
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select save directory","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ } else {
+ delete d;
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select save directory","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ KviQString::ensureLastCharIs(szBaseDir,KVI_PATH_SEPARATOR_CHAR);
+ sto.szAbsoluteDirectory=szBaseDir+sto.szSubdirectory;
+ KviQString::ensureLastCharIs(sto.szAbsoluteDirectory,KVI_PATH_SEPARATOR_CHAR);
+ QString szThemeDir=sto.szAbsoluteDirectory;
+ sto.szAbsoluteDirectory+="files";
+
+ if(!KviFileUtils::makeDir(sto.szAbsoluteDirectory))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme files directory.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+
+ g_pApp->saveTheme(sto);
+
+ if(!KviFileUtils::makeDir(szThemeDir+"utils"))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme utils directory.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+
+ QString szInstallerScript;
+ g_pApp->getGlobalKvircDirectory(szInstallerScript,KviApp::DefScript,"installer.kvs");
+ if(!KviFileUtils::fileExists(szInstallerScript))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot find installer.kvs.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+
+ if(!KviFileUtils::copyFile(szInstallerScript,szThemeDir+"utils/installer.kvs"))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot write installer.kvs.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+
+ g_pApp->getGlobalKvircDirectory(szInstallerScript,KviApp::DefScript,"theme-install.kvs");
+ QString szMainScript=szThemeDir+"install.kvs";
+ if(!KviFileUtils::copyFile(szInstallerScript,szMainScript))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot write install.kvs.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ QFile installFile(szMainScript);
+ if(!installFile.open(IO_ReadOnly))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot open install.kvs for reading.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+
+ QCString szFileContents;
+ szFileContents=installFile.readAll();
+ installFile.close();
+
+ sto.szName.replace("\"","\\\"");
+
+ szFileContents.replace("@THEMENAME@",sto.szName.utf8().data());
+// szFileContents.replace("@THEMENAME@",sto.szName.utf8().data());
+ sto.szDescription.replace("\"","\\\"");
+ if(sto.szDescription.isEmpty()) sto.szDescription="empty";
+ szFileContents.replace("@THEMEDESCRIPTION@",sto.szDescription.utf8().data());
+ sto.szVersion.replace("\"","\\\"");
+ szFileContents.replace("@THEMEVERSION@",sto.szVersion.utf8().data());
+ szFileContents.replace("@SUBDIR@",sto.szSubdirectory.utf8().data());
+
+ QString szAliasName="";
+ QString m_szId;
+
+ struct timeval tv;
+ kvi_gettimeofday(&tv,0);
+
+ KviQString::sprintf(m_szId,"theme_%d%d%d",tv.tv_usec,rand() % 1000,rand() % 1000);
+ szAliasName.prepend(m_szId);
+ szFileContents.replace("@ALIASNAME@",szAliasName.utf8().data());
+ if(!installFile.open(IO_WriteOnly))
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot open install.kvs for writing.","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ installFile.writeBlock(szFileContents.data(),szFileContents.length());
+ installFile.close();
+
+ QString szMsg = __tr2qs_ctx("Theme saved successfully to ","theme");
+ szMsg += szThemeDir;
+
+ QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),szMsg,QMessageBox::Ok,
+ QMessageBox::NoButton,QMessageBox::NoButton);
+}
+
+void KviSaveThemeDialog::saveThemeInXmlFormat(KviThemeInfo& sto)
+{
+ QString szFilename;
+ QFileDialog * d = new QFileDialog(this);
+ d->setCaption(__tr2qs_ctx("Choose filaname","theme"));
+ d->setMode(QFileDialog::AnyFile);
+ d->setFilter( "KVIrc Packages (*.kvp)" );
+ if(d->exec() == QDialog::Accepted)
+ {
+ szFilename = d->selectedFile();
+ KviFileUtils::adjustFilePath(szFilename);
+ delete d;
+ if(szFilename.isEmpty())
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select filename","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ } else {
+ delete d;
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select filename","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+ if(QFileInfo(szFilename).extension()!="kvp") szFilename.append(".kvp");
+ g_pApp->saveXmlTheme(sto,szFilename);
+}
+
+void KviSaveThemeDialog::saveTheme()
+{
+ KviThemeInfo sto;
+ sto.szName = m_pThemeNameEdit->text();
+ if(sto.szName.isEmpty())
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must choose a theme name!","theme"),QMessageBox::Ok,
+ QMessageBox::NoButton,QMessageBox::NoButton);
+ return;
+ }
+
+ sto.szAuthor = m_pAuthorEdit->text();
+ sto.szDescription = m_pDescriptionEdit->text();
+ sto.szDate = QDateTime::currentDateTime().toString();
+ sto.szVersion = m_pVersionEdit->text();
+ sto.szKvircVersion = KVI_VERSION;
+ sto.bIncludeMsgColors=m_pIncludeMsgcolors->isChecked();
+
+ if(sto.szVersion.isEmpty())sto.szVersion = "1.0.0";
+
+ sto.szSubdirectory = sto.szName + QString("-") + sto.szVersion;
+ sto.szSubdirectory.replace(QRegExp("[ \\\\/:][ \\\\/:]*"),"_");
+
+/*
+ switch(m_pFormatCombo->currentItem())
+ {
+ case 0:
+ saveThemeInXmlFormat(sto);
+ break;
+ case 1:
+ saveThemeInNewFormat(sto);
+ break;
+ case 2:*/
+ saveThemeInOldFormat(sto);
+/* break;
+ }
+*/
+ accept();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+KviPackThemeDialog::KviPackThemeDialog(QWidget * pParent,KviPtrList<KviThemeInfo> * pThemeInfoList)
+: QWizard(pParent)
+{
+ m_pThemeInfoList = pThemeInfoList;
+
+ KviThemeInfo * pThemeInfo;
+ QString szPackageName;
+ QString szPackageAuthor;
+ QString szPackageDescription;
+ QString szPackageVersion;
+ if(m_pThemeInfoList->count() > 1)
+ {
+ szPackageName = "MyThemes";
+ szPackageAuthor = __tr2qs_ctx("Your name here","theme");
+ szPackageVersion = "1.0";
+ szPackageDescription = __tr2qs_ctx("Put a package description here...","theme");
+ } else {
+ if(m_pThemeInfoList->count() > 0)
+ {
+ pThemeInfo = m_pThemeInfoList->first();
+ szPackageName = pThemeInfo->szSubdirectory;
+ szPackageAuthor = pThemeInfo->szAuthor;
+ szPackageDescription = pThemeInfo->szDescription;
+ szPackageVersion = pThemeInfo->szVersion;
+ }
+ }
+
+
+ setCaption(__tr2qs_ctx("Export Theme - KVIrc","theme"));
+ setMinimumSize(400,350);
+
+ // welcome page ==================================================================================
+ QWidget * pPage = new QWidget(this);
+ QGridLayout * pLayout = new QGridLayout(pPage,2,1,4,4);
+
+ QLabel * pLabel = new QLabel(pPage);
+ QString szText = "<p>";
+ szText += __tr2qs_ctx("This procedure allows you to export the selected themes to a single package. It is useful when you want to distribute your themes to the public.","theme");
+ szText += "</p><p>";
+ szText += __tr2qs_ctx("You will be asked to provide a package name, a description and, if you want, an icon/screenshot.","theme");
+ szText += "</p><p>";
+ szText += __tr2qs_ctx("Hit the \"Next\" button to begin.","theme");
+ szText += "<p>";
+
+ pLabel->setText(szText);
+ pLayout->addWidget(pLabel,0,0);
+ pLayout->setRowStretch(1,1);
+
+ addPage(pPage,__tr2qs_ctx("Welcome","theme"));
+ setBackEnabled(pPage,false);
+ setNextEnabled(pPage,true);
+ setHelpEnabled(pPage,false);
+ setFinishEnabled(pPage,false);
+
+ // theme data name ================================================================================
+
+ pPage = new QWidget(this);
+ pLayout = new QGridLayout(pPage,2,1,4,4);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("This is the information list for the themes you're packaging. If it looks OK press \"Next\" to continue, otherwise press \"Cancel\" and rewiew your themes first.","theme"));
+ pLabel->setTextFormat(Qt::RichText);
+ pLayout->addWidget(pLabel,0,0);
+
+ QString szAuthor = __tr2qs_ctx("Author","theme");
+ QString szCreatedAt = __tr2qs_ctx("Created at","theme");
+ QString szCreatedOn = __tr2qs_ctx("Created on","theme");
+ QString szSubdirectory = __tr2qs_ctx("Subdirectory","theme");
+
+ QString szThemesDescription = "<html><body bgcolor=\"#ffffff\">";
+
+ int iIdx = 0;
+ for(pThemeInfo = m_pThemeInfoList->first();pThemeInfo;pThemeInfo = m_pThemeInfoList->next())
+ {
+ QString szThemeDescription;
+ KviQString::sprintf(
+ szThemeDescription,
+ "<p>" \
+ "<h2>%Q %Q</h2>" \
+ "</p>" \
+ "<p>" \
+ "<i>%Q</i>" \
+ "</p>" \
+ "<p>" \
+ "%Q: <b>%Q</b><br>" \
+ "%Q: <b>%Q</b><br>" \
+ "</p>" \
+ "<p>" \
+ "<font color=\"#808080\">" \
+ "%Q: KVIrc %Q<br>" \
+ "%Q: %Q<br>" \
+ "</font>" \
+ "</p>",
+ &(pThemeInfo->szName),
+ &(pThemeInfo->szVersion),
+ &(pThemeInfo->szDescription),
+ &szAuthor,
+ &(pThemeInfo->szAuthor),
+ &szCreatedAt,
+ &(pThemeInfo->szDate),
+ &szCreatedOn,
+ &(pThemeInfo->szKvircVersion),
+ &szSubdirectory,
+ &(pThemeInfo->szSubdirectory)
+ );
+ if(iIdx > 0)
+ szThemesDescription += "<hr>";
+ szThemesDescription += szThemeDescription;
+ iIdx++;
+ }
+
+ szThemesDescription += "</body></html>";
+
+ QTextEdit * pTextEdit = new QTextEdit(pPage);
+ pTextEdit->setPaper(QBrush(QColor(255,255,255)));
+ pTextEdit->setReadOnly(true);
+ pTextEdit->setText(szThemesDescription);
+ pLayout->addWidget(pTextEdit,1,0);
+ pLayout->setRowStretch(1,1);
+
+ addPage(pPage,__tr2qs_ctx("Theme Data","theme"));
+ setBackEnabled(pPage,true);
+ setHelpEnabled(pPage,false);
+ setNextEnabled(pPage,true);
+ setFinishEnabled(pPage,false);
+
+ // packager informations ================================================================================
+
+ pPage = new QWidget(this);
+ pLayout = new QGridLayout(pPage,5,2,4,4);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Here you need to provide informations about you (the packager) and a short description of the package you're creating.","theme"));
+ pLabel->setTextFormat(Qt::RichText);
+ pLayout->addMultiCellWidget(pLabel,0,0,0,1);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Package Name:","theme"));
+ pLayout->addWidget(pLabel,1,0);
+
+ m_pPackageNameEdit = new QLineEdit(pPage);
+ m_pPackageNameEdit->setText(szPackageName);
+ pLayout->addWidget(m_pPackageNameEdit,1,1);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Version:","theme"));
+ pLayout->addWidget(pLabel,2,0);
+
+ m_pPackageVersionEdit = new QLineEdit(pPage);
+ m_pPackageVersionEdit->setText(szPackageVersion);
+ pLayout->addWidget(m_pPackageVersionEdit,2,1);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Description:","theme"));
+ pLayout->addWidget(pLabel,3,0);
+
+ m_pPackageDescriptionEdit = new QMultiLineEdit(pPage);
+ m_pPackageDescriptionEdit->setText(szPackageDescription);
+ pLayout->addWidget(m_pPackageDescriptionEdit,3,1);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Package Author:","theme"));
+ pLayout->addWidget(pLabel,4,0);
+
+ m_pPackagerNameEdit = new QLineEdit(pPage);
+ m_pPackagerNameEdit->setText(szPackageAuthor);
+ pLayout->addWidget(m_pPackagerNameEdit,4,1);
+
+
+ pLayout->setRowStretch(3,1);
+ pLayout->setColStretch(1,1);
+
+ addPage(pPage,__tr2qs_ctx("Package Informations","theme"));
+ setBackEnabled(pPage,true);
+ setHelpEnabled(pPage,false);
+ setNextEnabled(pPage,true);
+ setFinishEnabled(pPage,false);
+
+ // screenshot/logo/icon ================================================================================
+
+ pPage = new QWidget(this);
+ pLayout = new QGridLayout(pPage,3,1,4,4);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Here you can choose the image that will appear in the installation dialog for your theme package. It can be an icon, a logo or a screenshot and it should be not larger than 300x225. If you don't provide an image a simple default icon will be used at installation stage.","theme"));
+ pLabel->setTextFormat(Qt::RichText);
+ pLayout->addWidget(pLabel,0,0);
+
+ m_pImageLabel = new QLabel(pPage);
+ m_pImageLabel->setFrameStyle(QFrame::Sunken | QFrame::Panel);
+ m_pImageLabel->setMinimumSize(300,225);
+ m_pImageLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter);
+ pLayout->addWidget(m_pImageLabel,1,0);
+
+ QString szFilter = "*.png *.jpg *.xpm";
+ m_pImageSelector = new KviFileSelector(pPage,"",&m_szImagePath,true,0,szFilter);
+ connect(m_pImageSelector,SIGNAL(selectionChanged(const QString &)),this,SLOT(imageSelectionChanged(const QString &)));
+ pLayout->addWidget(m_pImageSelector,2,0);
+ pLayout->setRowStretch(1,1);
+
+ m_pImageSelectionPage = pPage;
+ addPage(pPage,__tr2qs_ctx("Icon/Screenshot","theme"));
+ setBackEnabled(pPage,true);
+ setHelpEnabled(pPage,false);
+ setNextEnabled(pPage,true);
+ setFinishEnabled(pPage,false);
+
+ // save file name ================================================================================
+
+ pPage = new QWidget(this);
+ pLayout = new QGridLayout(pPage,4,1,4,4);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Here you must choose the file name for the theme package. It should have a *.%1 extension.","theme").arg(KVI_FILEEXTENSION_THEMEPACKAGE));
+ pLabel->setTextFormat(Qt::RichText);
+ pLayout->addWidget(pLabel,0,0);
+
+ m_szPackagePath = QDir::homeDirPath();
+ KviQString::ensureLastCharIs(m_szPackagePath,QChar(KVI_PATH_SEPARATOR_CHAR));
+
+ m_szPackagePath += szPackageName;
+ m_szPackagePath += "-";
+ m_szPackagePath += szPackageVersion;
+ m_szPackagePath += ".";
+ m_szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE;
+
+ szFilter = "*.";
+ szFilter += KVI_FILEEXTENSION_THEMEPACKAGE;
+ m_pPathSelector = new KviFileSelector(pPage,"",&m_szPackagePath,true,KviFileSelector::ChooseSaveFileName,szFilter);
+ pLayout->addWidget(m_pPathSelector,1,0);
+
+ pLabel = new QLabel(pPage);
+ pLabel->setText(__tr2qs_ctx("Finally hit the \"Finish\" button to complete the packaging operation.","theme"));
+ pLabel->setTextFormat(Qt::RichText);
+ pLayout->addWidget(pLabel,3,0);
+
+ pLayout->setRowStretch(2,1);
+
+ addPage(pPage,__tr2qs_ctx("Package Path","theme"));
+ setBackEnabled(pPage,true);
+ setHelpEnabled(pPage,false);
+ setNextEnabled(pPage,false);
+ setFinishEnabled(pPage,true);
+
+}
+
+KviPackThemeDialog::~KviPackThemeDialog()
+{
+}
+
+void KviPackThemeDialog::imageSelectionChanged(const QString &szImagePath)
+{
+ QImage pix(szImagePath);
+ if(!pix.isNull())
+ {
+ QPixmap out;
+ if(pix.width() > 300 || pix.height() > 225)
+ out.convertFromImage(pix.smoothScale(300,225,QImage::ScaleMin));
+ else
+ out.convertFromImage(pix);
+ m_pImageLabel->setPixmap(out);
+ return;
+ }
+
+ QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs_ctx("Failed to load the selected image","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+
+ m_pImageSelector->setSelection("");
+ m_pImageLabel->setPixmap(QPixmap());
+}
+
+
+void KviPackThemeDialog::accept()
+{
+ if(!packTheme())return;
+ QWizard::accept();
+}
+
+
+bool KviPackThemeDialog::packTheme()
+{
+ m_pImageSelector->commit();
+ m_pPathSelector->commit();
+
+ QString szPackageAuthor = m_pPackagerNameEdit->text();
+ QString szPackageName = m_pPackageNameEdit->text();
+ QString szPackageDescription = m_pPackageDescriptionEdit->text();
+ QString szPackageVersion = m_pPackageVersionEdit->text();
+
+ QImage pix(m_szImagePath);
+ QPixmap out;
+ if(!pix.isNull())
+ {
+ if(pix.width() > 300 || pix.height() > 225)
+ out.convertFromImage(pix.smoothScale(300,225,QImage::ScaleMin));
+ else
+ out.convertFromImage(pix);
+ } else {
+ if(!m_szImagePath.isEmpty())
+ {
+ QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs_ctx("Failed to load the selected image: please fix it","theme"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ showPage(m_pImageSelectionPage);
+ return false;
+ }
+ }
+
+ KviPackageWriter f;
+
+ QString szTmp = QDateTime::currentDateTime().toString();
+
+ f.addInfoField("PackageType","ThemePack");
+ f.addInfoField("ThemePackVersion","1");
+ f.addInfoField("Name",szPackageName);
+ f.addInfoField("Version",szPackageVersion);
+ f.addInfoField("Author",szPackageAuthor);
+ f.addInfoField("Description",szPackageDescription);
+ f.addInfoField("Date",szTmp);
+ f.addInfoField("KVIrcVersion",KVI_VERSION);
+
+ if(!out.isNull())
+ {
+ QByteArray * pba = new QByteArray();
+ QBuffer buffer(*pba);
+ buffer.open(IO_WriteOnly);
+ out.save(&buffer,"PNG");
+ buffer.close();
+ f.addInfoField("Image",pba); // cool :) [no disk access needed]
+ }
+
+ szTmp.setNum(m_pThemeInfoList->count());
+ f.addInfoField("ThemeCount",szTmp);
+
+ int iIdx = 0;
+ for(KviThemeInfo * pInfo = m_pThemeInfoList->first();pInfo;pInfo = m_pThemeInfoList->next())
+ {
+ KviQString::sprintf(szTmp,"Theme%dName",iIdx);
+ f.addInfoField(szTmp,pInfo->szName);
+ KviQString::sprintf(szTmp,"Theme%dVersion",iIdx);
+ f.addInfoField(szTmp,pInfo->szVersion);
+ KviQString::sprintf(szTmp,"Theme%dDescription",iIdx);
+ f.addInfoField(szTmp,pInfo->szDescription);
+ KviQString::sprintf(szTmp,"Theme%dDate",iIdx);
+ f.addInfoField(szTmp,pInfo->szDate);
+ KviQString::sprintf(szTmp,"Theme%dSubdirectory",iIdx);
+ f.addInfoField(szTmp,pInfo->szSubdirectory);
+ KviQString::sprintf(szTmp,"Theme%dAuthor",iIdx);
+ f.addInfoField(szTmp,pInfo->szAuthor);
+ KviQString::sprintf(szTmp,"Theme%dKVIrcVersion",iIdx);
+ f.addInfoField(szTmp,pInfo->szKvircVersion);
+ if(!f.addDirectory(pInfo->szAbsoluteDirectory,pInfo->szSubdirectory))
+ {
+ szTmp = __tr2qs_ctx("Packaging failed","theme");
+ szTmp += ": ";
+ szTmp += f.lastError();
+ QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp,
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ }
+ iIdx++;
+ }
+
+ if(!f.pack(m_szPackagePath))
+ {
+ szTmp = __tr2qs_ctx("Packaging failed","theme");
+ szTmp += ": ";
+ szTmp += f.lastError();
+ QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp,
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+ return false;
+ }
+
+ //KviPackageReader r;
+ //r.unpack("/root/test.kvt","/root/unpacked_test_kvt");
+
+ QMessageBox::information(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs("Package saved succesfully"),
+ QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
+
+ return true;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+KviThemeListBoxItem::KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf)
+: QListBoxText(box)
+{
+ m_pThemeInfo = inf;
+ QString t;
+ t = "<nobr><b>";
+ t += inf->szName;
+ t += "</b>";
+
+ if(!inf->szVersion.isEmpty()) {
+ t += "[";
+ t += inf->szVersion;
+ t += "]";
+ }
+
+ if(!inf->szAuthor.isEmpty()) {
+ t += " <font color=\"#a0a0a0\"> ";
+ t += __tr2qs_ctx("by","theme");
+ t += " ";
+ t += inf->szAuthor;
+ t += "</font>";
+ }
+
+ t += "</nobr>";
+ t += "<br><nobr><font size=\"-1\">";
+ t += inf->szDescription;
+ t += "</font></nobr>";
+ m_pText = new QSimpleRichText(t,box->font());
+ int iWidth = box->visibleWidth();
+ if(iWidth < LVI_MINIMUM_CELL_WIDTH)iWidth = LVI_MINIMUM_CELL_WIDTH;
+ iWidth -= LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER;
+ m_pText->setWidth(iWidth);
+}
+
+KviThemeListBoxItem::~KviThemeListBoxItem()
+{
+ delete m_pThemeInfo;
+ delete m_pText;
+}
+
+void KviThemeListBoxItem::paint ( QPainter * p )
+{
+ QListBoxText::paint(p);
+ p->drawPixmap(LVI_BORDER,LVI_BORDER, *(g_pIconManager->getBigIcon(QString(KVI_BIGICON_THEME))) );
+ int afterIcon = LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING;
+ int www = p->window().width() - (afterIcon + LVI_BORDER);
+ m_pText->setWidth(www);
+ m_pText->draw(p,afterIcon,LVI_BORDER,QRect(afterIcon,LVI_BORDER,www,p->window().height() - (LVI_BORDER * 2)),listBox()->viewport()->colorGroup());
+}
+
+int KviThemeListBoxItem::height ( const QListBox * lb ) const
+{
+ int iHeight = m_pText->height() + (2 * LVI_BORDER);
+ if(iHeight < (LVI_ICON_SIZE + (2 * LVI_BORDER)))iHeight = LVI_ICON_SIZE + (2 * LVI_BORDER);
+ return iHeight;
+}
+
+KviThemeManagementDialog * KviThemeManagementDialog::m_pInstance = 0;
+
+
+KviThemeManagementDialog::KviThemeManagementDialog(QWidget * parent)
+: QDialog(parent,"theme_options_widget")
+{
+ setCaption(__tr2qs_ctx("Manage Themes - KVIrc","theme"));
+ setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_THEMES)));
+
+ setModal(true);
+
+ m_pInstance = this;
+
+ m_pSaveThemeDialog = 0;
+
+ QGridLayout * g = new QGridLayout(this,3,2,4,4);
+
+ QHBox *hb = new QHBox(this);
+ g->addMultiCellWidget(hb,0,0,0,1);
+
+ KviStyledToolButton * tb = new KviStyledToolButton(hb);
+ tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_OPEN)));
+ tb->setUsesBigPixmap(true);
+ QToolTip::add(tb,__tr2qs_ctx("Install Theme Package From Disk","theme"));
+ connect(tb,SIGNAL(clicked()),this,SLOT(installFromXml()));
+
+ tb = new KviStyledToolButton(hb);
+ tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_SAVE)));
+ tb->setUsesBigPixmap(true);
+ QToolTip::add(tb,__tr2qs_ctx("Save Current Theme...","theme"));
+ connect(tb,SIGNAL(clicked()),this,SLOT(saveCurrentTheme()));
+
+ m_pPackThemeButton = new KviStyledToolButton(hb);
+ m_pPackThemeButton->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_PACK)));
+ m_pPackThemeButton->setUsesBigPixmap(true);
+ QToolTip::add(m_pPackThemeButton,__tr2qs_ctx("Export Selected Themes to a Distributable Package","theme"));
+ connect(m_pPackThemeButton,SIGNAL(clicked()),this,SLOT(packTheme()));
+
+ m_pDeleteThemeButton = new KviStyledToolButton(hb);
+ m_pDeleteThemeButton->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_REMOVE)));
+ m_pDeleteThemeButton->setUsesBigPixmap(true);
+ QToolTip::add(m_pDeleteThemeButton,__tr2qs_ctx("Delete Selected Themes","theme"));
+ connect(m_pDeleteThemeButton,SIGNAL(clicked()),this,SLOT(deleteTheme()));
+
+ tb = new KviStyledToolButton(hb);
+ tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_WWW)));
+ tb->setUsesBigPixmap(true);
+ QToolTip::add(tb,__tr2qs_ctx("Get More Themes...","theme"));
+ connect(tb,SIGNAL(clicked()),this,SLOT(getMoreThemes()));
+
+ QWidget *w= new QWidget(hb);
+ w->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum);
+
+ m_pListBox = new QListBox(this);
+ m_pListBox->setMinimumHeight(400);
+ m_pListBox->setMinimumWidth(400);
+ m_pListBox->setSelectionMode(QListBox::Extended);
+ connect(m_pListBox,SIGNAL(doubleClicked(QListBoxItem *)),this,SLOT(applyTheme(QListBoxItem *)));
+ connect(m_pListBox,SIGNAL(contextMenuRequested(QListBoxItem *,const QPoint &)),
+ this,SLOT(contextMenuRequested(QListBoxItem *,const QPoint &)));
+ connect(m_pListBox,SIGNAL(selectionChanged()),this,SLOT(enableDisableButtons()));
+ g->addMultiCellWidget(m_pListBox,1,1,0,1);
+
+
+ QPushButton * b = new QPushButton(__tr2qs("Close"),this);
+ connect(b,SIGNAL(clicked()),this,SLOT(closeClicked()));
+ g->addWidget(b,2,1);
+
+ g->setRowStretch(1,0);
+ g->setColStretch(0,0);
+
+ fillThemeBox();
+ m_pContextPopup = new QPopupMenu(this);
+
+ if(g_rectManagementDialogGeometry.y() < 5)
+ {
+ g_rectManagementDialogGeometry.setY(5);
+ }
+ resize(g_rectManagementDialogGeometry.width(),
+ g_rectManagementDialogGeometry.height());
+ move(g_rectManagementDialogGeometry.x(),
+ g_rectManagementDialogGeometry.y());
+}
+
+KviThemeManagementDialog::~KviThemeManagementDialog()
+{
+ g_rectManagementDialogGeometry = QRect(pos().x(),pos().y(),size().width(),size().height());
+
+ if(m_pSaveThemeDialog)
+ {
+ delete m_pSaveThemeDialog;
+ m_pSaveThemeDialog = 0;
+ }
+
+ m_pInstance = 0;
+}
+
+void KviThemeManagementDialog::closeClicked()
+{
+ delete this;
+}
+
+
+void KviThemeManagementDialog::display()
+{
+ if(m_pInstance)return;
+ m_pInstance = new KviThemeManagementDialog(g_pFrame);
+ m_pInstance->show();
+}
+
+void KviThemeManagementDialog::cleanup()
+{
+ if(!m_pInstance)return;
+ delete m_pInstance;
+ m_pInstance = 0;
+}
+
+void KviThemeManagementDialog::packTheme()
+{
+ KviPtrList<KviThemeInfo> dl;
+ dl.setAutoDelete(false);
+ for(KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->firstItem();it;it = (KviThemeListBoxItem *)it->next())
+ {
+ if(it->isSelected())
+ dl.append(it->themeInfo());
+ }
+ if(dl.isEmpty())return;
+
+ KviPackThemeDialog * pDialog = new KviPackThemeDialog(this,&dl);
+ pDialog->exec();
+ delete pDialog;
+
+}
+
+void KviThemeManagementDialog::contextMenuRequested ( QListBoxItem * it, const QPoint & pos )
+{
+ if(it)
+ {
+ m_pListBox->setCurrentItem(it);
+ m_pContextPopup->clear();
+ m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINUS)),__tr2qs_ctx("&Remove Theme","theme"),this,SLOT(deleteTheme()));
+ m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT)),__tr2qs_ctx("&Apply Theme","theme"),this,SLOT(applyCurrentTheme()));
+ m_pContextPopup->popup(pos);
+ }
+}
+
+void KviThemeManagementDialog::applyTheme ( QListBoxItem * it)
+{
+ if(it) m_pListBox->setCurrentItem(it);
+ applyCurrentTheme();
+}
+
+void KviThemeManagementDialog::applyCurrentTheme()
+{
+ KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->item(m_pListBox->currentItem());
+ if(!it)return;
+
+ if(KviMessageBox::yesNo(__tr2qs_ctx("Apply theme - KVIrc","theme"),
+ __tr2qs_ctx("Do you wish to apply theme \"%Q\" (version %Q)?","theme"),
+ &(it->themeInfo()->szName),&(it->themeInfo()->szVersion))) {
+
+ QString szPath = it->themeInfo()->szAbsoluteDirectory;
+ if(szPath.isEmpty())return;
+
+ g_pApp->loadTheme(szPath);
+ }
+}
+
+void KviThemeManagementDialog::deleteTheme()
+{
+ for(KviThemeListBoxItem * pItem = (KviThemeListBoxItem *)m_pListBox->firstItem();pItem;pItem = (KviThemeListBoxItem *)pItem->next())
+ {
+ if(pItem->isSelected())
+ {
+ if(!KviMessageBox::yesNo(__tr2qs_ctx("Delete Theme - KVIrc","theme"),
+ __tr2qs_ctx("Do you really wish to delete theme \"%Q\" (version %Q)?","theme"),
+ &(pItem->themeInfo()->szName),&(pItem->themeInfo()->szVersion)))goto jump_out;
+
+ KviFileUtils::deleteDir(pItem->themeInfo()->szAbsoluteDirectory);
+ }
+ }
+jump_out:
+ fillThemeBox();
+}
+
+void KviThemeManagementDialog::installFromXml()
+{
+ QString szFileName;
+ QDict<QString> * pInfoFields;
+ QString * pValue;
+ bool bInstall;
+
+ const char * check_fields[] = { "Name", "Version", "Author", "Description", "Date", "KVIrcVersion" };
+
+ if(!KviFileDialog::askForOpenFileName(szFileName,__tr2qs_ctx("Open Theme - KVIrc","theme"),QString::null,"*.kvt"))
+ return;
+
+ // check if it is a valid theme file
+ KviPackageReader r;
+ if(!r.readHeader(szFileName))
+ {
+ QString szErr = r.lastError();
+ KviMessageBox::information(__tr2qs_ctx("The selected file does not seem to be a valid KVIrc package: %Q","theme"),&szErr);
+ return;
+ }
+
+ pInfoFields = r.stringInfoFields();
+
+ pValue = pInfoFields->find("PackageType");
+ if(!pValue)goto not_a_valid_theme_package;
+ if(!KviQString::equalCI(*pValue,"ThemePack"))goto not_a_valid_theme_package;
+ pValue = pInfoFields->find("ThemePackVersion");
+ if(!pValue)goto not_a_valid_theme_package;
+ if(!KviQString::equalCI(*pValue,"1"))goto not_a_valid_theme_package;
+
+ // make sure the default fields exist
+ for(int i=0;i<6;i++)
+ {
+ pValue = pInfoFields->find(check_fields[i]);
+ if(!pValue)goto not_a_valid_theme_package;
+ }
+
+ pValue = pInfoFields->find("ThemeCount");
+ if(!pValue)goto not_a_valid_theme_package;
+ bool bOk;
+ int iThemeCount = pValue->toInt(&bOk);
+ if(!bOk)goto not_a_valid_theme_package;
+ if(iThemeCount < 1)goto not_a_valid_theme_package;
+
+ // ok.. it should be really valid at this point
+
+ // load it's picture
+ /*
+ KviUnpackThemeDialog * pDialog = new KviUnpackThemeDialog(this,szFileName);
+ bool bInstall = pDialog->exec() == QDialog::Accepted;
+ delete pDialog;
+ */
+
+ bInstall = true;
+
+ if(bInstall)
+ {
+ QString szUnpackPath;
+ g_pApp->getLocalKvircDirectory(szUnpackPath,KviApp::Themes);
+ if(!r.unpack(szFileName,szUnpackPath))
+ {
+ QString szErr2 = r.lastError();
+ KviMessageBox::information(__tr2qs_ctx("Failed to unpack the selected file: %Q","theme"),&szErr2);
+ return;
+ }
+ }
+
+ /*
+ KviXmlAddonLoader * pLoader = new KviXmlAddonLoader(szFilename,this);
+ pLoader->exec();
+ */
+ fillThemeBox();
+ return;
+not_a_valid_theme_package:
+ KviMessageBox::information(__tr2qs_ctx("The selected file does not seem to be a valid KVIrc theme package","theme"));
+ return;
+}
+
+void KviThemeManagementDialog::getMoreThemes()
+{
+ if(!g_pFrame)return;
+ g_pFrame->executeInternalCommand(KVI_INTERNALCOMMAND_OPENURL_KVIRC_THEMES);
+}
+
+void KviThemeManagementDialog::saveCurrentTheme()
+{
+ if(m_pSaveThemeDialog)return;
+ m_pSaveThemeDialog = new KviSaveThemeDialog(this);
+ m_pSaveThemeDialog->exec();
+ if(m_pSaveThemeDialog)
+ {
+ delete m_pSaveThemeDialog;
+ m_pSaveThemeDialog = 0;
+ fillThemeBox();
+ }
+}
+
+void KviThemeManagementDialog::fillThemeBox(const QString &szDir)
+{
+ QDir d(szDir);
+
+ QStringList sl = d.entryList(QDir::Dirs);
+
+ for(QStringList::Iterator it = sl.begin();it != sl.end();++it)
+ {
+ if(*it == ".")continue;
+ if(*it == "..")continue;
+
+ QString szTest = szDir;
+ szTest += KVI_PATH_SEPARATOR_CHAR;
+ szTest += *it;
+
+ KviThemeInfo * inf = new KviThemeInfo;
+ inf->szSubdirectory = *it;
+ if(g_pApp->loadThemeInfo(szTest,*inf))
+ {
+ KviThemeListBoxItem * item = 0;
+ item = new KviThemeListBoxItem(m_pListBox,inf);
+ } else {
+ delete inf;
+ }
+ }
+}
+
+void KviThemeManagementDialog::fillThemeBox()
+{
+ m_pListBox->clear();
+
+// KviThemeInfo * ti = new KviThemeInfo;
+// ti->szName = __tr2qs_ctx("Current Theme","theme");
+
+// KviThemeListBoxItem * itewrq = new KviThemeListBoxItem(m_pListBox,ti);
+
+ QString szDir;
+ g_pApp->getGlobalKvircDirectory(szDir,KviApp::Themes);
+ fillThemeBox(szDir);
+ g_pApp->getLocalKvircDirectory(szDir,KviApp::Themes);
+ fillThemeBox(szDir);
+
+// m_pListBox->setCurrentItem(itewrq);
+ enableDisableButtons();
+}
+
+bool KviThemeManagementDialog::hasSelectedItems()
+{
+ for(QListBoxItem * it = m_pListBox->firstItem();it;it = it->next())
+ {
+ if(it->isSelected())return true;
+ }
+ return false;
+}
+
+
+void KviThemeManagementDialog::enableDisableButtons()
+{
+ bool b = hasSelectedItems();
+ m_pPackThemeButton->setEnabled(b);
+ m_pDeleteThemeButton->setEnabled(b);
+}
+
+
diff --git a/src/modules/theme/managementdialog.h b/src/modules/theme/managementdialog.h
new file mode 100644
index 000000000..d88be2ea0
--- /dev/null
+++ b/src/modules/theme/managementdialog.h
@@ -0,0 +1,164 @@
+#ifndef _MANAGEMENTDIALOG_H_
+#define _MANAGEMENTDIALOG_H_
+//=============================================================================
+//
+// File : managementdialog.h
+// Created on Sat 30 Dec 2006 14:54:56 by Szymon Stefanek
+//
+// This file is part of the KVIrc IRC Client distribution
+// Copyright (C) 2006 Szymon Stefanek <pragma at kvirc dot net>
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+//=============================================================================
+
+#include "kvi_optionswidget.h"
+#include "kvi_list.h"
+
+#include <qdialog.h>
+#include <qsimplerichtext.h>
+#include <qlistbox.h>
+#include <qcombobox.h>
+#include <qpopupmenu.h>
+#include <qcursor.h>
+#include <qwizard.h>
+
+#define KVI_OPTIONS_WIDGET_ICON_KviThemeManagementDialog KVI_SMALLICON_GUI
+#define KVI_OPTIONS_WIDGET_NAME_KviThemeManagementDialog __tr2qs_no_lookup("Load & Save")
+#define KVI_OPTIONS_WIDGET_PRIORITY_KviThemeManagementDialog 90000
+#define KVI_OPTIONS_WIDGET_KEYWORDS_KviThemeManagementDialog __tr2qs_no_lookup("theme")
+#define KVI_OPTIONS_WIDGET_GROUP_KviThemeManagementDialog "themeLoader"
+
+class QLineEdit;
+class QTextEdit;
+class QPushButton;
+class QLabel;
+class QCheckBox;
+class QMultiLineEdit;
+
+typedef struct _KviThemeInfoTag KviThemeInfo;
+
+class KviSaveThemeDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ KviSaveThemeDialog(QWidget *par);
+ ~KviSaveThemeDialog();
+protected:
+ QLineEdit * m_pAuthorEdit;
+ QLineEdit * m_pThemeNameEdit;
+ QLineEdit * m_pVersionEdit;
+ QTextEdit * m_pDescriptionEdit;
+ QPushButton * m_pOkButton;
+// QComboBox * m_pFormatCombo;
+ QCheckBox * m_pIncludeMsgcolors;
+
+private:
+ void saveThemeInNewFormat(KviThemeInfo& info);
+ void saveThemeInOldFormat(KviThemeInfo& info);
+ void saveThemeInXmlFormat(KviThemeInfo& info);
+protected slots:
+ void saveTheme();
+ void themeNameChanged(const QString &txt);
+};
+
+class KviPackThemeDialog : public QWizard
+{
+ Q_OBJECT
+public:
+ KviPackThemeDialog(QWidget * pParent,KviPtrList<KviThemeInfo> * pThemeInfoList);
+ ~KviPackThemeDialog();
+protected:
+ QString m_szImagePath;
+ KviFileSelector * m_pImageSelector;
+ QString m_szPackagePath;
+ KviFileSelector * m_pPathSelector;
+ QLabel * m_pImageLabel;
+ KviPtrList<KviThemeInfo> * m_pThemeInfoList;
+ QLineEdit * m_pPackageNameEdit;
+ QMultiLineEdit * m_pPackageDescriptionEdit;
+ QLineEdit * m_pPackageVersionEdit;
+ QLineEdit * m_pPackagerNameEdit;
+ QWidget * m_pImageSelectionPage;
+protected:
+ virtual void accept();
+protected slots:
+ bool packTheme();
+ void imageSelectionChanged(const QString &szImagePath);
+};
+
+/*
+class KviUnpackThemeDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ KviUnpackThemeDialog(QWidget * pParent);
+ ~KviUnpackThemeDialog();
+};
+*/
+
+class KviThemeListBoxItem : public QListBoxText
+{
+public:
+ KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf);
+ ~KviThemeListBoxItem();
+public:
+ KviThemeInfo * m_pThemeInfo;
+ QSimpleRichText * m_pText;
+public:
+ KviThemeInfo * themeInfo(){ return m_pThemeInfo; };
+ virtual int height ( const QListBox * lb ) const ;
+protected:
+ virtual void paint ( QPainter * painter );
+};
+
+
+class KviStyledToolButton;
+
+class KviThemeManagementDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ KviThemeManagementDialog(QWidget * parent);
+ ~KviThemeManagementDialog();
+protected:
+ static KviThemeManagementDialog * m_pInstance;
+ QListBox * m_pListBox;
+ QPopupMenu * m_pContextPopup;
+ KviSaveThemeDialog * m_pSaveThemeDialog;
+ KviStyledToolButton * m_pDeleteThemeButton;
+ KviStyledToolButton * m_pPackThemeButton;
+public:
+ static KviThemeManagementDialog * instance(){ return m_pInstance; };
+ static void display();
+ static void cleanup();
+protected:
+ void fillThemeBox(const QString &szDir);
+ bool hasSelectedItems();
+protected slots:
+ void saveCurrentTheme();
+ void getMoreThemes();
+ void installFromXml();
+ void fillThemeBox();
+ void deleteTheme();
+ void closeClicked();
+ void packTheme();
+ void applyTheme(QListBoxItem *);
+ void applyCurrentTheme();
+ void enableDisableButtons();
+ void contextMenuRequested(QListBoxItem * item, const QPoint & pos);
+};
+
+#endif //!_MANAGEMENTDIALOG_H_