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.
tellico/src/fetcherconfigdialog.cpp

226 lines
7.9 KiB

/***************************************************************************
copyright : (C) 2006 by Robby Stephenson
email : robby@periapsis.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of version 2 of the GNU General Public License as *
* published by the Free Software Foundation; *
* *
***************************************************************************/
#include "fetcherconfigdialog.h"
#include "fetch/fetchmanager.h"
#include "gui/combobox.h"
#include <tdelocale.h>
#include <klineedit.h>
#include <kcombobox.h>
#include <kiconloader.h>
#include <tqlabel.h>
#include <tqlayout.h>
#include <tqhgroupbox.h>
#include <tqwidgetstack.h>
#include <tqwhatsthis.h>
#include <tqhbox.h>
#include <tqvgroupbox.h>
#include <tqcheckbox.h>
namespace {
static const int FETCHER_CONFIG_MIN_WIDTH = 600;
}
using Tellico::FetcherConfigDialog;
FetcherConfigDialog::FetcherConfigDialog(TQWidget* parent_)
: KDialogBase(parent_, "fetcher dialog", true, i18n("Data Source Properties"),
KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help)
, m_newSource(true)
, m_useDefaultName(true)
, m_configWidget(0) {
init(Fetch::Unknown);
}
FetcherConfigDialog::FetcherConfigDialog(const TQString& sourceName_, Fetch::Type type_, bool updateOverwrite_,
Fetch::ConfigWidget* configWidget_, TQWidget* parent_)
: KDialogBase(parent_, "fetcher dialog", true, i18n("Data Source Properties"),
KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help)
, m_newSource(false)
, m_useDefaultName(false)
, m_configWidget(configWidget_) {
init(type_);
m_nameEdit->setText(sourceName_);
m_cbOverwrite->setChecked(updateOverwrite_);
}
void FetcherConfigDialog::init(Fetch::Type type_) {
setMinimumWidth(FETCHER_CONFIG_MIN_WIDTH);
setHelp(TQString::fromLatin1("data-sources-options"));
TQWidget* widget = new TQWidget(this);
TQBoxLayout* topLayout = new TQHBoxLayout(widget, KDialog::spacingHint());
TQBoxLayout* vlay1 = new TQVBoxLayout(topLayout, KDialog::spacingHint());
m_iconLabel = new TQLabel(widget);
if(type_ == Fetch::Unknown) {
m_iconLabel->setPixmap(TDEGlobal::iconLoader()->loadIcon(TQString::fromLatin1("network"), TDEIcon::Panel, 64));
} else {
m_iconLabel->setPixmap(Fetch::Manager::self()->fetcherIcon(type_, TDEIcon::Panel, 64));
}
vlay1->addWidget(m_iconLabel);
vlay1->addStretch(1);
TQBoxLayout* vlay2 = new TQVBoxLayout(topLayout, KDialog::spacingHint());
TQGridLayout* gl = new TQGridLayout(vlay2, 2, 2, KDialog::spacingHint());
int row = -1;
TQLabel* label = new TQLabel(i18n("&Source name: "), widget);
gl->addWidget(label, ++row, 0);
TQString w = i18n("The name identifies the data source and should be unique and informative.");
TQWhatsThis::add(label, w);
m_nameEdit = new KLineEdit(widget);
gl->addWidget(m_nameEdit, row, 1);
m_nameEdit->setFocus();
TQWhatsThis::add(m_nameEdit, w);
label->setBuddy(m_nameEdit);
connect(m_nameEdit, TQ_SIGNAL(textChanged(const TQString&)), TQ_SLOT(slotNameChanged(const TQString&)));
if(m_newSource) {
label = new TQLabel(i18n("Source &type: "), widget);
} else {
// since the label doesn't have a buddy, we don't want an accel,
// but also want to reuse string we already have
label = new TQLabel(i18n("Source &type: ").remove('&'), widget);
}
gl->addWidget(label, ++row, 0);
w = i18n("Tellico supports several different data sources.");
TQWhatsThis::add(label, w);
if(m_newSource) {
m_typeCombo = new GUI::ComboBox(widget);
gl->addWidget(m_typeCombo, row, 1);
TQWhatsThis::add(m_typeCombo, w);
label->setBuddy(m_typeCombo);
} else {
m_typeCombo = 0;
TQLabel* lab = new TQLabel(Fetch::Manager::typeName(type_), widget);
gl->addWidget(lab, row, 1);
TQWhatsThis::add(lab, w);
}
m_cbOverwrite = new TQCheckBox(i18n("Updating from source should overwrite user data"), widget);
++row;
gl->addMultiCellWidget(m_cbOverwrite, row, row, 0, 1);
w = i18n("If checked, updating entries will overwrite any existing information.");
TQWhatsThis::add(m_cbOverwrite, w);
if(m_newSource) {
m_stack = new TQWidgetStack(widget);
vlay2->addWidget(m_stack);
connect(m_typeCombo, TQ_SIGNAL(activated(int)), TQ_SLOT(slotNewSourceSelected(int)));
int z3950_idx = 0;
const Fetch::TypePairList typeList = Fetch::Manager::self()->typeList();
for(Fetch::TypePairList::ConstIterator it = typeList.begin(); it != typeList.end(); ++it) {
const Fetch::TypePair& type = *it;
m_typeCombo->insertItem(type.index(), type.value());
if(type.value() == Fetch::Z3950) {
z3950_idx = m_typeCombo->count()-1;
}
}
// make sure first widget gets initialized
// I'd like it to be the z39.50 widget
m_typeCombo->setCurrentItem(z3950_idx);
slotNewSourceSelected(z3950_idx);
} else {
m_stack = 0;
// just add config widget and reparent
m_configWidget->reparent(widget, TQPoint());
vlay2->addWidget(m_configWidget);
connect(m_configWidget, TQ_SIGNAL(signalName(const TQString&)), TQ_SLOT(slotPossibleNewName(const TQString&)));
}
setMainWidget(widget);
}
TQString FetcherConfigDialog::sourceName() const {
return m_nameEdit->text();
}
bool FetcherConfigDialog::updateOverwrite() const {
return m_cbOverwrite->isChecked();
}
Tellico::Fetch::ConfigWidget* FetcherConfigDialog::configWidget() const {
if(m_newSource) {
return dynamic_cast<Fetch::ConfigWidget*>(m_stack->visibleWidget());
}
kdWarning() << "FetcherConfigDialog::configWidget() called for modifying existing fetcher!" << endl;
return m_configWidget;
}
Tellico::Fetch::Type FetcherConfigDialog::sourceType() const {
if(!m_newSource || m_typeCombo->count() == 0) {
kdWarning() << "FetcherConfigDialog::sourceType() called for modifying existing fetcher!" << endl;
return Fetch::Unknown;
}
return static_cast<Fetch::Type>(m_typeCombo->currentData().toInt());
}
void FetcherConfigDialog::slotNewSourceSelected(int idx_) {
if(!m_newSource) {
return;
}
// always change to default name
m_useDefaultName = true;
Fetch::ConfigWidget* cw = m_configWidgets[idx_];
if(cw) {
m_stack->raiseWidget(cw);
slotPossibleNewName(cw->preferredName());
return;
}
Fetch::Type type = sourceType();
if(type == Fetch::Unknown) {
kdWarning() << "FetcherConfigDialog::slotNewSourceSelected() - unknown source type" << endl;
return;
}
m_iconLabel->setPixmap(Fetch::Manager::self()->fetcherIcon(type, TDEIcon::Panel, 64));
cw = Fetch::Manager::self()->configWidget(m_stack, type, m_typeCombo->currentText());
if(!cw) {
// bad bad bad!
kdWarning() << "FetcherConfigDialog::slotNewSourceSelected() - no config widget found for type " << type << endl;
m_typeCombo->setCurrentItem(0);
slotNewSourceSelected(0);
return;
}
connect(cw, TQ_SIGNAL(signalName(const TQString&)), TQ_SLOT(slotPossibleNewName(const TQString&)));
m_configWidgets.insert(idx_, cw);
m_stack->addWidget(cw);
m_stack->raiseWidget(cw);
slotPossibleNewName(cw->preferredName());
}
void FetcherConfigDialog::slotNameChanged(const TQString&) {
m_useDefaultName = false;
}
void FetcherConfigDialog::slotPossibleNewName(const TQString& name_) {
if(name_.isEmpty()) {
return;
}
Fetch::ConfigWidget* cw = m_stack ? static_cast<Fetch::ConfigWidget*>(m_stack->visibleWidget()) : m_configWidget;
if(m_useDefaultName || (cw && m_nameEdit->text() == cw->preferredName())) {
m_nameEdit->setText(name_);
m_useDefaultName = true; // it gets reset in slotNameChanged()
}
}
#include "fetcherconfigdialog.moc"