You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/modules/options/libkvioptions.cpp

325 lines
8.5 KiB

//============================================================================================
//
// File : libkvioptions.cpp
// Creation date : Fri Aug 18 2000 15:04:09 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// 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
// 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. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//============================================================================================
#include "kvi_module.h"
#include "kvi_options.h"
#include "kvi_app.h"
#include "kvi_frame.h"
#include "kvi_window.h"
#include "kvi_locale.h"
#include "kvi_mirccntrl.h"
#include "kvi_out.h"
#include "kvi_splash.h"
#include "container.h"
#include "instances.h"
#include "dialog.h"
#include <tqsplitter.h>
#include "kvi_pointerhashtable.h"
KviPointerHashTable<TQString,KviOptionsDialog> * g_pOptionsDialogDict = 0;
KviOptionsInstanceManager * g_pOptionsInstanceManager = 0;
extern int g_iOptionWidgetInstances;
/*
@doc: options.save
@type:
command
@title:
options.save
@short:
Saves the options to disk
@syntax:
options.save
@description:
Saves the options to disk; this includes aliases , popups ,
events and user preferences.
*/
static bool options_kvs_cmd_save(KviKvsModuleCommandCall * c)
{
g_pApp->saveOptions();
return true;
}
/*
@doc: options.dialog
@type:
command
@title:
options.dialog
@short:
Shows the "options dialog"
@syntax:
options.dialog [-t] [options_group]
@description:
Shows the KVIrc options dialog for the specified options group.
If the [-t] switch is used , the dialog is opened as toplevel window,
otherwise it is opened as part of the current frame window.[br]
Valid values for [options_group] are "general" and "theme".
If [options_group] is omitted, the option group "general" is assumed.
This command is exported by the "options" module.
@seealso:
[fnc]$options.isDialog[/fnc]
*/
static bool options_kvs_cmd_dialog(KviKvsModuleCommandCall * c)
{
TQString szGroup;
KVSM_PARAMETERS_BEGIN(c)
KVSM_PARAMETER("options_group",KVS_PT_STRING,KVS_PF_OPTIONAL,szGroup)
KVSM_PARAMETERS_END(c)
if(szGroup.isEmpty())szGroup = "general";
KviOptionsDialog * d = g_pOptionsDialogDict->find(szGroup);
if(d)
{
if(c->hasSwitch('t',"toplevel"))
{
if(d->parent())
{
d->reparent(0,TQPoint(0,0),true);
}
} else {
if(TQT_BASE_OBJECT(d->parent()) != TQT_BASE_OBJECT(c->window()->frame()->splitter()))
{
d->reparent(c->window()->frame()->splitter(),TQPoint(0,0),true);
}
}
} else {
if(c->hasSwitch('t',"toplevel"))
{
d = new KviOptionsDialog(0,szGroup);
} else {
d = new KviOptionsDialog(c->window()->frame()->splitter(),szGroup);
}
g_pOptionsDialogDict->insert(szGroup,d);
}
d->raise();
d->show();
d->setFocus();
return true;
}
/*
@doc: options.pages
@type:
command
@title:
options.pages
@short:
Lists the option pages
@syntax:
options.pages
@description:
Lists the option pages available for editing by the means of [cmd]options.edit[/cmd].
@seealso:
*/
static void options_kvs_module_print_pages(KviKvsModuleCommandCall * c,KviOptionsWidgetInstanceEntry * e,const char * prefix)
{
c->window()->output(KVI_OUT_SYSTEMMESSAGE,"%s%c%s%c (%Q)",prefix,KVI_TEXT_BOLD,e->szClassName,KVI_TEXT_BOLD,&(e->szName));
KviStr szPre = prefix;
szPre.append(" ");
if(e->pChildList)
{
for(KviOptionsWidgetInstanceEntry * ex = e->pChildList->first();ex;ex = e->pChildList->next())
{
options_kvs_module_print_pages(c,ex,szPre.ptr());
}
}
}
static bool options_kvs_cmd_pages(KviKvsModuleCommandCall * c)
{
KviPointerList<KviOptionsWidgetInstanceEntry> * l = g_pOptionsInstanceManager->instanceEntryTree();
for(KviOptionsWidgetInstanceEntry * e = l->first();e;e = l->next())
{
options_kvs_module_print_pages(c,e,"");
}
return true;
}
/*
@doc: options.edit
@type:
command
@title:
options.edit [-m]
@short:
Shows a single options page
@syntax:
options.edit <"options page class name">
@description:
Shows an options page as toplevel dialog.
The available option pages can be listed by using [cmd]options.pages[/cmd].
If the -m switch is used, the dialog will appear as modal, blocking input
to the main frame until it's closed.
@seealso:
*/
static bool options_kvs_cmd_edit(KviKvsModuleCommandCall * c)
{
TQString szOption;
KVSM_PARAMETERS_BEGIN(c)
KVSM_PARAMETER("option",KVS_PT_STRING,0,szOption)
KVSM_PARAMETERS_END(c)
KviOptionsWidgetInstanceEntry * e = g_pOptionsInstanceManager->findInstanceEntry(szOption);
if(!e)
{
c->warning(__tr2qs_ctx("No such options page class name %Q","options"),&szOption);
return true;
}
if(e->pWidget)
{
//c->warning(__tr("The editor page is already open","options"));
e->pWidget->raise();
e->pWidget->setActiveWindow();
e->pWidget->setFocus();
return true;
}
TQWidget * w;
if(c->hasSwitch('m',"modal"))
{
w = TQT_TQWIDGET(g_pApp->activeModalWidget());
if(!w)w = g_pFrame;
} else {
w = g_pFrame;
}
KviOptionsWidgetContainer * wc = new KviOptionsWidgetContainer(w,c->hasSwitch('m',"modal"));
wc->setup(g_pOptionsInstanceManager->getInstance(e,wc));
// a trick for the dialog covering the splash screen before the time (this is prolly a WM or TQt bug)
if(g_pSplashScreen)
{
if(g_pSplashScreen->isVisible()) // another bug: this ALWAYS RETURNS TRUE, even if the splash was hidden by a mouse click...
{
TQObject::connect(g_pSplashScreen,TQT_SIGNAL(destroyed()),wc,TQT_SLOT(show()));
return true;
}
}
wc->show();
wc->raise();
return true;
}
/*
@doc: options.isdialog
@type:
function
@title:
$options.isdialog
@short:
Returns the options dialog state
@syntax:
<boolean> $options.isdialog([options_group:string])
@description:
Returns '1' if the options dialog for the specified options_group is open, '0' otherwise.[br]
If [options_group] is omitted then the group "general" is assumed.
At the moment of writing the valid [options_group] values are "general" and "theme".
This command is exported by the "options" module.
@seealso:
[cmd]options.dialog[/cmd]
*/
static bool options_kvs_fnc_isdialog(KviKvsModuleFunctionCall * c)
{
TQString szGroup;
KVSM_PARAMETERS_BEGIN(c)
KVSM_PARAMETER("options_group",KVS_PT_STRING,KVS_PF_OPTIONAL,szGroup)
KVSM_PARAMETERS_END(c)
if(szGroup.isEmpty())szGroup = "general";
c->returnValue()->setBoolean(g_pOptionsDialogDict->find(szGroup));
return true;
}
static bool options_module_init(KviModule * m)
{
g_pOptionsInstanceManager = new KviOptionsInstanceManager();
KVSM_REGISTER_SIMPLE_COMMAND(m,"dialog",options_kvs_cmd_dialog);
KVSM_REGISTER_SIMPLE_COMMAND(m,"save",options_kvs_cmd_save);
KVSM_REGISTER_SIMPLE_COMMAND(m,"pages",options_kvs_cmd_pages);
KVSM_REGISTER_SIMPLE_COMMAND(m,"edit",options_kvs_cmd_edit);
KVSM_REGISTER_FUNCTION(m,"isDialog",options_kvs_fnc_isdialog);
g_pOptionsDialogDict = new KviPointerHashTable<TQString,KviOptionsDialog>;
g_pOptionsDialogDict->setAutoDelete(false);
return true;
}
static bool options_module_cleanup(KviModule *m)
{
KviPointerHashTableIterator<TQString,KviOptionsDialog> it(*g_pOptionsDialogDict);
KviPointerList<KviOptionsDialog> l;
l.setAutoDelete(false);
KviOptionsDialog * d;
while(d = it.current())
{
l.append(d);
++it;
}
for(d = l.first();d;d = l.next())delete d;
delete g_pOptionsDialogDict;
g_pOptionsDialogDict = 0;
g_pOptionsInstanceManager->cleanup(m);
delete g_pOptionsInstanceManager;
g_pOptionsInstanceManager = 0;
return true;
}
static bool options_module_can_unload(KviModule *m)
{
return ((g_pOptionsDialogDict->isEmpty()) && (g_iOptionWidgetInstances == 0));
}
KVIRC_MODULE(
"Options", // module name
"1.0.0", // module version
"Copyright (C) 2000 Szymon Stefanek (pragma at kvirc dot net)", // author & (C)
"Options Dialog",
options_module_init,
options_module_can_unload,
0,
options_module_cleanup
)