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.
tdeutils/kdelirc/kcmlirc/addaction.cpp

376 lines
13 KiB

/***************************************************************************
* Copyright (C) 2003 by Gav Wood *
* gav@kde.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include <tqregexp.h>
#include <tqlabel.h>
#include <tqradiobutton.h>
#include <tqwidgetstack.h>
#include <tqcheckbox.h>
#include <tqbuttongroup.h>
#include <kdebug.h>
#include <klineedit.h>
#include <klistview.h>
#include <kapplication.h>
#include <kmessagebox.h>
#include <knuminput.h>
#include <keditlistbox.h>
#include <klocale.h>
#include <dcopclient.h>
#include <irkick_stub.h>
#include "prototype.h"
#include "addaction.h"
#include "profileserver.h"
#include "remoteserver.h"
AddAction::AddAction(TQWidget *parent, const char *name, const Mode &mode): AddActionBase(parent, name), theMode(mode)
{
connect(this, TQT_SIGNAL( selected(const TQString &) ), TQT_SLOT( updateForPageChange() ));
connect(this, TQT_SIGNAL( selected(const TQString &) ), TQT_SLOT( slotCorrectPage() ));
curPage = 0;
updateProfiles();
updateButtons();
updateObjects();
updateProfileFunctions();
}
AddAction::~AddAction()
{
}
void AddAction::slotNextParam()
{
// TODO: go on to next parameter
}
void AddAction::slotModeSelected()
{
theSwitchMode->setChecked(true);
}
void AddAction::slotCorrectPage()
{
int lastPage = curPage;
curPage = indexOf(currentPage());
if(curPage == 2 && theUseProfile->isChecked())
showPage(((TQWizard *)this)->page(lastPage > 1 ? 1 : 3));
if((curPage == 2 || curPage == 5) && theChangeMode->isChecked())
showPage(((TQWizard *)this)->page(lastPage > 1 ? 1 : 6));
if(curPage == 3 && theUseDCOP->isChecked())
showPage(((TQWizard *)this)->page(lastPage == 4 ? 2 : 4));
if(curPage == 4 && (
(theUseDCOP->isChecked() && theFunctions->currentItem() && !Prototype(theFunctions->currentItem()->text(2)).count()) ||
(theUseProfile->isChecked() && (theProfileFunctions->currentItem() && !theProfileFunctions->currentItem()->text(1).toInt() || theJustStart->isChecked()))
))
showPage(((TQWizard *)this)->page(lastPage == 5 ? (theUseDCOP->isChecked() ? 2 : 3) : 5));
}
void AddAction::requestNextPress()
{
IRKick_stub("irkick", "IRKick").stealNextPress(DCOPClient::mainClient()->appId(), "KCMLirc", "gotButton(TQString, TQString)");
}
void AddAction::cancelRequest()
{
IRKick_stub("irkick", "IRKick").dontStealNextPress();
}
void AddAction::updateButton(const TQString &remote, const TQString &button)
{
if(theMode.remote() == remote)
{ // note this isn't the "correct" way of doing it; really i should iterate throughg the items and try to find the item which when put through buttonMap[item] returns the current button name. but i cant be arsed.
theButtons->setCurrentItem(theButtons->findItem(RemoteServer::remoteServer()->getButtonName(remote, button), 0));
theButtons->ensureItemVisible(theButtons->findItem(RemoteServer::remoteServer()->getButtonName(remote, button), 0));
}
else
KMessageBox::error(this, i18n( "You did not select a mode of that remote control. Please use %1, "
"or revert back to select a different mode." ).tqarg( theMode.remoteName() ),
i18n( "Incorrect Remote Control Detected" ));
if(indexOf(currentPage()) == 1)
requestNextPress();
}
void AddAction::updateButtons()
{
theButtons->clear();
buttonMap.clear();
IRKick_stub IRKick("irkick", "IRKick");
TQStringList buttons = IRKick.buttons(theMode.remote());
for(TQStringList::iterator j = buttons.begin(); j != buttons.end(); ++j)
buttonMap[new TQListViewItem(theButtons, RemoteServer::remoteServer()->getButtonName(theMode.remote(), *j))] = *j;
}
void AddAction::updateForPageChange()
{
if(indexOf(currentPage()) == 1) requestNextPress(); else cancelRequest();
switch(indexOf(currentPage()))
{ case 0: break;
case 1: break;
case 2: break;
case 3: break;
case 4: break;
}
updateButtonStates();
}
void AddAction::updateButtonStates()
{
switch(indexOf(currentPage()))
{ case 0: setNextEnabled(currentPage(), theProfiles->currentItem() != 0 || !theUseProfile->isChecked()); break;
case 1: setNextEnabled(currentPage(), theButtons->currentItem() != 0); break;
case 2: setNextEnabled(currentPage(), theFunctions->currentItem() != 0); break;
case 3: setNextEnabled(currentPage(), theProfileFunctions->currentItem() != 0 || theJustStart->isChecked()); break;
case 4: setNextEnabled(currentPage(), true); break;
case 5: setNextEnabled(currentPage(), false); setFinishEnabled(currentPage(), true); break;
case 6: setNextEnabled(currentPage(), false); setFinishEnabled(currentPage(), theModes->currentItem() || !theSwitchMode->isChecked()); break;
}
}
const TQStringList AddAction::getFunctions(const TQString app, const TQString obj)
{
TQStringList ret;
DCOPClient *theClient = KApplication::kApplication()->dcopClient();
QCStringList theApps = theClient->remoteFunctions(app.utf8(), obj.utf8());
for(QCStringList::iterator i = theApps.begin(); i != theApps.end(); ++i)
if( *i != "QCStringList interfaces()" &&
*i != "QCStringList functions()" &&
*i != "QCStringList objects()" &&
*i != "QCStringList find(TQCString)" )
ret += TQString::fromUtf8(*i);
return ret;
}
void AddAction::updateProfiles()
{
ProfileServer *theServer = ProfileServer::profileServer();
theProfiles->clear();
profileMap.clear();
TQDict<Profile> dict = theServer->profiles();
TQDictIterator<Profile> i(dict);
for(; i.current(); ++i)
profileMap[new TQListViewItem(theProfiles, i.current()->name())] = i.currentKey();
}
void AddAction::updateOptions()
{
IfMulti im;
if(theUseProfile->isChecked())
{
ProfileServer *theServer = ProfileServer::profileServer();
if(!theProfiles->currentItem()) return;
const Profile *p = theServer->profiles()[profileMap[theProfiles->currentItem()]];
im = p->ifMulti();
isUnique = p->unique();
}
else if(theUseDCOP->isChecked())
{
if(!theObjects->selectedItem()) return;
TQListViewItem* i = theObjects->selectedItem()->parent();
if(!i) return;
isUnique = uniqueProgramMap[i];
TQRegExp r("(.*)-[0-9]+");
program = r.exactMatch(nameProgramMap[i]) ? r.cap(1) : nameProgramMap[i];
im = IM_DONTSEND;
}
else return;
theIMLabel->setEnabled(!isUnique);
theIMGroup->setEnabled(!isUnique);
theIMLine->setEnabled(!isUnique);
theIMTop->setEnabled(!isUnique);
theDontSend->setEnabled(!isUnique);
theSendToBottom->setEnabled(!isUnique);
theSendToTop->setEnabled(!isUnique);
theSendToAll->setEnabled(!isUnique);
switch(im)
{ case IM_DONTSEND: theDontSend->setChecked(true); break;
case IM_SENDTOTOP: theSendToTop->setChecked(true); break;
case IM_SENDTOBOTTOM: theSendToBottom->setChecked(true); break;
case IM_SENDTOALL: theSendToAll->setChecked(true); break;
}
}
void AddAction::updateProfileFunctions()
{
ProfileServer *theServer = ProfileServer::profileServer();
theProfileFunctions->clear();
profileFunctionMap.clear();
if(!theProfiles->currentItem()) return;
const Profile *p = theServer->profiles()[profileMap[theProfiles->currentItem()]];
TQDict<ProfileAction> dict = p->actions();
for(TQDictIterator<ProfileAction> i(dict); i.current(); ++i)
profileFunctionMap[new TQListViewItem(theProfileFunctions, i.current()->name(), TQString().setNum(i.current()->arguments().count()), i.current()->comment())] = i.currentKey();
updateParameters();
updateOptions();
}
void AddAction::updateParameters()
{
theParameters->clear();
theArguments.clear();
if(theUseDCOP->isChecked() && theFunctions->currentItem())
{
Prototype p(theFunctions->currentItem()->text(2));
for(unsigned k = 0; k < p.count(); k++)
{ new KListViewItem(theParameters, p.name(k).isEmpty() ? i18n( "<anonymous>" ) : p.name(k), "", p.type(k), TQString().setNum(k + 1));
theArguments.append(TQVariant(""));
theArguments.back().cast(TQVariant::nameToType(p.type(k).utf8()));
}
}
else if(theUseProfile->isChecked() && theProfiles->currentItem())
{
ProfileServer *theServer = ProfileServer::profileServer();
if(!theProfiles->currentItem()) return;
if(!theProfileFunctions->currentItem()) return;
const Profile *p = theServer->profiles()[profileMap[theProfiles->currentItem()]];
const ProfileAction *pa = p->actions()[profileFunctionMap[theProfileFunctions->currentItem()]];
int index = 1;
for(TQValueList<ProfileActionArgument>::const_iterator i = pa->arguments().begin(); i != pa->arguments().end(); ++i, index++)
{ theArguments.append(TQVariant((*i).getDefault()));
theArguments.back().cast(TQVariant::nameToType((*i).type().utf8()));
new TQListViewItem(theParameters, (*i).comment(), theArguments.back().toString(), (*i).type(), TQString().setNum(index));
}
// quicky update options too...
theRepeat->setChecked(pa->repeat());
theAutoStart->setChecked(pa->autoStart());
}
updateParameter();
}
void AddAction::updateParameter()
{
if(theParameters->currentItem())
{ TQString type = theParameters->currentItem()->text(2);
int index = theParameters->currentItem()->text(3).toInt() - 1;
if(type.find("int") != -1 || type.find("short") != -1 || type.find("long") != -1)
{ theValue->raiseWidget(2);
theValueIntNumInput->setValue(theArguments[index].toInt());
}
else if(type.find("double") != -1 || type.find("float") != -1)
{ theValue->raiseWidget(3);
theValueDoubleNumInput->setValue(theArguments[index].toDouble());
}
else if(type.find("bool") != -1)
{ theValue->raiseWidget(1);
theValueCheckBox->setChecked(theArguments[index].toBool());
}
else if(type.find(TQSTRINGLIST_OBJECT_NAME_STRING) != -1)
{ theValue->raiseWidget(4);
TQStringList backup = theArguments[index].toStringList();
// backup needed because calling clear will kill what ever has been saved.
theValueEditListBox->clear();
theValueEditListBox->insertStringList(backup);
theArguments[index].asStringList() = backup;
}
else
{ theValue->raiseWidget(0);
theValueLineEdit->setText(theArguments[index].toString());
}
theCurParameter->setText(theParameters->currentItem()->text(0));
theCurParameter->setEnabled(true);
theValue->setEnabled(true);
}
else
{ theCurParameter->setText("");
theValueLineEdit->setText("");
theValueCheckBox->setChecked(false);
theValueIntNumInput->setValue(0);
theValueDoubleNumInput->setValue(0.0);
theCurParameter->setEnabled(false);
theValue->setEnabled(false);
}
}
// called when the textbox/checkbox/whatever changes value
void AddAction::slotParameterChanged()
{
if(!theParameters->currentItem()) return;
int index = theParameters->currentItem()->text(3).toInt() - 1;
TQString type = theParameters->currentItem()->text(2);
if(type.find("int") != -1 || type.find("short") != -1 || type.find("long") != -1)
theArguments[index].asInt() = theValueIntNumInput->value();
else if(type.find("double") != -1 || type.find("float") != -1)
theArguments[index].asDouble() = theValueDoubleNumInput->value();
else if(type.find("bool") != -1)
theArguments[index].asBool() = theValueCheckBox->isChecked();
else if(type.find(TQSTRINGLIST_OBJECT_NAME_STRING) != -1)
theArguments[index].asStringList() = theValueEditListBox->items();
else
theArguments[index].asString() = theValueLineEdit->text();
theArguments[theParameters->currentItem()->text(3).toInt() - 1].cast(TQVariant::nameToType(theParameters->currentItem()->text(2).utf8()));
updateArgument(theParameters->currentItem());
}
// takes theArguments[theIndex] and puts it into theItem
void AddAction::updateArgument(TQListViewItem *theItem)
{
theItem->setText(1, theArguments[theItem->text(3).toInt() - 1].toString());
}
void AddAction::updateObjects()
{
TQStringList names;
theObjects->clear();
uniqueProgramMap.clear();
nameProgramMap.clear();
DCOPClient *theClient = KApplication::kApplication()->dcopClient();
QCStringList theApps = theClient->registeredApplications();
for(QCStringList::iterator i = theApps.begin(); i != theApps.end(); ++i)
{
if(!TQString(*i).find("anonymous")) continue;
if(!TQString(*i).find(i18n( "anonymous" ))) continue;
TQRegExp r("(.*)-[0-9]+");
TQString name = r.exactMatch(TQString(*i)) ? r.cap(1) : *i;
if(names.contains(name)) continue;
names += name;
KListViewItem *a = new KListViewItem(theObjects, name);
uniqueProgramMap[a] = name == TQString(*i);
nameProgramMap[a] = *i;
QCStringList theObjects = theClient->remoteObjects(*i);
for(QCStringList::iterator j = theObjects.begin(); j != theObjects.end(); ++j)
if(*j != "ksycoca" && *j != "qt")// && getFunctions(*i, *j).count())
new KListViewItem(a, *j);
}
updateFunctions();
}
void AddAction::updateFunctions()
{
theFunctions->clear();
if(theObjects->currentItem() && theObjects->currentItem()->parent())
{ TQStringList functions = getFunctions(nameProgramMap[theObjects->currentItem()->parent()], theObjects->currentItem()->text(0));
for(TQStringList::iterator i = functions.begin(); i != functions.end(); ++i)
{ Prototype p((TQString)(*i));
new KListViewItem(theFunctions, p.name(), p.argumentList(), *i);
}
}
updateOptions();
}
#include "addaction.moc"