summaryrefslogtreecommitdiffstats
path: root/kicker/kicker/core/container_button.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kicker/kicker/core/container_button.cpp')
-rw-r--r--kicker/kicker/core/container_button.cpp542
1 files changed, 542 insertions, 0 deletions
diff --git a/kicker/kicker/core/container_button.cpp b/kicker/kicker/core/container_button.cpp
new file mode 100644
index 000000000..b050f371d
--- /dev/null
+++ b/kicker/kicker/core/container_button.cpp
@@ -0,0 +1,542 @@
+/*****************************************************************
+
+Copyright (c) 1996-2003 the kicker authors. See file AUTHORS.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************/
+
+#include <algorithm>
+
+#include <qlayout.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kmultipledrag.h>
+#include <kpanelapplet.h>
+#include <kurldrag.h>
+
+#include "global.h"
+#include "appletop_mnu.h"
+
+#include "containerarea.h"
+#include "panelbutton.h"
+#include "bookmarksbutton.h"
+#include "browserbutton.h"
+#include "desktopbutton.h"
+#include "extensionbutton.h"
+#include "kbutton.h"
+#include "kicker.h"
+#include "kickerSettings.h"
+#include "kickertip.h"
+#include "nonkdeappbutton.h"
+#include "paneldrag.h"
+#include "servicebutton.h"
+#include "servicemenubutton.h"
+#include "urlbutton.h"
+#include "windowlistbutton.h"
+
+#include "container_button.h"
+#include "container_button.moc"
+
+ButtonContainer::ButtonContainer(QPopupMenu* opMenu, QWidget* parent)
+ : BaseContainer(opMenu, parent)
+ , _button(0)
+ , _layout(0)
+ , _oldpos(0,0)
+{
+ setBackgroundOrigin(AncestorOrigin);
+}
+
+bool ButtonContainer::isValid() const
+{
+ if (_button)
+ {
+ return _button->isValid();
+ }
+
+ return false; // Can this happen?
+}
+
+// Buttons Shouldn't be square when larger than a certain size.
+int ButtonContainer::widthForHeight(int height) const
+{
+ if (isValid())
+ {
+ return _button->widthForHeight(height);
+ }
+
+ return height;
+}
+
+int ButtonContainer::heightForWidth(int width) const
+{
+ if (isValid())
+ {
+ return _button->heightForWidth(width);
+ }
+
+ return width;
+}
+
+void ButtonContainer::setBackground()
+{
+ PanelButton* b = button();
+ if (!b)
+ return;
+
+ b->unsetPalette();
+}
+
+void ButtonContainer::configure()
+{
+ if (_button)
+ {
+ _button->configure();
+ }
+}
+
+void ButtonContainer::doSaveConfiguration(KConfigGroup& config, bool layoutOnly) const
+{
+ // immutability is checked by ContainerBase
+ if (_button && !layoutOnly)
+ {
+ _button->saveConfig(config);
+ }
+}
+
+void ButtonContainer::setPopupDirection(KPanelApplet::Direction d)
+{
+ BaseContainer::setPopupDirection(d);
+
+ if (_button)
+ {
+ _button->setPopupDirection(d);
+ }
+}
+
+void ButtonContainer::setOrientation(Orientation o)
+{
+ BaseContainer::setOrientation(o);
+
+ if(_button)
+ _button->setOrientation(o);
+}
+
+void ButtonContainer::embedButton(PanelButton* b)
+{
+ if (!b) return;
+
+ delete _layout;
+ _layout = new QVBoxLayout(this);
+ _button = b;
+
+ _button->installEventFilter(this);
+ _layout->add(_button);
+ connect(_button, SIGNAL(requestSave()), SIGNAL(requestSave()));
+ connect(_button, SIGNAL(hideme(bool)), SLOT(hideRequested(bool)));
+ connect(_button, SIGNAL(removeme()), SLOT(removeRequested()));
+ connect(_button, SIGNAL(dragme(const QPixmap)),
+ SLOT(dragButton(const QPixmap)));
+ connect(_button, SIGNAL(dragme(const KURL::List, const QPixmap)),
+ SLOT(dragButton(const KURL::List, const QPixmap)));
+}
+
+QPopupMenu* ButtonContainer::createOpMenu()
+{
+ return new PanelAppletOpMenu(_actions, appletOpMenu(), 0, _button->title(),
+ _button->icon(), this);
+}
+
+void ButtonContainer::removeRequested()
+{
+ if (isImmutable())
+ {
+ return;
+ }
+
+ emit removeme(this);
+}
+
+void ButtonContainer::hideRequested(bool shouldHide)
+{
+ if (shouldHide)
+ {
+ hide();
+ }
+ else
+ {
+ show();
+ }
+}
+
+void ButtonContainer::dragButton(const KURL::List urls, const QPixmap icon)
+{
+ if (isImmutable())
+ {
+ return;
+ }
+
+ KMultipleDrag* dd = new KMultipleDrag(this);
+ dd->addDragObject(new KURLDrag(urls, 0));
+ dd->addDragObject(new PanelDrag(this, 0));
+ dd->setPixmap(icon);
+ grabKeyboard();
+ dd->dragMove();
+ releaseKeyboard();
+}
+
+void ButtonContainer::dragButton(const QPixmap icon)
+{
+ PanelDrag* dd = new PanelDrag(this, this);
+ dd->setPixmap(icon);
+ grabKeyboard();
+ dd->drag();
+ releaseKeyboard();
+}
+
+bool ButtonContainer::eventFilter(QObject *o, QEvent *e)
+{
+ if (o == _button && e->type() == QEvent::MouseButtonPress)
+ {
+ static bool sentinal = false;
+
+ if (sentinal)
+ {
+ return false;
+ }
+
+ sentinal = true;
+ QMouseEvent* me = static_cast<QMouseEvent*>(e);
+ switch (me->button())
+ {
+ case MidButton:
+ {
+ if (isImmutable())
+ {
+ break;
+ }
+
+ _button->setDown(true);
+ _moveOffset = me->pos();
+ emit moveme(this);
+ sentinal = false;
+ return true;
+ }
+
+ case RightButton:
+ {
+ if (!kapp->authorizeKAction("kicker_rmb") ||
+ isImmutable())
+ {
+ break;
+ }
+
+ QPopupMenu* menu = opMenu();
+ connect( menu, SIGNAL( aboutToHide() ), this, SLOT( slotMenuClosed() ) );
+ QPoint pos = KickerLib::popupPosition(popupDirection(), menu, this,
+ (orientation() == Horizontal) ?
+ QPoint(0, 0) : me->pos());
+
+ Kicker::the()->setInsertionPoint(me->globalPos());
+
+ KickerTip::enableTipping(false);
+ switch (menu->exec(pos))
+ {
+ case PanelAppletOpMenu::Move:
+ _moveOffset = rect().center();
+ emit moveme(this);
+ break;
+ case PanelAppletOpMenu::Remove:
+ emit removeme(this);
+ break;
+ case PanelAppletOpMenu::Help:
+ help();
+ break;
+ case PanelAppletOpMenu::About:
+ about();
+ break;
+ case PanelAppletOpMenu::Preferences:
+ if (_button)
+ {
+ _button->properties();
+ }
+ break;
+ default:
+ break;
+ }
+ KickerTip::enableTipping(true);
+
+ Kicker::the()->setInsertionPoint(QPoint());
+ clearOpMenu();
+ sentinal = false;
+ return true;
+ }
+
+ default:
+ break;
+ }
+
+ sentinal = false;
+ }
+ return false;
+}
+
+void ButtonContainer::completeMoveOperation()
+{
+ if (_button)
+ {
+ _button->setDown(false);
+ setBackground();
+ }
+}
+
+void ButtonContainer::slotMenuClosed()
+{
+ if (_button)
+ _button->setDown(false);
+}
+
+void ButtonContainer::checkImmutability(const KConfigGroup& config)
+{
+ m_immutable = config.groupIsImmutable() ||
+ config.entryIsImmutable("ConfigFile") ||
+ config.entryIsImmutable("FreeSpace2");
+}
+
+// KMenuButton containerpan
+KMenuButtonContainer::KMenuButtonContainer(const KConfigGroup& config, QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new KButton(this) );
+ _actions = PanelAppletOpMenu::KMenuEditor;
+}
+
+KMenuButtonContainer::KMenuButtonContainer(QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new KButton(this) );
+ _actions = PanelAppletOpMenu::KMenuEditor;
+}
+
+int KMenuButtonContainer::heightForWidth( int width ) const
+{
+ if ( width < 32 )
+ return width + 10;
+ else
+ return ButtonContainer::heightForWidth(width);
+}
+
+// DesktopButton container
+DesktopButtonContainer::DesktopButtonContainer(QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new DesktopButton(this) );
+}
+
+DesktopButtonContainer::DesktopButtonContainer(const KConfigGroup& config,
+ QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new DesktopButton(this) );
+}
+
+// ServiceButton container
+ServiceButtonContainer::ServiceButtonContainer( const QString& desktopFile,
+ QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new ServiceButton( desktopFile, this ) );
+ _actions = KPanelApplet::Preferences;
+}
+
+ServiceButtonContainer::ServiceButtonContainer( const KService::Ptr &service,
+ QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new ServiceButton( service, this ) );
+ _actions = KPanelApplet::Preferences;
+}
+
+ServiceButtonContainer::ServiceButtonContainer( const KConfigGroup& config,
+ QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new ServiceButton( config, this ) );
+ _actions = KPanelApplet::Preferences;
+}
+
+QString ServiceButtonContainer::icon() const
+{
+ return button()->icon();
+}
+
+QString ServiceButtonContainer::visibleName() const
+{
+ return button()->title();
+}
+
+// URLButton container
+URLButtonContainer::URLButtonContainer( const QString& url, QPopupMenu* opMenu, QWidget* parent )
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new URLButton( url, this ) );
+ _actions = KPanelApplet::Preferences;
+}
+
+URLButtonContainer::URLButtonContainer( const KConfigGroup& config, QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new URLButton( config, this ) );
+ _actions = KPanelApplet::Preferences;
+}
+
+QString URLButtonContainer::icon() const
+{
+ return button()->icon();
+}
+
+QString URLButtonContainer::visibleName() const
+{
+ return button()->title();
+}
+
+// BrowserButton container
+BrowserButtonContainer::BrowserButtonContainer(const QString &startDir, QPopupMenu* opMenu, const QString& icon, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new BrowserButton(icon, startDir, this) );
+ _actions = KPanelApplet::Preferences;
+}
+
+BrowserButtonContainer::BrowserButtonContainer( const KConfigGroup& config, QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new BrowserButton(config, this) );
+ _actions = KPanelApplet::Preferences;
+}
+
+// ServiceMenuButton container
+ServiceMenuButtonContainer::ServiceMenuButtonContainer(const QString& relPath, QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new ServiceMenuButton(relPath, this) );
+}
+
+ServiceMenuButtonContainer::ServiceMenuButtonContainer( const KConfigGroup& config, QPopupMenu* opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new ServiceMenuButton(config, this) );
+}
+
+QString ServiceMenuButtonContainer::icon() const
+{
+ return button()->icon();
+}
+
+QString ServiceMenuButtonContainer::visibleName() const
+{
+ return button()->title();
+}
+
+// WindowListButton container
+WindowListButtonContainer::WindowListButtonContainer(const KConfigGroup& config, QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new WindowListButton(this) );
+}
+
+WindowListButtonContainer::WindowListButtonContainer(QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new WindowListButton(this) );
+}
+
+// BookmarkButton container
+BookmarksButtonContainer::BookmarksButtonContainer(const KConfigGroup& config, QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new BookmarksButton(this) );
+ _actions = PanelAppletOpMenu::BookmarkEditor;
+}
+
+BookmarksButtonContainer::BookmarksButtonContainer(QPopupMenu *opMenu, QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new BookmarksButton(this) );
+ _actions = PanelAppletOpMenu::BookmarkEditor;
+}
+
+// NonKDEAppButton container
+NonKDEAppButtonContainer::NonKDEAppButtonContainer(const QString &name,
+ const QString &description,
+ const QString &filePath,
+ const QString &icon,
+ const QString &cmdLine,
+ bool inTerm,
+ QPopupMenu* opMenu,
+ QWidget* parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton(new NonKDEAppButton(name, description, filePath, icon, cmdLine,
+ inTerm, this));
+ _actions = KPanelApplet::Preferences;
+}
+
+NonKDEAppButtonContainer::NonKDEAppButtonContainer( const KConfigGroup& config, QPopupMenu* opMenu, QWidget *parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new NonKDEAppButton(config, this) );
+ _actions = KPanelApplet::Preferences;
+}
+
+// ExtensionButton container
+ExtensionButtonContainer::ExtensionButtonContainer(const QString& df, QPopupMenu* opMenu, QWidget *parent)
+ : ButtonContainer(opMenu, parent)
+{
+ embedButton( new ExtensionButton(df, this) );
+}
+
+ExtensionButtonContainer::ExtensionButtonContainer( const KConfigGroup& config, QPopupMenu* opMenu, QWidget *parent)
+ : ButtonContainer(opMenu, parent)
+{
+ checkImmutability(config);
+ embedButton( new ExtensionButton(config, this) );
+}
+
+QString ExtensionButtonContainer::icon() const
+{
+ return button()->icon();
+}
+
+QString ExtensionButtonContainer::visibleName() const
+{
+ return button()->title();
+}
+