summaryrefslogtreecommitdiffstats
path: root/kmenuedit/basictab.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmenuedit/basictab.cpp')
-rw-r--r--kmenuedit/basictab.cpp500
1 files changed, 500 insertions, 0 deletions
diff --git a/kmenuedit/basictab.cpp b/kmenuedit/basictab.cpp
new file mode 100644
index 000000000..f6971a1f2
--- /dev/null
+++ b/kmenuedit/basictab.cpp
@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2000 Matthias Elter <elter@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 <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qfileinfo.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kglobal.h>
+#include <kdialog.h>
+#include <kkeybutton.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <kicondialog.h>
+#include <kdesktopfile.h>
+#include <kurlrequester.h>
+#include <kfiledialog.h>
+#include <kcombobox.h>
+#include <kkeydialog.h>
+#include <kprocess.h>
+#include "khotkeys.h"
+
+#include "menuinfo.h"
+
+#include "basictab.h"
+#include "basictab.moc"
+
+BasicTab::BasicTab( QWidget *parent, const char *name )
+ : QWidget(parent, name)
+{
+ _menuFolderInfo = 0;
+ _menuEntryInfo = 0;
+
+ QGridLayout *layout = new QGridLayout(this, 6, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ // general group
+ QGroupBox *general_group = new QGroupBox(this);
+ QGridLayout *grid = new QGridLayout(general_group, 5, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ general_group->setAcceptDrops(false);
+
+ // setup line inputs
+ _nameEdit = new KLineEdit(general_group);
+ _nameEdit->setAcceptDrops(false);
+ _descriptionEdit = new KLineEdit(general_group);
+ _descriptionEdit->setAcceptDrops(false);
+ _commentEdit = new KLineEdit(general_group);
+ _commentEdit->setAcceptDrops(false);
+ _execEdit = new KURLRequester(general_group);
+ _execEdit->lineEdit()->setAcceptDrops(false);
+ QWhatsThis::add(_execEdit,i18n(
+ "Following the command, you can have several place holders which will be replaced "
+ "with the actual values when the actual program is run:\n"
+ "%f - a single file name\n"
+ "%F - a list of files; use for applications that can open several local files at once\n"
+ "%u - a single URL\n"
+ "%U - a list of URLs\n"
+ "%d - the folder of the file to open\n"
+ "%D - a list of folders\n"
+ "%i - the icon\n"
+ "%m - the mini-icon\n"
+ "%c - the caption"));
+
+ _launchCB = new QCheckBox(i18n("Enable &launch feedback"), general_group);
+ _systrayCB = new QCheckBox(i18n("&Place in system tray"), general_group);
+
+ // setup labels
+ _nameLabel = new QLabel(_nameEdit, i18n("&Name:"), general_group);
+ _descriptionLabel = new QLabel(_descriptionEdit, i18n("&Description:"), general_group);
+ _commentLabel = new QLabel(_commentEdit, i18n("&Comment:"), general_group);
+ _execLabel = new QLabel(_execEdit, i18n("Co&mmand:"), general_group);
+ grid->addWidget(_nameLabel, 0, 0);
+ grid->addWidget(_descriptionLabel, 1, 0);
+ grid->addWidget(_commentLabel, 2, 0);
+ grid->addWidget(_execLabel, 3, 0);
+
+ // connect line inputs
+ connect(_nameEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ connect(_descriptionEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ connect(_commentEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ connect(_execEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ connect(_execEdit, SIGNAL(urlSelected(const QString&)),
+ SLOT(slotExecSelected()));
+ connect(_launchCB, SIGNAL(clicked()), SLOT(launchcb_clicked()));
+ connect(_systrayCB, SIGNAL(clicked()), SLOT(systraycb_clicked()));
+
+ // add line inputs to the grid
+ grid->addMultiCellWidget(_nameEdit, 0, 0, 1, 1);
+ grid->addMultiCellWidget(_descriptionEdit, 1, 1, 1, 1);
+ grid->addMultiCellWidget(_commentEdit, 2, 2, 1, 2);
+ grid->addMultiCellWidget(_execEdit, 3, 3, 1, 2);
+ grid->addMultiCellWidget(_launchCB, 4, 4, 0, 2);
+ grid->addMultiCellWidget(_systrayCB, 5, 5, 0, 2);
+
+ // setup icon button
+ _iconButton = new KIconButton(general_group);
+ _iconButton->setFixedSize(56,56);
+ _iconButton->setIconSize(48);
+ connect(_iconButton, SIGNAL(iconChanged(QString)), SLOT(slotChanged()));
+ grid->addMultiCellWidget(_iconButton, 0, 1, 2, 2);
+
+ // add the general group to the main layout
+ layout->addMultiCellWidget(general_group, 0, 0, 0, 1);
+
+ // path group
+ _path_group = new QGroupBox(this);
+ QVBoxLayout *vbox = new QVBoxLayout(_path_group, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ QHBox *hbox = new QHBox(_path_group);
+ hbox->setSpacing(KDialog::spacingHint());
+
+ _pathLabel = new QLabel(i18n("&Work path:"), hbox);
+
+ _pathEdit = new KURLRequester(hbox);
+ _pathEdit->setMode(KFile::Directory | KFile::LocalOnly);
+ _pathEdit->lineEdit()->setAcceptDrops(false);
+
+ _pathLabel->setBuddy(_pathEdit);
+
+ connect(_pathEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ vbox->addWidget(hbox);
+ layout->addMultiCellWidget(_path_group, 1, 1, 0, 1);
+
+ // terminal group
+ _term_group = new QGroupBox(this);
+ vbox = new QVBoxLayout(_term_group, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ _terminalCB = new QCheckBox(i18n("Run in term&inal"), _term_group);
+ connect(_terminalCB, SIGNAL(clicked()), SLOT(termcb_clicked()));
+ vbox->addWidget(_terminalCB);
+
+ hbox = new QHBox(_term_group);
+ hbox->setSpacing(KDialog::spacingHint());
+ _termOptLabel = new QLabel(i18n("Terminal &options:"), hbox);
+ _termOptEdit = new KLineEdit(hbox);
+ _termOptEdit->setAcceptDrops(false);
+ _termOptLabel->setBuddy(_termOptEdit);
+
+ connect(_termOptEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ vbox->addWidget(hbox);
+ layout->addMultiCellWidget(_term_group, 2, 2, 0, 1);
+
+ _termOptEdit->setEnabled(false);
+
+ // uid group
+ _uid_group = new QGroupBox(this);
+ vbox = new QVBoxLayout(_uid_group, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ _uidCB = new QCheckBox(i18n("&Run as a different user"), _uid_group);
+ connect(_uidCB, SIGNAL(clicked()), SLOT(uidcb_clicked()));
+ vbox->addWidget(_uidCB);
+
+ hbox = new QHBox(_uid_group);
+ hbox->setSpacing(KDialog::spacingHint());
+ _uidLabel = new QLabel(i18n("&Username:"), hbox);
+ _uidEdit = new KLineEdit(hbox);
+ _uidEdit->setAcceptDrops(false);
+ _uidLabel->setBuddy(_uidEdit);
+
+ connect(_uidEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotChanged()));
+ vbox->addWidget(hbox);
+ layout->addMultiCellWidget(_uid_group, 3, 3, 0, 1);
+
+ _uidEdit->setEnabled(false);
+
+ layout->setRowStretch(0, 2);
+
+ // key binding group
+ general_group_keybind = new QGroupBox(this);
+ layout->addMultiCellWidget( general_group_keybind, 4, 4, 0, 1 );
+ // dummy widget in order to make it look a bit better
+ layout->addWidget( new QWidget(this), 5, 0 );
+ layout->setRowStretch( 5, 4 );
+ QGridLayout *grid_keybind = new QGridLayout(general_group_keybind, 3, 1,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ //_keyEdit = new KLineEdit(general_group_keybind);
+ //_keyEdit->setReadOnly( true );
+ //_keyEdit->setText( "" );
+ //QPushButton* _keyButton = new QPushButton( i18n( "Change" ),
+ // general_group_keybind );
+ //connect( _keyButton, SIGNAL( clicked()), this, SLOT( keyButtonPressed()));
+ _keyEdit = new KKeyButton(general_group_keybind);
+ grid_keybind->addWidget(new QLabel(_keyEdit, i18n("Current shortcut &key:"), general_group_keybind), 0, 0);
+ connect( _keyEdit, SIGNAL(capturedShortcut(const KShortcut&)),
+ this, SLOT(slotCapturedShortcut(const KShortcut&)));
+ grid_keybind->addWidget(_keyEdit, 0, 1);
+ //grid_keybind->addWidget(_keyButton, 0, 2 );
+
+ if (!KHotKeys::present())
+ general_group_keybind->hide();
+
+ slotDisableAction();
+}
+
+void BasicTab::slotDisableAction()
+{
+ //disable all group at the begining.
+ //because there is not file selected.
+ _nameEdit->setEnabled(false);
+ _descriptionEdit->setEnabled(false);
+ _commentEdit->setEnabled(false);
+ _execEdit->setEnabled(false);
+ _launchCB->setEnabled(false);
+ _systrayCB->setEnabled(false);
+ _nameLabel->setEnabled(false);
+ _descriptionLabel->setEnabled(false);
+ _commentLabel->setEnabled(false);
+ _execLabel->setEnabled(false);
+ _path_group->setEnabled(false);
+ _term_group->setEnabled(false);
+ _uid_group->setEnabled(false);
+ _iconButton->setEnabled(false);
+ // key binding part
+ general_group_keybind->setEnabled( false );
+}
+
+void BasicTab::enableWidgets(bool isDF, bool isDeleted)
+{
+ // set only basic attributes if it is not a .desktop file
+ _nameEdit->setEnabled(!isDeleted);
+ _descriptionEdit->setEnabled(!isDeleted);
+ _commentEdit->setEnabled(!isDeleted);
+ _iconButton->setEnabled(!isDeleted);
+ _execEdit->setEnabled(isDF && !isDeleted);
+ _launchCB->setEnabled(isDF && !isDeleted);
+ _systrayCB->setEnabled(isDF && !isDeleted);
+ _nameLabel->setEnabled(!isDeleted);
+ _descriptionLabel->setEnabled(!isDeleted);
+ _commentLabel->setEnabled(!isDeleted);
+ _execLabel->setEnabled(isDF && !isDeleted);
+
+ _path_group->setEnabled(isDF && !isDeleted);
+ _term_group->setEnabled(isDF && !isDeleted);
+ _uid_group->setEnabled(isDF && !isDeleted);
+ general_group_keybind->setEnabled( isDF && !isDeleted );
+
+ _termOptEdit->setEnabled(isDF && !isDeleted && _terminalCB->isChecked());
+ _termOptLabel->setEnabled(isDF && !isDeleted && _terminalCB->isChecked());
+
+ _uidEdit->setEnabled(isDF && !isDeleted && _uidCB->isChecked());
+ _uidLabel->setEnabled(isDF && !isDeleted && _uidCB->isChecked());
+}
+
+void BasicTab::setFolderInfo(MenuFolderInfo *folderInfo)
+{
+ blockSignals(true);
+ _menuFolderInfo = folderInfo;
+ _menuEntryInfo = 0;
+
+ _nameEdit->setText(folderInfo->caption);
+ _descriptionEdit->setText(folderInfo->genericname);
+ _descriptionEdit->setCursorPosition(0);
+ _commentEdit->setText(folderInfo->comment);
+ _commentEdit->setCursorPosition(0);
+ _iconButton->setIcon(folderInfo->icon);
+
+ // clean all disabled fields and return
+ _execEdit->lineEdit()->setText("");
+ _pathEdit->lineEdit()->setText("");
+ _termOptEdit->setText("");
+ _uidEdit->setText("");
+ _launchCB->setChecked(false);
+ _systrayCB->setChecked(false);
+ _terminalCB->setChecked(false);
+ _uidCB->setChecked(false);
+ _keyEdit->setShortcut(0, false);
+
+ enableWidgets(false, folderInfo->hidden);
+ blockSignals(false);
+}
+
+void BasicTab::setEntryInfo(MenuEntryInfo *entryInfo)
+{
+ blockSignals(true);
+ _menuFolderInfo = 0;
+ _menuEntryInfo = entryInfo;
+
+ if (!entryInfo)
+ {
+ _nameEdit->setText(QString::null);
+ _descriptionEdit->setText(QString::null);
+ _commentEdit->setText(QString::null);
+ _iconButton->setIcon(QString::null);
+
+ // key binding part
+ _keyEdit->setShortcut( KShortcut(), false );
+ _execEdit->lineEdit()->setText(QString::null);
+ _systrayCB->setChecked(false);
+
+ _pathEdit->lineEdit()->setText(QString::null);
+ _termOptEdit->setText(QString::null);
+ _uidEdit->setText(QString::null);
+
+ _launchCB->setChecked(false);
+ _terminalCB->setChecked(false);
+ _uidCB->setChecked(false);
+ enableWidgets(true, true);
+ blockSignals(false);
+ return;
+ }
+
+ KDesktopFile *df = entryInfo->desktopFile();
+
+ _nameEdit->setText(df->readName());
+ _descriptionEdit->setText(df->readGenericName());
+ _descriptionEdit->setCursorPosition(0);
+ _commentEdit->setText(df->readComment());
+ _commentEdit->setCursorPosition(0);
+ _iconButton->setIcon(df->readIcon());
+
+ // key binding part
+ if( KHotKeys::present())
+ {
+ _keyEdit->setShortcut( entryInfo->shortcut(), false );
+ }
+
+ QString temp = df->readPathEntry("Exec");
+ if (temp.left(12) == "ksystraycmd ")
+ {
+ _execEdit->lineEdit()->setText(temp.right(temp.length()-12));
+ _systrayCB->setChecked(true);
+ }
+ else
+ {
+ _execEdit->lineEdit()->setText(temp);
+ _systrayCB->setChecked(false);
+ }
+
+ _pathEdit->lineEdit()->setText(df->readPath());
+ _termOptEdit->setText(df->readEntry("TerminalOptions"));
+ _uidEdit->setText(df->readEntry("X-KDE-Username"));
+
+ if( df->hasKey( "StartupNotify" ))
+ _launchCB->setChecked(df->readBoolEntry("StartupNotify", true));
+ else // backwards comp.
+ _launchCB->setChecked(df->readBoolEntry("X-KDE-StartupNotify", true));
+
+ if(df->readNumEntry("Terminal", 0) == 1)
+ _terminalCB->setChecked(true);
+ else
+ _terminalCB->setChecked(false);
+
+ _uidCB->setChecked(df->readBoolEntry("X-KDE-SubstituteUID", false));
+
+ enableWidgets(true, entryInfo->hidden);
+ blockSignals(false);
+}
+
+void BasicTab::apply()
+{
+ if (_menuEntryInfo)
+ {
+ _menuEntryInfo->setDirty();
+ _menuEntryInfo->setCaption(_nameEdit->text());
+ _menuEntryInfo->setDescription(_descriptionEdit->text());
+ _menuEntryInfo->setIcon(_iconButton->icon());
+
+ KDesktopFile *df = _menuEntryInfo->desktopFile();
+ df->writeEntry("Comment", _commentEdit->text());
+ if (_systrayCB->isChecked())
+ df->writePathEntry("Exec", _execEdit->lineEdit()->text().prepend("ksystraycmd "));
+ else
+ df->writePathEntry("Exec", _execEdit->lineEdit()->text());
+
+ df->writePathEntry("Path", _pathEdit->lineEdit()->text());
+
+ if (_terminalCB->isChecked())
+ df->writeEntry("Terminal", 1);
+ else
+ df->writeEntry("Terminal", 0);
+
+ df->writeEntry("TerminalOptions", _termOptEdit->text());
+ df->writeEntry("X-KDE-SubstituteUID", _uidCB->isChecked());
+ df->writeEntry("X-KDE-Username", _uidEdit->text());
+ df->writeEntry("StartupNotify", _launchCB->isChecked());
+ }
+ else
+ {
+ _menuFolderInfo->setCaption(_nameEdit->text());
+ _menuFolderInfo->setGenericName(_descriptionEdit->text());
+ _menuFolderInfo->setComment(_commentEdit->text());
+ _menuFolderInfo->setIcon(_iconButton->icon());
+ }
+}
+
+void BasicTab::slotChanged()
+{
+ if (signalsBlocked())
+ return;
+ apply();
+ if (_menuEntryInfo)
+ emit changed( _menuEntryInfo );
+ else
+ emit changed( _menuFolderInfo );
+}
+
+void BasicTab::launchcb_clicked()
+{
+ slotChanged();
+}
+
+void BasicTab::systraycb_clicked()
+{
+ slotChanged();
+}
+
+void BasicTab::termcb_clicked()
+{
+ _termOptEdit->setEnabled(_terminalCB->isChecked());
+ _termOptLabel->setEnabled(_terminalCB->isChecked());
+ slotChanged();
+}
+
+void BasicTab::uidcb_clicked()
+{
+ _uidEdit->setEnabled(_uidCB->isChecked());
+ _uidLabel->setEnabled(_uidCB->isChecked());
+ slotChanged();
+}
+
+void BasicTab::slotExecSelected()
+{
+ QString path = _execEdit->lineEdit()->text();
+ if (!path.startsWith("'"))
+ _execEdit->lineEdit()->setText(KProcess::quote(path));
+}
+
+void BasicTab::slotCapturedShortcut(const KShortcut& cut)
+{
+ if (signalsBlocked())
+ return;
+
+ if( KKeyChooser::checkGlobalShortcutsConflict( cut, true, topLevelWidget())
+ || KKeyChooser::checkStandardShortcutsConflict( cut, true, topLevelWidget()))
+ return;
+
+ if ( KHotKeys::present() )
+ {
+ if (!_menuEntryInfo->isShortcutAvailable( cut ) )
+ {
+ KService::Ptr service;
+ emit findServiceShortcut(cut, service);
+ if (!service)
+ service = KHotKeys::findMenuEntry(cut.toString());
+ if (service)
+ {
+ KMessageBox::sorry(this, i18n("<qt>The key <b>%1</b> can not be used here because it is already used to activate <b>%2</b>.").arg(cut.toString(), service->name()));
+ return;
+ }
+ else
+ {
+ KMessageBox::sorry(this, i18n("<qt>The key <b>%1</b> can not be used here because it is already in use.").arg(cut.toString()));
+ return;
+ }
+ }
+ _menuEntryInfo->setShortcut( cut );
+ }
+ _keyEdit->setShortcut(cut, false);
+ if (_menuEntryInfo)
+ emit changed( _menuEntryInfo );
+}
+