summaryrefslogtreecommitdiff
path: root/core/launcher/mrulist.cpp
Side-by-side diff
Diffstat (limited to 'core/launcher/mrulist.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/mrulist.cpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/core/launcher/mrulist.cpp b/core/launcher/mrulist.cpp
new file mode 100644
index 0000000..4daf7d2
--- a/dev/null
+++ b/core/launcher/mrulist.cpp
@@ -0,0 +1,199 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "mrulist.h"
+
+#include <qpe/global.h>
+#include <qpe/applnk.h>
+#include <qpe/resource.h>
+
+#include <qframe.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qpainter.h>
+#include <qwindowsystem_qws.h>
+
+
+QList<MRUList> *MRUList::MRUListWidgets = NULL;
+QList<AppLnk> *MRUList::task = NULL;
+
+
+MRUList::MRUList( QWidget *parent )
+ : QFrame( parent ), selected(-1), oldsel(-1)
+{
+ setBackgroundMode( PaletteButton );
+ if (!MRUListWidgets)
+ MRUListWidgets = new QList<MRUList>;
+ if (!task)
+ task = new QList<AppLnk>;
+ MRUListWidgets->append( this );
+}
+
+
+MRUList::~MRUList()
+{
+ if (MRUListWidgets)
+ MRUListWidgets->remove( this );
+ if (task)
+ task->setAutoDelete( TRUE );
+}
+
+
+QSize MRUList::sizeHint() const
+{
+ return QSize( frameWidth(), 16 );
+}
+
+
+void MRUList::addTask( const AppLnk *appLnk )
+{
+ if ( !appLnk )
+ return;
+ unsigned int i = 0;
+
+ if ( !task )
+ return;
+
+ for ( ; i < task->count(); i++ ) {
+ AppLnk *t = task->at(i);
+ if ( t->exec() == appLnk->exec() ) {
+ if (i != 0) {
+ task->remove();
+ task->prepend( t );
+ }
+ for (unsigned i = 0; i < MRUListWidgets->count(); i++ )
+ MRUListWidgets->at(i)->update();
+ return;
+ }
+ }
+
+ AppLnk *t = new AppLnk( *appLnk );
+ // DocLnks have an overloaded virtual function exec()
+ t->setExec( appLnk->exec() );
+ task->prepend( t );
+
+ if ( task->count() > 6 ) {
+ t = task->last();
+ task->remove();
+ Global::terminate(t);
+ delete t;
+ }
+
+ for (unsigned i = 0; i < MRUListWidgets->count(); i++ )
+ MRUListWidgets->at(i)->update();
+}
+
+bool MRUList::quitOldApps()
+{
+ QStringList appsstarted;
+ QStringList appsrunning;
+ for ( int i=task->count()-1; i>=0; --i ) {
+ AppLnk *t = task->at(i);
+ appsstarted.append(t->exec());
+ }
+
+ const QList<QWSWindow> &list = qwsServer->clientWindows();
+ QWSWindow* w;
+ for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) {
+ QString app = w->client()->identity();
+ if ( appsstarted.contains(app) && !appsrunning.contains(app) )
+ appsrunning.append(app);
+ }
+
+ if ( appsrunning.count() > 1 ) {
+ QStringList::ConstIterator it = appsrunning.begin();
+ ++it; // top stays running!
+ for (; it != appsrunning.end(); it++) {
+ for ( int i=task->count()-1; i>=0; --i ) {
+ AppLnk *t = task->at(i);
+ if ( t->exec() == *it )
+ Global::terminate(t);
+ }
+ }
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+
+void MRUList::mousePressEvent(QMouseEvent *e)
+{
+ selected = 0;
+ int x=0;
+ QListIterator<AppLnk> it( *task );
+ for ( ; it.current(); ++it,++selected,x+=15 ) {
+ if ( x + 15 <= width() ) {
+ if ( e->x() >= x && e->x() < x+15 ) {
+ if ( selected < (int)task->count() ) {
+ repaint(FALSE);
+ return;
+ }
+ }
+ } else {
+ break;
+ }
+ }
+ selected = -1;
+ repaint( FALSE );
+}
+
+
+void MRUList::mouseReleaseEvent(QMouseEvent *)
+{
+ if ( selected >= 0 ) {
+ if ( parentWidget() )
+ if ( parentWidget()->isA( "QPopupMenu" ) )
+ parentWidget()->hide();
+ Global::execute( task->at(selected)->exec() );
+ selected = -1;
+ oldsel = -1;
+ update();
+ }
+}
+
+
+void MRUList::paintEvent( QPaintEvent * )
+{
+ QPainter p( this );
+ AppLnk *t;
+ int x = 0;
+ int y = (height() - 14) / 2;
+ int i = 0;
+
+ p.fillRect( 0, 0, width(), height(), colorGroup().background() );
+
+ if ( task ) {
+ QListIterator<AppLnk> it( *task );
+ for ( ; it.current(); i++, ++it ) {
+ if ( x + 15 <= width() ) {
+ t = it.current();
+ if ( (int)i == selected )
+ p.fillRect( x, y, 15, t->pixmap().height()+1, colorGroup().highlight() );
+ else if ( (int)i == oldsel )
+ p.eraseRect( x, y, 15, t->pixmap().height()+1 );
+ p.drawPixmap( x, y, t->pixmap() );
+ x += 15;
+ }
+ }
+ }
+}
+