kio Library API Documentation

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., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 00018 */ 00019 00020 #include <qhbox.h> 00021 #include <qregexp.h> 00022 #include <qimage.h> 00023 #include <qpushbutton.h> 00024 00025 #include <kbuttonbox.h> 00026 #include <klocale.h> 00027 #include <kglobal.h> 00028 #include <kiconloader.h> 00029 #include <klistview.h> 00030 #include <kservice.h> 00031 #include <kstandarddirs.h> 00032 #include <kconfigbase.h> 00033 #include <kopenwith.h> 00034 00035 #include "kcustommenueditor.h" 00036 00037 class KCustomMenuEditor::Item : public QListViewItem 00038 { 00039 public: 00040 Item(QListView *parent, KService::Ptr service) 00041 : QListViewItem(parent), 00042 s(service) 00043 { 00044 init(); 00045 } 00046 00047 Item(QListViewItem *parent, KService::Ptr service) 00048 : QListViewItem(parent), 00049 s(service) 00050 { 00051 init(); 00052 } 00053 00054 void init() 00055 { 00056 QString serviceName = s->name(); 00057 00058 // item names may contain ampersands. To avoid them being converted 00059 // to accelators, replace them with two ampersands. 00060 serviceName.replace("&", "&&"); 00061 00062 QPixmap normal = KGlobal::instance()->iconLoader()->loadIcon(s->icon(), KIcon::Small, 00063 0, KIcon::DefaultState, 0L, true); 00064 00065 // make sure they are not larger than 16x16 00066 if (normal.width() > 16 || normal.height() > 16) { 00067 QImage tmp = normal.convertToImage(); 00068 tmp = tmp.smoothScale(16, 16); 00069 normal.convertFromImage(tmp); 00070 } 00071 setText(0, serviceName); 00072 setPixmap(0, normal); 00073 } 00074 00075 KService::Ptr s; 00076 }; 00077 00078 class KCustomMenuEditor::KCustomMenuEditorPrivate 00079 { 00080 public: 00081 QPushButton * pbRemove; 00082 QPushButton * pbMoveUp; 00083 QPushButton * pbMoveDown; 00084 }; 00085 00086 KCustomMenuEditor::KCustomMenuEditor(QWidget *parent) 00087 : KDialogBase(parent, "custommenueditor", true, i18n("Menu Editor"), Ok|Cancel, Ok, true), 00088 m_listView(0) 00089 { 00090 d = new KCustomMenuEditorPrivate; 00091 QHBox *page = makeHBoxMainWidget(); 00092 m_listView = new KListView(page); 00093 m_listView->addColumn(i18n("Menu")); 00094 m_listView->setFullWidth(true); 00095 m_listView->setSorting(-1); 00096 KButtonBox *buttonBox = new KButtonBox(page, Vertical); 00097 buttonBox->addButton(i18n("New..."), this, SLOT(slotNewItem())); 00098 d->pbRemove=buttonBox->addButton(i18n("Remove"), this, SLOT(slotRemoveItem())); 00099 d->pbMoveUp=buttonBox->addButton(i18n("Move Up"), this, SLOT(slotMoveUp())); 00100 d->pbMoveDown=buttonBox->addButton(i18n("Move Down"), this, SLOT(slotMoveDown())); 00101 buttonBox->layout(); 00102 connect( m_listView, SIGNAL( selectionChanged () ), this, SLOT( refreshButton() ) ); 00103 refreshButton(); 00104 } 00105 00106 KCustomMenuEditor::~KCustomMenuEditor() 00107 { 00108 delete d; 00109 d=0; 00110 } 00111 00112 void KCustomMenuEditor::refreshButton() 00113 { 00114 QListViewItem *item = m_listView->currentItem(); 00115 d->pbRemove->setEnabled( item ); 00116 d->pbMoveUp->setEnabled( item && item->itemAbove() ); 00117 d->pbMoveDown->setEnabled( item && item->itemBelow() ); 00118 } 00119 00120 void 00121 KCustomMenuEditor::load(KConfigBase *cfg) 00122 { 00123 cfg->setGroup(QString::null); 00124 int count = cfg->readNumEntry("NrOfItems"); 00125 QListViewItem *last = 0; 00126 for(int i = 0; i < count; i++) 00127 { 00128 QString entry = cfg->readPathEntry(QString("Item%1").arg(i+1)); 00129 if (entry.isEmpty()) 00130 continue; 00131 00132 // Try KSycoca first. 00133 KService::Ptr menuItem = KService::serviceByDesktopPath( entry ); 00134 if (!menuItem) 00135 menuItem = KService::serviceByDesktopName( entry ); 00136 if (!menuItem) 00137 menuItem = new KService( entry ); 00138 00139 if (!menuItem->isValid()) 00140 continue; 00141 00142 QListViewItem *item = new Item(m_listView, menuItem); 00143 item->moveItem(last); 00144 last = item; 00145 } 00146 } 00147 00148 void 00149 KCustomMenuEditor::save(KConfigBase *cfg) 00150 { 00151 // First clear the whole config file. 00152 QStringList groups = cfg->groupList(); 00153 for(QStringList::ConstIterator it = groups.begin(); 00154 it != groups.end(); ++it) 00155 { 00156 cfg->deleteGroup(*it); 00157 } 00158 00159 cfg->setGroup(QString::null); 00160 Item * item = (Item *) m_listView->firstChild(); 00161 int i = 0; 00162 while(item) 00163 { 00164 i++; 00165 QString path = item->s->desktopEntryPath(); 00166 if (!path.startsWith("/") || !KGlobal::dirs()->relativeLocation("xdgdata-apps", path).startsWith("/")) 00167 path = item->s->desktopEntryName(); 00168 cfg->writePathEntry(QString("Item%1").arg(i), path); 00169 item = (Item *) item->nextSibling(); 00170 } 00171 cfg->writeEntry("NrOfItems", i); 00172 } 00173 00174 void 00175 KCustomMenuEditor::slotNewItem() 00176 { 00177 QListViewItem *item = m_listView->currentItem(); 00178 00179 KOpenWithDlg dlg(this); 00180 dlg.setSaveNewApplications(true); 00181 00182 if (dlg.exec()) 00183 { 00184 KService::Ptr s = dlg.service(); 00185 if (s && s->isValid()) 00186 { 00187 Item *newItem = new Item(m_listView, s); 00188 newItem->moveItem(item); 00189 } 00190 refreshButton(); 00191 } 00192 } 00193 00194 void 00195 KCustomMenuEditor::slotRemoveItem() 00196 { 00197 QListViewItem *item = m_listView->currentItem(); 00198 if (!item) 00199 return; 00200 00201 delete item; 00202 refreshButton(); 00203 } 00204 00205 void 00206 KCustomMenuEditor::slotMoveUp() 00207 { 00208 QListViewItem *item = m_listView->currentItem(); 00209 if (!item) 00210 return; 00211 00212 QListViewItem *searchItem = m_listView->firstChild(); 00213 while(searchItem) 00214 { 00215 QListViewItem *next = searchItem->nextSibling(); 00216 if (next == item) 00217 { 00218 searchItem->moveItem(item); 00219 break; 00220 } 00221 searchItem = next; 00222 } 00223 refreshButton(); 00224 } 00225 00226 void 00227 KCustomMenuEditor::slotMoveDown() 00228 { 00229 QListViewItem *item = m_listView->currentItem(); 00230 if (!item) 00231 return; 00232 00233 QListViewItem *after = item->nextSibling(); 00234 if (!after) 00235 return; 00236 00237 item->moveItem( after ); 00238 refreshButton(); 00239 } 00240 00241 #include "kcustommenueditor.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Sep 29 09:41:03 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003