diff options
Diffstat (limited to 'buildtools/autotools/addapplicationdlg.cpp')
-rw-r--r-- | buildtools/autotools/addapplicationdlg.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/buildtools/autotools/addapplicationdlg.cpp b/buildtools/autotools/addapplicationdlg.cpp new file mode 100644 index 00000000..04e132dd --- /dev/null +++ b/buildtools/autotools/addapplicationdlg.cpp @@ -0,0 +1,207 @@ +/*************************************************************************** + * Copyright (C) 2001 by Bernd Gehrmann * + * bernd@kdevelop.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 "addapplicationdlg.h" + +#include <qcheckbox.h> +#include <qcombobox.h> +#include <qfile.h> +#include <qheader.h> +#include <qlistview.h> +#include <qtextstream.h> +#include <qapplication.h> +#include <klineedit.h> +#include <kdebug.h> +#include <kicondialog.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kmimetype.h> + +#include "autolistviewitems.h" + +#include "misc.h" +#include "autoprojectwidget.h" +#include "autoprojectpart.h" + + +AddApplicationDialog::AddApplicationDialog(AutoProjectWidget *widget, SubprojectItem *spitem, + QWidget *parent, const char *name) + : AddApplicationDialogBase(parent, name, true) +{ + filename_edit->setText(".desktop"); + filename_edit->home(false); + filename_edit->setFocus(); + chosentypes_listview->header()->hide(); + availtypes_listview->header()->hide(); + QString addApplication = add_button->text(); + QString removeApplication = remove_button->text(); + + add_button->setText( QApplication::reverseLayout() ? removeApplication : addApplication ); + remove_button->setText( QApplication::reverseLayout() ? addApplication : removeApplication ); + + m_widget = widget; + subProject = spitem; + + // Fill the combo box with program names in the directory + QPtrListIterator<TargetItem> tit(spitem->targets); + for (; tit.current(); ++tit) { + if ((*tit)->primary == "PROGRAMS") + executable_combo->insertItem(QString((*tit)->name)); + } + + // Fill the list of available mime types + KMimeType::List l = KMimeType::allMimeTypes(); + KMimeType::List::Iterator it; + for (it = l.begin(); it != l.end(); ++it) + new QListViewItem(availtypes_listview, (*it)->name()); + + setIcon ( SmallIcon ( "window_new" ) ); +} + + +AddApplicationDialog::~AddApplicationDialog() +{} + + +void AddApplicationDialog::iconClicked() +{ + KIconLoader *loader = AutoProjectFactory::instance()->iconLoader(); + QString name = KIconDialog::getIcon(KIcon::Desktop); + if (!name.isNull()) { + iconName = name; + icon_button->setPixmap(loader->loadIcon(name, KIcon::Desktop)); + } +} + + +void AddApplicationDialog::addTypeClicked() +{ + QListViewItem *selitem = availtypes_listview->selectedItem(); + if (!selitem) + return; + + QListViewItem *olditem = chosentypes_listview->firstChild(); + while (olditem) { + if (selitem->text(0) == olditem->text(0)) + return; + olditem = olditem->nextSibling(); + } + new QListViewItem(chosentypes_listview, selitem->text(0)); +} + + +void AddApplicationDialog::removeTypeClicked() +{ + delete chosentypes_listview->currentItem(); +} + + +void AddApplicationDialog::accept() +{ + // Create list of mime types + QStringList mimeTypes; + QListViewItem *item = chosentypes_listview->firstChild(); + while (item) { + mimeTypes.append(item->text(0)); + item = item->nextSibling(); + } + + // Some plausibility tests + QString fileName = filename_edit->text(); + if (fileName.isEmpty() || fileName == ".desktop") { + KMessageBox::sorry(this, i18n("You have to enter a file name.")); + filename_edit->setFocus(); + return; + } + + QString executable = executable_combo->currentText(); + if (executable.isEmpty()) { + KMessageBox::sorry(this, i18n("You have to enter the file name of an executable program.")); + executable_combo->setFocus(); + return; + } + + QString name = name_edit->text(); + if (name.isEmpty()) { + KMessageBox::sorry(this, i18n("You have to enter an application name.")); + name_edit->setFocus(); + return; + } + + QFile f(subProject->path + "/" + fileName); + if (f.exists()) { + KMessageBox::sorry(this, i18n("A file with this name exists already.")); + filename_edit->setFocus(); + return; + } + if (!f.open(IO_WriteOnly)) { + KMessageBox::sorry(this, i18n("Could not open file for writing.")); + return; + } + + QTextStream stream(&f); + stream << "[Desktop Entry]" << endl; + stream << "Type=Application" << endl; + stream << "Name=" << name << endl; + stream << "Exec=" << (executable + " -caption \"%c\" %i %m %u") << endl; + stream << "Comment=" << comment_edit->text() << endl; + if (!iconName.isNull()) + stream << "Icon=" << iconName << endl; + stream << "MimeTypes=" << mimeTypes.join(";") << endl; + stream << "Terminal=" << (terminal_box->isChecked()? "true" : "false") << endl; + f.close(); + + // Find a prefix that points to the applnk directory. + // If there is none, use appslnksection + QString section = section_combo->currentText(); + QString appsdir = "$(kde_appsdir)/" + section; + QMap<QString,QString>::ConstIterator it; + for (it = subProject->prefixes.begin(); it != subProject->prefixes.end(); ++it) + if (it.data() == appsdir) + break; + + QMap<QString, QString> replaceMap; + QString prefix; + if (it == subProject->prefixes.end()) { + prefix = "applnk" + section; + replaceMap.insert(prefix + "dir", appsdir); + subProject->prefixes.insert(prefix, appsdir); + } else { + prefix = it.key(); + } + QString varname = prefix + "_DATA"; + + // Look if a list view item for this prefix exists already. + // Create a new one otherwise + TargetItem *titem = 0; + for (uint i=0; i < subProject->targets.count(); ++i) { + TargetItem *tmptitem = subProject->targets.at(i); + if ("DATA" == tmptitem->primary && prefix == tmptitem->prefix) { + titem = tmptitem; + break; + } + } + if (!titem) { + titem = m_widget->createTargetItem("", prefix, "DATA", false); + subProject->targets.append(titem); + } + // Add this file to the target + FileItem *fitem = m_widget->createFileItem(fileName, subProject); + titem->sources.append(fitem); + + subProject->variables[varname] += (" " + fileName); + replaceMap.insert(varname, subProject->variables[varname]); + AutoProjectTool::addToMakefileam(subProject->path + "/Makefile.am", replaceMap); + + QDialog::accept(); +} + +#include "addapplicationdlg.moc" |