• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kio

kcustommenueditor.cpp

Go to the documentation of this file.
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"

kio

Skip menu "kio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal