summaryrefslogtreecommitdiffstats
path: root/kicker/taskbar/taskbarcontainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kicker/taskbar/taskbarcontainer.cpp')
-rw-r--r--kicker/taskbar/taskbarcontainer.cpp366
1 files changed, 366 insertions, 0 deletions
diff --git a/kicker/taskbar/taskbarcontainer.cpp b/kicker/taskbar/taskbarcontainer.cpp
new file mode 100644
index 000000000..a891cf64e
--- /dev/null
+++ b/kicker/taskbar/taskbarcontainer.cpp
@@ -0,0 +1,366 @@
+/*****************************************************************
+
+Copyright (c) 2001 John Firebaugh <[email protected]>
+
+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 <tqlayout.h>
+#include <tqtimer.h>
+#include <tqfile.h>
+
+#include <dcopclient.h>
+#include <tdeapplication.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <twindowlistmenu.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include "simplebutton.h"
+
+#include "taskbar.h"
+#include "taskbarsettings.h"
+
+#include "taskbarcontainer.h"
+#include "taskbarcontainer.moc"
+
+#define GLOBAL_TASKBAR_CONFIG_FILE_NAME "ktaskbarrc"
+
+#define READ_MERGED_TASBKAR_SETTING(x) ((settingsObject->useGlobalSettings())?globalSettingsObject->x():settingsObject->x())
+
+TaskBarContainer::TaskBarContainer( bool enableFrame, TQString configFileOverride, TQWidget *parent, const char *name )
+ : TQFrame(parent, name),
+ configFile(configFileOverride),
+ direction( KPanelApplet::Up ),
+ showWindowListButton( true ),
+ windowListButton(0),
+ windowListMenu(0),
+ settingsObject(NULL),
+ globalSettingsObject(NULL)
+{
+ if (configFile == "")
+ {
+ configFile = GLOBAL_TASKBAR_CONFIG_FILE_NAME;
+ }
+ TQFile configFileObject(locateLocal("config", configFile));
+ if (!configFileObject.exists())
+ {
+ TDEConfig globalConfig(GLOBAL_TASKBAR_CONFIG_FILE_NAME, TRUE, TRUE);
+ TDEConfig localConfig(configFile);
+ globalConfig.copyTo(configFile, &localConfig);
+ localConfig.writeEntry("UseGlobalSettings", TRUE);
+ localConfig.sync();
+ }
+ settingsObject = new TaskBarSettings(TDESharedConfig::openConfig(configFile));
+ globalSettingsObject = new TaskBarSettings(TDESharedConfig::openConfig(GLOBAL_TASKBAR_CONFIG_FILE_NAME));
+
+ setAcceptDrops(true); // Always enabled to activate task during drag&drop.
+
+ setBackgroundOrigin( AncestorOrigin );
+
+ uint margin;
+ if ( enableFrame )
+ {
+ setFrameStyle( Sunken | StyledPanel );
+ margin = frameWidth();
+ }
+ else
+ {
+ setFrameStyle( NoFrame );
+ margin = 0;
+ }
+
+ layout = new TQBoxLayout( this, TQApplication::reverseLayout() ?
+ TQBoxLayout::RightToLeft :
+ TQBoxLayout::LeftToRight );
+ layout->setMargin( margin );
+
+ // scrollable taskbar
+ taskBar = new TaskBar(settingsObject, globalSettingsObject, this);
+ layout->addWidget( taskBar );
+
+ connect( taskBar, TQT_SIGNAL( containerCountChanged() ), TQT_SIGNAL( containerCountChanged() ) );
+
+ setBackground();
+
+ // read settings and setup layout
+ configure();
+
+ connectDCOPSignal("", "", "kdeTaskBarConfigChanged()",
+ "configChanged()", false);
+}
+
+TaskBarContainer::~TaskBarContainer()
+{
+ if (windowListMenu) delete windowListMenu;
+ if (settingsObject) delete settingsObject;
+ if (globalSettingsObject) delete globalSettingsObject;
+}
+
+void TaskBarContainer::configure()
+{
+ setFont(READ_MERGED_TASBKAR_SETTING(taskbarFont));
+ showWindowListButton = READ_MERGED_TASBKAR_SETTING(showWindowListBtn);
+
+ if (!showWindowListButton)
+ {
+ delete windowListButton;
+ windowListButton = 0;
+ delete windowListMenu;
+ windowListMenu = 0;
+ }
+ else if (windowListButton == 0)
+ {
+ // window list button
+ windowListButton = new SimpleButton(this);
+ windowListMenu= new KWindowListMenu;
+ connect(windowListButton, TQT_SIGNAL(pressed()),
+ TQT_SLOT(showWindowListMenu()));
+ connect(windowListMenu, TQT_SIGNAL(aboutToHide()),
+ TQT_SLOT(windowListMenuAboutToHide()));
+
+ // geometry
+ TQString icon;
+ switch (direction)
+ {
+ case KPanelApplet::Up:
+ icon = "1uparrow";
+ windowListButton->setMaximumHeight(BUTTON_MAX_WIDTH);
+ break;
+ case KPanelApplet::Down:
+ icon = "1downarrow";
+ windowListButton->setMaximumHeight(BUTTON_MAX_WIDTH);
+ break;
+ case KPanelApplet::Left:
+ icon = "1leftarrow";
+ windowListButton->setMaximumWidth(BUTTON_MAX_WIDTH);
+ break;
+ case KPanelApplet::Right:
+ icon = "1rightarrow";
+ windowListButton->setMaximumWidth(BUTTON_MAX_WIDTH);
+ break;
+ }
+
+ windowListButton->setPixmap(kapp->iconLoader()->loadIcon(icon,
+ TDEIcon::Panel,
+ 16));
+ windowListButton->setMinimumSize(windowListButton->sizeHint());
+ layout->insertWidget(0, windowListButton);
+ windowListButton->show();
+ }
+}
+
+void TaskBarContainer::configChanged()
+{
+ // we have a separate method here to connect to the DCOP signal
+ // instead of connecting direclty to taskbar so that Taskbar
+ // doesn't have to also connect to the DCOP signal (less places
+ // to change/fix it if/when it changes) without calling
+ // configure() twice on taskbar on start up
+ settingsObject->readConfig();
+ globalSettingsObject->readConfig();
+
+ configure();
+ taskBar->configure();
+}
+
+void TaskBarContainer::preferences()
+{
+ TQByteArray data;
+
+ if (!kapp->dcopClient()->isAttached())
+ {
+ kapp->dcopClient()->attach();
+ }
+
+ if (configFile == GLOBAL_TASKBAR_CONFIG_FILE_NAME)
+ {
+ kapp->dcopClient()->send("kicker", "kicker", "showTaskBarConfig()", data);
+ }
+ else
+ {
+ TQDataStream args( data, IO_WriteOnly );
+ args << configFile;
+ kapp->dcopClient()->send("kicker", "kicker", "showTaskBarConfig(TQString)", data);
+ }
+}
+
+void TaskBarContainer::orientationChange(Orientation o)
+{
+ if (o == Qt::Horizontal)
+ {
+ if (windowListButton)
+ {
+ windowListButton->setFixedWidth(WINDOWLISTBUTTON_SIZE);
+ windowListButton->setMaximumHeight(BUTTON_MAX_WIDTH);
+ }
+ layout->setDirection(TQApplication::reverseLayout() ?
+ TQBoxLayout::RightToLeft :
+ TQBoxLayout::LeftToRight);
+ }
+ else
+ {
+ if (windowListButton)
+ {
+ windowListButton->setMaximumWidth(BUTTON_MAX_WIDTH);
+ windowListButton->setFixedHeight(WINDOWLISTBUTTON_SIZE);
+ }
+ layout->setDirection(TQBoxLayout::TopToBottom);
+ }
+
+ taskBar->setOrientation(o);
+ if (windowListButton)
+ {
+ windowListButton->setOrientation(o);
+ }
+ layout->activate();
+}
+
+void TaskBarContainer::popupDirectionChange(KPanelApplet::Direction d)
+{
+ direction = d;
+ ArrowType at = UpArrow;
+
+ TQString icon;
+ switch (d)
+ {
+ case KPanelApplet::Up:
+ icon = "1uparrow";
+ at = UpArrow;
+ break;
+ case KPanelApplet::Down:
+ icon = "1downarrow";
+ at = DownArrow;
+ break;
+ case KPanelApplet::Left:
+ icon = "1leftarrow";
+ at = LeftArrow;
+ break;
+ case KPanelApplet::Right:
+ icon = "1rightarrow";
+ at = RightArrow;
+ break;
+ }
+
+ taskBar->setArrowType(at);
+
+ if (windowListButton)
+ {
+ windowListButton->setPixmap(kapp->iconLoader()->loadIcon(icon,
+ TDEIcon::Panel,
+ 16));
+ windowListButton->setMinimumSize(windowListButton->sizeHint());
+ }
+}
+
+void TaskBarContainer::showWindowListMenu()
+{
+ if (!windowListMenu)
+ return;
+
+ windowListMenu->init();
+
+ // calc popup menu position
+ TQPoint pos( mapToGlobal( TQPoint(0,0) ) );
+
+ switch( direction ) {
+ case KPanelApplet::Right:
+ pos.setX( pos.x() + width() );
+ break;
+ case KPanelApplet::Left:
+ pos.setX( pos.x() - windowListMenu->sizeHint().width() );
+ break;
+ case KPanelApplet::Down:
+ pos.setY( pos.y() + height() );
+ break;
+ case KPanelApplet::Up:
+ pos.setY( pos.y() - windowListMenu->sizeHint().height() );
+ default:
+ break;
+ }
+
+ disconnect( windowListButton, TQT_SIGNAL( pressed() ), this, TQT_SLOT( showWindowListMenu() ) );
+ windowListMenu->exec( pos );
+ TQTimer::singleShot(100, this, TQT_SLOT(reconnectWindowListButton()));
+}
+
+void TaskBarContainer::windowListMenuAboutToHide()
+{
+ // this ensures that when clicked AGAIN, the window list button doesn't cause the
+ // window list menu to show again. usability, you see. hoorah.
+ windowListButton->setDown( false );
+}
+
+void TaskBarContainer::reconnectWindowListButton()
+{
+ connect( windowListButton, TQT_SIGNAL( pressed() ), TQT_SLOT( showWindowListMenu() ) );
+}
+
+TQSize TaskBarContainer::sizeHint( KPanelExtension::Position p, TQSize maxSize) const
+{
+ TQSize size = taskBar->sizeHint( p, maxSize );
+ if ( (p == KPanelExtension::Left || p == KPanelExtension::Right) && showWindowListButton ) {
+ return TQSize( size.width(), size.height() + WINDOWLISTBUTTON_SIZE );
+ }
+ return size;
+}
+
+void TaskBarContainer::setBackground()
+{
+ taskBar->setBackground();
+}
+
+void TaskBarContainer::dragEnterEvent( TQDragEnterEvent* e )
+{
+ // ignore all drags other than tasks
+ if (!TaskDrag::canDecode(e))
+ {
+ return;
+ }
+
+ if ((e->source()->parent() == taskBar->viewport()) && TaskDrag::canDecode(e) && READ_MERGED_TASBKAR_SETTING(allowDragAndDropReArrange) && (!READ_MERGED_TASBKAR_SETTING(sortByApp)))
+ {
+ e->accept();
+ }
+}
+
+void TaskBarContainer::dragLeaveEvent( TQDragLeaveEvent* e )
+{
+ TQFrame::dragLeaveEvent( e );
+}
+
+void TaskBarContainer::dropEvent( TQDropEvent* e )
+{
+ // ignore all drags other than tasks
+ if (!TaskDrag::canDecode(e))
+ {
+ return;
+ }
+
+ if ((e->source()->parent() == taskBar->viewport()) && TaskDrag::canDecode(e) && READ_MERGED_TASBKAR_SETTING(allowDragAndDropReArrange) && (!READ_MERGED_TASBKAR_SETTING(sortByApp)))
+ {
+ if (taskBar->taskMoveHandler(TaskMoveDestination::Position, TaskDrag::decode(e), taskBar->mapFrom(this, e->pos()))) {
+ e->accept();
+ }
+ }
+}