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.
376 lines
13 KiB
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"
|