kcustommenueditor.cpp
00001 /* This file is part of the KDE libraries 00002 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; version 2 00007 of the License. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00017 Boston, MA 02110-1301, USA. 00018 */ 00019 00020 #include <qhbox.h> 00021 #include <qregexp.h> 00022 #include <qimage.h> 00023 #include <qpushbutton.h> 00024 #include <qdir.h> 00025 00026 #include <kbuttonbox.h> 00027 #include <klocale.h> 00028 #include <kglobal.h> 00029 #include <kiconloader.h> 00030 #include <klistview.h> 00031 #include <kservice.h> 00032 #include <kstandarddirs.h> 00033 #include <kconfigbase.h> 00034 #include <kopenwith.h> 00035 00036 #include "kcustommenueditor.h" 00037 00038 class KCustomMenuEditor::Item : public QListViewItem 00039 { 00040 public: 00041 Item(QListView *parent, KService::Ptr service) 00042 : QListViewItem(parent), 00043 s(service) 00044 { 00045 init(); 00046 } 00047 00048 Item(QListViewItem *parent, KService::Ptr service) 00049 : QListViewItem(parent), 00050 s(service) 00051 { 00052 init(); 00053 } 00054 00055 void init() 00056 { 00057 QString serviceName = s->name(); 00058 00059 // item names may contain ampersands. To avoid them being converted 00060 // to accelators, replace them with two ampersands. 00061 serviceName.replace("&", "&&"); 00062 00063 QPixmap normal = KGlobal::instance()->iconLoader()->loadIcon(s->icon(), KIcon::Small, 00064 0, KIcon::DefaultState, 0L, true); 00065 00066 // make sure they are not larger than 16x16 00067 if (normal.width() > 16 || normal.height() > 16) { 00068 QImage tmp = normal.convertToImage(); 00069 tmp = tmp.smoothScale(16, 16); 00070 normal.convertFromImage(tmp); 00071 } 00072 setText(0, serviceName); 00073 setPixmap(0, normal); 00074 } 00075 00076 KService::Ptr s; 00077 }; 00078 00079 class KCustomMenuEditor::KCustomMenuEditorPrivate 00080 { 00081 public: 00082 QPushButton * pbRemove; 00083 QPushButton * pbMoveUp; 00084 QPushButton * pbMoveDown; 00085 }; 00086 00087 KCustomMenuEditor::KCustomMenuEditor(QWidget *parent) 00088 : KDialogBase(parent, "custommenueditor", true, i18n("Menu Editor"), Ok|Cancel, Ok, true), 00089 m_listView(0) 00090 { 00091 d = new KCustomMenuEditorPrivate; 00092 QHBox *page = makeHBoxMainWidget(); 00093 m_listView = new KListView(page); 00094 m_listView->addColumn(i18n("Menu")); 00095 m_listView->setFullWidth(true); 00096 m_listView->setSorting(-1); 00097 KButtonBox *buttonBox = new KButtonBox(page, Vertical); 00098 buttonBox->addButton(i18n("New..."), this, SLOT(slotNewItem())); 00099 d->pbRemove=buttonBox->addButton(i18n("Remove"), this, SLOT(slotRemoveItem())); 00100 d->pbMoveUp=buttonBox->addButton(i18n("Move Up"), this, SLOT(slotMoveUp())); 00101 d->pbMoveDown=buttonBox->addButton(i18n("Move Down"), this, SLOT(slotMoveDown())); 00102 buttonBox->layout(); 00103 connect( m_listView, SIGNAL( selectionChanged () ), this, SLOT( refreshButton() ) ); 00104 refreshButton(); 00105 } 00106 00107 KCustomMenuEditor::~KCustomMenuEditor() 00108 { 00109 delete d; 00110 d=0; 00111 } 00112 00113 void KCustomMenuEditor::refreshButton() 00114 { 00115 QListViewItem *item = m_listView->currentItem(); 00116 d->pbRemove->setEnabled( item ); 00117 d->pbMoveUp->setEnabled( item && item->itemAbove() ); 00118 d->pbMoveDown->setEnabled( item && item->itemBelow() ); 00119 } 00120 00121 void 00122 KCustomMenuEditor::load(KConfigBase *cfg) 00123 { 00124 cfg->setGroup(QString::null); 00125 int count = cfg->readNumEntry("NrOfItems"); 00126 QListViewItem *last = 0; 00127 for(int i = 0; i < count; i++) 00128 { 00129 QString entry = cfg->readPathEntry(QString("Item%1").arg(i+1)); 00130 if (entry.isEmpty()) 00131 continue; 00132 00133 // Try KSycoca first. 00134 KService::Ptr menuItem = KService::serviceByDesktopPath( entry ); 00135 if (!menuItem) 00136 menuItem = KService::serviceByDesktopName( entry ); 00137 if (!menuItem) 00138 menuItem = new KService( entry ); 00139 00140 if (!menuItem->isValid()) 00141 continue; 00142 00143 QListViewItem *item = new Item(m_listView, menuItem); 00144 item->moveItem(last); 00145 last = item; 00146 } 00147 } 00148 00149 void 00150 KCustomMenuEditor::save(KConfigBase *cfg) 00151 { 00152 // First clear the whole config file. 00153 QStringList groups = cfg->groupList(); 00154 for(QStringList::ConstIterator it = groups.begin(); 00155 it != groups.end(); ++it) 00156 { 00157 cfg->deleteGroup(*it); 00158 } 00159 00160 cfg->setGroup(QString::null); 00161 Item * item = (Item *) m_listView->firstChild(); 00162 int i = 0; 00163 while(item) 00164 { 00165 i++; 00166 QString path = item->s->desktopEntryPath(); 00167 if (QDir::isRelativePath(path) || QDir::isRelativePath(KGlobal::dirs()->relativeLocation("xdgdata-apps", path))) 00168 path = item->s->desktopEntryName(); 00169 cfg->writePathEntry(QString("Item%1").arg(i), path); 00170 item = (Item *) item->nextSibling(); 00171 } 00172 cfg->writeEntry("NrOfItems", i); 00173 } 00174 00175 void 00176 KCustomMenuEditor::slotNewItem() 00177 { 00178 QListViewItem *item = m_listView->currentItem(); 00179 00180 KOpenWithDlg dlg(this); 00181 dlg.setSaveNewApplications(true); 00182 00183 if (dlg.exec()) 00184 { 00185 KService::Ptr s = dlg.service(); 00186 if (s && s->isValid()) 00187 { 00188 Item *newItem = new Item(m_listView, s); 00189 newItem->moveItem(item); 00190 } 00191 refreshButton(); 00192 } 00193 } 00194 00195 void 00196 KCustomMenuEditor::slotRemoveItem() 00197 { 00198 QListViewItem *item = m_listView->currentItem(); 00199 if (!item) 00200 return; 00201 00202 delete item; 00203 refreshButton(); 00204 } 00205 00206 void 00207 KCustomMenuEditor::slotMoveUp() 00208 { 00209 QListViewItem *item = m_listView->currentItem(); 00210 if (!item) 00211 return; 00212 00213 QListViewItem *searchItem = m_listView->firstChild(); 00214 while(searchItem) 00215 { 00216 QListViewItem *next = searchItem->nextSibling(); 00217 if (next == item) 00218 { 00219 searchItem->moveItem(item); 00220 break; 00221 } 00222 searchItem = next; 00223 } 00224 refreshButton(); 00225 } 00226 00227 void 00228 KCustomMenuEditor::slotMoveDown() 00229 { 00230 QListViewItem *item = m_listView->currentItem(); 00231 if (!item) 00232 return; 00233 00234 QListViewItem *after = item->nextSibling(); 00235 if (!after) 00236 return; 00237 00238 item->moveItem( after ); 00239 refreshButton(); 00240 } 00241 00242 #include "kcustommenueditor.moc"