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.
tdevelop/parts/distpart/distpart_widget.cpp

606 lines
21 KiB

/***************************************************************************
* Copyright (C) 2004 by ian reinhart geiser *
* geiseri@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. *
* *
* 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 "distpart_widget.h"
#include <kparts/part.h>
#include <klibloader.h>
#include <kurl.h>
#include <kdebug.h>
#include <kprocess.h>
#include <kfiledialog.h>
#include <kio/netaccess.h>
#include <klocale.h>
#include "kdevproject.h"
#include "domutil.h"
#include <ktar.h>
#include <kmessagebox.h>
#include <kdevcore.h>
#include <qgroupbox.h>
#include <qlayout.h>
#include <qnetwork.h>
#include <qurloperator.h>
#include <qmessagebox.h>
#include "distpart_part.h"
#include <qdir.h>
#include <qfile.h>
#include <qregexp.h>
#include <qstringlist.h>
#include <qtabwidget.h>
#include "kdevmakefrontend.h"
#include <kprogress.h>
#include <qerrormessage.h>
#include "specsupport.h"
#include "lsmsupport.h"
DistpartDialog::DistpartDialog(DistpartPart *part, QWidget *parent)
:distpart_ui(parent, "dist_widget"), m_part(part) {
m_spec = new SpecSupport(m_part);
connect( customProjectCheckBox, SIGNAL(toggled(bool) ),
this, SLOT(slotcustomProjectCheckBoxChanged()));
connect( uploadCustomCheckBox, SIGNAL(toggled(bool)),
this, SLOT(slotuploadCustomCheckBoxChanged()));
// connect( okayPushButton, SIGNAL(clicked()),
// this, SLOT(slotokayPushButtonPressed()));
// connect( cancelPushButton, SIGNAL(clicked()),
// this, SLOT(slotcancelPushButtonPressed()));
/* connect(help_PushButton, SIGNAL(clicked()),
this, SLOT(slothelp_PushButtonPressed()));*/
connect( createSrcArchPushButton, SIGNAL(clicked()),
this, SLOT(slotcreateSrcArchPushButtonPressed()));
connect( resetSrcPushButton, SIGNAL(clicked()),
this, SLOT(slotresetSrcPushButtonPressed()));
connect( genHTMLPushButton, SIGNAL(clicked()),
this, SLOT(slotgenHTMLPushButtonPressed()));
connect( resetHTMLPushButton, SIGNAL(clicked()),
this, SLOT(slotresetHTMLPushButtonPressed()));
connect( uploadSubmitPushButton, SIGNAL(clicked()),
this, SLOT(slotuploadSubmitPushButtonPressed()));
connect( uploadResetPushButton, SIGNAL(clicked()),
this, SLOT(slotuploadResetPushButtonPressed()));
connect( uploadAddFileToolButton, SIGNAL(clicked()),
this, SLOT(slotuploadAddFileToolButtonPressed()));
connect( uploadRemoveToolButton, SIGNAL(clicked()),
this, SLOT(slotuploadRemoveToolButtonPressed()));
connect ( srcDistFileListBox, SIGNAL(clicked(QListBoxItem *item)), this, SLOT(slotRemoveFile(QListBoxItem *item)));
// connect( buildAllPushButton, SIGNAL( clicked() ), this, SLOT( slotbuildAllPushButtonPressed() ));
// connect( exportSPECPushButton, SIGNAL( clicked() ), this, SLOT( slotexportSPECPushButtonPressed( ) ) );
// connect( srcPackagePushButton, SIGNAL( clicked() ), this, SLOT( slotsrcPackagePushButtonPressed() ) );
// connect( importSPECPushButton, SIGNAL( clicked() ), this, SLOT( slotimportSPECPushButtonPressed() ) );
loadSettings();
localOptionsGroupBox->setEnabled(false);
devPackageCheckBox->setEnabled(false);
docsPackageCheckBox->setEnabled(false);
appIconCheckBox->setEnabled(false);
uploadftpkdeorgCheckBox->setEnabled(false);
uploadAppsKDEcomCheckBox->setEnabled(false);
}
DistpartDialog::~DistpartDialog() {
}
// QPushButton* okayPushButton;
void DistpartDialog::slotokayPushButtonPressed() {
storeSettings();
// accept();
}
// QPushButton* cancelPushButton;
void DistpartDialog::slotcancelPushButtonPressed() {
// reject();
}
// QPushButton* help_PushButton;
/*void DistpartDialog::slothelp_PushButtonPressed() {
QMessageBox::about(this,i18n("Distpart Help"),i18n("In order to build a RPM package :\n\t1) Create a source archive\n\t2) Generate a SPEC File\n\t3) Build the package"));
}*/
// QPushButton* createSrcArchPushButton;
void DistpartDialog::slotcreateSrcArchPushButtonPressed() {
kdDebug() << "Starting archive..." << endl;
QString dist = (getcustomProjectCheckBoxState() && getbzipCheckBoxState()) ? "application/x-bzip2" : "application/x-gzip";
QString filename = m_part->project()->projectDirectory() + "/" + getSourceName();
KTar tar(filename, dist);
if ( tar.open(IO_WriteOnly) )
{
//QStringList files = m_part->project()->distFiles();
KProgressDialog *prog = new KProgressDialog( 0, "dialog", i18n("Building Package"), "", true );
prog->show();
for( uint idx = 0; idx < srcDistFileListBox->numRows(); ++idx)
{
QString file = srcDistFileListBox->text(idx);
if ( !tar.addLocalFile( m_part->project()->projectDirectory() + "/" + file, getappNameFormatLineEditText() + "/" + file) )
{
kdDebug() << "Failed to write file " << file << endl;
}
else
{
prog->setLabel(i18n("Adding file: %1").arg( file) );
prog->progressBar()->setValue( (idx*100)/srcDistFileListBox->numRows() );
}
}
tar.close( );
prog->hide();
delete prog;
KMessageBox::information( this, i18n("Archive made at: %1").arg( filename ), i18n("Archive Done") );
}
else
{
kdDebug() << "Failed to open archive..." << endl;
}
}
// QPushButton* resetSrcPushButton;
void DistpartDialog::slotresetSrcPushButtonPressed() {
srcDistFileListBox->clear();
loadSettings();
}
// QPushButton* genHTMLPushButton;
void DistpartDialog::slotgenHTMLPushButtonPressed() {}
// QPushButton* resetHTMLPushButton;
void DistpartDialog::slotresetHTMLPushButtonPressed() {}
// QToolButton* uploadAddFileToolButton;
void DistpartDialog::slotuploadAddFileToolButtonPressed() {
uploadFileListBox->insertStringList(KFileDialog::getOpenFileNames());
}
// QToolButton* uploadRemoveToolButton;
void DistpartDialog::slotuploadRemoveToolButtonPressed() {
for(unsigned int i=0; i< uploadFileListBox->count(); i++)
if ( uploadFileListBox->isSelected(i)) uploadFileListBox->removeItem(i);
}
// QPushButton* uploadSubmitPushButton;
void DistpartDialog::slotuploadSubmitPushButtonPressed() {
if(getuploadftpkdeorgCheckBoxState() || getuploadAppsKDEcomCheckBoxState())
kdDebug() << "Implement ftp.kde.org & apps.kde.com ftp transfer" << endl;
else {
for(unsigned int i=0; i< uploadFileListBox->count(); i++)
KIO::NetAccess::copy(KURL::fromPathOrURL( uploadFileListBox->text(i) ),
KURL::fromPathOrURL( getuploadURLLineEditText() + uploadFileListBox->text(i).replace(QRegExp("[^/]*/"),"") ));
}
}
// QPushButton* uploadResetPushButton;
void DistpartDialog::slotuploadResetPushButtonPressed() {
uploadFileListBox->clear();
}
// Connect Slots to the following widgets and add
// accessors and mutators
// QCheckBox* customProjectCheckBox;
void DistpartDialog::slotcustomProjectCheckBoxChanged() {
kdDebug () << "New State" << customProjectCheckBox->isChecked() << endl;
sourceOptionsGroupBox->setEnabled( customProjectCheckBox->isChecked());
}
bool DistpartDialog::getcustomProjectCheckBoxState() {
return customProjectCheckBox->isChecked();
}
void DistpartDialog::setcustomProjectCheckBoxState(bool state) {
customProjectCheckBox->setChecked(state);
}
// QCheckBox* uploadCustomCheckBox;
void DistpartDialog::slotuploadCustomCheckBoxChanged() {
uploadURLLineEdit->setEnabled( uploadCustomCheckBox->isChecked());
}
bool DistpartDialog::getuploadCustomCheckBoxState() {
return uploadCustomCheckBox->isChecked();
}
void DistpartDialog::setuploadCustomCheckBoxState(bool state) {
uploadCustomCheckBox->setChecked(state);
}
// Add accessors and mutators for the following
// QCheckBox* bzipCheckBox;
bool DistpartDialog::getbzipCheckBoxState() {
return bzipCheckBox->isChecked();
}
void DistpartDialog::setbzipCheckBoxState(bool state) {
bzipCheckBox->setChecked(state);
}
// QCheckBox* appIconCheckBox;
bool DistpartDialog::getappIconCheckBoxState() {
return appIconCheckBox->isChecked();
}
void DistpartDialog::setappIconCheckBoxState(bool state) {
appIconCheckBox->setChecked(state);
}
// QCheckBox* genHTMLCheckBox;
bool DistpartDialog::getgenHTMLCheckBoxState() {
return genHTMLCheckBox->isChecked();
}
void DistpartDialog::setgenHTMLCheckBoxState(bool state) {
genHTMLCheckBox->setChecked(state);
}
// QCheckBox* useRPMInfoCheckBox;
bool DistpartDialog::getuseRPMInfoCheckBoxState() {
return useRPMInfoCheckBox->isChecked();
}
void DistpartDialog::setuseRPMInfoCheckBoxState(bool state) {
useRPMInfoCheckBox->setChecked(state);
}
// QCheckBox* uploadAppsKDEcomCheckBox;
bool DistpartDialog::getuploadAppsKDEcomCheckBoxState() {
return uploadAppsKDEcomCheckBox->isChecked();
}
void DistpartDialog::setuploadAppsKDEcomCheckBoxState(bool state) {
uploadAppsKDEcomCheckBox->setChecked(state);
}
// QCheckBox* uploadftpkdeorgCheckBox;
bool DistpartDialog::getuploadftpkdeorgCheckBoxState() {
return uploadftpkdeorgCheckBox->isChecked();
}
void DistpartDialog::setuploadftpkdeorgCheckBoxState(bool state) {
uploadftpkdeorgCheckBox->setChecked(state);
}
// QCheckBox* devPackageCheckBox;
bool DistpartDialog::getdevPackageCheckBoxState() {
return devPackageCheckBox->isChecked();
}
void DistpartDialog::setdevPackageCheckBoxState(bool state) {
devPackageCheckBox->setChecked(state);
}
// QCheckBox* docsPackageCheckBox;
bool DistpartDialog::getdocsPackageCheckBoxState() {
return docsPackageCheckBox->isChecked();
}
void DistpartDialog::setdocsPackageCheckBoxState(bool state) {
docsPackageCheckBox->setChecked(state);
}
// QLineEdit* archNameFormatLineEdit;
QString DistpartDialog::getarchNameFormatLineEditText() {
return archNameFormatLineEdit->text();
}
void DistpartDialog::setarchNameFormatLineEditText(QString text) {
archNameFormatLineEdit->setText(text);
}
// QLineEdit* appNameLineEdit;
QString DistpartDialog::getappNameFormatLineEditText() {
return appNameLineEdit->text();
}
void DistpartDialog::setappNameFormatLineEditText(QString text) {
appNameLineEdit->setText(text);
}
// QLineEdit* summaryLineEdit;
QString DistpartDialog::getsummaryLineEditText() {
return summaryLineEdit->text();
}
void DistpartDialog::setsummaryLineEditText(QString text) {
summaryLineEdit->setText(text);
}
// QLineEdit* groupLineEdit;
QString DistpartDialog::getgroupLineEditText() {
return groupLineEdit->text();
}
void DistpartDialog::setgroupLineEditText(QString text) {
groupLineEdit->setText(text);
}
// QLineEdit* releaseLineEdit;
QString DistpartDialog::getreleaseLineEditText() {
return releaseLineEdit->text();
}
void DistpartDialog::setreleaseLineEditText(QString text) {
releaseLineEdit->setText(text);
}
// QLineEdit* VersionLineEdit;
QString DistpartDialog::getversionLineEditText() {
return versionLineEdit->text();
}
void DistpartDialog::setversionLineEditText(QString text) {
versionLineEdit->setText( text );
}
// QLineEdit* VendorLineEdit;
QString DistpartDialog::getvendorLineEditText() {
return vendorLineEdit->text();
}
void DistpartDialog::setvendorLineEditText(QString text) {
vendorLineEdit->setText(text);
}
// QLineEdit* LicenseLineEdit;
QString DistpartDialog::getlicenseLineEditText() {
return licenseLineEdit->text();
}
void DistpartDialog::setlicenseLineEditText(QString text) {
licenseLineEdit->setText(text);
}
// QLineEdit* uploadURLLineEdit;
QString DistpartDialog::getuploadURLLineEditText() {
return uploadURLLineEdit->text();
}
void DistpartDialog::setuploadURLLineEditText(QString text) {
uploadURLLineEdit->setText(text);
}
// QLineEdit* PackagerLineEdit;
QString DistpartDialog::getpackagerLineEditText() {
return packagerLineEdit->text();
}
void DistpartDialog::setpackagerLineEditText(QString text) {
packagerLineEdit->setText(text);
}
// QComboBox* archComboBox;
QString DistpartDialog::getarchComboBoxText() {
return archComboBox->currentText();
}
int DistpartDialog::getarchComboBoxItem() {
return archComboBox->currentItem();
}
void DistpartDialog::setarchComboBoxItem(int item) {
archComboBox->setCurrentItem( item );
}
// QListBox* uploadFileListBox;
QString DistpartDialog::getuploadFileListBoxText() {
return uploadFileListBox->currentText();
}
int DistpartDialog::getuploadFileListBoxItem() {
return uploadFileListBox->currentItem();
}
void DistpartDialog::setuploadFileListBoxItem(int item) {
uploadFileListBox->setCurrentItem( item);
}
// QListBox* srcDistFileListBox;
QString DistpartDialog::getsrcDistFileListBoxText() {
return srcDistFileListBox->currentText ();
}
int DistpartDialog::getsrcDistFileListBoxItem() {
return srcDistFileListBox->currentItem ();
}
void DistpartDialog::setsrcDistFileListBoxItem(int item) {
srcDistFileListBox->setCurrentItem( item );
}
// QMultiLineEdit* projectDescriptionMultilineEdit;
QString DistpartDialog::getprojectDescriptionMultilineEditText() {
return projectDescriptionMultilineEdit->text();
}
void DistpartDialog::setprojectDescriptionMultilineEditText(QString text) {
projectDescriptionMultilineEdit->setText(text);
}
QString DistpartDialog::getprojectChangelogMultilineEditText() {
return projectChangelogMultilineEdit->text();
}
void DistpartDialog::setprojectChangelogMultilineEditText(QString text) {
projectChangelogMultilineEdit->setText(text);
}
QString DistpartDialog::getSourceName() {
QString name = (getcustomProjectCheckBoxState()) ? getarchNameFormatLineEditText() : QString("%n-%v");
name += (getcustomProjectCheckBoxState() && getbzipCheckBoxState()) ? ".tar.bz2" : ".tar.gz";
return name.replace(QRegExp("%n"),getappNameFormatLineEditText())
.replace(QRegExp("%v"),getversionLineEditText())
.replace(QRegExp("%d"),QDate::currentDate().toString("yyyyMMdd"));
}
void DistpartDialog::loadSettings() {
QDomDocument &dom = *m_part->projectDom();
srcDistFileListBox->insertStringList( m_part->project()->distFiles() );
// First Tab
setcustomProjectCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/custom",false));
slotcustomProjectCheckBoxChanged();
setbzipCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/bzip",false));
setarchNameFormatLineEditText(DomUtil::readEntry(dom,"/dist/archname"));
// Second Tab
setappNameFormatLineEditText(DomUtil::readEntry(dom,"/dist/appname", m_part->project()->projectName() ));
setversionLineEditText(DomUtil::readEntry(dom,"/dist/version",DomUtil::readEntry(dom,"/general/version")));
setreleaseLineEditText(DomUtil::readEntry(dom,"/dist/release"));
setvendorLineEditText(DomUtil::readEntry(dom,"/dist/vendor"));
setlicenseLineEditText(DomUtil::readEntry(dom,"/dist/licence"));
setsummaryLineEditText(DomUtil::readEntry(dom,"/dist/summary"));
setgroupLineEditText(DomUtil::readEntry(dom,"/dist/group"));
setpackagerLineEditText(DomUtil::readEntry(dom,"/dist/packager"));
setprojectDescriptionMultilineEditText(DomUtil::readEntry(dom,"/dist/description",DomUtil::readEntry(dom,"/general/description")));
setprojectChangelogMultilineEditText(DomUtil::readEntry(dom,"/dist/changelog"));
setdevPackageCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/devpackage"));
setdocsPackageCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/docspackage"));
setappIconCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/appicon"));
setarchComboBoxItem(DomUtil::readIntEntry(dom,"/dist/arch"));
// Third Tab
setgenHTMLCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/genHTML"));
setuseRPMInfoCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/useRPM"));
setuploadftpkdeorgCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/ftpkde"));
setuploadAppsKDEcomCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/appskde"));
setuploadCustomCheckBoxState(DomUtil::readBoolEntry(dom,"/dist/custom"));
slotuploadCustomCheckBoxChanged();
setuploadURLLineEditText(DomUtil::readEntry(dom,"/dist/url"));
}
void DistpartDialog::storeSettings() {
QDomDocument &dom = *m_part->projectDom();
// First Tab
DomUtil::writeBoolEntry(dom,"/dist/custom",getcustomProjectCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/bzip",getbzipCheckBoxState());
DomUtil::writeEntry(dom,"/dist/archname",getarchNameFormatLineEditText());
// Second Tab
DomUtil::writeEntry(dom,"/dist/appname",getappNameFormatLineEditText());
DomUtil::writeEntry(dom,"/dist/version",getversionLineEditText());
DomUtil::writeEntry(dom,"/dist/release",getreleaseLineEditText());
DomUtil::writeEntry(dom,"/dist/vendor",getvendorLineEditText());
DomUtil::writeEntry(dom,"/dist/licence",getlicenseLineEditText());
DomUtil::writeEntry(dom,"/dist/summary",getsummaryLineEditText());
DomUtil::writeEntry(dom,"/dist/group",getgroupLineEditText());
DomUtil::writeEntry(dom,"/dist/packager",getpackagerLineEditText());
DomUtil::writeEntry(dom,"/dist/description",getprojectDescriptionMultilineEditText());
DomUtil::writeEntry(dom,"/dist/changelog",getprojectChangelogMultilineEditText());
DomUtil::writeBoolEntry(dom,"/dist/devpackage",getdevPackageCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/docspackage",getdocsPackageCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/appicon",getappIconCheckBoxState());
DomUtil::writeIntEntry(dom,"/dist/arch",getarchComboBoxItem());
// Third Tab
DomUtil::writeBoolEntry(dom,"/dist/genHTML",getgenHTMLCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/useRPM",getuseRPMInfoCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/ftpkde",getuploadftpkdeorgCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/appskde",getuploadAppsKDEcomCheckBoxState());
DomUtil::writeBoolEntry(dom,"/dist/custom",getuploadCustomCheckBoxState());
DomUtil::writeEntry(dom,"/dist/url",getuploadURLLineEditText());
}
// Populate Spec Data from UI;
void DistpartDialog::setPackageData()
{
m_spec->setAppRevision( releaseLineEdit->text());
m_spec->setAppName( appNameLineEdit->text());
m_spec->setAppVendor( vendorLineEdit->text());
m_spec->setAppLicense( licenseLineEdit->text());
m_spec->setAppSummary( summaryLineEdit->text());
m_spec->setAppPackager( packagerLineEdit->text());
m_spec->setAppVersion( versionLineEdit->text());
m_spec->setAppGroup( groupLineEdit->text());
m_spec->setAppDescription( projectDescriptionMultilineEdit->text());
m_spec->setAppChangelog( projectChangelogMultilineEdit->text());
}
// Populate UI from Spec data;
void DistpartDialog::getPackageData()
{
releaseLineEdit->setText(m_spec->getAppRevision());
appNameLineEdit->setText(m_spec->getAppName());
vendorLineEdit->setText(m_spec->getAppVendor());
licenseLineEdit->setText(m_spec->getAppLicense( ));
summaryLineEdit->setText(m_spec->getAppSummary( ));
packagerLineEdit->setText(m_spec->getAppPackager( ));
versionLineEdit->setText(m_spec->getAppVersion());
groupLineEdit->setText(m_spec->getAppGroup( ));
projectDescriptionMultilineEdit->setText(m_spec->getAppDescription( ));
projectChangelogMultilineEdit->setText(m_spec->getAppChangelog( ));
}
void DistpartDialog::slotbuildAllPushButtonPressed( )
{
setPackageData();
m_spec->slotbuildAllPushButtonPressed();
}
void DistpartDialog::slotexportSPECPushButtonPressed( )
{
setPackageData();
m_spec->slotexportSPECPushButtonPressed();
}
void DistpartDialog::slotimportSPECPushButtonPressed( )
{
m_spec->slotimportSPECPushButtonPressed();
getPackageData();
}
void DistpartDialog::slotsrcPackagePushButtonPressed( )
{
setPackageData();
m_spec->slotsrcPackagePushButtonPressed();
}
void DistpartDialog::slotAddFileButtonPressed(){
QStringList filenames = KFileDialog::getOpenFileNames();
for(uint count =0; count< filenames.size(); count++){
QString base = m_part->project()->projectDirectory() +"/";
srcDistFileListBox->insertItem(filenames[count].remove(base));
}
}
void DistpartDialog::slotRemoveFile(QListBoxItem *item){
if ( KMessageBox::Yes == KMessageBox::warningYesNo( this, i18n("Remove %1").arg( item->text() ), i18n("Remove File") )){
for(uint count =0; count< srcDistFileListBox->numRows(); count++){
if ( item == srcDistFileListBox->item(count)){
srcDistFileListBox->removeItem(count);
break;
}
}
}
}
#include "distpart_widget.moc"