diff options
| author | 2006-12-30 14:47:50 +0000 | |
|---|---|---|
| committer | 2006-12-30 14:47:50 +0000 | |
| commit | 1655daf2249fa681bcf56f176b7a49c6332ff26f (patch) | |
| tree | 90184ad81e1f7b5a111be3c10c5638db7dd38c36 | |
| parent | *AUTOMATICALLY* updated KVI_SOURCES_DATE variable (diff) | |
| download | KVIrc-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
51 files changed, 5977 insertions, 2900 deletions
@@ -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 Binary files differnew file mode 100644 index 000000000..3afbfcd0c --- /dev/null +++ b/data/pics/coresmall/kcs_theme.png diff --git a/data/pics/coresmall/kcs_themes.png b/data/pics/coresmall/kcs_themes.png Binary files differnew file mode 100644 index 000000000..b54c1d06b --- /dev/null +++ b/data/pics/coresmall/kcs_themes.png diff --git a/data/pics/kvi_bigicon_pack.png b/data/pics/kvi_bigicon_pack.png Binary files differnew file mode 100644 index 000000000..0ff6bed99 --- /dev/null +++ b/data/pics/kvi_bigicon_pack.png diff --git a/data/pics/kvi_bigicon_themes.png b/data/pics/kvi_bigicon_themes.png Binary files differnew file mode 100644 index 000000000..9c945fd51 --- /dev/null +++ b/data/pics/kvi_bigicon_themes.png 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_ |
