⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 appservices.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of the 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.************************************************************************/#define QTOPIA_INTERNAL_MIMEEXT#include "appservices.h"#include <qtopia/resource.h>#include <qtopia/applnk.h>#include <qtopia/mimetype.h>#include <qtopia/qpeapplication.h>#include <qtopia/qcopenvelope_qws.h>#include <qtopia/config.h>#include <qtopia/services.h>#include <qtimer.h>#include <qlistview.h>#include <qdir.h>#include <qradiobutton.h>#include <qbuttongroup.h>class ASCheckListItem : public QCheckListItem {public:    ASCheckListItem(QListView *parent, const QString &sv, const AppLnk* lnk) :	QCheckListItem(parent,QString::null,Controller), link(lnk), svr(sv)    {	Config service(Service::config(sv),Config::File);	QString icon;	if ( service.isValid() ) {	    service.setGroup("Service");	    QString nm = service.readEntry("Name");	    if ( nm.isEmpty() || service.readNumEntry("Multiple",0) ) {		// Not presented to users		svr = QString::null;	    } else {		setText(0,nm);		icon = service.readEntry("Icon");	    }	} else if ( lnk ) {	    QString name=sv.mid(5); // Strip "Open/"	    if ( name.left(12)=="application/" ) {		QString ap = name.mid(12);		if ( ap.left(2) == "x-" )		    ap = ap.mid(2);		name = ap;//AppServices::tr("%1 (%2)").arg(lnk->name()).arg(ap);	    } else if ( name.find('/')>0 ) {		MimeType mt(name);		QString ext = mt.extension().upper();		if ( !ext.isEmpty() )		    name = ext;	    } // else not translated	    setText(0,AppServices::tr("Open %1").arg(name));	    icon = lnk->icon();	} else {	    svr = QString::null;	}	int s = AppLnk::bigIconSize();	QImage img;	if ( !icon.isNull() )	    img = Resource::loadImage(icon);	if ( img.isNull() )	    img = Resource::loadImage("Generic");	img = img.smoothScale(s,s);	QPixmap pm; pm.convertFromImage(img);	setPixmap(0,pm);    }    ASCheckListItem(QCheckListItem *parent, const AppLnk* lnk) :	QCheckListItem(parent,lnk->name(),RadioButton), link(lnk)    {    }    bool isValid() const    {	return !svr.isNull();    }    int width( const QFontMetrics&,                       const QListView* lv, int column) const    {	QFont f=chFont(lv->font());	return QCheckListItem::width(QFontMetrics(f),lv,column)+5;    }    void paintCell( QPainter *p,  const QColorGroup & cg,                    int column, int width, int alignment )    {	QFont f=p->font();	if ( !svr.isEmpty() ) {	    QFont bf=chFont(f);	    p->setFont(bf);	}	QCheckListItem::paintCell(p,cg,column,width,alignment);	p->setFont(f);    }    QString service() const    {	return svr;    }    QString application() const    {	return link ? link->exec() : QString("XXXX");    }private:    QFont chFont(const QFont& f) const    {        QFont r = f;	r.setPointSize(f.pointSize()*4/3);	r.setBold(TRUE);	return r;    }    const AppLnk* link;    QString svr;};/*  *  Constructs a AppServices which is a child of 'parent', with the  *  name 'name' and widget flags set to 'f'  * *  The dialog will by default be modeless, unless you set 'modal' to *  TRUE to construct a modal dialog. */AppServices::AppServices( QWidget* parent,  const char* name, bool modal, WFlags fl )    : AppServicesBase( parent, name, modal, fl ){    changed=FALSE;    allapps=0;    connect(lv,SIGNAL(clicked(QListViewItem*)),this,SLOT(check(QListViewItem*)));    QTimer::singleShot(1,this,SLOT(loadState()));}void AppServices::check(QListViewItem* i){    if ( i && i->parent() ) {	// must be checkbox	QCheckListItem* cli = (QCheckListItem*)i;	if ( !cli->isOn() ) {	    ((QCheckListItem*)i)->setOn(TRUE);	    changed = TRUE;	}    }}void AppServices::drawWait(bool on){    QWidget* waitwi = lv->viewport();    QPainter waitpaint(waitwi);    QPixmap pm = Resource::loadPixmap("bigwait");    int x = (waitwi->width()-pm.width())/2;    int y = (waitwi->height()-pm.height())/2;    if ( on ) {	waitpaint.drawPixmap(x,y,pm);    } else {	waitpaint.eraseRect(x,y,pm.width(),pm.height());    }    waitpaint.end();}void AppServices::loadState(){    lv->clear();    drawWait(TRUE);    delete allapps;    allapps=new AppLnkSet(MimeType::appsFolderName());    int max=-1;    QDict<ASCheckListItem> servicedict;#define ADDAPP(si,lnk,ver) \    ASCheckListItem* ai = new ASCheckListItem(si,lnk); \    /*ai->setText(1,ver);*/ \    ai->setPixmap(0,lnk->pixmap()); \    if ( def == lnk->exec() ) { \	ai->setOn(TRUE); \    }    // All services    QStringList s = Service::list();    for (QStringList::ConstIterator it = s.begin(); it!=s.end(); ++it) {	QString sv=QPEApplication::qpeDir()+"services/"+(*it);	QDir dir(sv,QString::null,QDir::Name | QDir::IgnoreCase,QDir::Files);	QStringList apps = dir.entryList();	ASCheckListItem* si = new ASCheckListItem(lv,(*it),0);	if ( si->isValid() ) {	    QString def;	    Config binding(Service::binding(*it));	    if ( binding.isValid() ) {		binding.setGroup("Service");		def = binding.readEntry("default");	    }	    servicedict.insert(*it,si);	    for (QStringList::ConstIterator ait = apps.begin(); ait!=apps.end(); ++ait) {		const AppLnk* lnk = allapps->findExec(*ait);		if ( lnk ) {		    QFile f(sv+"/"+*ait);		    if ( f.open(IO_ReadOnly) ) {			//int vern=QString(f.readAll()).stripWhiteSpace().toInt();			//QString ver; ver.sprintf("%d.%02d",vern/100,vern%100);			ADDAPP(si,lnk,ver);		    }		}	    }	    si->setOpen(TRUE);	} else {	    delete si;	}    }    // Now include all MIME types    const QList<AppLnk> &c = allapps->children();    const AppLnk* lnk;    for (QListIterator<AppLnk> ai(c); (lnk=ai.current()); ++ai) {	QStringList types = lnk->mimeTypes();	for (QStringList::ConstIterator ti=types.begin(); ti!=types.end(); ++ti) {	    QString mt = *ti;	    if ( mt.right(2)=="/*" )		mt.truncate(mt.length()-2);	    QString sv = "Open/"+mt;	    ASCheckListItem* s = servicedict.find(sv);	    if ( !s ) {		s = new ASCheckListItem(lv,sv,lnk);		servicedict.insert(sv,s);		s->setOpen(TRUE);	    }	    Config binding(Service::binding(sv));	    QString def;	    if ( binding.isValid() ) {		binding.setGroup("Service");		def = binding.readEntry("default");	    }	    ADDAPP(s,lnk,"1.00");	}    }    bool some = FALSE;    QDictIterator<ASCheckListItem> sdit(servicedict);    ASCheckListItem* si;    for (; (si=sdit.current()); ++sdit) {	int n = si->childCount();	max = QMAX(max,n);	if ( n==0 && show0->isOn()	  || n==1 && show1->isOn()	  || n>1 && showmulti->isOn())	{	    some = TRUE;	    if ( n == 1 ) {		((ASCheckListItem*)si->firstChild())->setOn(TRUE);	    }	} else {	    delete si;	}    }    if ( !some ) {	switch ( max ) {	    case -1:		// there are no services		choices->setEnabled(FALSE);		break;	    case 1:		// there are no service choices		showmulti->setEnabled(FALSE);		if ( showmulti->isChecked() ) {		    show1->setChecked(TRUE);		    loadState();		}		break;	    case 0:		// there are no services provided		showmulti->setEnabled(FALSE);		show1->setEnabled(FALSE);		if (!show0->isChecked()) {		    show0->setChecked(TRUE);		    loadState();		}		break;	}    }    drawWait(FALSE);}/*   *  Destroys the object and frees any allocated resources */AppServices::~AppServices(){    delete allapps;}void AppServices::done(int y){    if ( y ) {	if ( changed ) {	    QListViewItem* s = lv->firstChild();	    while ( s ) {		ASCheckListItem* sv=(ASCheckListItem*)s;		for (QListViewItem* a = s->firstChild(); a; a = a->nextSibling()) {		    ASCheckListItem* ap=(ASCheckListItem*)a;		    if ( ap->isOn() && sv->childCount()>1 ) {			Config binding(Service::binding(sv->service()));			binding.setGroup("Service");			binding.writeEntry("default",ap->application());			break;		    }		}		s = s->nextSibling();	    }	}	// Could list, but server ignores at the moment	QCopEnvelope e("QPE/System","serviceChanged(QString)");	e << QString::null;    }    AppServicesBase::done(y);    close();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -