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.
gwenview/src/gvcore/externaltooldialog.cpp

355 lines
9.6 KiB

/*
Gwenview - A simple image viewer for TDE
Copyright 2000-2004 Aur<75>lien G<>teau
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.
*/
// TQt
#include <tqbuttongroup.h>
#include <tqheader.h>
#include <tqwhatsthis.h>
// KDE
#include <kdebug.h>
#include <kdesktopfile.h>
#include <kicondialog.h>
#include <kiconloader.h>
#include <kimageio.h>
#include <klineedit.h>
#include <tdelistview.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <krun.h>
#include <kurllabel.h>
#include <kurlrequester.h>
// Local
#include "archive.h"
#include "mimetypeutils.h"
#include "externaltoolmanager.h"
#include "externaltooldialogbase.h"
#include "externaltooldialog.moc"
namespace Gwenview {
enum { ID_ALL_IMAGES=0, ID_ALL_FILES, ID_CUSTOM };
class ToolListViewItem : public TDEListViewItem {
public:
ToolListViewItem(TDEListView* parent, const TQString& label)
: TDEListViewItem(parent, label), mDesktopFile(0L) {}
void setDesktopFile(KDesktopFile* df) {
mDesktopFile=df;
}
KDesktopFile* desktopFile() const {
return mDesktopFile;
}
private:
KDesktopFile* mDesktopFile;
};
struct ExternalToolDialogPrivate {
ExternalToolDialogBase* mContent;
TQPtrList<KDesktopFile> mDeletedTools;
ToolListViewItem* mSelectedItem;
ExternalToolDialogPrivate()
: mSelectedItem(0L) {}
void fillMimeTypeListView() {
TQStringList mimeTypes=MimeTypeUtils::rasterImageMimeTypes();
mimeTypes.append("inode/directory");
mimeTypes+=Archive::mimeTypes();
TQStringList::const_iterator it=mimeTypes.begin();
for(; it!=mimeTypes.end(); ++it) {
(void)new TQCheckListItem(mContent->mMimeTypeListView, *it, TQCheckListItem::CheckBox);
}
}
void fillToolListView() {
TQDict<KDesktopFile> desktopFiles=ExternalToolManager::instance()->desktopFiles();
TQDictIterator<KDesktopFile> it(desktopFiles);
for (; it.current(); ++it) {
ToolListViewItem* item=new ToolListViewItem(mContent->mToolListView, it.current()->readName());
item->setPixmap(0, SmallIcon(it.current()->readIcon()) );
item->setDesktopFile(it.current());
}
mContent->mToolListView->setSortColumn(0);
mContent->mToolListView->sort();
}
void writeServiceTypes(KDesktopFile* desktopFile) {
TQButton* button=mContent->mFileAssociationGroup->selected();
if (!button) {
desktopFile->writeEntry("X-TDE-ServiceTypes", "*");
return;
}
int id=mContent->mFileAssociationGroup->id(button);
if (id==ID_ALL_IMAGES) {
desktopFile->writeEntry("X-TDE-ServiceTypes", "image/*");
return;
}
if (id==ID_ALL_FILES) {
desktopFile->writeEntry("X-TDE-ServiceTypes", "*");
return;
}
TQStringList mimeTypes;
TQListViewItem* item=mContent->mMimeTypeListView->firstChild();
for (; item; item=item->nextSibling()) {
if (static_cast<TQCheckListItem*>(item)->isOn()) {
mimeTypes.append(item->text(0));
}
}
desktopFile->writeEntry("X-TDE-ServiceTypes", mimeTypes);
}
bool saveChanges() {
if (!mSelectedItem) return true;
// Check name
TQString name=mContent->mName->text().stripWhiteSpace();
if (name.isEmpty()) {
KMessageBox::sorry(mContent, i18n("The tool name cannot be empty"));
return false;
}
TQListViewItem* item=mContent->mToolListView->firstChild();
for (; item; item=item->nextSibling()) {
if (item==mSelectedItem) continue;
if (name==item->text(0)) {
KMessageBox::sorry(mContent, i18n("There is already a tool named \"%1\"").arg(name));
return false;
}
}
// Save data
KDesktopFile* desktopFile=mSelectedItem->desktopFile();
if (desktopFile) {
if (desktopFile->isReadOnly()) {
desktopFile=ExternalToolManager::instance()->editSystemDesktopFile(desktopFile);
mSelectedItem->setDesktopFile(desktopFile);
}
} else {
desktopFile=ExternalToolManager::instance()->createUserDesktopFile(name);
mSelectedItem->setDesktopFile(desktopFile);
}
desktopFile->writeEntry("Name", name);
desktopFile->writeEntry("Icon", mContent->mIconButton->icon());
desktopFile->writeEntry("Exec", mContent->mCommand->url());
writeServiceTypes(desktopFile);
mSelectedItem->setPixmap(0, SmallIcon(mContent->mIconButton->icon()) );
mSelectedItem->setText(0, name);
return true;
}
void updateFileAssociationGroup(const TQStringList& serviceTypes) {
TQListViewItem* item=mContent->mMimeTypeListView->firstChild();
for (; item; item=item->nextSibling()) {
static_cast<TQCheckListItem*>(item)->setOn(false);
}
if (serviceTypes.size()==0) {
mContent->mFileAssociationGroup->setButton(ID_ALL_FILES);
return;
}
if (serviceTypes.size()==1) {
TQString serviceType=serviceTypes[0];
if (serviceType=="image/*") {
mContent->mFileAssociationGroup->setButton(ID_ALL_IMAGES);
return;
}
if (serviceType=="*") {
mContent->mFileAssociationGroup->setButton(ID_ALL_FILES);
return;
}
}
mContent->mFileAssociationGroup->setButton(ID_CUSTOM);
TQStringList::ConstIterator it=serviceTypes.begin();
for (;it!=serviceTypes.end(); ++it) {
TQListViewItem* item=
mContent->mMimeTypeListView->findItem(*it, 0, TQt::ExactMatch);
if (item) static_cast<TQCheckListItem*>(item)->setOn(true);
}
}
void updateDetails() {
mContent->mDetails->setEnabled(mSelectedItem!=0);
if (mSelectedItem) {
KDesktopFile* desktopFile=mSelectedItem->desktopFile();
if (desktopFile) {
mContent->mName->setText(desktopFile->readName());
mContent->mCommand->setURL(desktopFile->readEntry("Exec"));
mContent->mIconButton->setIcon(desktopFile->readIcon());
TQStringList serviceTypes=desktopFile->readListEntry("X-TDE-ServiceTypes");
updateFileAssociationGroup(serviceTypes);
return;
}
}
mContent->mName->setText(TQString());
mContent->mCommand->setURL(TQString());
mContent->mIconButton->setIcon(TQString());
mContent->mFileAssociationGroup->setButton(ID_ALL_IMAGES);
}
bool apply() {
if (!saveChanges()) return false;
TQPtrListIterator<KDesktopFile> it(mDeletedTools);
for(; it.current(); ++it) {
ExternalToolManager::instance()->hideDesktopFile(it.current());
}
ExternalToolManager::instance()->updateServices();
return true;
}
};
/**
* This event filter object is here to prevent the user from selecting a
* different tool in the tool list view if the current tool could not be saved.
*/
class ToolListViewFilterObject : public TQObject {
ExternalToolDialogPrivate* d;
public:
ToolListViewFilterObject(TQObject* parent, ExternalToolDialogPrivate* _d)
: TQObject(parent), d(_d) {}
bool eventFilter(TQObject*, TQEvent* event) {
if (event->type()!=TQEvent::MouseButtonPress) return false;
return !d->saveChanges();
}
};
ExternalToolDialog::ExternalToolDialog(TQWidget* parent)
: KDialogBase(
parent,0, false, TQString(), KDialogBase::Ok|KDialogBase::Apply|KDialogBase::Cancel,
KDialogBase::Ok, true)
{
setWFlags(getWFlags() | TQt::WDestructiveClose);
d=new ExternalToolDialogPrivate;
d->mContent=new ExternalToolDialogBase(this);
setMainWidget(d->mContent);
setCaption(d->mContent->caption());
d->mContent->mToolListView->header()->hide();
d->mContent->mMimeTypeListView->header()->hide();
d->fillMimeTypeListView();
d->fillToolListView();
d->mContent->mToolListView->viewport()->installEventFilter(
new ToolListViewFilterObject(this, d));
connect( d->mContent->mToolListView, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
this, TQ_SLOT(slotSelectionChanged(TQListViewItem*)) );
connect( d->mContent->mAddButton, TQ_SIGNAL(clicked()),
this, TQ_SLOT(addTool()) );
connect( d->mContent->mDeleteButton, TQ_SIGNAL(clicked()),
this, TQ_SLOT(deleteTool()) );
connect( d->mContent->mHelp, TQ_SIGNAL(leftClickedURL()),
this, TQ_SLOT(showCommandHelp()) );
connect( d->mContent->mMoreTools, TQ_SIGNAL(leftClickedURL(const TQString&)),
this, TQ_SLOT(openURL(const TQString&)) );
TDEListView* view=d->mContent->mToolListView;
if (view->firstChild()) {
view->setSelected(view->firstChild(), true);
}
d->updateDetails();
}
ExternalToolDialog::~ExternalToolDialog() {
delete d;
}
void ExternalToolDialog::slotOk() {
if (!d->apply()) return;
accept();
}
void ExternalToolDialog::slotApply() {
d->apply();
}
void ExternalToolDialog::slotCancel() {
KDialogBase::slotCancel();
}
void ExternalToolDialog::slotSelectionChanged(TQListViewItem* item) {
d->mSelectedItem=static_cast<ToolListViewItem*>(item);
d->updateDetails();
}
void ExternalToolDialog::addTool() {
TDEListView* view=d->mContent->mToolListView;
TQString name=i18n("<Unnamed tool>");
ToolListViewItem* item=new ToolListViewItem(view, name);
view->setSelected(item, true);
}
void ExternalToolDialog::deleteTool() {
TDEListView* view=d->mContent->mToolListView;
ToolListViewItem* item=static_cast<ToolListViewItem*>(view->selectedItem());
if (!item) return;
KDesktopFile* desktopFile=item->desktopFile();
delete item;
d->mDeletedTools.append(desktopFile);
d->mSelectedItem=0L;
d->updateDetails();
}
void ExternalToolDialog::showCommandHelp() {
KURLRequester* lbl=d->mContent->mCommand;
TQWhatsThis::display(TQWhatsThis::textFor(lbl),
lbl->mapToGlobal( lbl->rect().bottomRight() ) );
}
void ExternalToolDialog::openURL(const TQString& url) {
new KRun(KURL(url));
}
} // namespace