summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/applnk.cpp130
-rw-r--r--library/resource.cpp13
2 files changed, 90 insertions, 53 deletions
diff --git a/library/applnk.cpp b/library/applnk.cpp
index 1c1a227..80f2c62 100644
--- a/library/applnk.cpp
+++ b/library/applnk.cpp
@@ -856,481 +856,513 @@ bool AppLnk::writeLink() const
856 return FALSE; 856 return FALSE;
857 storeLink(); 857 storeLink();
858 return TRUE; 858 return TRUE;
859} 859}
860 860
861/*! 861/*!
862 \internal 862 \internal
863*/ 863*/
864void AppLnk::storeLink() const 864void AppLnk::storeLink() const
865{ 865{
866 Config config( mLinkFile, Config::File ); 866 Config config( mLinkFile, Config::File );
867 config.setGroup("Desktop Entry"); 867 config.setGroup("Desktop Entry");
868 config.writeEntry("Name",mName); 868 config.writeEntry("Name",mName);
869 if ( !mIconFile.isNull() ) config.writeEntry("Icon",mIconFile); 869 if ( !mIconFile.isNull() ) config.writeEntry("Icon",mIconFile);
870 config.writeEntry("Type",type()); 870 config.writeEntry("Type",type());
871 if(!rotation().isEmpty()) 871 if(!rotation().isEmpty())
872 config.writeEntry("Rotation",rotation()); 872 config.writeEntry("Rotation",rotation());
873 else 873 else
874 config.removeEntry("Rotation"); 874 config.removeEntry("Rotation");
875 if ( !mComment.isNull() ) config.writeEntry("Comment",mComment); 875 if ( !mComment.isNull() ) config.writeEntry("Comment",mComment);
876 QString f = file(); 876 QString f = file();
877 int i = 0; 877 int i = 0;
878 while ( i < (int)f.length() && i < (int)mLinkFile.length() && f[i] == mLinkFile[i] ) 878 while ( i < (int)f.length() && i < (int)mLinkFile.length() && f[i] == mLinkFile[i] )
879 i++; 879 i++;
880 while ( i && f[i] != '/' ) 880 while ( i && f[i] != '/' )
881 i--; 881 i--;
882 // simple case where in the same directory 882 // simple case where in the same directory
883 if ( mLinkFile.find( '/', i + 1 ) < 0 ) 883 if ( mLinkFile.find( '/', i + 1 ) < 0 )
884 f = f.mid(i+1); 884 f = f.mid(i+1);
885 // ### could do relative ie ../../otherDocs/file.doc 885 // ### could do relative ie ../../otherDocs/file.doc
886 config.writeEntry("File",f); 886 config.writeEntry("File",f);
887 config.writeEntry( "Categories", d->mCatList, ';' ); 887 config.writeEntry( "Categories", d->mCatList, ';' );
888 888
889#ifndef QT_NO_COP 889#ifndef QT_NO_COP
890 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 890 QCopEnvelope e("QPE/System", "linkChanged(QString)");
891 e << mLinkFile; 891 e << mLinkFile;
892#endif 892#endif
893} 893}
894 894
895/*! 895/*!
896 Sets the property named \a key to \a value. 896 Sets the property named \a key to \a value.
897 897
898 \sa property() 898 \sa property()
899*/ 899*/
900void AppLnk::setProperty(const QString& key, const QString& value) 900void AppLnk::setProperty(const QString& key, const QString& value)
901{ 901{
902 if ( ensureLinkExists() ) { 902 if ( ensureLinkExists() ) {
903 Config cfg(linkFile(), Config::File); 903 Config cfg(linkFile(), Config::File);
904 cfg.writeEntry(key,value); 904 cfg.writeEntry(key,value);
905 } 905 }
906} 906}
907 907
908/*! 908/*!
909 Returns the property named \a key. 909 Returns the property named \a key.
910 910
911 \sa setProperty() 911 \sa setProperty()
912*/ 912*/
913QString AppLnk::property(const QString& key) const 913QString AppLnk::property(const QString& key) const
914{ 914{
915 QString lf = linkFile(); 915 QString lf = linkFile();
916 if ( !QFile::exists(lf) ) 916 if ( !QFile::exists(lf) )
917 return QString::null; 917 return QString::null;
918 Config cfg(lf, Config::File); 918 Config cfg(lf, Config::File);
919 return cfg.readEntry(key); 919 return cfg.readEntry(key);
920} 920}
921 921
922bool AppLnk::isPreloaded() const { 922bool AppLnk::isPreloaded() const {
923 // Preload information is stored in the Launcher config in v1.5. 923 // Preload information is stored in the Launcher config in v1.5.
924 Config cfg("Launcher"); 924 Config cfg("Launcher");
925 cfg.setGroup("Preload"); 925 cfg.setGroup("Preload");
926 QStringList apps = cfg.readListEntry("Apps",','); 926 QStringList apps = cfg.readListEntry("Apps",',');
927 if (apps.contains(exec())) 927 if (apps.contains(exec()))
928 return true; 928 return true;
929 return false; 929 return false;
930} 930}
931 931
932void AppLnk::setPreloaded(bool yesNo) { 932void AppLnk::setPreloaded(bool yesNo) {
933 // Preload information is stored in the Launcher config in v1.5. 933 // Preload information is stored in the Launcher config in v1.5.
934 Config cfg("Launcher"); 934 Config cfg("Launcher");
935 cfg.setGroup("Preload"); 935 cfg.setGroup("Preload");
936 QStringList apps = cfg.readListEntry("Apps", ','); 936 QStringList apps = cfg.readListEntry("Apps", ',');
937 if (apps.contains(exec()) && !yesNo) 937 if (apps.contains(exec()) && !yesNo)
938 apps.remove(exec()); 938 apps.remove(exec());
939 else if (yesNo && !apps.contains(exec())) 939 else if (yesNo && !apps.contains(exec()))
940 apps.append(exec()); 940 apps.append(exec());
941 cfg.writeEntry("Apps", apps, ','); 941 cfg.writeEntry("Apps", apps, ',');
942} 942}
943 943
944 944
945/*! 945/*!
946 Deletes both the linkFile() and the file() associated with this AppLnk. 946 Deletes both the linkFile() and the file() associated with this AppLnk.
947 947
948 \sa removeLinkFile() 948 \sa removeLinkFile()
949*/ 949*/
950void AppLnk::removeFiles() 950void AppLnk::removeFiles()
951{ 951{
952 bool valid = isValid(); 952 bool valid = isValid();
953 if ( !valid || !linkFileKnown() || QFile::remove(linkFile()) ) { 953 if ( !valid || !linkFileKnown() || QFile::remove(linkFile()) ) {
954 if ( QFile::remove(file()) ) { 954 if ( QFile::remove(file()) ) {
955#ifndef QT_NO_COP 955#ifndef QT_NO_COP
956 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 956 QCopEnvelope e("QPE/System", "linkChanged(QString)");
957 if ( linkFileKnown() ) 957 if ( linkFileKnown() )
958 e << linkFile(); 958 e << linkFile();
959 else 959 else
960 e << file(); 960 e << file();
961#endif 961#endif
962 } else if ( valid ) { 962 } else if ( valid ) {
963 // restore link 963 // restore link
964 writeLink(); 964 writeLink();
965 } 965 }
966 } 966 }
967} 967}
968 968
969/*! 969/*!
970 Deletes the linkFile(), leaving any file() untouched. 970 Deletes the linkFile(), leaving any file() untouched.
971 971
972 \sa removeFiles() 972 \sa removeFiles()
973*/ 973*/
974void AppLnk::removeLinkFile() 974void AppLnk::removeLinkFile()
975{ 975{
976 if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) { 976 if ( isValid() && linkFileKnown() && QFile::remove(linkFile()) ) {
977#ifndef QT_NO_COP 977#ifndef QT_NO_COP
978 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 978 QCopEnvelope e("QPE/System", "linkChanged(QString)");
979 e << linkFile(); 979 e << linkFile();
980#endif 980#endif
981 } 981 }
982} 982}
983 983
984class AppLnkImagePrivate {
985public :
986 AppLnkImagePrivate( const QString & ImageName ) {
987 IconName = ImageName;
988 Small = 0;
989 Big = 0;
990 }
991 ~AppLnkImagePrivate( ) {
992 if ( Small ) delete Small;
993 if ( Big ) delete Big;
994 }
995
996 inline QPixmap * small( void ) {
997 if( ! Small ) {
998 QImage unscaledIcon = Resource::loadImage( IconName );
999 // works as long as smallSize remains static
1000 Small = new QPixmap();
1001 Small->convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) );
1002 }
1003 return Small;
1004 }
1005
1006 inline QPixmap * big( void ) {
1007 if( ! Big ) {
1008 QImage unscaledIcon = Resource::loadImage( IconName );
1009 // works as long as bigSize remains static
1010 Big = new QPixmap();
1011 Big->convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) );
1012 }
1013 return Big;
1014 }
1015
1016 QString IconName;
1017 QPixmap * Small;
1018 QPixmap * Big;
1019};
1020
984class AppLnkSetPrivate { 1021class AppLnkSetPrivate {
985public: 1022public:
986 AppLnkSetPrivate() 1023 AppLnkSetPrivate()
987 { 1024 {
988 typPix.setAutoDelete(TRUE); 1025 typPix.setAutoDelete(TRUE);
989 typPixBig.setAutoDelete(TRUE); 1026 typName.setAutoDelete(TRUE);
990 typName.setAutoDelete(TRUE);
991 } 1027 }
992 1028
993 QDict<QPixmap> typPix; 1029 QDict<AppLnkImagePrivate> typPix;
994 QDict<QPixmap> typPixBig;
995 QDict<QString> typName; 1030 QDict<QString> typName;
996}; 1031};
997 1032
998/*! 1033/*!
999 \class AppLnkSet applnk.h 1034 \class AppLnkSet applnk.h
1000 \brief The AppLnkSet class is a set of AppLnk objects. 1035 \brief The AppLnkSet class is a set of AppLnk objects.
1001*/ 1036*/
1002 1037
1003/*! 1038/*!
1004 \fn QStringList AppLnkSet::types() const 1039 \fn QStringList AppLnkSet::types() const
1005 1040
1006 Returns the list of \link applnk.html#Types types\endlink in the set. 1041 Returns the list of \link applnk.html#Types types\endlink in the set.
1007 1042
1008 For applications, games and settings the type is \c Application; 1043 For applications, games and settings the type is \c Application;
1009 for documents the type is the document's MIME type. 1044 for documents the type is the document's MIME type.
1010 1045
1011 \sa AppLnk::type(), typeName(), typePixmap(), typeBigPixmap() 1046 \sa AppLnk::type(), typeName(), typePixmap(), typeBigPixmap()
1012*/ 1047*/
1013 1048
1014/*! 1049/*!
1015 \fn const QList<AppLnk>& AppLnkSet::children() const 1050 \fn const QList<AppLnk>& AppLnkSet::children() const
1016 1051
1017 Returns the members of the set. 1052 Returns the members of the set.
1018*/ 1053*/
1019 1054
1020/*! 1055/*!
1021 Constructs an empty AppLnkSet. 1056 Constructs an empty AppLnkSet.
1022*/ 1057*/
1023AppLnkSet::AppLnkSet() : 1058AppLnkSet::AppLnkSet() :
1024 d(new AppLnkSetPrivate) 1059 d(new AppLnkSetPrivate)
1025{ 1060{
1026} 1061}
1027 1062
1028/*! 1063/*!
1029 Constructs an AppLnkSet that contains AppLnk objects representing 1064 Constructs an AppLnkSet that contains AppLnk objects representing
1030 all the files in the given \a directory (and any subdirectories 1065 all the files in the given \a directory (and any subdirectories
1031 recursively). 1066 recursively).
1032 1067
1033 \omit 1068 \omit
1034 The directories may contain ".directory" files which override 1069 The directories may contain ".directory" files which override
1035 any AppLnk::type() values for AppLnk objects found in the directory. 1070 any AppLnk::type() values for AppLnk objects found in the directory.
1036 This allows simple localization of application types. 1071 This allows simple localization of application types.
1037 \endomit 1072 \endomit
1038*/ 1073*/
1039AppLnkSet::AppLnkSet( const QString &directory ) : 1074AppLnkSet::AppLnkSet( const QString &directory ) :
1040 d(new AppLnkSetPrivate) 1075 d(new AppLnkSetPrivate)
1041{ 1076{
1042 QDir dir( directory ); 1077 QDir dir( directory );
1043 mFile = directory; 1078 mFile = directory;
1044 findChildren(directory,QString::null,QString::null); 1079 findChildren(directory,QString::null,QString::null);
1045} 1080}
1046 1081
1047/*! 1082/*!
1048 Detaches all AppLnk objects from the set. The set become empty and 1083 Detaches all AppLnk objects from the set. The set become empty and
1049 the caller becomes responsible for deleting the AppLnk objects. 1084 the caller becomes responsible for deleting the AppLnk objects.
1050*/ 1085*/
1051void AppLnkSet::detachChildren() 1086void AppLnkSet::detachChildren()
1052{ 1087{
1053 QListIterator<AppLnk> it( mApps ); 1088 QListIterator<AppLnk> it( mApps );
1054 for ( ; it.current(); ) { 1089 for ( ; it.current(); ) {
1055 AppLnk* a = *it; 1090 AppLnk* a = *it;
1056 ++it; 1091 ++it;
1057 a->mId = 0; 1092 a->mId = 0;
1058 } 1093 }
1059 mApps.clear(); 1094 mApps.clear();
1060} 1095}
1061 1096
1062/*! 1097/*!
1063 Destroys the set, deleting all the AppLnk objects it contains. 1098 Destroys the set, deleting all the AppLnk objects it contains.
1064 1099
1065 \sa detachChildren() 1100 \sa detachChildren()
1066*/ 1101*/
1067AppLnkSet::~AppLnkSet() 1102AppLnkSet::~AppLnkSet()
1068{ 1103{
1069 QListIterator<AppLnk> it( mApps ); 1104 QListIterator<AppLnk> it( mApps );
1070 for ( ; it.current(); ) { 1105 for ( ; it.current(); ) {
1071 AppLnk* a = *it; 1106 AppLnk* a = *it;
1072 ++it; 1107 ++it;
1073 a->mId = 0; 1108 a->mId = 0;
1074 delete a; 1109 delete a;
1075 } 1110 }
1076 delete d; 1111 delete d;
1077} 1112}
1078 1113
1079void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth) 1114void AppLnkSet::findChildren(const QString &dr, const QString& typ, const QString& typName, int depth)
1080{ 1115{
1081 depth++; 1116 depth++;
1082 if ( depth > 10 ) 1117 if ( depth > 10 )
1083 return; 1118 return;
1084 1119
1085 QDir dir( dr ); 1120 QDir dir( dr );
1086 QString typNameLocal = typName; 1121 QString typNameLocal = typName;
1087 1122
1088 if ( dir.exists( ".directory" ) ) { 1123 if ( dir.exists( ".directory" ) ) {
1089 Config config( dr + "/.directory", Config::File ); 1124 Config config( dr + "/.directory", Config::File );
1090 config.setGroup( "Desktop Entry" ); 1125 config.setGroup( "Desktop Entry" );
1091 typNameLocal = config.readEntry( "Name", typNameLocal ); 1126 typNameLocal = config.readEntry( "Name", typNameLocal );
1092 if ( !typ.isEmpty() ) { 1127 if ( !typ.isEmpty() ) {
1093 QString iconFile = config.readEntry( "Icon", "AppsIcon" ); 1128 d->typPix.insert( typ,
1094 QImage unscaledIcon = Resource::loadImage( iconFile ); 1129 new AppLnkImagePrivate( config.readEntry( "Icon", "AppsIcon" ) )
1095 QPixmap pm, bpm; 1130 );
1096 pm.convertFromImage( unscaledIcon.smoothScale( smallSize, smallSize ) ); 1131 d->typName.insert(typ, new QString(typNameLocal));
1097 bpm.convertFromImage( unscaledIcon.smoothScale( bigSize, bigSize ) ); 1132
1098 d->typPix.insert(typ, new QPixmap(pm)); 1133 }
1099 d->typPixBig.insert(typ, new QPixmap(bpm));
1100 d->typName.insert(typ, new QString(typNameLocal));
1101 }
1102 } 1134 }
1103 1135
1104 const QFileInfoList *list = dir.entryInfoList(); 1136 const QFileInfoList *list = dir.entryInfoList();
1105 if ( list ) { 1137 if ( list ) {
1106 QFileInfo* fi; 1138 QFileInfo* fi;
1107 bool cadded=FALSE; 1139 bool cadded=FALSE;
1108 for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) { 1140 for ( QFileInfoListIterator it(*list); (fi=*it); ++it ) {
1109 QString bn = fi->fileName(); 1141 QString bn = fi->fileName();
1110// qDebug("findChildren "+bn); 1142 // qDebug("findChildren "+bn);
1111 if ( bn[0] != '.' && bn != "CVS" ) { 1143 if ( bn[0] != '.' && bn != "CVS" ) {
1112 if ( fi->isDir() ) { 1144 if ( fi->isDir() ) {
1113 QString c = typ.isNull() ? bn : typ+"/"+bn; 1145 QString c = typ.isNull() ? bn : typ+"/"+bn;
1114 QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn; 1146 QString d = typNameLocal.isNull() ? bn : typNameLocal+"/"+bn;
1115 findChildren(fi->filePath(), c, d, depth ); 1147 findChildren(fi->filePath(), c, d, depth );
1116 } else { 1148 } else {
1117 if ( fi->extension(FALSE) == "desktop" ) { 1149 if ( fi->extension(FALSE) == "desktop" ) {
1118 AppLnk* app = new AppLnk( fi->filePath() ); 1150 AppLnk* app = new AppLnk( fi->filePath() );
1119#ifdef QT_NO_QWS_MULTIPROCESS 1151#ifdef QT_NO_QWS_MULTIPROCESS
1120 if ( !Global::isBuiltinCommand( app->exec() ) ) 1152 if ( !Global::isBuiltinCommand( app->exec() ) )
1121 delete app; 1153 delete app;
1122 else 1154 else
1123#endif 1155#endif
1124 { 1156 {
1125 if ( !typ.isEmpty() ) { 1157 if ( !typ.isEmpty() ) {
1126 if ( !cadded ) { 1158 if ( !cadded ) {
1127 typs.append(typ); 1159 typs.append(typ);
1128 cadded = TRUE; 1160 cadded = TRUE;
1129 } 1161 }
1130 app->setType(typ); 1162 app->setType(typ);
1163 }
1164 add(app);
1165 }
1166 }
1131 } 1167 }
1132 add(app);
1133 }
1134 } 1168 }
1135 }
1136 } 1169 }
1137 }
1138 } 1170 }
1139} 1171}
1140 1172
1141/*! 1173/*!
1142 Adds AppLnk \a f to the set. The set takes responsibility for 1174 Adds AppLnk \a f to the set. The set takes responsibility for
1143 deleting \a f. 1175 deleting \a f.
1144 1176
1145 \sa remove() 1177 \sa remove()
1146*/ 1178*/
1147void AppLnkSet::add( AppLnk *f ) 1179void AppLnkSet::add( AppLnk *f )
1148{ 1180{
1149 if ( f->mId == 0 ) { 1181 if ( f->mId == 0 ) {
1150 AppLnk::lastId++; 1182 AppLnk::lastId++;
1151 f->mId = AppLnk::lastId; 1183 f->mId = AppLnk::lastId;
1152 mApps.append( f ); 1184 mApps.append( f );
1153 } else { 1185 } else {
1154 qWarning("Attempt to add an AppLnk twice"); 1186 qWarning("Attempt to add an AppLnk twice");
1155 } 1187 }
1156} 1188}
1157 1189
1158/*! 1190/*!
1159 Removes AppLnk \a f to the set. The caller becomes responsible for 1191 Removes AppLnk \a f to the set. The caller becomes responsible for
1160 deleting \a f. Returns TRUE if \a f was in the set; otherwise 1192 deleting \a f. Returns TRUE if \a f was in the set; otherwise
1161 returns FALSE. 1193 returns FALSE.
1162 1194
1163 \sa add() 1195 \sa add()
1164*/ 1196*/
1165bool AppLnkSet::remove( AppLnk *f ) 1197bool AppLnkSet::remove( AppLnk *f )
1166{ 1198{
1167 if ( mApps.remove( f ) ) { 1199 if ( mApps.remove( f ) ) {
1168 f->mId = 0; 1200 f->mId = 0;
1169 return TRUE; 1201 return TRUE;
1170 } 1202 }
1171 return FALSE; 1203 return FALSE;
1172} 1204}
1173 1205
1174 1206
1175/*! 1207/*!
1176 Returns the localized name for type \a t. 1208 Returns the localized name for type \a t.
1177 1209
1178 For applications, games and settings the type is \c Application; 1210 For applications, games and settings the type is \c Application;
1179 for documents the type is the document's MIME type. 1211 for documents the type is the document's MIME type.
1180*/ 1212*/
1181QString AppLnkSet::typeName( const QString& t ) const 1213QString AppLnkSet::typeName( const QString& t ) const
1182{ 1214{
1183 QString *st = d->typName.find(t); 1215 QString *st = d->typName.find(t);
1184 return st ? *st : QString::null; 1216 return st ? *st : QString::null;
1185} 1217}
1186 1218
1187/*! 1219/*!
1188 Returns the small pixmap associated with type \a t. 1220 Returns the small pixmap associated with type \a t.
1189 1221
1190 For applications, games and settings the type is \c Application; 1222 For applications, games and settings the type is \c Application;
1191 for documents the type is the document's MIME type. 1223 for documents the type is the document's MIME type.
1192*/ 1224*/
1193QPixmap AppLnkSet::typePixmap( const QString& t ) const 1225QPixmap AppLnkSet::typePixmap( const QString& t ) const
1194{ 1226{
1195 QPixmap *pm = d->typPix.find(t); 1227 AppLnkImagePrivate *alip = d->typPix.find(t);
1196 return pm ? *pm : QPixmap(); 1228 return alip ? *(alip->small()) : QPixmap();
1197} 1229}
1198 1230
1199/*! 1231/*!
1200 Returns the large pixmap associated with type \a t. 1232 Returns the large pixmap associated with type \a t.
1201 1233
1202 For applications, games and settings the type is \c Application; 1234 For applications, games and settings the type is \c Application;
1203 for documents the type is the document's MIME type. 1235 for documents the type is the document's MIME type.
1204*/ 1236*/
1205QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const 1237QPixmap AppLnkSet::typeBigPixmap( const QString& t ) const
1206{ 1238{
1207 QPixmap *pm = d->typPixBig.find(t); 1239 AppLnkImagePrivate *alip = d->typPix.find(t);
1208 return pm ? *pm : QPixmap(); 1240 return alip ? *(alip->big()) : QPixmap();
1209} 1241}
1210 1242
1211/*! 1243/*!
1212 Returns the AppLnk with the given \a id. 1244 Returns the AppLnk with the given \a id.
1213*/ 1245*/
1214const AppLnk *AppLnkSet::find( int id ) const 1246const AppLnk *AppLnkSet::find( int id ) const
1215{ 1247{
1216 QListIterator<AppLnk> it( children() ); 1248 QListIterator<AppLnk> it( children() );
1217 1249
1218 for ( ; it.current(); ++it ) { 1250 for ( ; it.current(); ++it ) {
1219 const AppLnk *app = it.current(); 1251 const AppLnk *app = it.current();
1220 if ( app->id() == id ) 1252 if ( app->id() == id )
1221 return app; 1253 return app;
1222 } 1254 }
1223 1255
1224 return 0; 1256 return 0;
1225} 1257}
1226 1258
1227/*! 1259/*!
1228 Returns the AppLnk with the given \a exec attribute. 1260 Returns the AppLnk with the given \a exec attribute.
1229*/ 1261*/
1230const AppLnk *AppLnkSet::findExec( const QString& exec ) const 1262const AppLnk *AppLnkSet::findExec( const QString& exec ) const
1231{ 1263{
1232 QListIterator<AppLnk> it( children() ); 1264 QListIterator<AppLnk> it( children() );
1233 1265
1234 for ( ; it.current(); ++it ) { 1266 for ( ; it.current(); ++it ) {
1235 const AppLnk *app = it.current(); 1267 const AppLnk *app = it.current();
1236 if ( app->exec() == exec ) 1268 if ( app->exec() == exec )
1237 return app; 1269 return app;
1238 } 1270 }
1239 1271
1240 return 0; 1272 return 0;
1241} 1273}
1242 1274
1243/*! 1275/*!
1244 \class DocLnkSet applnk.h 1276 \class DocLnkSet applnk.h
1245 \brief The DocLnkSet class is a set of DocLnk objects. 1277 \brief The DocLnkSet class is a set of DocLnk objects.
1246*/ 1278*/
1247 1279
1248/*! 1280/*!
1249 \fn const QList<DocLnk>& DocLnkSet::children() const 1281 \fn const QList<DocLnk>& DocLnkSet::children() const
1250 1282
1251 Returns the members of the set. 1283 Returns the members of the set.
1252*/ 1284*/
1253 1285
1254/*! 1286/*!
1255 Constructs an empty DocLnkSet. 1287 Constructs an empty DocLnkSet.
1256 1288
1257 \sa appendFrom() 1289 \sa appendFrom()
1258*/ 1290*/
1259DocLnkSet::DocLnkSet() 1291DocLnkSet::DocLnkSet()
1260{ 1292{
1261} 1293}
1262 1294
1263/*! 1295/*!
1264 Constructs a DocLnkSet that contains DocLnk objects representing all 1296 Constructs a DocLnkSet that contains DocLnk objects representing all
1265 the files in the \a directory (and any subdirectories, recursively). 1297 the files in the \a directory (and any subdirectories, recursively).
1266 1298
1267 If \a mimefilter is not null, 1299 If \a mimefilter is not null,
1268 only documents with a MIME type matching \a mimefilter are selected. 1300 only documents with a MIME type matching \a mimefilter are selected.
1269 The value may contain multiple wild-card patterns separated by ";", 1301 The value may contain multiple wild-card patterns separated by ";",
1270 such as \c{*o/mpeg;audio/x-wav}. 1302 such as \c{*o/mpeg;audio/x-wav}.
1271 1303
1272 See also \link applnk.html#files-and-links Files and Links\endlink. 1304 See also \link applnk.html#files-and-links Files and Links\endlink.
1273 1305
1274*/ 1306*/
1275DocLnkSet::DocLnkSet( const QString &directory, const QString& mimefilter ) : 1307DocLnkSet::DocLnkSet( const QString &directory, const QString& mimefilter ) :
1276 AppLnkSet() 1308 AppLnkSet()
1277{ 1309{
1278 QDir dir( directory ); 1310 QDir dir( directory );
1279 mFile = dir.dirName(); 1311 mFile = dir.dirName();
1280 QDict<void> reference(1021); 1312 QDict<void> reference(1021);
1281 1313
1282 QStringList subFilter = QStringList::split(";", mimefilter); 1314 QStringList subFilter = QStringList::split(";", mimefilter);
1283 QValueList<QRegExp> mimeFilters; 1315 QValueList<QRegExp> mimeFilters;
1284 for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++ it ) 1316 for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++ it )
1285 mimeFilters.append( QRegExp(*it, FALSE, TRUE) ); 1317 mimeFilters.append( QRegExp(*it, FALSE, TRUE) );
1286 1318
1287 findChildren(directory, mimeFilters, reference); 1319 findChildren(directory, mimeFilters, reference);
1288 1320
1289 const QList<DocLnk> &list = children(); 1321 const QList<DocLnk> &list = children();
1290 for ( QListIterator<DocLnk> it( list ); it.current(); ++it ) { 1322 for ( QListIterator<DocLnk> it( list ); it.current(); ++it ) {
1291 reference.remove( (*it)->file() ); 1323 reference.remove( (*it)->file() );
1292 } 1324 }
1293 for ( QDictIterator<void> dit(reference); dit.current(); ++dit ) { 1325 for ( QDictIterator<void> dit(reference); dit.current(); ++dit ) {
1294 if ( dit.current() == (void*)2 ) { 1326 if ( dit.current() == (void*)2 ) {
1295 // Unreferenced, make an unwritten link 1327 // Unreferenced, make an unwritten link
1296 DocLnk* dl = new DocLnk; 1328 DocLnk* dl = new DocLnk;
1297 QFileInfo fi( dit.currentKey() ); 1329 QFileInfo fi( dit.currentKey() );
1298 dl->setFile(fi.filePath()); 1330 dl->setFile(fi.filePath());
1299 dl->setName(fi.baseName()); 1331 dl->setName(fi.baseName());
1300 // #### default to current path? 1332 // #### default to current path?
1301 // dl->setCategories( ... ); 1333 // dl->setCategories( ... );
1302 bool match = mimefilter.isNull(); 1334 bool match = mimefilter.isNull();
1303 if ( !match ) 1335 if ( !match )
1304 for( QValueList<QRegExp>::Iterator it = mimeFilters.begin(); it != mimeFilters.end() && !match; ++ it ) 1336 for( QValueList<QRegExp>::Iterator it = mimeFilters.begin(); it != mimeFilters.end() && !match; ++ it )
1305 if ( (*it).match(dl->type()) >= 0 ) 1337 if ( (*it).match(dl->type()) >= 0 )
1306 match = TRUE; 1338 match = TRUE;
1307 if ( match /* && dl->type() != "application/octet-stream" */ 1339 if ( match /* && dl->type() != "application/octet-stream" */
1308 && !!dl->exec() ) 1340 && !!dl->exec() )
1309 add(dl); 1341 add(dl);
1310 else 1342 else
1311 delete dl; 1343 delete dl;
1312 } 1344 }
1313 } 1345 }
1314} 1346}
1315 1347
1316// other becomes empty 1348// other becomes empty
1317/*! 1349/*!
1318 Transfers all DocLnk objects from \a other to this set. \a other becomes 1350 Transfers all DocLnk objects from \a other to this set. \a other becomes
1319 empty. 1351 empty.
1320*/ 1352*/
1321void DocLnkSet::appendFrom( DocLnkSet& other ) 1353void DocLnkSet::appendFrom( DocLnkSet& other )
1322{ 1354{
1323 if ( &other == this ) 1355 if ( &other == this )
1324 return; 1356 return;
1325 QListIterator<AppLnk> it( other.mApps ); 1357 QListIterator<AppLnk> it( other.mApps );
1326 for ( ; it.current(); ) { 1358 for ( ; it.current(); ) {
1327 mApps.append(*it); 1359 mApps.append(*it);
1328 ++it; 1360 ++it;
1329 } 1361 }
1330 other.mApps.clear(); 1362 other.mApps.clear();
1331} 1363}
1332 1364
1333void DocLnkSet::findChildren(const QString &dr, const QValueList<QRegExp> &mimeFilters, QDict<void> &reference, int depth) 1365void DocLnkSet::findChildren(const QString &dr, const QValueList<QRegExp> &mimeFilters, QDict<void> &reference, int depth)
1334{ 1366{
1335 depth++; 1367 depth++;
1336 if ( depth > 10 ) 1368 if ( depth > 10 )
diff --git a/library/resource.cpp b/library/resource.cpp
index cfa0d26..b31876f 100644
--- a/library/resource.cpp
+++ b/library/resource.cpp
@@ -1,230 +1,235 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_MIMEEXT 21#define QTOPIA_INTERNAL_MIMEEXT
22#include <qpe/qpeapplication.h> 22#include <qpe/qpeapplication.h>
23#include "resource.h" 23#include "resource.h"
24#include "mimetype.h" 24#include "mimetype.h"
25#include <qdir.h> 25#include <qdir.h>
26#include <qpixmapcache.h> 26#include <qpixmapcache.h>
27 27
28// this namespace is just a workaround for a gcc bug 28// this namespace is just a workaround for a gcc bug
29// gcc exports inline functions in the generated file 29// gcc exports inline functions in the generated file
30// inlinepics_p.h 30// inlinepics_p.h
31 31
32namespace { 32namespace {
33#include "inlinepics_p.h" 33#include "inlinepics_p.h"
34} 34}
35 35
36static bool g_notUseSet = ::getenv("OVERWRITE_ICON_SET"); 36static bool g_notUseSet = ::getenv("OVERWRITE_ICON_SET");
37 37
38/*! 38/*!
39 \class Resource resource.h 39 \class Resource resource.h
40 \brief The Resource class provides access to named resources. 40 \brief The Resource class provides access to named resources.
41 41
42 The resources may be provided from files or other sources. 42 The resources may be provided from files or other sources.
43 43
44 The allSounds() function returns a list of all the sounds available. 44 The allSounds() function returns a list of all the sounds available.
45 A particular sound can be searched for using findSound(). 45 A particular sound can be searched for using findSound().
46 46
47 Images can be loaded with loadImage(), loadPixmap(), loadBitmap() 47 Images can be loaded with loadImage(), loadPixmap(), loadBitmap()
48 and loadIconSet(). 48 and loadIconSet().
49 49
50 \ingroup qtopiaemb 50 \ingroup qtopiaemb
51*/ 51*/
52 52
53/*! 53/*!
54 \fn Resource::Resource() 54 \fn Resource::Resource()
55 \internal 55 \internal
56*/ 56*/
57 57
58/*! 58/*!
59 Returns the QPixmap called \a pix. You should avoid including 59 Returns the QPixmap called \a pix. You should avoid including
60 any filename type extension (e.g. .png, .xpm). 60 any filename type extension (e.g. .png, .xpm).
61*/ 61*/
62#include <stdio.h>
62QPixmap Resource::loadPixmap( const QString &pix ) 63QPixmap Resource::loadPixmap( const QString &pix )
63{ 64{
64 QPixmap pm; 65 QPixmap pm; // null pixmap
65 QString key="QPE_"+pix; 66 QString key="QPE_"+pix;
66 if ( !QPixmapCache::find(key,pm) ) { 67 if ( !QPixmapCache::find(key,pm) ) {
67 pm.convertFromImage(loadImage(pix)); 68 QImage I = loadImage(pix);
68 QPixmapCache::insert(key,pm); 69 if( I.isNull() ) {
70 qWarning( "Could not load %s", pix.latin1() );
71 } else {
72 pm.convertFromImage(I);
73 QPixmapCache::insert(key,pm);
74 }
69 } 75 }
70 return pm; 76 return pm;
71} 77}
72 78
73/*! 79/*!
74 Returns the QBitmap called \a pix. You should avoid including 80 Returns the QBitmap called \a pix. You should avoid including
75 any filename type extension (e.g. .png, .xpm). 81 any filename type extension (e.g. .png, .xpm).
76*/ 82*/
77QBitmap Resource::loadBitmap( const QString &pix ) 83QBitmap Resource::loadBitmap( const QString &pix )
78{ 84{
79 QBitmap bm; 85 QBitmap bm;
80 bm = loadPixmap(pix); 86 bm = loadPixmap(pix);
81 return bm; 87 return bm;
82} 88}
83 89
84/*! 90/*!
85 Returns the filename of a pixmap called \a pix. You should avoid including 91 Returns the filename of a pixmap called \a pix. You should avoid including
86 any filename type extension (e.g. .png, .xpm). 92 any filename type extension (e.g. .png, .xpm).
87 93
88 Normally you will use loadPixmap() rather than this function. 94 Normally you will use loadPixmap() rather than this function.
89*/ 95*/
90QString Resource::findPixmap( const QString &pix ) 96QString Resource::findPixmap( const QString &pix )
91{ 97{
92 QString picsPath = QPEApplication::qpeDir() + "pics/"; 98 QString picsPath = QPEApplication::qpeDir() + "pics/";
93 99
94 QString f; 100 QString f;
95 101
96 // Common case optimizations... 102 // Common case optimizations...
97 f = picsPath + pix + ".png"; 103 f = picsPath + pix + ".png";
98 if ( QFile( f ).exists() ) 104 if ( QFile( f ).exists() )
99 return f; 105 return f;
100 f = picsPath + pix + ".xpm"; 106 f = picsPath + pix + ".xpm";
101 if ( QFile( f ).exists() ) 107 if ( QFile( f ).exists() )
102 return f; 108 return f;
103 109
104
105 // All formats... 110 // All formats...
106 QStrList fileFormats = QImageIO::inputFormats(); 111 QStrList fileFormats = QImageIO::inputFormats();
107 QString ff = fileFormats.first(); 112 QString ff = fileFormats.first();
108 while ( fileFormats.current() ) { 113 while ( fileFormats.current() ) {
109 QStringList exts = MimeType("image/"+ff.lower()).extensions(); 114 QStringList exts = MimeType("image/"+ff.lower()).extensions();
110 for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) { 115 for ( QStringList::ConstIterator it = exts.begin(); it!=exts.end(); ++it ) {
111 QString f = picsPath + pix + "." + *it; 116 QString f = picsPath + pix + "." + *it;
112 if ( QFile(f).exists() ) 117 if ( QFile(f).exists() )
113 return f; 118 return f;
114 } 119 }
115 ff = fileFormats.next(); 120 ff = fileFormats.next();
116 } 121 }
117 122
118 // Finally, no (or existing) extension... 123 // Finally, no (or existing) extension...
119 if ( QFile( picsPath + pix ).exists() ) 124 if ( QFile( picsPath + pix ).exists() )
120 return picsPath + pix; 125 return picsPath + pix;
121 126
122 //qDebug("Cannot find pixmap: %s", pix.latin1()); 127 //qDebug("Cannot find pixmap: %s", pix.latin1());
123 return QString(); 128 return QString();
124} 129}
125 130
126/*! 131/*!
127 Returns a sound file for a sound called \a name. 132 Returns a sound file for a sound called \a name.
128 133
129 You should avoid including any filename type extension (e.g. .wav), 134 You should avoid including any filename type extension (e.g. .wav),
130 as the system will search for only those fileformats which are supported 135 as the system will search for only those fileformats which are supported
131 by the library. 136 by the library.
132 137
133 Currently, only WAV files are supported. 138 Currently, only WAV files are supported.
134*/ 139*/
135QString Resource::findSound( const QString &name ) 140QString Resource::findSound( const QString &name )
136{ 141{
137 QString picsPath = QPEApplication::qpeDir() + "sounds/"; 142 QString picsPath = QPEApplication::qpeDir() + "sounds/";
138 143
139 QString result; 144 QString result;
140 if ( QFile( (result = picsPath + name + ".wav") ).exists() ) 145 if ( QFile( (result = picsPath + name + ".wav") ).exists() )
141 return result; 146 return result;
142 147
143 return QString(); 148 return QString();
144} 149}
145 150
146/*! 151/*!
147 Returns a list of all sound names. 152 Returns a list of all sound names.
148*/ 153*/
149QStringList Resource::allSounds() 154QStringList Resource::allSounds()
150{ 155{
151 QDir resourcedir( QPEApplication::qpeDir() + "sounds/", "*.wav" ); 156 QDir resourcedir( QPEApplication::qpeDir() + "sounds/", "*.wav" );
152 QStringList entries = resourcedir.entryList(); 157 QStringList entries = resourcedir.entryList();
153 QStringList result; 158 QStringList result;
154 for (QStringList::Iterator i=entries.begin(); i != entries.end(); ++i) 159 for (QStringList::Iterator i=entries.begin(); i != entries.end(); ++i)
155 result.append((*i).replace(QRegExp("\\.wav"),"")); 160 result.append((*i).replace(QRegExp("\\.wav"),""));
156 return result; 161 return result;
157} 162}
158 163
159static QImage load_image(const QString &name) 164static QImage load_image(const QString &name)
160{ 165{
161 if (g_notUseSet ) { 166 if (g_notUseSet ) {
162 // try file 167 // try file
163 QImage img; 168 QImage img;
164 QString f = Resource::findPixmap(name); 169 QString f = Resource::findPixmap(name);
165 if ( !f.isEmpty() ) 170 if ( !f.isEmpty() )
166 img.load(f); 171 img.load(f);
167 if (img.isNull() ) 172 if (img.isNull() )
168 img = qembed_findImage(name.latin1() ); 173 img = qembed_findImage(name.latin1() );
169 return img; 174 return img;
170 } 175 }
171 else{ 176 else{
172 QImage img = qembed_findImage(name.latin1()); 177 QImage img = qembed_findImage(name.latin1());
173 178
174 if ( img.isNull() ) { 179 if ( img.isNull() ) {
175 // No inlined image, try file 180 // No inlined image, try file
176 QString f = Resource::findPixmap(name); 181 QString f = Resource::findPixmap(name);
177 if ( !f.isEmpty() ) 182 if ( !f.isEmpty() )
178 img.load(f); 183 img.load(f);
179 } 184 }
180 return img; 185 return img;
181 } 186 }
182} 187}
183 188
184/*! 189/*!
185 Returns the QImage called \a name. You should avoid including 190 Returns the QImage called \a name. You should avoid including
186 any filename type extension (e.g. .png, .xpm). 191 any filename type extension (e.g. .png, .xpm).
187*/ 192*/
188QImage Resource::loadImage( const QString &name) 193QImage Resource::loadImage( const QString &name)
189{ 194{
190 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps 195 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps
191 static QImage last_enabled; 196 static QImage last_enabled;
192 static QString last_enabled_name; 197 static QString last_enabled_name;
193 if ( name == last_enabled_name ) 198 if ( name == last_enabled_name )
194 return last_enabled; 199 return last_enabled;
195#endif 200#endif
196 QImage img = load_image(name); 201 QImage img = load_image(name);
197 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps 202 #ifndef QT_NO_DEPTH_32// have alpha-blended pixmaps
198 if ( img.isNull() ) { 203 if ( img.isNull() ) {
199 // No file, try generating 204 // No file, try generating
200 if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) { 205 if ( name[name.length()-1]=='d' && name.right(9)=="_disabled" ) {
201 last_enabled_name = name.left(name.length()-9); 206 last_enabled_name = name.left(name.length()-9);
202 last_enabled = load_image(last_enabled_name); 207 last_enabled = load_image(last_enabled_name);
203 if ( last_enabled.isNull() ) { 208 if ( last_enabled.isNull() ) {
204 last_enabled_name = QString::null; 209 last_enabled_name = QString::null;
205 } else { 210 } else {
206 img.detach(); 211 img.detach();
207 img.create( last_enabled.width(), last_enabled.height(), 32 ); 212 img.create( last_enabled.width(), last_enabled.height(), 32 );
208 for ( int y = 0; y < img.height(); y++ ) { 213 for ( int y = 0; y < img.height(); y++ ) {
209 for ( int x = 0; x < img.width(); x++ ) { 214 for ( int x = 0; x < img.width(); x++ ) {
210 QRgb p = last_enabled.pixel( x, y ); 215 QRgb p = last_enabled.pixel( x, y );
211 int a = qAlpha(p)/3; 216 int a = qAlpha(p)/3;
212 int g = qGray(qRed(p),qGreen(p),qBlue(p)); 217 int g = qGray(qRed(p),qGreen(p),qBlue(p));
213 img.setPixel( x, y, qRgba(g,g,g,a) ); 218 img.setPixel( x, y, qRgba(g,g,g,a) );
214 } 219 }
215 } 220 }
216 img.setAlphaBuffer( TRUE ); 221 img.setAlphaBuffer( TRUE );
217 } 222 }
218 } 223 }
219 } 224 }
220#endif 225#endif
221 return img; 226 return img;
222} 227}
223 228
224/*! 229/*!
225 \fn QIconSet Resource::loadIconSet( const QString &name ) 230 \fn QIconSet Resource::loadIconSet( const QString &name )
226 231
227 Returns a QIconSet for the pixmap named \a name. A disabled icon is 232 Returns a QIconSet for the pixmap named \a name. A disabled icon is
228 generated that conforms to the Qtopia look & feel. You should avoid 233 generated that conforms to the Qtopia look & feel. You should avoid
229 including any filename type extension (eg. .png, .xpm). 234 including any filename type extension (eg. .png, .xpm).
230*/ 235*/