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.
tdesdk/cervisia/repositorydlg.cpp

503 lines
15 KiB

/*
* Copyright (C) 1999-2002 Bernd Gehrmann
* bernd@mail.berlios.de
* Copyright (c) 2002-2006 Christian Loose <christian.loose@kdemail.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 option) 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 "repositorydlg.h"
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <kbuttonbox.h>
#include <tdeconfig.h>
#include <tdelistview.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kdebug.h>
#include "addrepositorydlg.h"
#include "cvsservice_stub.h"
#include "misc.h"
#include "progressdlg.h"
#include "repositories.h"
class RepositoryListItem : public TDEListViewItem
{
public:
RepositoryListItem(TDEListView* parent, const TQString& repo, bool loggedin);
void setRsh(const TQString& rsh);
void setServer(const TQString& server) { m_server = server; }
void setCompression(int compression);
void setIsLoggedIn(bool isLoggedIn);
void setRetrieveCvsignore(bool retrieve) { m_retrieveCvsignore = retrieve; }
TQString repository() const
{
return text(0);
}
TQString rsh() const
{
TQString str = text(1);
return (str.startsWith("ext (") ? str.mid(5, str.length()-6)
: TQString());
}
TQString server() const { return m_server; }
int compression() const
{
bool ok;
int n = text(2).toInt(&ok);
return ok ? n : -1;
}
bool isLoggedIn() const { return m_isLoggedIn; }
bool retrieveCvsignore() const { return m_retrieveCvsignore; }
private:
void changeLoginStatusColumn();
private:
TQString m_server;
bool m_isLoggedIn;
bool m_retrieveCvsignore;
};
static bool LoginNeeded(const TQString& repository)
{
return repository.startsWith(":pserver:") ||
repository.startsWith(":sspi:");
}
RepositoryListItem::RepositoryListItem(TDEListView* parent, const TQString& repo,
bool loggedin)
: TDEListViewItem(parent)
, m_isLoggedIn(loggedin)
{
setText(0, repo);
changeLoginStatusColumn();
}
void RepositoryListItem::setRsh(const TQString& rsh)
{
TQString repo = repository();
TQString method;
if( repo.startsWith(":pserver:") )
method = "pserver";
else if( repo.startsWith(":sspi:") )
method = "sspi";
else if( repo.contains(':') )
{
method = "ext";
if( !rsh.isEmpty() )
{
method += " (";
method += rsh;
method += ")";
}
}
else
method = "local";
setText(1, method);
}
void RepositoryListItem::setCompression(int compression)
{
TQString compressionStr = (compression >= 0) ? TQString::number(compression)
: i18n("Default");
setText(2, compressionStr);
}
void RepositoryListItem::setIsLoggedIn(bool isLoggedIn)
{
m_isLoggedIn = isLoggedIn;
changeLoginStatusColumn();
}
void RepositoryListItem::changeLoginStatusColumn()
{
TQString loginStatus;
if( LoginNeeded(repository()) )
loginStatus = m_isLoggedIn ? i18n("Logged in") : i18n("Not logged in");
else
loginStatus = i18n("No login required");
setText(3, loginStatus);
}
RepositoryDialog::RepositoryDialog(TDEConfig& cfg, CvsService_stub* cvsService,
TQWidget* parent, const char* name)
: KDialogBase(parent, name, true, i18n("Configure Access to Repositories"),
Ok | Cancel | Help, Ok, true)
, m_partConfig(cfg)
, m_cvsService(cvsService)
{
TQFrame* mainWidget = makeMainWidget();
TQBoxLayout* hbox = new TQHBoxLayout(mainWidget, 0, spacingHint());
m_repoList = new TDEListView(mainWidget);
hbox->addWidget(m_repoList, 10);
m_repoList->setMinimumWidth(fontMetrics().width('0') * 60);
m_repoList->setAllColumnsShowFocus(true);
m_repoList->addColumn(i18n("Repository"));
m_repoList->addColumn(i18n("Method"));
m_repoList->addColumn(i18n("Compression"));
m_repoList->addColumn(i18n("Status"));
m_repoList->setFocus();
connect(m_repoList, TQT_SIGNAL(doubleClicked(TQListViewItem*)),
this, TQT_SLOT(slotDoubleClicked(TQListViewItem*)));
connect(m_repoList, TQT_SIGNAL(selectionChanged()),
this, TQT_SLOT(slotSelectionChanged()));
KButtonBox* actionbox = new KButtonBox(mainWidget, TQt::Vertical);
TQPushButton* addbutton = actionbox->addButton(i18n("&Add..."));
m_modifyButton = actionbox->addButton(i18n("&Modify..."));
m_removeButton = actionbox->addButton(i18n("&Remove"));
actionbox->addStretch();
m_loginButton = actionbox->addButton(i18n("Login..."));
m_logoutButton = actionbox->addButton(i18n("Logout"));
actionbox->addStretch();
actionbox->layout();
hbox->addWidget(actionbox, 0);
m_loginButton->setEnabled(false);
m_logoutButton->setEnabled(false);
connect( addbutton, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotAddClicked()) );
connect( m_modifyButton, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotModifyClicked()) );
connect( m_removeButton, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotRemoveClicked()) );
connect( m_loginButton, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotLoginClicked()) );
connect( m_logoutButton, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotLogoutClicked()) );
// open cvs DCOP service configuration file
m_serviceConfig = new TDEConfig("cvsservicerc");
readCvsPassFile();
readConfigFile();
if (TQListViewItem* item = m_repoList->firstChild())
{
m_repoList->setCurrentItem(item);
m_repoList->setSelected(item, true);
}
else
{
// we have no item so disable modify and remove button
slotSelectionChanged();
}
setHelp("accessing-repository");
setWFlags(TQt::WDestructiveClose | getWFlags());
TQSize size = configDialogSize(m_partConfig, "RepositoryDialog");
resize(size);
// without this restoreLayout() can't change the column widths
for (int i = 0; i < m_repoList->columns(); ++i)
m_repoList->setColumnWidthMode(i, TQListView::Manual);
m_repoList->restoreLayout(&m_partConfig, TQString::fromLatin1("RepositoryListView"));
}
RepositoryDialog::~RepositoryDialog()
{
saveDialogSize(m_partConfig, "RepositoryDialog");
m_repoList->saveLayout(&m_partConfig, TQString::fromLatin1("RepositoryListView"));
delete m_serviceConfig;
}
void RepositoryDialog::readCvsPassFile()
{
TQStringList list = Repositories::readCvsPassFile();
TQStringList::ConstIterator it;
for( it = list.begin(); it != list.end(); ++it )
(void) new RepositoryListItem(m_repoList, (*it), true);
}
void RepositoryDialog::readConfigFile()
{
TQStringList list = Repositories::readConfigFile();
// Sort out all list elements which are already in the list view
TQListViewItem* item = m_repoList->firstChild();
for( ; item; item = item->nextSibling() )
list.remove(item->text(0));
TQStringList::ConstIterator it;
for( it = list.begin(); it != list.end(); ++it )
new RepositoryListItem(m_repoList, *it, false);
// Now look for the used methods
item = m_repoList->firstChild();
for( ; item; item = item->nextSibling() )
{
RepositoryListItem* ritem = static_cast<RepositoryListItem*>(item);
// read entries from cvs DCOP service configuration
m_serviceConfig->setGroup(TQString::fromLatin1("Repository-") +
ritem->repository());
TQString rsh = m_serviceConfig->readEntry("rsh", TQString());
TQString server = m_serviceConfig->readEntry("cvs_server", TQString());
int compression = m_serviceConfig->readNumEntry("Compression", -1);
bool retrieveFile = m_serviceConfig->readBoolEntry("RetrieveCvsignore",
false);
ritem->setRsh(rsh);
ritem->setServer(server);
ritem->setCompression(compression);
ritem->setRetrieveCvsignore(retrieveFile);
}
}
void RepositoryDialog::slotOk()
{
// Make list of repositories
TQListViewItem* item;
TQStringList list;
for( item = m_repoList->firstChild(); item; item = item->nextSibling() )
list.append(item->text(0));
m_partConfig.setGroup("Repositories");
m_partConfig.writeEntry("Repos", list);
for( item = m_repoList->firstChild(); item; item = item->nextSibling() )
{
RepositoryListItem* ritem = static_cast<RepositoryListItem*>(item);
// write entries to cvs DCOP service configuration
writeRepositoryData(ritem);
}
// write to disk so other services can reparse the configuration
m_serviceConfig->sync();
KDialogBase::slotOk();
}
void RepositoryDialog::slotAddClicked()
{
AddRepositoryDialog dlg(m_partConfig, TQString(), this);
// default compression level
dlg.setCompression(-1);
if( dlg.exec() )
{
TQString repo = Cervisia::NormalizeRepository(dlg.repository());
TQString rsh = dlg.rsh();
TQString server = dlg.server();
int compression = dlg.compression();
bool retrieveFile = dlg.retrieveCvsignoreFile();
TQListViewItem* item = m_repoList->firstChild();
for( ; item; item = item->nextSibling() )
if( item->text(0) == repo )
{
KMessageBox::information(this, i18n("This repository is already known."));
return;
}
RepositoryListItem* ritem = new RepositoryListItem(m_repoList, repo, false);
ritem->setRsh(rsh);
ritem->setCompression(compression);
ritem->setRetrieveCvsignore(retrieveFile);
// write entries to cvs DCOP service configuration
writeRepositoryData(ritem);
// write to disk so other services can reparse the configuration
m_serviceConfig->sync();
}
}
void RepositoryDialog::slotModifyClicked()
{
slotDoubleClicked(m_repoList->selectedItem());
}
void RepositoryDialog::slotRemoveClicked()
{
// logout from pserver accounts so that they don't
// get re-added because of the .cvspass file. (BR #51129)
if( m_logoutButton->isEnabled() )
slotLogoutClicked();
delete m_repoList->currentItem();
}
void RepositoryDialog::slotDoubleClicked(TQListViewItem* item)
{
if( !item )
return;
RepositoryListItem* ritem = static_cast<RepositoryListItem*>(item);
TQString repo = ritem->repository();
TQString rsh = ritem->rsh();
TQString server = ritem->server();
int compression = ritem->compression();
bool retrieveFile = ritem->retrieveCvsignore();
AddRepositoryDialog dlg(m_partConfig, repo, this);
dlg.setRepository(repo);
dlg.setRsh(rsh);
dlg.setServer(server);
dlg.setCompression(compression);
dlg.setRetrieveCvsignoreFile(retrieveFile);
if( dlg.exec() )
{
ritem->setRsh(dlg.rsh());
ritem->setServer(dlg.server());
ritem->setCompression(dlg.compression());
ritem->setRetrieveCvsignore(dlg.retrieveCvsignoreFile());
// write entries to cvs DCOP service configuration
writeRepositoryData(ritem);
// write to disk so other services can reparse the configuration
m_serviceConfig->sync();
}
}
void RepositoryDialog::slotLoginClicked()
{
RepositoryListItem* item = (RepositoryListItem*)m_repoList->currentItem();
if( !item )
return;
kdDebug(8050) << k_funcinfo << "repository = " << item->repository() << endl;
DCOPRef job = m_cvsService->login(item->repository());
if( !m_cvsService->ok() )
{
kdError(8050) << "Failed to call login() method of the cvs DCOP service "
<< "(" << m_cvsService->app() << ")" << endl;
return;
}
bool success = job.call("execute()");
if( !success )
{
TQStringList output = job.call("output()");
KMessageBox::detailedError(this, i18n("Login failed."), output.join("\n"));
return;
}
item->setIsLoggedIn(true);
slotSelectionChanged();
}
void RepositoryDialog::slotLogoutClicked()
{
RepositoryListItem* item = (RepositoryListItem*)m_repoList->currentItem();
if( !item )
return;
kdDebug(8050) << k_funcinfo << "repository = " << item->repository() << endl;
DCOPRef job = m_cvsService->logout(item->repository());
if( !m_cvsService->ok() )
{
kdError(8050) << "Failed to call logout() method of the cvs DCOP service "
<< "(" << m_cvsService->app() << ")" << endl;
return;
}
ProgressDialog dlg(this, "Logout", job, "logout", i18n("CVS Logout"));
if( !dlg.execute() )
return;
item->setIsLoggedIn(false);
slotSelectionChanged();
}
void RepositoryDialog::slotSelectionChanged()
{
// retrieve the selected item
RepositoryListItem* item = (RepositoryListItem*)m_repoList->selectedItem();
// is an item in the list view selected?
bool isItemSelected = (item != 0);
m_modifyButton->setEnabled(isItemSelected);
m_removeButton->setEnabled(isItemSelected);
m_loginButton->setEnabled(isItemSelected);
m_logoutButton->setEnabled(isItemSelected);
if( !isItemSelected )
return;
// is this a pserver repository?
if( !LoginNeeded(item->repository()) )
{
m_loginButton->setEnabled(false);
m_logoutButton->setEnabled(false);
return;
}
// are we logged in?
bool isLoggedIn = item->isLoggedIn();
m_loginButton->setEnabled(!isLoggedIn);
m_logoutButton->setEnabled(isLoggedIn);
}
void RepositoryDialog::writeRepositoryData(RepositoryListItem* item)
{
// write entries to cvs DCOP service configuration
m_serviceConfig->setGroup(TQString::fromLatin1("Repository-") +
item->repository());
m_serviceConfig->writeEntry("rsh", item->rsh());
m_serviceConfig->writeEntry("cvs_server", item->server());
m_serviceConfig->writeEntry("Compression", item->compression());
m_serviceConfig->writeEntry("RetrieveCvsignore", item->retrieveCvsignore());
}
#include "repositorydlg.moc"