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/kvirc/ui/kvi_modeeditor.cpp

329 lines
8.8 KiB

//
// File : kvi_modeeditor.cpp
// Creation date : Sat Apr 14 2001 13:52:11 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2001 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.
//
#define __KVIRC__
#include "kvi_modeeditor.h"
#include "kvi_iconmanager.h"
#include "kvi_locale.h"
#include "kvi_qstring.h"
#include "kvi_console.h"
#include "kvi_ircconnection.h"
#include "kvi_ircconnectionserverinfo.h"
#include "kvi_channel.h"
#include "kvi_ircconnectionuserinfo.h"
#include "kvi_styled_controls.h"
#include "kvi_toolwindows_container.h"
#include "kvi_tal_scrollview.h"
#include <tqlayout.h>
#include <tqlabel.h>
//////////////////////////////////////////////////////////////////////
// class KviModeEditor
//
//////////////////////////////////////////////////////////////////////
//static char checkable_modes_table[KVI_NUM_CHECKABLE_MODES] = { 'p','s','t','n','m','i'};
// FIXME: This widget should use a KviTalScrollView!
KviModeEditor::KviModeEditor(TQWidget * par,KviWindowToolPageButton* button,const char * nam,KviConsole * c,const char * mode,const char * key,const char * limit)
: KviWindowToolWidget(par,button)
{
m_szMode = mode;
m_szKey = key;
m_szLimit = limit;
bool isEnabled=1;
TQObject * w = parent();
while(w)
{
if(w->inherits("KviChannel"))
{
KviChannel *chan = ((KviChannel *)w);
if(!( chan->isMeHalfOp() || chan->isMeOp() || chan->isMeChanOwner() || chan->isMeChanAdmin() || chan->connection()->userInfo()->hasUserMode('o') || chan->connection()->userInfo()->hasUserMode('O') ) ) isEnabled=0;
break;
}
w = w->parent();
}
TQGridLayout *pMasterLayout = new TQGridLayout(this,2,1,2,2);
setFocusPolicy(TQWidget::ClickFocus);
KviTalScrollView *pScrollView = new KviTalScrollView(this);
pScrollView->viewport()->setBackgroundMode(TQWidget::PaletteBackground);
pMasterLayout->addWidget(pScrollView,0,0);
pMasterLayout->setRowStretch(1,1);
TQPushButton * b;
if(isEnabled) b = new TQPushButton(__tr2qs("&Apply"),this);
else b = new TQPushButton(__tr2qs("Close"),this);
pMasterLayout->addWidget(b,1,0);
connect(b,TQ_SIGNAL(clicked()),this,TQ_SLOT(commit()));
TQWidget * pBackground = new TQWidget(pScrollView->viewport());
TQGridLayout *g = new TQGridLayout(pBackground,20,3,2,2);
TQLabel * l = new TQLabel("",pBackground);
l->setPixmap(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MODE)));
g->addWidget(l,0,0);
l = new TQLabel(__tr2qs("Channel Modes"),pBackground);
g->addMultiCellWidget(l,0,0,1,2);
TQFrame * f = new TQFrame(pBackground);
f->setFrameStyle(TQFrame::HLine | TQFrame::Sunken);
g->addMultiCellWidget(f,1,1,0,2);
int i = 1;
TQString tmp;
m_pCheckBoxes = new KviPointerList<KviStyledCheckBox>;
m_pCheckBoxes->setAutoDelete(false);
// first che basic checkable modes pstnmi
TQString szModes = "pstnmi";
while(!szModes.isEmpty())
{
TQChar ccc = szModes[0];
szModes.remove(0,1);
KviTQString::sprintf(tmp,"%c: %Q",ccc.unicode(),&(c->connection()->serverInfo()->getChannelModeDescription(ccc)));
KviStyledCheckBox * cb = new KviStyledCheckBox(tmp,pBackground);
cb->setEnabled(isEnabled);
m_pCheckBoxes->append(cb);
cb->setChecked(m_szMode.contains((char)ccc.unicode()));
i++;
g->addMultiCellWidget(cb,i,i,0,2);
}
KviTQString::sprintf(tmp,"l: %Q",&(c->connection()->serverInfo()->getChannelModeDescription('l')));
m_pLimitBox = new KviStyledCheckBox(tmp,pBackground);
m_pLimitBox->setEnabled(isEnabled);
i++;
g->addMultiCellWidget(m_pLimitBox,i,i,0,2);
connect(m_pLimitBox,TQ_SIGNAL(toggled(bool)),this,TQ_SLOT(limitBoxToggled(bool)));
m_pLimitEdit = new TQLineEdit(pBackground);
m_pLimitEdit->setEnabled(isEnabled);
i++;
g->addMultiCellWidget(m_pLimitEdit,i,i,1,2);
if(m_szLimit.hasData())
{
m_pLimitBox->setChecked(true);
// m_pLimitEdit->setEnabled(true);
m_pLimitEdit->setText(m_szLimit.ptr());
} else {
m_pLimitEdit->setEnabled(false);
}
KviTQString::sprintf(tmp,"k: %Q",&(c->connection()->serverInfo()->getChannelModeDescription('k')));
m_pKeyBox = new KviStyledCheckBox(tmp,pBackground);
m_pKeyBox->setEnabled(isEnabled);
i++;
g->addMultiCellWidget(m_pKeyBox,i,i,0,2);
connect(m_pKeyBox,TQ_SIGNAL(toggled(bool)),this,TQ_SLOT(keyBoxToggled(bool)));
m_pKeyEdit = new TQLineEdit(pBackground);
m_pKeyEdit->setEnabled(isEnabled);
i++;
g->addMultiCellWidget(m_pKeyEdit,i,i,1,2);
if(m_szKey.hasData())
{
m_pKeyBox->setChecked(true);
// m_pLimitEdit->setEnabled(true);
m_pKeyEdit->setText(m_szKey.ptr());
} else {
m_pKeyEdit->setEnabled(false);
}
if(c->connection())
{
if(c->connection()->serverInfo())
szModes = c->connection()->serverInfo()->supportedChannelModes();
}
int idx = szModes.findRev(',');
if(idx != -1)szModes.remove(0,idx+1);
szModes.replace("p","");
szModes.replace("s","");
szModes.replace("t","");
szModes.replace("n","");
szModes.replace("m","");
szModes.replace("i","");
szModes.replace(",","");
szModes.replace("b","");
szModes.replace("k","");
szModes.replace("l","");
while(!szModes.isEmpty())
{
TQChar ccc = szModes[0];
szModes.remove(0,1);
KviTQString::sprintf(tmp,"%c: %Q",(char)ccc.unicode(),&(c->connection()->serverInfo()->getChannelModeDescription(ccc)));
KviStyledCheckBox * cb = new KviStyledCheckBox(tmp,pBackground);
cb->setEnabled(isEnabled);
m_pCheckBoxes->append(cb);
cb->setChecked(m_szMode.contains((char)ccc.unicode()));
i++;
g->addMultiCellWidget(cb,i,i,0,2);
}
i++;
g->setRowStretch(i,1);
g->setColStretch(2,1);
pScrollView->addChild(pBackground,0,0);
registerSelf();
}
KviModeEditor::~KviModeEditor()
{
delete m_pCheckBoxes;
}
void KviModeEditor::limitBoxToggled(bool bChecked)
{
m_pLimitEdit->setEnabled(bChecked);
}
void KviModeEditor::keyBoxToggled(bool bChecked)
{
m_pKeyEdit->setEnabled(bChecked);
}
void KviModeEditor::commit()
{
KviStr szPlusModes;
KviStr szMinusModes;
if(m_szKey.hasData())
{
// had a key before
if(m_pKeyBox->isChecked())
{
// still have it
KviStr tmp = m_pKeyEdit->text();
tmp.stripWhiteSpace();
if(tmp.hasData())
{
if(!kvi_strEqualCI(tmp.ptr(),m_szKey.ptr()))
{
// not the same key!
// set the new one
KviStr mode(KviStr::Format,"-k %s",m_szKey.ptr());
emit setMode(mode.ptr());
mode.sprintf("+k %s",tmp.ptr());
emit setMode(mode.ptr());
}
}
} else {
// no key now! reset
KviStr mode(KviStr::Format,"-k %s",m_szKey.ptr());
emit setMode(mode.ptr());
}
} else {
// there was no key before
if(m_pKeyBox->isChecked())
{
KviStr tmp = m_pKeyEdit->text();
tmp.stripWhiteSpace();
if(tmp.hasData())
{
// new key to be set
KviStr mode(KviStr::Format,"+k %s",tmp.ptr());
emit setMode(mode.ptr());
}
}
}
if(m_szLimit.hasData())
{
// had a limit before
if(m_pLimitBox->isChecked())
{
// still have it
KviStr tmp = m_pLimitEdit->text();
tmp.stripWhiteSpace();
if(tmp.hasData() && tmp.isUnsignedNum())
{
if(!kvi_strEqualCI(tmp.ptr(),m_szLimit.ptr()))
{
// not the same limit!
KviStr mode(KviStr::Format,"+l %s",tmp.ptr());
emit setMode(mode.ptr());
}
}
} else {
// no limit now! reset
szMinusModes.append('l');
}
} else {
// there was no limit before
if(m_pLimitBox->isChecked())
{
KviStr tmp = m_pLimitEdit->text();
tmp.stripWhiteSpace();
if(tmp.hasData() && tmp.isUnsignedNum())
{
// new limit to be set
KviStr mode(KviStr::Format,"+l %s",tmp.ptr());
emit setMode(mode.ptr());
}
}
}
for(KviStyledCheckBox * cb = m_pCheckBoxes->first();cb;cb = m_pCheckBoxes->next())
{
TQString sz = cb->text();
sz.replace("&","");
if(sz.length() > 0)
{
TQChar ccc = sz[0];
if(cb->isChecked())
{
if(!m_szMode.contains((char)ccc.unicode()))szPlusModes.append((char)ccc.unicode());
} else {
if(m_szMode.contains((char)ccc.unicode()))szMinusModes.append((char)ccc.unicode());
}
}
}
KviStr szModes;
if(szMinusModes.hasData())szModes.sprintf("-%s",szMinusModes.ptr());
if(szPlusModes.hasData())szModes.append(KviStr::Format,"+%s",szPlusModes.ptr());
if(szModes.hasData())emit setMode(szModes.ptr());
emit done();
}
#include "kvi_modeeditor.moc"