summaryrefslogtreecommitdiff
path: root/library/qpedecoration_qws.cpp
authorzecke <zecke>2004-02-08 14:24:56 (UTC)
committer zecke <zecke>2004-02-08 14:24:56 (UTC)
commita763515241faab10c9d86c5cb785c714578e9bb0 (patch) (unidiff)
tree35ecc8bd63fdc7a40e26d8fe369b389f21901d5c /library/qpedecoration_qws.cpp
parent258a55008dc84c8860f0c851b1da1e6cc921a1cb (diff)
downloadopie-a763515241faab10c9d86c5cb785c714578e9bb0.zip
opie-a763515241faab10c9d86c5cb785c714578e9bb0.tar.gz
opie-a763515241faab10c9d86c5cb785c714578e9bb0.tar.bz2
ReMerge QPEDeco
Diffstat (limited to 'library/qpedecoration_qws.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpedecoration_qws.cpp147
1 files changed, 94 insertions, 53 deletions
diff --git a/library/qpedecoration_qws.cpp b/library/qpedecoration_qws.cpp
index bac1a75..7842ebd 100644
--- a/library/qpedecoration_qws.cpp
+++ b/library/qpedecoration_qws.cpp
@@ -17,6 +17,7 @@
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#ifdef QWS
20#define QTOPIA_INTERNAL_LANGLIST 21#define QTOPIA_INTERNAL_LANGLIST
21#include <qapplication.h> 22#include <qapplication.h>
22#include <qstyle.h> 23#include <qstyle.h>
@@ -24,6 +25,7 @@
24#include <qpainter.h> 25#include <qpainter.h>
25#include <qtimer.h> 26#include <qtimer.h>
26#include <qwhatsthis.h> 27#include <qwhatsthis.h>
28#include <qpopupmenu.h>
27#include "qcopenvelope_qws.h" 29#include "qcopenvelope_qws.h"
28#include "qpedecoration_qws.h" 30#include "qpedecoration_qws.h"
29#include <qdialog.h> 31#include <qdialog.h>
@@ -34,12 +36,13 @@
34#include "global.h" 36#include "global.h"
35#include "qlibrary.h" 37#include "qlibrary.h"
36#include "windowdecorationinterface.h" 38#include "windowdecorationinterface.h"
39#include <qpe/qlibrary.h>
37#include <qfile.h> 40#include <qfile.h>
38#include <qsignal.h> 41#include <qsignal.h>
39 42
40#include <stdlib.h> 43#include <stdlib.h>
41 44
42extern QRect qt_maxWindowRect; 45extern Q_EXPORT QRect qt_maxWindowRect;
43 46
44#define WHATSTHIS_MODE 47#define WHATSTHIS_MODE
45 48
@@ -95,12 +98,13 @@ static const char * const qpe_accept_xpm[] = {
95 98
96#endif // QT_NO_IMAGEIO_XPM 99#endif // QT_NO_IMAGEIO_XPM
97 100
98class HackWidget : public QWidget 101class DecorHackWidget : public QWidget
99{ 102{
100public: 103public:
101 bool needsOk() { 104 bool needsOk() {
102 return (getWState() & WState_Reserved1 ) || 105 return (getWState() & WState_Reserved1 ) ||
103 (inherits( "QDialog" ) && !inherits( "QMessageBox" ) ); 106 (inherits("QDialog") && !inherits("QMessageBox")
107 && !inherits("QWizard") );
104 } 108 }
105}; 109};
106 110
@@ -188,19 +192,19 @@ bool QPEManager::eventFilter( QObject *o, QEvent *e )
188 QString text; 192 QString text;
189 switch ( inRegion ) { 193 switch ( inRegion ) {
190 case QWSDecoration::Close: 194 case QWSDecoration::Close:
191 if ( ((HackWidget*)w)->needsOk() ) 195 if ( ((DecorHackWidget*)w)->needsOk() )
192 text = QObject::tr("Click to close this window, discarding changes."); 196 text = tr("Click to close this window, discarding changes.");
193 else 197 else
194 text = QObject::tr("Click to close this window."); 198 text = tr("Click to close this window.");
195 break; 199 break;
196 case QWSDecoration::Minimize: 200 case QWSDecoration::Minimize:
197 text = QObject::tr("Click to close this window and apply changes."); 201 text = tr("Click to close this window and apply changes.");
198 break; 202 break;
199 case QWSDecoration::Maximize: 203 case QWSDecoration::Maximize:
200 if ( w->isMaximized() ) 204 if ( w->isMaximized() )
201 text = QObject::tr("Click to make this window moveable."); 205 text = tr("Click to make this window movable.");
202 else 206 else
203 text = QObject::tr("Click to make this window use all available screen area."); 207 text = tr("Click to make this window use all available screen area.");
204 break; 208 break;
205 default: 209 default:
206 break; 210 break;
@@ -454,9 +458,10 @@ QRegion WindowDecorationInterface::mask( const WindowData *wd ) const
454class DefaultWindowDecoration : public WindowDecorationInterface 458class DefaultWindowDecoration : public WindowDecorationInterface
455{ 459{
456public: 460public:
457 DefaultWindowDecoration() : ref(0) {} 461 DefaultWindowDecoration(){}
458 QString name() const { 462 QString name() const {
459 return "Default"; 463 return qApp->translate("WindowDecoration", "Default",
464 "List box text for default window decoration");
460 } 465 }
461 QPixmap icon() const { 466 QPixmap icon() const {
462 return QPixmap(); 467 return QPixmap();
@@ -467,6 +472,8 @@ public:
467 *iface = this; 472 *iface = this;
468 else if ( uuid == IID_WindowDecoration ) 473 else if ( uuid == IID_WindowDecoration )
469 *iface = this; 474 *iface = this;
475 else
476 return QS_FALSE;
470 477
471 if ( *iface ) 478 if ( *iface )
472 (*iface)->addRef(); 479 (*iface)->addRef();
@@ -474,39 +481,58 @@ public:
474 } 481 }
475 Q_REFCOUNT 482 Q_REFCOUNT
476 483
477private:
478 ulong ref;
479}; 484};
480 485
481static WindowDecorationInterface *wdiface = 0; 486static WindowDecorationInterface *wdiface = 0;
482static QLibrary *wdlib = 0; 487static QLibrary* wdlib = 0;
483static QString libname; 488static QString libname;
484 489
485//=========================================================================== 490//===========================================================================
491bool QPEDecoration::helpExists() const
492{
493 if ( helpFile.isNull() ) {
494 QStringList helpPath = Global::helpPath();
495 QString hf = QString(qApp->argv()[0]) + ".html";
496 bool he = FALSE;
497 for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !he; ++it)
498 he = QFile::exists( *it + "/" + hf );
499 ((QPEDecoration*)this)->helpFile = hf;
500 ((QPEDecoration*)this)->helpexists = he;
501 return he;
502 }
503 return helpexists;
504}
486 505
487QPEDecoration::QPEDecoration() 506QPEDecoration::QPEDecoration()
488 : QWSDefaultDecoration() 507 : QWSDefaultDecoration()
489{ 508{
490 init ( libname ); 509 if ( wdlib ) {
510 delete wdlib;
511 wdlib = 0;
512 } else {
513 delete wdiface;
514 }
515 wdiface = new DefaultWindowDecoration;
516
517 helpexists = FALSE; // We don't know (flagged by helpFile being null)
518 qpeManager = new QPEManager( this );
519 imageOk = Resource::loadImage( "OKButton" );
520 imageClose = Resource::loadImage( "CloseButton" );
521 imageHelp = Resource::loadImage( "HelpButton" );
491} 522}
492 523
493QPEDecoration::QPEDecoration( const QString &plugin ) 524QPEDecoration::QPEDecoration( const QString &plugin )
494 : QWSDefaultDecoration() 525 : QWSDefaultDecoration()
495{ 526{
496 init ( plugin );
497}
498
499void QPEDecoration::init ( const QString &plugin )
500{
501 libname = plugin; 527 libname = plugin;
502 528
503 if ( wdlib ) { 529 if ( wdlib ) {
504 wdiface->release(); 530 wdiface->release();
505 wdlib->unload(); 531 wdlib->unload();
506 delete wdlib; 532 delete wdlib;
507 wdlib = 0; 533 wdlib = 0;
508 } else { 534 } else {
509 delete wdiface; 535 delete wdiface;
510 } 536 }
511 537
512 WindowDecorationInterface *iface = 0; 538 WindowDecorationInterface *iface = 0;
@@ -536,19 +562,10 @@ void QPEDecoration::init ( const QString &plugin )
536 wdiface = new DefaultWindowDecoration; 562 wdiface = new DefaultWindowDecoration;
537 } 563 }
538 564
539 helpFile = QString(qApp->argv()[0]) + ".html";
540 QStringList helpPath = Global::helpPath();
541 helpExists = FALSE;
542 for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !helpExists; ++it) {
543 helpExists = QFile::exists( *it + "/" + helpFile );
544 //qDebug ( "Checking %s/%s for help: %d", (*it).latin1(), helpFile.latin1(),helpExists);
545 }
546 qpeManager = new QPEManager( this );
547 565
548 // Qtopia 1.5 compatibility 566
549 imageOk = *okImage ( 15 ); 567 helpexists = FALSE; // We don't know (flagged by helpFile being null)
550 imageClose = *closeImage ( 15 ); 568 qpeManager = new QPEManager( this );
551 imageHelp = *helpImage ( 15 );
552} 569}
553 570
554QPEDecoration::~QPEDecoration() 571QPEDecoration::~QPEDecoration()
@@ -614,14 +631,14 @@ QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecor
614 if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) { 631 if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) {
615 int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd); 632 int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd);
616 int left = rect.right() - maximizeWidth - closeWidth; 633 int left = rect.right() - maximizeWidth - closeWidth;
617 if ( ((HackWidget *)widget)->needsOk() ) 634 if ( ((DecorHackWidget *)widget)->needsOk() )
618 left -= okWidth; 635 left -= okWidth;
619 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight); 636 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
620 region = r; 637 region = r;
621 } 638 }
622 break; 639 break;
623 case Minimize: 640 case Minimize:
624 if ( ((HackWidget *)widget)->needsOk() ) { 641 if ( ((DecorHackWidget *)widget)->needsOk() ) {
625 QRect r(rect.right() - okWidth, 642 QRect r(rect.right() - okWidth,
626 rect.top() - titleHeight, okWidth, titleHeight); 643 rect.top() - titleHeight, okWidth, titleHeight);
627 if (r.left() > rect.left() + titleHeight) 644 if (r.left() > rect.left() + titleHeight)
@@ -631,7 +648,7 @@ QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecor
631 case Close: 648 case Close:
632 { 649 {
633 int left = rect.right() - closeWidth; 650 int left = rect.right() - closeWidth;
634 if ( ((HackWidget *)widget)->needsOk() ) 651 if ( ((DecorHackWidget *)widget)->needsOk() )
635 left -= okWidth; 652 left -= okWidth;
636 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight); 653 QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
637 region = r; 654 region = r;
@@ -640,7 +657,7 @@ QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecor
640 case Title: 657 case Title:
641 if ( !widget->isMaximized() ) { 658 if ( !widget->isMaximized() ) {
642 int width = rect.width() - helpWidth - closeWidth; 659 int width = rect.width() - helpWidth - closeWidth;
643 if ( ((HackWidget *)widget)->needsOk() ) 660 if ( ((DecorHackWidget *)widget)->needsOk() )
644 width -= okWidth; 661 width -= okWidth;
645 QRect r(rect.left()+helpWidth, rect.top() - titleHeight, 662 QRect r(rect.left()+helpWidth, rect.top() - titleHeight,
646 width, titleHeight); 663 width, titleHeight);
@@ -649,7 +666,7 @@ QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecor
649 } 666 }
650 break; 667 break;
651 case Help: 668 case Help:
652 if ( helpExists || widget->testWFlags(Qt::WStyle_ContextHelp) ) { 669 if ( helpExists() || widget->testWFlags(Qt::WStyle_ContextHelp) ) {
653 QRect r(rect.left(), rect.top() - titleHeight, 670 QRect r(rect.left(), rect.top() - titleHeight,
654 helpWidth, titleHeight); 671 helpWidth, titleHeight);
655 region = r; 672 region = r;
@@ -752,11 +769,11 @@ void QPEDecoration::paint(QPainter *painter, const QWidget *widget)
752 QRect rect(widget->rect()); 769 QRect rect(widget->rect());
753 770
754 // title bar rect 771 // title bar rect
755 QRect tr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight ); 772 QRect tbr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );
756 773
757#ifndef QT_NO_PALETTE 774#ifndef QT_NO_PALETTE
758 QRegion oldClip = painter->clipRegion(); 775 QRegion oldClip = painter->clipRegion();
759 painter->setClipRegion( oldClip - QRegion( tr ) );// reduce flicker 776 painter->setClipRegion( oldClip - QRegion( tbr ) );// reduce flicker
760 wdiface->drawArea( WindowDecorationInterface::Border, painter, &wd ); 777 wdiface->drawArea( WindowDecorationInterface::Border, painter, &wd );
761 painter->setClipRegion( oldClip ); 778 painter->setClipRegion( oldClip );
762 779
@@ -796,9 +813,9 @@ void QPEDecoration::paintButton(QPainter *painter, const QWidget *w,
796 b = WindowDecorationInterface::Close; 813 b = WindowDecorationInterface::Close;
797 break; 814 break;
798 case Minimize: 815 case Minimize:
799 if ( ((HackWidget *)w)->needsOk() ) 816 if ( ((DecorHackWidget *)w)->needsOk() )
800 b = WindowDecorationInterface::OK; 817 b = WindowDecorationInterface::OK;
801 else if ( helpExists ) 818 else if ( helpExists() )
802 b = WindowDecorationInterface::Help; 819 b = WindowDecorationInterface::Help;
803 else 820 else
804 return; 821 return;
@@ -818,7 +835,7 @@ void QPEDecoration::paintButton(QPainter *painter, const QWidget *w,
818 835
819 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); 836 int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
820 QRect rect(w->rect()); 837 QRect rect(w->rect());
821 QRect tr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight ); 838 QRect tbr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );
822 QRect brect(region(w, w->rect(), type).boundingRect()); 839 QRect brect(region(w, w->rect(), type).boundingRect());
823 840
824 const QColorGroup &cg = w->palette().active(); 841 const QColorGroup &cg = w->palette().active();
@@ -828,7 +845,7 @@ void QPEDecoration::paintButton(QPainter *painter, const QWidget *w,
828 painter->setPen( cg.color(QColorGroup::Text) ); 845 painter->setPen( cg.color(QColorGroup::Text) );
829 846
830 QRegion oldClip = painter->clipRegion(); 847 QRegion oldClip = painter->clipRegion();
831 painter->setClipRegion( QRect(brect.x(), tr.y(), brect.width(), tr.height()) ); // reduce flicker 848 painter->setClipRegion( QRect(brect.x(), tbr.y(), brect.width(), tbr.height()) ); // reduce flicker
832 wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd ); 849 wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd );
833 wdiface->drawButton( b, painter, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)state ); 850 wdiface->drawButton( b, painter, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)state );
834 painter->setClipRegion( oldClip ); 851 painter->setClipRegion( oldClip );
@@ -848,6 +865,20 @@ void QPEDecoration::maximize( QWidget *widget )
848 } 865 }
849} 866}
850 867
868QPopupMenu *QPEDecoration::menu( const QWidget *, const QPoint & )
869{
870 QPopupMenu *m = new QPopupMenu();
871
872 m->insertItem(QPEManager::tr("Restore"), (int)Normalize);
873 m->insertItem(QPEManager::tr("Move"), (int)Title);
874 m->insertItem(QPEManager::tr("Size"), (int)BottomRight);
875 m->insertItem(QPEManager::tr("Maximize"), (int)Maximize);
876 m->insertSeparator();
877 m->insertItem(QPEManager::tr("Close"), (int)Close);
878
879 return m;
880}
881
851#ifndef QT_NO_DIALOG 882#ifndef QT_NO_DIALOG
852class HackDialog : public QDialog 883class HackDialog : public QDialog
853{ 884{
@@ -871,7 +902,7 @@ void QPEDecoration::minimize( QWidget *widget )
871 d->acceptIt(); 902 d->acceptIt();
872 } 903 }
873#endif 904#endif
874 else if ( ((HackWidget *)widget)->needsOk() ) { 905 else if ( ((DecorHackWidget *)widget)->needsOk() ) {
875 QSignal s; 906 QSignal s;
876 s.connect( widget, SLOT( accept() ) ); 907 s.connect( widget, SLOT( accept() ) );
877 s.activate(); 908 s.activate();
@@ -882,11 +913,20 @@ void QPEDecoration::minimize( QWidget *widget )
882 913
883void QPEDecoration::help( QWidget *w ) 914void QPEDecoration::help( QWidget *w )
884{ 915{
885 if ( helpExists ) { 916 if ( helpExists() ) {
886 Global::execute( "helpbrowser", helpFile ); 917 QString hf = helpFile;
918 QString localHelpFile = QString(qApp->argv()[0]) + "-" + w->name() + ".html";
919 QStringList helpPath = Global::helpPath();
920 for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end(); ++it) {
921 if ( QFile::exists( *it + "/" + localHelpFile ) ) {
922 hf = localHelpFile;
923 break;
924 }
925 }
926 Global::execute( "helpbrowser", hf );
887 } else if ( w && w->testWFlags(Qt::WStyle_ContextHelp) ) { 927 } else if ( w && w->testWFlags(Qt::WStyle_ContextHelp) ) {
888 QWhatsThis::enterWhatsThisMode(); 928 QWhatsThis::enterWhatsThisMode();
889 QWhatsThis::leaveWhatsThisMode( QObject::tr( 929 QWhatsThis::leaveWhatsThisMode( QObject::tr(
890 "<Qt>Comprehensive help is not available for this application, " 930 "<Qt>Comprehensive help is not available for this application, "
891 "however there is context-sensitive help.<p>To use context-sensitive help:<p>" 931 "however there is context-sensitive help.<p>To use context-sensitive help:<p>"
892 "<ol><li>click and hold the help button." 932 "<ol><li>click and hold the help button."
@@ -899,7 +939,7 @@ void QPEDecoration::windowData( const QWidget *w, WindowDecorationInterface::Win
899{ 939{
900 wd.rect = w->rect(); 940 wd.rect = w->rect();
901 if ( qpeManager->whatsThisWidget() == w ) 941 if ( qpeManager->whatsThisWidget() == w )
902 wd.caption = QObject::tr("What's this..." ); 942 wd.caption = QObject::tr( "What's this..." );
903 else 943 else
904 wd.caption = w->caption(); 944 wd.caption = w->caption();
905 wd.palette = qApp->palette(); 945 wd.palette = qApp->palette();
@@ -924,3 +964,4 @@ QPopupMenu *QPEDecoration::menu(QWSManager*, const QWidget*, const QPoint&)
924 964
925 965
926#endif // QT_NO_QWS_QPE_WM_STYLE 966#endif // QT_NO_QWS_QPE_WM_STYLE
967#endif