summaryrefslogtreecommitdiff
authorsandman <sandman>2003-03-21 21:11:15 (UTC)
committer sandman <sandman>2003-03-21 21:11:15 (UTC)
commit299ab81f6b0bdc542311b1544fc84e1debd97a1f (patch) (unidiff)
tree288a85eb4fc70a8297ee0e58a3d49bc70ea83655
parent2afcd6fa6b581f5ec7b3e65fe312ceadebb37ee7 (diff)
downloadopie-299ab81f6b0bdc542311b1544fc84e1debd97a1f.zip
opie-299ab81f6b0bdc542311b1544fc84e1debd97a1f.tar.gz
opie-299ab81f6b0bdc542311b1544fc84e1debd97a1f.tar.bz2
fix for bug #599:
O-Menu does not detect newly added programs until Opie restart
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/launcher.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/core/launcher/launcher.cpp b/core/launcher/launcher.cpp
index 6764338..fc944e1 100644
--- a/core/launcher/launcher.cpp
+++ b/core/launcher/launcher.cpp
@@ -1,1260 +1,1270 @@
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// WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT 21// WARNING: Do *NOT* define this yourself. The SL5xxx from SHARP does NOT
22// have this class. 22// have this class.
23#define QTOPIA_INTERNAL_FSLP 23#define QTOPIA_INTERNAL_FSLP
24 24
25#include <qpe/qcopenvelope_qws.h> 25#include <qpe/qcopenvelope_qws.h>
26#include <qpe/resource.h> 26#include <qpe/resource.h>
27#include <qpe/applnk.h> 27#include <qpe/applnk.h>
28#include <qpe/config.h> 28#include <qpe/config.h>
29#include <qpe/global.h> 29#include <qpe/global.h>
30#include <qpe/qpeapplication.h> 30#include <qpe/qpeapplication.h>
31#include <qpe/mimetype.h> 31#include <qpe/mimetype.h>
32#include <qpe/storage.h> 32#include <qpe/storage.h>
33#include <qpe/palmtoprecord.h> 33#include <qpe/palmtoprecord.h>
34 34
35#include <qpe/version.h> 35#include <qpe/version.h>
36 36
37#include <qdir.h> 37#include <qdir.h>
38#ifdef QWS 38#ifdef QWS
39#include <qwindowsystem_qws.h> 39#include <qwindowsystem_qws.h>
40#endif 40#endif
41#include <qtimer.h> 41#include <qtimer.h>
42#include <qcombobox.h> 42#include <qcombobox.h>
43#include <qvbox.h> 43#include <qvbox.h>
44#include <qlayout.h> 44#include <qlayout.h>
45#include <qstyle.h> 45#include <qstyle.h>
46#include <qpushbutton.h> 46#include <qpushbutton.h>
47#include <qtabbar.h> 47#include <qtabbar.h>
48#include <qwidgetstack.h> 48#include <qwidgetstack.h>
49#include <qlayout.h> 49#include <qlayout.h>
50#include <qregexp.h> 50#include <qregexp.h>
51#include <qmessagebox.h> 51#include <qmessagebox.h>
52#include <qframe.h> 52#include <qframe.h>
53#include <qpainter.h> 53#include <qpainter.h>
54#include <qlabel.h> 54#include <qlabel.h>
55#include <qtextstream.h> 55#include <qtextstream.h>
56#include <qpopupmenu.h> 56#include <qpopupmenu.h>
57 57
58#include "launcherview.h" 58#include "launcherview.h"
59#include "launcher.h" 59#include "launcher.h"
60#include "syncdialog.h" 60#include "syncdialog.h"
61#include "desktop.h" 61#include "desktop.h"
62#include <qpe/lnkproperties.h> 62#include <qpe/lnkproperties.h>
63//#include "mrulist.h" 63//#include "mrulist.h"
64#include "qrsync.h" 64#include "qrsync.h"
65#include <stdlib.h> 65#include <stdlib.h>
66#include <unistd.h> 66#include <unistd.h>
67 67
68#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) 68#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
69#include <stdio.h> 69#include <stdio.h>
70#include <sys/vfs.h> 70#include <sys/vfs.h>
71#include <mntent.h> 71#include <mntent.h>
72#endif 72#endif
73 73
74#include <qpe/storage.h> 74#include <qpe/storage.h>
75#include "mediummountgui.h" 75#include "mediummountgui.h"
76 76
77namespace { 77namespace {
78 QStringList configToMime( Config *cfg ){ 78 QStringList configToMime( Config *cfg ){
79 QStringList mimes; 79 QStringList mimes;
80 bool tmpMime = true; 80 bool tmpMime = true;
81 cfg->setGroup("mimetypes" ); 81 cfg->setGroup("mimetypes" );
82 tmpMime = cfg->readBoolEntry("all" ,true); 82 tmpMime = cfg->readBoolEntry("all" ,true);
83 if( tmpMime ){ 83 if( tmpMime ){
84 mimes << QString::null; 84 mimes << QString::null;
85 return mimes; 85 return mimes;
86 }else{ 86 }else{
87 tmpMime = cfg->readBoolEntry("audio", true ); 87 tmpMime = cfg->readBoolEntry("audio", true );
88 if(tmpMime ) 88 if(tmpMime )
89 mimes.append("audio/*" ); 89 mimes.append("audio/*" );
90 90
91 tmpMime = cfg->readBoolEntry("image", true ); 91 tmpMime = cfg->readBoolEntry("image", true );
92 if(tmpMime ) 92 if(tmpMime )
93 mimes.append("image/*" ); 93 mimes.append("image/*" );
94 94
95 tmpMime = cfg->readBoolEntry("text", true ); 95 tmpMime = cfg->readBoolEntry("text", true );
96 if(tmpMime ) 96 if(tmpMime )
97 mimes.append("text/*"); 97 mimes.append("text/*");
98 98
99 tmpMime = cfg->readBoolEntry("video", true ); 99 tmpMime = cfg->readBoolEntry("video", true );
100 if(tmpMime ) 100 if(tmpMime )
101 mimes.append("video/*" ); 101 mimes.append("video/*" );
102 } 102 }
103 return mimes; 103 return mimes;
104 } 104 }
105 105
106} 106}
107 107
108 108
109 109
110//#define SHOW_ALL 110//#define SHOW_ALL
111 111
112class CategoryTab : public QTab 112class CategoryTab : public QTab
113{ 113{
114public: 114public:
115 CategoryTab( const QIconSet &icon, const QString &text=QString::null ) 115 CategoryTab( const QIconSet &icon, const QString &text=QString::null )
116 : QTab( icon, text ) 116 : QTab( icon, text )
117 { 117 {
118 } 118 }
119 119
120 QColor bgColor; 120 QColor bgColor;
121 QColor fgColor; 121 QColor fgColor;
122}; 122};
123 123
124//=========================================================================== 124//===========================================================================
125 125
126CategoryTabWidget::CategoryTabWidget( QWidget* parent ) : 126CategoryTabWidget::CategoryTabWidget( QWidget* parent ) :
127 QVBox( parent ) 127 QVBox( parent )
128{ 128{
129 categoryBar = 0; 129 categoryBar = 0;
130 stack = 0; 130 stack = 0;
131} 131}
132 132
133void CategoryTabWidget::prevTab() 133void CategoryTabWidget::prevTab()
134{ 134{
135 if ( categoryBar ) { 135 if ( categoryBar ) {
136 int n = categoryBar->count(); 136 int n = categoryBar->count();
137 int tab = categoryBar->currentTab(); 137 int tab = categoryBar->currentTab();
138 if ( tab >= 0 ) 138 if ( tab >= 0 )
139 categoryBar->setCurrentTab( (tab - 1 + n)%n ); 139 categoryBar->setCurrentTab( (tab - 1 + n)%n );
140 } 140 }
141} 141}
142 142
143void CategoryTabWidget::nextTab() 143void CategoryTabWidget::nextTab()
144{ 144{
145 if ( categoryBar ) { 145 if ( categoryBar ) {
146 int n = categoryBar->count(); 146 int n = categoryBar->count();
147 int tab = categoryBar->currentTab(); 147 int tab = categoryBar->currentTab();
148 categoryBar->setCurrentTab( (tab + 1)%n ); 148 categoryBar->setCurrentTab( (tab + 1)%n );
149 } 149 }
150} 150}
151 151
152void CategoryTabWidget::addItem( const QString& linkfile ) 152void CategoryTabWidget::addItem( const QString& linkfile )
153{ 153{
154 int i=0; 154 int i=0;
155 AppLnk *app = new AppLnk(linkfile); 155 AppLnk *app = new AppLnk(linkfile);
156 if ( !app->isValid() ) { 156 if ( !app->isValid() ) {
157 delete app; 157 delete app;
158 app=0; 158 app=0;
159 } 159 }
160 if ( !app || !app->file().isEmpty() ) { 160 if ( !app || !app->file().isEmpty() ) {
161 // A document 161 // A document
162 delete app; 162 delete app;
163 app = new DocLnk(linkfile); 163 app = new DocLnk(linkfile);
164 if ( app->fileKnown() ) { 164 if ( app->fileKnown() ) {
165 ((LauncherView*)(stack->widget(ids.count()-1)))->addItem(app); 165 ((LauncherView*)(stack->widget(ids.count()-1)))->addItem(app);
166 } else { 166 } else {
167 ((LauncherView*)(stack->widget(ids.count()-1)))->sort(); 167 ((LauncherView*)(stack->widget(ids.count()-1)))->sort();
168 delete app; 168 delete app;
169 } 169 }
170 return; 170 return;
171 } 171 }
172 // An application 172 // An application
173 for ( QStringList::Iterator it=ids.begin(); it!=ids.end(); ++it) { 173 for ( QStringList::Iterator it=ids.begin(); it!=ids.end(); ++it) {
174 if ( !(*it).isEmpty() ) { 174 if ( !(*it).isEmpty() ) {
175 QRegExp tf(*it,FALSE,TRUE); 175 QRegExp tf(*it,FALSE,TRUE);
176 if ( tf.match(app->type()) >= 0 ) { 176 if ( tf.match(app->type()) >= 0 ) {
177 ((LauncherView*)stack->widget(i))->addItem(app); 177 ((LauncherView*)stack->widget(i))->addItem(app);
178 return; 178 return;
179 } 179 }
180 i++; 180 i++;
181 } 181 }
182 } 182 }
183 183
184 QCopEnvelope e("QPE/TaskBar","reloadApps()"); 184 QCopEnvelope e("QPE/TaskBar","reloadApps()");
185} 185}
186 186
187void CategoryTabWidget::initializeCategories(AppLnkSet* rootFolder, 187void CategoryTabWidget::initializeCategories(AppLnkSet* rootFolder,
188 AppLnkSet* docFolder, const QList<FileSystem> &fs) 188 AppLnkSet* docFolder, const QList<FileSystem> &fs)
189{ 189{
190 delete categoryBar; 190 delete categoryBar;
191 categoryBar = new CategoryTabBar( this ); 191 categoryBar = new CategoryTabBar( this );
192 QPalette pal = categoryBar->palette(); 192 QPalette pal = categoryBar->palette();
193 pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) ); 193 pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) );
194 pal.setColor( QColorGroup::Background, pal.active().background().light(110) ); 194 pal.setColor( QColorGroup::Background, pal.active().background().light(110) );
195 categoryBar->setPalette( pal ); 195 categoryBar->setPalette( pal );
196 196
197 delete stack; 197 delete stack;
198 stack = new QWidgetStack(this); 198 stack = new QWidgetStack(this);
199 tabs=0; 199 tabs=0;
200 200
201 ids.clear(); 201 ids.clear();
202 202
203 Config cfg("Launcher"); 203 Config cfg("Launcher");
204 204
205 QStringList types = rootFolder->types(); 205 QStringList types = rootFolder->types();
206 for ( QStringList::Iterator it=types.begin(); it!=types.end(); ++it) { 206 for ( QStringList::Iterator it=types.begin(); it!=types.end(); ++it) {
207 if ( !(*it).isEmpty() ) { 207 if ( !(*it).isEmpty() ) {
208 (void)newView(*it,rootFolder->typePixmap(*it),rootFolder->typeName(*it)); 208 (void)newView(*it,rootFolder->typePixmap(*it),rootFolder->typeName(*it));
209 setTabAppearance( *it, cfg ); 209 setTabAppearance( *it, cfg );
210 } 210 }
211 } 211 }
212 QListIterator<AppLnk> it( rootFolder->children() ); 212 QListIterator<AppLnk> it( rootFolder->children() );
213 AppLnk* l; 213 AppLnk* l;
214 while ( (l=it.current()) ) { 214 while ( (l=it.current()) ) {
215 if ( l->type() == "Separator" ) { // No tr 215 if ( l->type() == "Separator" ) { // No tr
216 rootFolder->remove(l); 216 rootFolder->remove(l);
217 delete l; 217 delete l;
218 } else { 218 } else {
219 int i=0; 219 int i=0;
220 for ( QStringList::Iterator it=types.begin(); it!=types.end(); ++it) { 220 for ( QStringList::Iterator it=types.begin(); it!=types.end(); ++it) {
221 if ( *it == l->type() ) 221 if ( *it == l->type() )
222 ((LauncherView*)stack->widget(i))->addItem(l,FALSE); 222 ((LauncherView*)stack->widget(i))->addItem(l,FALSE);
223 i++; 223 i++;
224 } 224 }
225 } 225 }
226 ++it; 226 ++it;
227 } 227 }
228 rootFolder->detachChildren(); 228 rootFolder->detachChildren();
229 for (int i=0; i<tabs; i++) 229 for (int i=0; i<tabs; i++)
230 ((LauncherView*)stack->widget(i))->sort(); 230 ((LauncherView*)stack->widget(i))->sort();
231 231
232 // all documents 232 // all documents
233 QImage img( Resource::loadImage( "DocsIcon" ) ); 233 QImage img( Resource::loadImage( "DocsIcon" ) );
234 QPixmap pm; 234 QPixmap pm;
235 pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ); 235 pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() );
236 docview = newView( "Documents", // No tr 236 docview = newView( "Documents", // No tr
237 pm, tr("Documents")); 237 pm, tr("Documents"));
238 docview->populate( docFolder, QString::null ); 238 docview->populate( docFolder, QString::null );
239 docFolder->detachChildren(); 239 docFolder->detachChildren();
240 docview->setFileSystems(fs); 240 docview->setFileSystems(fs);
241 docview->setToolsEnabled(TRUE); 241 docview->setToolsEnabled(TRUE);
242 setTabAppearance( "Documents", cfg ); // No tr 242 setTabAppearance( "Documents", cfg ); // No tr
243 243
244 connect( categoryBar, SIGNAL(selected(int)), stack, SLOT(raiseWidget(int)) ); 244 connect( categoryBar, SIGNAL(selected(int)), stack, SLOT(raiseWidget(int)) );
245 245
246 ((LauncherView*)stack->widget(0))->setFocus(); 246 ((LauncherView*)stack->widget(0))->setFocus();
247 247
248 cfg. setGroup ( "GUI" ); 248 cfg. setGroup ( "GUI" );
249 setBusyIndicatorType ( cfg. readEntry ( "BusyType", QString::null )); 249 setBusyIndicatorType ( cfg. readEntry ( "BusyType", QString::null ));
250 250
251 categoryBar->show(); 251 categoryBar->show();
252 stack->show(); 252 stack->show();
253} 253}
254 254
255void CategoryTabWidget::setTabAppearance( const QString &id, Config &cfg ) 255void CategoryTabWidget::setTabAppearance( const QString &id, Config &cfg )
256{ 256{
257 QString grp( "Tab %1" ); // No tr 257 QString grp( "Tab %1" ); // No tr
258 cfg.setGroup( grp.arg(id) ); 258 cfg.setGroup( grp.arg(id) );
259 LauncherView *v = view( id ); 259 LauncherView *v = view( id );
260 int idx = ids.findIndex( id ); 260 int idx = ids.findIndex( id );
261 CategoryTab *tab = (CategoryTab *)categoryBar->tab( idx ); 261 CategoryTab *tab = (CategoryTab *)categoryBar->tab( idx );
262 262
263 // View 263 // View
264 QString view = cfg.readEntry( "View", "Icon" ); 264 QString view = cfg.readEntry( "View", "Icon" );
265 if ( view == "List" ) // No tr 265 if ( view == "List" ) // No tr
266 v->setViewMode( LauncherView::List ); 266 v->setViewMode( LauncherView::List );
267 QString bgType = cfg.readEntry( "BackgroundType", "Image" ); 267 QString bgType = cfg.readEntry( "BackgroundType", "Image" );
268 if ( bgType == "Image" ) { // No tr 268 if ( bgType == "Image" ) { // No tr
269 QString pm = cfg.readEntry( "BackgroundImage", "launcher/opie-background" ); 269 QString pm = cfg.readEntry( "BackgroundImage", "launcher/opie-background" );
270 v->setBackgroundType( LauncherView::Image, pm ); 270 v->setBackgroundType( LauncherView::Image, pm );
271 } else if ( bgType == "SolidColor" ) { 271 } else if ( bgType == "SolidColor" ) {
272 QString c = cfg.readEntry( "BackgroundColor" ); 272 QString c = cfg.readEntry( "BackgroundColor" );
273 v->setBackgroundType( LauncherView::SolidColor, c ); 273 v->setBackgroundType( LauncherView::SolidColor, c );
274 } 274 }
275 QString textCol = cfg.readEntry( "TextColor" ); 275 QString textCol = cfg.readEntry( "TextColor" );
276 if ( textCol.isEmpty() ) 276 if ( textCol.isEmpty() )
277 v->setTextColor( QColor() ); 277 v->setTextColor( QColor() );
278 else 278 else
279 v->setTextColor( QColor(textCol) ); 279 v->setTextColor( QColor(textCol) );
280 QStringList font = cfg.readListEntry( "Font", ',' ); 280 QStringList font = cfg.readListEntry( "Font", ',' );
281 if ( font.count() == 4 ) 281 if ( font.count() == 4 )
282 v->setViewFont( QFont(font[0], font[1].toInt(), font[2].toInt(), font[3].toInt()!=0) ); 282 v->setViewFont( QFont(font[0], font[1].toInt(), font[2].toInt(), font[3].toInt()!=0) );
283 283
284 // Tabs 284 // Tabs
285 QString tabCol = cfg.readEntry( "TabColor" ); 285 QString tabCol = cfg.readEntry( "TabColor" );
286 if ( tabCol.isEmpty() ) 286 if ( tabCol.isEmpty() )
287 tab->bgColor = QColor(); 287 tab->bgColor = QColor();
288 else 288 else
289 tab->bgColor = QColor(tabCol); 289 tab->bgColor = QColor(tabCol);
290 QString tabTextCol = cfg.readEntry( "TabTextColor" ); 290 QString tabTextCol = cfg.readEntry( "TabTextColor" );
291 if ( tabTextCol.isEmpty() ) 291 if ( tabTextCol.isEmpty() )
292 tab->fgColor = QColor(); 292 tab->fgColor = QColor();
293 else 293 else
294 tab->fgColor = QColor(tabTextCol); 294 tab->fgColor = QColor(tabTextCol);
295} 295}
296 296
297void CategoryTabWidget::updateDocs(AppLnkSet* docFolder, const QList<FileSystem> &fs) 297void CategoryTabWidget::updateDocs(AppLnkSet* docFolder, const QList<FileSystem> &fs)
298{ 298{
299 docview->populate( docFolder, QString::null ); 299 docview->populate( docFolder, QString::null );
300 docFolder->detachChildren(); 300 docFolder->detachChildren();
301 docview->setFileSystems(fs); 301 docview->setFileSystems(fs);
302 docview->updateTools(); 302 docview->updateTools();
303} 303}
304 304
305void CategoryTabWidget::tabProperties() 305void CategoryTabWidget::tabProperties()
306{ 306{
307 LauncherView *view = (LauncherView*)stack->widget( categoryBar->currentTab() ); 307 LauncherView *view = (LauncherView*)stack->widget( categoryBar->currentTab() );
308 QPopupMenu *m = new QPopupMenu( this ); 308 QPopupMenu *m = new QPopupMenu( this );
309 m->insertItem( tr("Icon View"), LauncherView::Icon ); 309 m->insertItem( tr("Icon View"), LauncherView::Icon );
310 m->insertItem( tr("List View"), LauncherView::List ); 310 m->insertItem( tr("List View"), LauncherView::List );
311 m->setItemChecked( (int)view->viewMode(), TRUE ); 311 m->setItemChecked( (int)view->viewMode(), TRUE );
312 int rv = m->exec( QCursor::pos() ); 312 int rv = m->exec( QCursor::pos() );
313 if ( rv >= 0 && rv != view->viewMode() ) { 313 if ( rv >= 0 && rv != view->viewMode() ) {
314 view->setViewMode( (LauncherView::ViewMode)rv ); 314 view->setViewMode( (LauncherView::ViewMode)rv );
315 } 315 }
316 316
317 delete m; 317 delete m;
318} 318}
319 319
320QString CategoryTabWidget::getAllDocLinkInfo() const 320QString CategoryTabWidget::getAllDocLinkInfo() const
321{ 321{
322 return docview->getAllDocLinkInfo(); 322 return docview->getAllDocLinkInfo();
323} 323}
324 324
325LauncherView* CategoryTabWidget::newView( const QString& id, const QPixmap& pm, const QString& label ) 325LauncherView* CategoryTabWidget::newView( const QString& id, const QPixmap& pm, const QString& label )
326{ 326{
327 LauncherView* view = new LauncherView( stack ); 327 LauncherView* view = new LauncherView( stack );
328 connect( view, SIGNAL(clicked(const AppLnk*)), 328 connect( view, SIGNAL(clicked(const AppLnk*)),
329 this, SIGNAL(clicked(const AppLnk*))); 329 this, SIGNAL(clicked(const AppLnk*)));
330 connect( view, SIGNAL(rightPressed(AppLnk*)), 330 connect( view, SIGNAL(rightPressed(AppLnk*)),
331 this, SIGNAL(rightPressed(AppLnk*))); 331 this, SIGNAL(rightPressed(AppLnk*)));
332 ids.append(id); 332 ids.append(id);
333 categoryBar->addTab( new CategoryTab( pm, label ) ); 333 categoryBar->addTab( new CategoryTab( pm, label ) );
334 stack->addWidget( view, tabs++ ); 334 stack->addWidget( view, tabs++ );
335 return view; 335 return view;
336} 336}
337 337
338void CategoryTabWidget::updateLink(const QString& linkfile) 338void CategoryTabWidget::updateLink(const QString& linkfile)
339{ 339{
340 int i=0; 340 int i=0;
341 LauncherView* view; 341 LauncherView* view;
342 while ((view = (LauncherView*)stack->widget(i++))) { 342 while ((view = (LauncherView*)stack->widget(i++))) {
343 if ( view->removeLink(linkfile) ) 343 if ( view->removeLink(linkfile) )
344 break; 344 break;
345 } 345 }
346 addItem(linkfile); 346 addItem(linkfile);
347 docview->updateTools(); 347 docview->updateTools();
348} 348}
349 349
350void CategoryTabWidget::paletteChange( const QPalette &p ) 350void CategoryTabWidget::paletteChange( const QPalette &p )
351{ 351{
352 QVBox::paletteChange( p ); 352 QVBox::paletteChange( p );
353 QPalette pal = palette(); 353 QPalette pal = palette();
354 pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) ); 354 pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) );
355 pal.setColor( QColorGroup::Background, pal.active().background().light(110) ); 355 pal.setColor( QColorGroup::Background, pal.active().background().light(110) );
356 categoryBar->setPalette( pal ); 356 categoryBar->setPalette( pal );
357 categoryBar->update(); 357 categoryBar->update();
358} 358}
359 359
360void CategoryTabWidget::setBusy(bool on) 360void CategoryTabWidget::setBusy(bool on)
361{ 361{
362 if ( on ) 362 if ( on )
363 ((LauncherView*)stack->visibleWidget())->setBusy(TRUE); 363 ((LauncherView*)stack->visibleWidget())->setBusy(TRUE);
364 else 364 else
365 for (int i=0; i<tabs; i++) 365 for (int i=0; i<tabs; i++)
366 ((LauncherView*)stack->widget(i))->setBusy(FALSE); 366 ((LauncherView*)stack->widget(i))->setBusy(FALSE);
367} 367}
368 368
369LauncherView *CategoryTabWidget::view( const QString &id ) 369LauncherView *CategoryTabWidget::view( const QString &id )
370{ 370{
371 int idx = ids.findIndex( id ); 371 int idx = ids.findIndex( id );
372 return (LauncherView *)stack->widget(idx); 372 return (LauncherView *)stack->widget(idx);
373} 373}
374 374
375void CategoryTabWidget::setBusyIndicatorType ( const QString &type ) 375void CategoryTabWidget::setBusyIndicatorType ( const QString &type )
376{ 376{
377 for ( QStringList::Iterator it = ids. begin ( ); it != ids. end ( ); ++it ) 377 for ( QStringList::Iterator it = ids. begin ( ); it != ids. end ( ); ++it )
378 view ( *it )-> setBusyIndicatorType ( type ); 378 view ( *it )-> setBusyIndicatorType ( type );
379} 379}
380 380
381//=========================================================================== 381//===========================================================================
382 382
383CategoryTabBar::CategoryTabBar( QWidget *parent, const char *name ) 383CategoryTabBar::CategoryTabBar( QWidget *parent, const char *name )
384 : QTabBar( parent, name ) 384 : QTabBar( parent, name )
385{ 385{
386 setFocusPolicy( NoFocus ); 386 setFocusPolicy( NoFocus );
387 connect( this, SIGNAL( selected(int) ), this, SLOT( layoutTabs() ) ); 387 connect( this, SIGNAL( selected(int) ), this, SLOT( layoutTabs() ) );
388} 388}
389 389
390CategoryTabBar::~CategoryTabBar() 390CategoryTabBar::~CategoryTabBar()
391{ 391{
392} 392}
393 393
394void CategoryTabBar::layoutTabs() 394void CategoryTabBar::layoutTabs()
395{ 395{
396 if ( !count() ) 396 if ( !count() )
397 return; 397 return;
398 398
399// int percentFalloffTable[] = { 100, 70, 40, 12, 6, 3, 1, 0 }; 399// int percentFalloffTable[] = { 100, 70, 40, 12, 6, 3, 1, 0 };
400 int available = width()-1; 400 int available = width()-1;
401 QFontMetrics fm = fontMetrics(); 401 QFontMetrics fm = fontMetrics();
402 int hiddenTabWidth = -7; 402 int hiddenTabWidth = -7;
403 int middleTab = currentTab(); 403 int middleTab = currentTab();
404 int hframe, vframe, overlap; 404 int hframe, vframe, overlap;
405 style().tabbarMetrics( this, hframe, vframe, overlap ); 405 style().tabbarMetrics( this, hframe, vframe, overlap );
406 int x = 0; 406 int x = 0;
407 QRect r; 407 QRect r;
408 QTab *t; 408 QTab *t;
409 int required = 0; 409 int required = 0;
410 int eventabwidth = (width()-1)/count(); 410 int eventabwidth = (width()-1)/count();
411 enum Mode { HideBackText, Pack, Even } mode=Even; 411 enum Mode { HideBackText, Pack, Even } mode=Even;
412 for ( int i = 0; i < count(); i++ ) { 412 for ( int i = 0; i < count(); i++ ) {
413 t = tab(i); 413 t = tab(i);
414 int iw = fm.width( t->text() ) + hframe - overlap; 414 int iw = fm.width( t->text() ) + hframe - overlap;
415 if ( i != middleTab ) { 415 if ( i != middleTab ) {
416 available -= hiddenTabWidth + hframe - overlap; 416 available -= hiddenTabWidth + hframe - overlap;
417 if ( t->iconSet() != 0 ) 417 if ( t->iconSet() != 0 )
418 available -= t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width(); 418 available -= t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width();
419 } 419 }
420 if ( t->iconSet() != 0 ) 420 if ( t->iconSet() != 0 )
421 iw += t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width(); 421 iw += t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width();
422 required += iw; 422 required += iw;
423 // As space gets tight, packed looks better than even. "10" must be at least 0. 423 // As space gets tight, packed looks better than even. "10" must be at least 0.
424 if ( iw >= eventabwidth-10 ) 424 if ( iw >= eventabwidth-10 )
425 mode = Pack; 425 mode = Pack;
426 } 426 }
427 if ( mode == Pack && required > width()-1 ) 427 if ( mode == Pack && required > width()-1 )
428 mode = HideBackText; 428 mode = HideBackText;
429 for ( int i = 0; i < count(); i++ ) { 429 for ( int i = 0; i < count(); i++ ) {
430 t = tab(i); 430 t = tab(i);
431 if ( mode != HideBackText ) { 431 if ( mode != HideBackText ) {
432 int w = fm.width( t->text() ); 432 int w = fm.width( t->text() );
433 int ih = 0; 433 int ih = 0;
434 if ( t->iconSet() != 0 ) { 434 if ( t->iconSet() != 0 ) {
435 w += t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width(); 435 w += t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width();
436 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height(); 436 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
437 } 437 }
438 int h = QMAX( fm.height(), ih ); 438 int h = QMAX( fm.height(), ih );
439 h = QMAX( h, QApplication::globalStrut().height() ); 439 h = QMAX( h, QApplication::globalStrut().height() );
440 440
441 h += vframe; 441 h += vframe;
442 w += hframe; 442 w += hframe;
443 443
444 QRect tr(x, 0, 444 QRect tr(x, 0,
445 mode == Even ? eventabwidth : w * (width()-1)/required, h); 445 mode == Even ? eventabwidth : w * (width()-1)/required, h);
446 t->setRect(tr); 446 t->setRect(tr);
447 x += tr.width() - overlap; 447 x += tr.width() - overlap;
448 r = r.unite(tr); 448 r = r.unite(tr);
449 } else if ( i != middleTab ) { 449 } else if ( i != middleTab ) {
450 int w = hiddenTabWidth; 450 int w = hiddenTabWidth;
451 int ih = 0; 451 int ih = 0;
452 if ( t->iconSet() != 0 ) { 452 if ( t->iconSet() != 0 ) {
453 w += t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width(); 453 w += t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width();
454 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height(); 454 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
455 } 455 }
456 int h = QMAX( fm.height(), ih ); 456 int h = QMAX( fm.height(), ih );
457 h = QMAX( h, QApplication::globalStrut().height() ); 457 h = QMAX( h, QApplication::globalStrut().height() );
458 458
459 h += vframe; 459 h += vframe;
460 w += hframe; 460 w += hframe;
461 461
462 t->setRect( QRect(x, 0, w, h) ); 462 t->setRect( QRect(x, 0, w, h) );
463 x += t->rect().width() - overlap; 463 x += t->rect().width() - overlap;
464 r = r.unite( t->rect() ); 464 r = r.unite( t->rect() );
465 } else { 465 } else {
466 int ih = 0; 466 int ih = 0;
467 if ( t->iconSet() != 0 ) { 467 if ( t->iconSet() != 0 ) {
468 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height(); 468 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
469 } 469 }
470 int h = QMAX( fm.height(), ih ); 470 int h = QMAX( fm.height(), ih );
471 h = QMAX( h, QApplication::globalStrut().height() ); 471 h = QMAX( h, QApplication::globalStrut().height() );
472 472
473 h += vframe; 473 h += vframe;
474 474
475 t->setRect( QRect(x, 0, available, h) ); 475 t->setRect( QRect(x, 0, available, h) );
476 x += t->rect().width() - overlap; 476 x += t->rect().width() - overlap;
477 r = r.unite( t->rect() ); 477 r = r.unite( t->rect() );
478 } 478 }
479 } 479 }
480 480
481 QRect rr = tab(count()-1)->rect(); 481 QRect rr = tab(count()-1)->rect();
482 rr.setRight(width()-1); 482 rr.setRight(width()-1);
483 tab(count()-1)->setRect( rr ); 483 tab(count()-1)->setRect( rr );
484 484
485 for ( t = tabList()->first(); t; t = tabList()->next() ) { 485 for ( t = tabList()->first(); t; t = tabList()->next() ) {
486 QRect tr = t->rect(); 486 QRect tr = t->rect();
487 tr.setHeight( r.height() ); 487 tr.setHeight( r.height() );
488 t->setRect( tr ); 488 t->setRect( tr );
489 } 489 }
490 490
491 update(); 491 update();
492} 492}
493 493
494 494
495void CategoryTabBar::paint( QPainter * p, QTab * t, bool selected ) const 495void CategoryTabBar::paint( QPainter * p, QTab * t, bool selected ) const
496{ 496{
497 CategoryTabBar *that = (CategoryTabBar *) this; 497 CategoryTabBar *that = (CategoryTabBar *) this;
498 CategoryTab *ct = (CategoryTab *)t; 498 CategoryTab *ct = (CategoryTab *)t;
499 QPalette pal = palette(); 499 QPalette pal = palette();
500 bool setPal = FALSE; 500 bool setPal = FALSE;
501 if ( ct->bgColor.isValid() ) { 501 if ( ct->bgColor.isValid() ) {
502 pal.setColor( QPalette::Active, QColorGroup::Background, ct->bgColor ); 502 pal.setColor( QPalette::Active, QColorGroup::Background, ct->bgColor );
503 pal.setColor( QPalette::Active, QColorGroup::Button, ct->bgColor ); 503 pal.setColor( QPalette::Active, QColorGroup::Button, ct->bgColor );
504 pal.setColor( QPalette::Inactive, QColorGroup::Background, ct->bgColor ); 504 pal.setColor( QPalette::Inactive, QColorGroup::Background, ct->bgColor );
505 pal.setColor( QPalette::Inactive, QColorGroup::Button, ct->bgColor ); 505 pal.setColor( QPalette::Inactive, QColorGroup::Button, ct->bgColor );
506 that->setUpdatesEnabled( FALSE ); 506 that->setUpdatesEnabled( FALSE );
507 that->setPalette( pal ); 507 that->setPalette( pal );
508 setPal = TRUE; 508 setPal = TRUE;
509 } 509 }
510#if QT_VERSION >= 300 510#if QT_VERSION >= 300
511 QStyle::SFlags flags = QStyle::Style_Default; 511 QStyle::SFlags flags = QStyle::Style_Default;
512 if ( selected ) 512 if ( selected )
513 flags |= QStyle::Style_Selected; 513 flags |= QStyle::Style_Selected;
514 style().drawControl( QStyle::CE_TabBarTab, p, this, t->rect(), 514 style().drawControl( QStyle::CE_TabBarTab, p, this, t->rect(),
515 colorGroup(), flags, QStyleOption(t) ); 515 colorGroup(), flags, QStyleOption(t) );
516#else 516#else
517 style().drawTab( p, this, t, selected ); 517 style().drawTab( p, this, t, selected );
518#endif 518#endif
519 519
520 QRect r( t->rect() ); 520 QRect r( t->rect() );
521 QFont f( font() ); 521 QFont f( font() );
522 if ( selected ) 522 if ( selected )
523 f.setBold( TRUE ); 523 f.setBold( TRUE );
524 p->setFont( f ); 524 p->setFont( f );
525 525
526 if ( ct->fgColor.isValid() ) { 526 if ( ct->fgColor.isValid() ) {
527 pal.setColor( QPalette::Active, QColorGroup::Foreground, ct->fgColor ); 527 pal.setColor( QPalette::Active, QColorGroup::Foreground, ct->fgColor );
528 pal.setColor( QPalette::Inactive, QColorGroup::Foreground, ct->fgColor ); 528 pal.setColor( QPalette::Inactive, QColorGroup::Foreground, ct->fgColor );
529 that->setUpdatesEnabled( FALSE ); 529 that->setUpdatesEnabled( FALSE );
530 that->setPalette( pal ); 530 that->setPalette( pal );
531 setPal = TRUE; 531 setPal = TRUE;
532 } 532 }
533 int iw = 0; 533 int iw = 0;
534 int ih = 0; 534 int ih = 0;
535 if ( t->iconSet() != 0 ) { 535 if ( t->iconSet() != 0 ) {
536 iw = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 2; 536 iw = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 2;
537 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height(); 537 ih = t->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
538 } 538 }
539 int w = iw + p->fontMetrics().width( t->text() ) + 4; 539 int w = iw + p->fontMetrics().width( t->text() ) + 4;
540 int h = QMAX(p->fontMetrics().height() + 4, ih ); 540 int h = QMAX(p->fontMetrics().height() + 4, ih );
541 paintLabel( p, QRect( r.left() + (r.width()-w)/2 - 3, 541 paintLabel( p, QRect( r.left() + (r.width()-w)/2 - 3,
542 r.top() + (r.height()-h)/2, w, h ), t, 542 r.top() + (r.height()-h)/2, w, h ), t,
543#if QT_VERSION >= 300 543#if QT_VERSION >= 300
544 t->identifier() == keyboardFocusTab() 544 t->identifier() == keyboardFocusTab()
545#else 545#else
546 t->identitifer() == keyboardFocusTab() 546 t->identitifer() == keyboardFocusTab()
547#endif 547#endif
548 ); 548 );
549 if ( setPal ) { 549 if ( setPal ) {
550 that->unsetPalette(); 550 that->unsetPalette();
551 that->setUpdatesEnabled( TRUE ); 551 that->setUpdatesEnabled( TRUE );
552 } 552 }
553} 553}
554 554
555 555
556void CategoryTabBar::paintLabel( QPainter* p, const QRect&, 556void CategoryTabBar::paintLabel( QPainter* p, const QRect&,
557 QTab* t, bool has_focus ) const 557 QTab* t, bool has_focus ) const
558{ 558{
559 QRect r = t->rect(); 559 QRect r = t->rect();
560 // if ( t->id != currentTab() ) 560 // if ( t->id != currentTab() )
561 //r.moveBy( 1, 1 ); 561 //r.moveBy( 1, 1 );
562 // 562 //
563 if ( t->iconSet() ) { 563 if ( t->iconSet() ) {
564 // the tab has an iconset, draw it in the right mode 564 // the tab has an iconset, draw it in the right mode
565 QIconSet::Mode mode = (t->isEnabled() && isEnabled()) ? QIconSet::Normal : QIconSet::Disabled; 565 QIconSet::Mode mode = (t->isEnabled() && isEnabled()) ? QIconSet::Normal : QIconSet::Disabled;
566 if ( mode == QIconSet::Normal && has_focus ) 566 if ( mode == QIconSet::Normal && has_focus )
567 mode = QIconSet::Active; 567 mode = QIconSet::Active;
568 QPixmap pixmap = t->iconSet()->pixmap( QIconSet::Small, mode ); 568 QPixmap pixmap = t->iconSet()->pixmap( QIconSet::Small, mode );
569 int pixw = pixmap.width(); 569 int pixw = pixmap.width();
570 int pixh = pixmap.height(); 570 int pixh = pixmap.height();
571 p->drawPixmap( r.left() + 6, r.center().y() - pixh / 2 + 1, pixmap ); 571 p->drawPixmap( r.left() + 6, r.center().y() - pixh / 2 + 1, pixmap );
572 r.setLeft( r.left() + pixw + 5 ); 572 r.setLeft( r.left() + pixw + 5 );
573 } 573 }
574 574
575 QRect tr = r; 575 QRect tr = r;
576 576
577 if ( r.width() < 20 ) 577 if ( r.width() < 20 )
578 return; 578 return;
579 579
580 if ( t->isEnabled() && isEnabled() ) { 580 if ( t->isEnabled() && isEnabled() ) {
581#if defined(_WS_WIN32_) 581#if defined(_WS_WIN32_)
582 if ( colorGroup().brush( QColorGroup::Button ) == colorGroup().brush( QColorGroup::Background ) ) 582 if ( colorGroup().brush( QColorGroup::Button ) == colorGroup().brush( QColorGroup::Background ) )
583 p->setPen( colorGroup().buttonText() ); 583 p->setPen( colorGroup().buttonText() );
584 else 584 else
585 p->setPen( colorGroup().foreground() ); 585 p->setPen( colorGroup().foreground() );
586#else 586#else
587 p->setPen( colorGroup().foreground() ); 587 p->setPen( colorGroup().foreground() );
588#endif 588#endif
589 p->drawText( tr, AlignCenter | AlignVCenter | ShowPrefix, t->text() ); 589 p->drawText( tr, AlignCenter | AlignVCenter | ShowPrefix, t->text() );
590 } else { 590 } else {
591 p->setPen( palette().disabled().foreground() ); 591 p->setPen( palette().disabled().foreground() );
592 p->drawText( tr, AlignCenter | AlignVCenter | ShowPrefix, t->text() ); 592 p->drawText( tr, AlignCenter | AlignVCenter | ShowPrefix, t->text() );
593 } 593 }
594} 594}
595 595
596//--------------------------------------------------------------------------- 596//---------------------------------------------------------------------------
597 597
598Launcher::Launcher( QWidget* parent, const char* name, WFlags fl ) 598Launcher::Launcher( QWidget* parent, const char* name, WFlags fl )
599 : QMainWindow( parent, name, fl ) 599 : QMainWindow( parent, name, fl )
600{ 600{
601 setCaption( tr("Launcher") ); 601 setCaption( tr("Launcher") );
602 602
603 syncDialog = 0; 603 syncDialog = 0;
604 604
605 // we have a pretty good idea how big we'll be 605 // we have a pretty good idea how big we'll be
606 setGeometry( 0, 0, qApp->desktop()->width(), qApp->desktop()->height() ); 606 setGeometry( 0, 0, qApp->desktop()->width(), qApp->desktop()->height() );
607 607
608 tabs = 0; 608 tabs = 0;
609 rootFolder = 0; 609 rootFolder = 0;
610 docsFolder = 0; 610 docsFolder = 0;
611 611
612 int stamp = uidgen.generate(); // this is our timestamp to see which devices we know 612 int stamp = uidgen.generate(); // this is our timestamp to see which devices we know
613 //uidgen.store( stamp ); 613 //uidgen.store( stamp );
614 m_timeStamp = QString::number( stamp ); 614 m_timeStamp = QString::number( stamp );
615 615
616 tabs = new CategoryTabWidget( this ); 616 tabs = new CategoryTabWidget( this );
617 tabs->setMaximumWidth( qApp->desktop()->width() ); 617 tabs->setMaximumWidth( qApp->desktop()->width() );
618 setCentralWidget( tabs ); 618 setCentralWidget( tabs );
619 619
620 connect( tabs, SIGNAL(selected(const QString&)), 620 connect( tabs, SIGNAL(selected(const QString&)),
621 this, SLOT(viewSelected(const QString&)) ); 621 this, SLOT(viewSelected(const QString&)) );
622 connect( tabs, SIGNAL(clicked(const AppLnk*)), 622 connect( tabs, SIGNAL(clicked(const AppLnk*)),
623 this, SLOT(select(const AppLnk*))); 623 this, SLOT(select(const AppLnk*)));
624 connect( tabs, SIGNAL(rightPressed(AppLnk*)), 624 connect( tabs, SIGNAL(rightPressed(AppLnk*)),
625 this, SLOT(properties(AppLnk*))); 625 this, SLOT(properties(AppLnk*)));
626 626
627#if !defined(QT_NO_COP) 627#if !defined(QT_NO_COP)
628 QCopChannel* sysChannel = new QCopChannel( "QPE/System", this ); 628 QCopChannel* sysChannel = new QCopChannel( "QPE/System", this );
629 connect( sysChannel, SIGNAL(received(const QCString &, const QByteArray &)), 629 connect( sysChannel, SIGNAL(received(const QCString &, const QByteArray &)),
630 this, SLOT(systemMessage( const QCString &, const QByteArray &)) ); 630 this, SLOT(systemMessage( const QCString &, const QByteArray &)) );
631 QCopChannel *channel = new QCopChannel( "QPE/Launcher", this ); 631 QCopChannel *channel = new QCopChannel( "QPE/Launcher", this );
632 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), 632 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
633 this, SLOT(launcherMessage(const QCString&, const QByteArray&)) ); 633 this, SLOT(launcherMessage(const QCString&, const QByteArray&)) );
634#endif 634#endif
635 635
636 storage = new StorageInfo( this ); 636 storage = new StorageInfo( this );
637 connect( storage, SIGNAL( disksChanged() ), SLOT( storageChanged() ) ); 637 connect( storage, SIGNAL( disksChanged() ), SLOT( storageChanged() ) );
638 638
639 updateTabs(); 639 updateTabs();
640 640
641 preloadApps(); 641 preloadApps();
642 642
643 in_lnk_props = FALSE; 643 in_lnk_props = FALSE;
644 got_lnk_change = FALSE; 644 got_lnk_change = FALSE;
645} 645}
646 646
647Launcher::~Launcher() 647Launcher::~Launcher()
648{ 648{
649 delete rootFolder; 649 delete rootFolder;
650 delete docsFolder; 650 delete docsFolder;
651} 651}
652 652
653static bool isVisibleWindow(int wid) 653static bool isVisibleWindow(int wid)
654{ 654{
655#ifdef QWS 655#ifdef QWS
656 const QList<QWSWindow> &list = qwsServer->clientWindows(); 656 const QList<QWSWindow> &list = qwsServer->clientWindows();
657 QWSWindow* w; 657 QWSWindow* w;
658 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) { 658 for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) {
659 if ( w->winId() == wid ) 659 if ( w->winId() == wid )
660 return !w->isFullyObscured(); 660 return !w->isFullyObscured();
661 } 661 }
662#endif 662#endif
663 return FALSE; 663 return FALSE;
664} 664}
665 665
666void Launcher::showMaximized() 666void Launcher::showMaximized()
667{ 667{
668 if ( isVisibleWindow( winId() ) ) 668 if ( isVisibleWindow( winId() ) )
669 doMaximize(); 669 doMaximize();
670 else 670 else
671 QTimer::singleShot( 20, this, SLOT(doMaximize()) ); 671 QTimer::singleShot( 20, this, SLOT(doMaximize()) );
672} 672}
673 673
674void Launcher::doMaximize() 674void Launcher::doMaximize()
675{ 675{
676 QMainWindow::showMaximized(); 676 QMainWindow::showMaximized();
677} 677}
678 678
679void Launcher::updateMimeTypes() 679void Launcher::updateMimeTypes()
680{ 680{
681 MimeType::clear(); 681 MimeType::clear();
682 updateMimeTypes(rootFolder); 682 updateMimeTypes(rootFolder);
683} 683}
684 684
685void Launcher::updateMimeTypes(AppLnkSet* folder) 685void Launcher::updateMimeTypes(AppLnkSet* folder)
686{ 686{
687 for ( QListIterator<AppLnk> it( folder->children() ); it.current(); ++it ) { 687 for ( QListIterator<AppLnk> it( folder->children() ); it.current(); ++it ) {
688 AppLnk *app = it.current(); 688 AppLnk *app = it.current();
689 if ( app->type() == "Folder" ) // No tr 689 if ( app->type() == "Folder" ) // No tr
690 updateMimeTypes((AppLnkSet *)app); 690 updateMimeTypes((AppLnkSet *)app);
691 else { 691 else {
692 MimeType::registerApp(*app); 692 MimeType::registerApp(*app);
693 } 693 }
694 } 694 }
695} 695}
696 696
697/** This is a HACK.... 697/** This is a HACK....
698 * Reason: scanning huge mediums, microdirvers for examples 698 * Reason: scanning huge mediums, microdirvers for examples
699 * consomes time. To avoid that we invented the MediumMountCheck 699 * consomes time. To avoid that we invented the MediumMountCheck
700 * 700 *
701 * a) the user globally disabled medium checking. We can ignore 701 * a) the user globally disabled medium checking. We can ignore
702 * all removable medium 702 * all removable medium
703 * b) the user enabled medium checking globally and we need to use this mimefilter 703 * b) the user enabled medium checking globally and we need to use this mimefilter
704 * c) the user enabled medium checking on a per medium bases 704 * c) the user enabled medium checking on a per medium bases
705 * c1) we already checked and its not ask again turns 705 * c1) we already checked and its not ask again turns
706 * c2) we need to ask and then apply the mimefilter 706 * c2) we need to ask and then apply the mimefilter
707 */ 707 */
708void Launcher::loadDocs() // ok here comes a hack belonging to Global:: 708void Launcher::loadDocs() // ok here comes a hack belonging to Global::
709{ 709{
710 delete docsFolder; 710 delete docsFolder;
711 docsFolder = new DocLnkSet; 711 docsFolder = new DocLnkSet;
712 712
713 DocLnkSet *tmp = 0; 713 DocLnkSet *tmp = 0;
714 QString home = QString(getenv("HOME")) + "/Documents"; 714 QString home = QString(getenv("HOME")) + "/Documents";
715 tmp = new DocLnkSet( home , QString::null); 715 tmp = new DocLnkSet( home , QString::null);
716 docsFolder->appendFrom( *tmp ); 716 docsFolder->appendFrom( *tmp );
717 delete tmp; 717 delete tmp;
718 718
719 // RAM documents 719 // RAM documents
720 StorageInfo storage; 720 StorageInfo storage;
721 const QList<FileSystem> &fileSystems = storage.fileSystems(); 721 const QList<FileSystem> &fileSystems = storage.fileSystems();
722 QListIterator<FileSystem> it ( fileSystems ); 722 QListIterator<FileSystem> it ( fileSystems );
723 723
724 for ( ; it.current(); ++it ) { 724 for ( ; it.current(); ++it ) {
725 if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) { 725 if ( (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs" ) {
726 tmp = new DocLnkSet( (*it)->path(), QString::null ); 726 tmp = new DocLnkSet( (*it)->path(), QString::null );
727 docsFolder->appendFrom( *tmp ); 727 docsFolder->appendFrom( *tmp );
728 delete tmp; 728 delete tmp;
729 } 729 }
730 } 730 }
731 731
732 Config mediumCfg( "medium"); 732 Config mediumCfg( "medium");
733 mediumCfg.setGroup("main"); 733 mediumCfg.setGroup("main");
734 // a) -zecke we don't want to check 734 // a) -zecke we don't want to check
735 if(!mediumCfg.readBoolEntry("use", true ) ) 735 if(!mediumCfg.readBoolEntry("use", true ) )
736 return; 736 return;
737 737
738 // find out wich filesystems are new in this round 738 // find out wich filesystems are new in this round
739 // We will do this by having a timestamp inside each mountpoint 739 // We will do this by having a timestamp inside each mountpoint
740 // if the current timestamp doesn't match this is a new file system and 740 // if the current timestamp doesn't match this is a new file system and
741 // come up with our MediumMountGui :) let the hacking begin 741 // come up with our MediumMountGui :) let the hacking begin
742 int stamp = uidgen.generate(); 742 int stamp = uidgen.generate();
743 743
744 QString newStamp = QString::number( stamp ); // generates newtime Stamp 744 QString newStamp = QString::number( stamp ); // generates newtime Stamp
745 745
746 // b) 746 // b)
747 if( mediumCfg.readBoolEntry("global", true ) ){ 747 if( mediumCfg.readBoolEntry("global", true ) ){
748 QString mime = configToMime(&mediumCfg).join(";"); 748 QString mime = configToMime(&mediumCfg).join(";");
749 for( it.toFirst(); it.current(); ++it ){ 749 for( it.toFirst(); it.current(); ++it ){
750 if( (*it)->isRemovable() ){ 750 if( (*it)->isRemovable() ){
751 tmp = new DocLnkSet( (*it)->path(), mime ); 751 tmp = new DocLnkSet( (*it)->path(), mime );
752 docsFolder->appendFrom( *tmp ); 752 docsFolder->appendFrom( *tmp );
753 delete tmp; 753 delete tmp;
754 } 754 }
755 } // done 755 } // done
756 return; // save the else 756 return; // save the else
757 } 757 }
758 // c) zecke 758 // c) zecke
759 for ( it.toFirst(); it.current(); ++it ) { 759 for ( it.toFirst(); it.current(); ++it ) {
760 if ( (*it)->isRemovable() ) { // let's find out if we should search on it 760 if ( (*it)->isRemovable() ) { // let's find out if we should search on it
761 Config cfg( (*it)->path() + "/.opiestorage.cf", Config::File); 761 Config cfg( (*it)->path() + "/.opiestorage.cf", Config::File);
762 cfg.setGroup("main"); 762 cfg.setGroup("main");
763 QString stamp = cfg.readEntry("timestamp", QDateTime::currentDateTime().toString() ); 763 QString stamp = cfg.readEntry("timestamp", QDateTime::currentDateTime().toString() );
764 /** This medium is uptodate 764 /** This medium is uptodate
765 */ 765 */
766 if( stamp == m_timeStamp ){ // ok we know this card 766 if( stamp == m_timeStamp ){ // ok we know this card
767 cfg.writeEntry("timestamp", newStamp ); //just write a new timestamp 767 cfg.writeEntry("timestamp", newStamp ); //just write a new timestamp
768 // we need to scan the list now. Hopefully the cache will be there 768 // we need to scan the list now. Hopefully the cache will be there
769 // read the mimetypes from the config and search for documents 769 // read the mimetypes from the config and search for documents
770 QStringList mimetypes = configToMime( &cfg); 770 QStringList mimetypes = configToMime( &cfg);
771 tmp = new DocLnkSet( (*it)->path(), mimetypes.join(";") ); 771 tmp = new DocLnkSet( (*it)->path(), mimetypes.join(";") );
772 docsFolder->appendFrom( *tmp ); 772 docsFolder->appendFrom( *tmp );
773 delete tmp; 773 delete tmp;
774 774
775 }else{ // come up with the gui cause this a new card 775 }else{ // come up with the gui cause this a new card
776 MediumMountGui medium(&cfg, (*it)->path() ); 776 MediumMountGui medium(&cfg, (*it)->path() );
777 if( medium.check() ){ // we did not ask before or ask again is off 777 if( medium.check() ){ // we did not ask before or ask again is off
778 /** c2) */ 778 /** c2) */
779 if( medium.exec() ){ // he clicked yes so search it 779 if( medium.exec() ){ // he clicked yes so search it
780 // speicher 780 // speicher
781 //cfg.read(); // cause of a race we need to reread - fixed 781 //cfg.read(); // cause of a race we need to reread - fixed
782 cfg.setGroup("main"); 782 cfg.setGroup("main");
783 cfg.writeEntry("timestamp", newStamp ); 783 cfg.writeEntry("timestamp", newStamp );
784 cfg.write(); 784 cfg.write();
785 tmp = new DocLnkSet( (*it)->path(), medium.mimeTypes().join(";" ) ); 785 tmp = new DocLnkSet( (*it)->path(), medium.mimeTypes().join(";" ) );
786 docsFolder->appendFrom( *tmp ); 786 docsFolder->appendFrom( *tmp );
787 delete tmp; 787 delete tmp;
788 }// no else 788 }// no else
789 /** c1) */ 789 /** c1) */
790 }else{ // we checked 790 }else{ // we checked
791 // do something different see what we need to do 791 // do something different see what we need to do
792 // let's see if we should check the device 792 // let's see if we should check the device
793 cfg.setGroup("main" ); 793 cfg.setGroup("main" );
794 bool check = cfg.readBoolEntry("autocheck", true ); 794 bool check = cfg.readBoolEntry("autocheck", true );
795 if( check ){ // find the documents 795 if( check ){ // find the documents
796 tmp = new DocLnkSet( (*it)->path(), configToMime(&cfg ).join(";") ); 796 tmp = new DocLnkSet( (*it)->path(), configToMime(&cfg ).join(";") );
797 docsFolder->appendFrom( *tmp ); 797 docsFolder->appendFrom( *tmp );
798 delete tmp; 798 delete tmp;
799 } 799 }
800 } 800 }
801 } 801 }
802 } 802 }
803 } 803 }
804 m_timeStamp = newStamp; 804 m_timeStamp = newStamp;
805} 805}
806 806
807void Launcher::updateTabs() 807void Launcher::updateTabs()
808{ 808{
809 MimeType::updateApplications(); // ### reads all applnks twice 809 MimeType::updateApplications(); // ### reads all applnks twice
810 810
811 delete rootFolder; 811 delete rootFolder;
812 rootFolder = new AppLnkSet( MimeType::appsFolderName() ); 812 rootFolder = new AppLnkSet( MimeType::appsFolderName() );
813 813
814 loadDocs(); 814 loadDocs();
815 815
816 tabs->initializeCategories(rootFolder, docsFolder, storage->fileSystems()); 816 tabs->initializeCategories(rootFolder, docsFolder, storage->fileSystems());
817} 817}
818 818
819void Launcher::updateDocs() 819void Launcher::updateDocs()
820{ 820{
821 loadDocs(); 821 loadDocs();
822 tabs->updateDocs(docsFolder,storage->fileSystems()); 822 tabs->updateDocs(docsFolder,storage->fileSystems());
823} 823}
824 824
825void Launcher::viewSelected(const QString& s) 825void Launcher::viewSelected(const QString& s)
826{ 826{
827 setCaption( s + tr(" - Launcher") ); 827 setCaption( s + tr(" - Launcher") );
828} 828}
829 829
830void Launcher::nextView() 830void Launcher::nextView()
831{ 831{
832 tabs->nextTab(); 832 tabs->nextTab();
833} 833}
834 834
835 835
836void Launcher::select( const AppLnk *appLnk ) 836void Launcher::select( const AppLnk *appLnk )
837{ 837{
838 if ( appLnk->type() == "Folder" ) { // No tr 838 if ( appLnk->type() == "Folder" ) { // No tr
839 // Not supported: flat is simpler for the user 839 // Not supported: flat is simpler for the user
840 } else { 840 } else {
841 if ( appLnk->exec().isNull() ) { 841 if ( appLnk->exec().isNull() ) {
842 QMessageBox::information(this,tr("No application"), 842 QMessageBox::information(this,tr("No application"),
843 tr("<p>No application is defined for this document." 843 tr("<p>No application is defined for this document."
844 "<p>Type is %1.").arg(appLnk->type())); 844 "<p>Type is %1.").arg(appLnk->type()));
845 return; 845 return;
846 } 846 }
847 tabs->setBusy(TRUE); 847 tabs->setBusy(TRUE);
848 emit executing( appLnk ); 848 emit executing( appLnk );
849 appLnk->execute(); 849 appLnk->execute();
850 } 850 }
851} 851}
852 852
853void Launcher::externalSelected(const AppLnk *appLnk) 853void Launcher::externalSelected(const AppLnk *appLnk)
854{ 854{
855 tabs->setBusy(TRUE); 855 tabs->setBusy(TRUE);
856 emit executing( appLnk ); 856 emit executing( appLnk );
857} 857}
858 858
859void Launcher::properties( AppLnk *appLnk ) 859void Launcher::properties( AppLnk *appLnk )
860{ 860{
861 if ( appLnk->type() == "Folder" ) { // No tr 861 if ( appLnk->type() == "Folder" ) { // No tr
862 // Not supported: flat is simpler for the user 862 // Not supported: flat is simpler for the user
863 } else { 863 } else {
864 in_lnk_props = TRUE; 864 in_lnk_props = TRUE;
865 got_lnk_change = FALSE; 865 got_lnk_change = FALSE;
866 LnkProperties prop(appLnk); 866 LnkProperties prop(appLnk);
867 connect(&prop, SIGNAL(select(const AppLnk *)), this, SLOT(externalSelected(const AppLnk *))); 867 connect(&prop, SIGNAL(select(const AppLnk *)), this, SLOT(externalSelected(const AppLnk *)));
868 prop.showMaximized(); 868 prop.showMaximized();
869 prop.exec(); 869 prop.exec();
870 in_lnk_props = FALSE; 870 in_lnk_props = FALSE;
871 if ( got_lnk_change ) { 871 if ( got_lnk_change ) {
872 updateLink(lnk_change); 872 updateLink(lnk_change);
873 } 873 }
874 } 874 }
875} 875}
876 876
877void Launcher::updateLink(const QString& link) 877void Launcher::updateLink(const QString& link)
878{ 878{
879 if (link.isNull()) 879 bool notify_sm = false;
880
881 if (link.isNull()) {
880 updateTabs(); 882 updateTabs();
881 else if (link.isEmpty()) 883 notify_sm = true;
884 }
885 else if (link.isEmpty()) {
882 updateDocs(); 886 updateDocs();
883 else 887 }
888 else {
884 tabs->updateLink(link); 889 tabs->updateLink(link);
890 notify_sm = true;
891 }
892
893 if ( notify_sm )
894 QCopEnvelope e ( "QPE/TaskBar", "reloadApps()" );
885} 895}
886 896
887void Launcher::systemMessage( const QCString &msg, const QByteArray &data) 897void Launcher::systemMessage( const QCString &msg, const QByteArray &data)
888{ 898{
889 QDataStream stream( data, IO_ReadOnly ); 899 QDataStream stream( data, IO_ReadOnly );
890 if ( msg == "linkChanged(QString)" ) { 900 if ( msg == "linkChanged(QString)" ) {
891 QString link; 901 QString link;
892 stream >> link; 902 stream >> link;
893 if ( in_lnk_props ) { 903 if ( in_lnk_props ) {
894 got_lnk_change = TRUE; 904 got_lnk_change = TRUE;
895 lnk_change = link; 905 lnk_change = link;
896 } else { 906 } else {
897 updateLink(link); 907 updateLink(link);
898 } 908 }
899 } else if ( msg == "busy()" ) { 909 } else if ( msg == "busy()" ) {
900 emit busy(); 910 emit busy();
901 } else if ( msg == "notBusy(QString)" ) { 911 } else if ( msg == "notBusy(QString)" ) {
902 QString app; 912 QString app;
903 stream >> app; 913 stream >> app;
904 tabs->setBusy(FALSE); 914 tabs->setBusy(FALSE);
905 emit notBusy(app); 915 emit notBusy(app);
906 } else if ( msg == "mkdir(QString)" ) { 916 } else if ( msg == "mkdir(QString)" ) {
907 QString dir; 917 QString dir;
908 stream >> dir; 918 stream >> dir;
909 if ( !dir.isEmpty() ) 919 if ( !dir.isEmpty() )
910 mkdir( dir ); 920 mkdir( dir );
911 } else if ( msg == "rdiffGenSig(QString,QString)" ) { 921 } else if ( msg == "rdiffGenSig(QString,QString)" ) {
912 QString baseFile, sigFile; 922 QString baseFile, sigFile;
913 stream >> baseFile >> sigFile; 923 stream >> baseFile >> sigFile;
914 QRsync::generateSignature( baseFile, sigFile ); 924 QRsync::generateSignature( baseFile, sigFile );
915 } else if ( msg == "rdiffGenDiff(QString,QString,QString)" ) { 925 } else if ( msg == "rdiffGenDiff(QString,QString,QString)" ) {
916 QString baseFile, sigFile, deltaFile; 926 QString baseFile, sigFile, deltaFile;
917 stream >> baseFile >> sigFile >> deltaFile; 927 stream >> baseFile >> sigFile >> deltaFile;
918 QRsync::generateDiff( baseFile, sigFile, deltaFile ); 928 QRsync::generateDiff( baseFile, sigFile, deltaFile );
919 } else if ( msg == "rdiffApplyPatch(QString,QString)" ) { 929 } else if ( msg == "rdiffApplyPatch(QString,QString)" ) {
920 QString baseFile, deltaFile; 930 QString baseFile, deltaFile;
921 stream >> baseFile >> deltaFile; 931 stream >> baseFile >> deltaFile;
922 if ( !QFile::exists( baseFile ) ) { 932 if ( !QFile::exists( baseFile ) ) {
923 QFile f( baseFile ); 933 QFile f( baseFile );
924 f.open( IO_WriteOnly ); 934 f.open( IO_WriteOnly );
925 f.close(); 935 f.close();
926 } 936 }
927 QRsync::applyDiff( baseFile, deltaFile ); 937 QRsync::applyDiff( baseFile, deltaFile );
928#ifndef QT_NO_COP 938#ifndef QT_NO_COP
929 QCopEnvelope e( "QPE/Desktop", "patchApplied(QString)" ); 939 QCopEnvelope e( "QPE/Desktop", "patchApplied(QString)" );
930 e << baseFile; 940 e << baseFile;
931#endif 941#endif
932 } else if ( msg == "rdiffCleanup()" ) { 942 } else if ( msg == "rdiffCleanup()" ) {
933 mkdir( "/tmp/rdiff" ); 943 mkdir( "/tmp/rdiff" );
934 QDir dir; 944 QDir dir;
935 dir.setPath( "/tmp/rdiff" ); 945 dir.setPath( "/tmp/rdiff" );
936 QStringList entries = dir.entryList(); 946 QStringList entries = dir.entryList();
937 for ( QStringList::Iterator it = entries.begin(); it != entries.end(); ++it ) 947 for ( QStringList::Iterator it = entries.begin(); it != entries.end(); ++it )
938 dir.remove( *it ); 948 dir.remove( *it );
939 } else if ( msg == "sendHandshakeInfo()" ) { 949 } else if ( msg == "sendHandshakeInfo()" ) {
940 QString home = getenv( "HOME" ); 950 QString home = getenv( "HOME" );
941#ifndef QT_NO_COP 951#ifndef QT_NO_COP
942 QCopEnvelope e( "QPE/Desktop", "handshakeInfo(QString,bool)" ); 952 QCopEnvelope e( "QPE/Desktop", "handshakeInfo(QString,bool)" );
943 e << home; 953 e << home;
944 int locked = (int) Desktop::screenLocked(); 954 int locked = (int) Desktop::screenLocked();
945 e << locked; 955 e << locked;
946#endif 956#endif
947 } else if ( msg == "autoStart(QString)" ) { 957 } else if ( msg == "autoStart(QString)" ) {
948 QString appName; 958 QString appName;
949 stream >> appName; 959 stream >> appName;
950 Config cfg( "autostart" ); 960 Config cfg( "autostart" );
951 cfg.setGroup( "AutoStart" ); 961 cfg.setGroup( "AutoStart" );
952 if ( appName.compare("clear") == 0){ 962 if ( appName.compare("clear") == 0){
953 cfg.writeEntry("Apps", ""); 963 cfg.writeEntry("Apps", "");
954 } 964 }
955 } else if ( msg == "autoStart(QString,QString)" ) { 965 } else if ( msg == "autoStart(QString,QString)" ) {
956 QString modifier, appName; 966 QString modifier, appName;
957 stream >> modifier >> appName; 967 stream >> modifier >> appName;
958 Config cfg( "autostart" ); 968 Config cfg( "autostart" );
959 cfg.setGroup( "AutoStart" ); 969 cfg.setGroup( "AutoStart" );
960 if ( modifier.compare("add") == 0 ){ 970 if ( modifier.compare("add") == 0 ){
961 // only add if appname is entered 971 // only add if appname is entered
962 if (!appName.isEmpty()) { 972 if (!appName.isEmpty()) {
963 cfg.writeEntry("Apps", appName); 973 cfg.writeEntry("Apps", appName);
964 } 974 }
965 } else if (modifier.compare("remove") == 0 ) { 975 } else if (modifier.compare("remove") == 0 ) {
966 // need to change for multiple entries 976 // need to change for multiple entries
967 // actually remove is right now simular to clear, but in future there 977 // actually remove is right now simular to clear, but in future there
968 // should be multiple apps in autostart possible. 978 // should be multiple apps in autostart possible.
969 QString checkName; 979 QString checkName;
970 checkName = cfg.readEntry("Apps", ""); 980 checkName = cfg.readEntry("Apps", "");
971 if (checkName == appName) { 981 if (checkName == appName) {
972 cfg.writeEntry("Apps", ""); 982 cfg.writeEntry("Apps", "");
973 } 983 }
974 } 984 }
975 // case the autostart feature should be delayed 985 // case the autostart feature should be delayed
976 } else if ( msg == "autoStart(QString,QString,QString)") { 986 } else if ( msg == "autoStart(QString,QString,QString)") {
977 QString modifier, appName, delay; 987 QString modifier, appName, delay;
978 stream >> modifier >> appName >> delay; 988 stream >> modifier >> appName >> delay;
979 Config cfg( "autostart" ); 989 Config cfg( "autostart" );
980 cfg.setGroup( "AutoStart" ); 990 cfg.setGroup( "AutoStart" );
981 if ( modifier.compare("add") == 0 ){ 991 if ( modifier.compare("add") == 0 ){
982 // only add it appname is entered 992 // only add it appname is entered
983 if (!appName.isEmpty()) { 993 if (!appName.isEmpty()) {
984 cfg.writeEntry("Apps", appName); 994 cfg.writeEntry("Apps", appName);
985 cfg.writeEntry("Delay", delay); 995 cfg.writeEntry("Delay", delay);
986 } 996 }
987 } else { 997 } else {
988 } 998 }
989 } 999 }
990 /* 1000 /*
991 * QtopiaDesktop relies on the major number 1001 * QtopiaDesktop relies on the major number
992 * to start with 1. We're at 0.9 1002 * to start with 1. We're at 0.9
993 * so wee need to fake at least 1.4 to be able 1003 * so wee need to fake at least 1.4 to be able
994 * to sync with QtopiaDesktop1.6 1004 * to sync with QtopiaDesktop1.6
995 */ 1005 */
996 else if ( msg == "sendVersionInfo()" ) { 1006 else if ( msg == "sendVersionInfo()" ) {
997 QCopEnvelope e( "QPE/Desktop", "versionInfo(QString)" ); 1007 QCopEnvelope e( "QPE/Desktop", "versionInfo(QString)" );
998 QString v2 = QString::fromLatin1("1.4"); 1008 QString v2 = QString::fromLatin1("1.4");
999 e << v2; 1009 e << v2;
1000 //qDebug("version %s\n", line.latin1()); 1010 //qDebug("version %s\n", line.latin1());
1001 } else if ( msg == "sendCardInfo()" ) { 1011 } else if ( msg == "sendCardInfo()" ) {
1002#ifndef QT_NO_COP 1012#ifndef QT_NO_COP
1003 QCopEnvelope e( "QPE/Desktop", "cardInfo(QString)" ); 1013 QCopEnvelope e( "QPE/Desktop", "cardInfo(QString)" );
1004#endif 1014#endif
1005 const QList<FileSystem> &fs = storage->fileSystems(); 1015 const QList<FileSystem> &fs = storage->fileSystems();
1006 QListIterator<FileSystem> it ( fs ); 1016 QListIterator<FileSystem> it ( fs );
1007 QString s; 1017 QString s;
1008 QString homeDir = getenv("HOME"); 1018 QString homeDir = getenv("HOME");
1009 QString hardDiskHome, hardDiskHomePath; 1019 QString hardDiskHome, hardDiskHomePath;
1010 for ( ; it.current(); ++it ) { 1020 for ( ; it.current(); ++it ) {
1011 int k4 = (*it)->blockSize()/256; 1021 int k4 = (*it)->blockSize()/256;
1012 if ( (*it)->isRemovable() || (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs") { 1022 if ( (*it)->isRemovable() || (*it)->disk() == "/dev/mtdblock6" || (*it)->disk() == "tmpfs") {
1013 s += (*it)->name() + "=" + (*it)->path() + "/Documents " 1023 s += (*it)->name() + "=" + (*it)->path() + "/Documents "
1014 + QString::number( (*it)->availBlocks() * k4/4 ) 1024 + QString::number( (*it)->availBlocks() * k4/4 )
1015 + "K " + (*it)->options() + ";"; 1025 + "K " + (*it)->options() + ";";
1016 } else if ( (*it)->disk() == "/dev/mtdblock1" || 1026 } else if ( (*it)->disk() == "/dev/mtdblock1" ||
1017 (*it)->disk() == "/dev/mtdblock/1" ) { 1027 (*it)->disk() == "/dev/mtdblock/1" ) {
1018 s += (*it)->name() + "=" + homeDir + "/Documents " 1028 s += (*it)->name() + "=" + homeDir + "/Documents "
1019 + QString::number( (*it)->availBlocks() * k4/4 ) 1029 + QString::number( (*it)->availBlocks() * k4/4 )
1020 + "K " + (*it)->options() + ";"; 1030 + "K " + (*it)->options() + ";";
1021 } else if ( (*it)->name().contains( "Hard Disk") && 1031 } else if ( (*it)->name().contains( "Hard Disk") &&
1022 homeDir.contains( (*it)->path() ) && 1032 homeDir.contains( (*it)->path() ) &&
1023 (*it)->path().length() > hardDiskHomePath.length() ) { 1033 (*it)->path().length() > hardDiskHomePath.length() ) {
1024 hardDiskHomePath = (*it)->path(); 1034 hardDiskHomePath = (*it)->path();
1025 hardDiskHome = 1035 hardDiskHome =
1026 (*it)->name() + "=" + homeDir + "/Documents " 1036 (*it)->name() + "=" + homeDir + "/Documents "
1027 + QString::number( (*it)->availBlocks() * k4/4 ) 1037 + QString::number( (*it)->availBlocks() * k4/4 )
1028 + "K " + (*it)->options() + ";"; 1038 + "K " + (*it)->options() + ";";
1029 } 1039 }
1030 } 1040 }
1031 if ( !hardDiskHome.isEmpty() ) 1041 if ( !hardDiskHome.isEmpty() )
1032 s += hardDiskHome; 1042 s += hardDiskHome;
1033 1043
1034#ifndef QT_NO_COP 1044#ifndef QT_NO_COP
1035 e << s; 1045 e << s;
1036#endif 1046#endif
1037 } else if ( msg == "sendSyncDate(QString)" ) { 1047 } else if ( msg == "sendSyncDate(QString)" ) {
1038 QString app; 1048 QString app;
1039 stream >> app; 1049 stream >> app;
1040 Config cfg( "qpe" ); 1050 Config cfg( "qpe" );
1041 cfg.setGroup("SyncDate"); 1051 cfg.setGroup("SyncDate");
1042#ifndef QT_NO_COP 1052#ifndef QT_NO_COP
1043 QCopEnvelope e( "QPE/Desktop", "syncDate(QString,QString)" ); 1053 QCopEnvelope e( "QPE/Desktop", "syncDate(QString,QString)" );
1044 e << app << cfg.readEntry( app ); 1054 e << app << cfg.readEntry( app );
1045#endif 1055#endif
1046 //qDebug("QPE/System sendSyncDate for %s: response %s", app.latin1(), 1056 //qDebug("QPE/System sendSyncDate for %s: response %s", app.latin1(),
1047 //cfg.readEntry( app ).latin1() ); 1057 //cfg.readEntry( app ).latin1() );
1048 } else if ( msg == "setSyncDate(QString,QString)" ) { 1058 } else if ( msg == "setSyncDate(QString,QString)" ) {
1049 QString app, date; 1059 QString app, date;
1050 stream >> app >> date; 1060 stream >> app >> date;
1051 Config cfg( "qpe" ); 1061 Config cfg( "qpe" );
1052 cfg.setGroup("SyncDate"); 1062 cfg.setGroup("SyncDate");
1053 cfg.writeEntry( app, date ); 1063 cfg.writeEntry( app, date );
1054 //qDebug("setSyncDate(QString,QString) %s %s", app.latin1(), date.latin1()); 1064 //qDebug("setSyncDate(QString,QString) %s %s", app.latin1(), date.latin1());
1055 } else if ( msg == "startSync(QString)" ) { 1065 } else if ( msg == "startSync(QString)" ) {
1056 QString what; 1066 QString what;
1057 stream >> what; 1067 stream >> what;
1058 delete syncDialog; syncDialog = 0; 1068 delete syncDialog; syncDialog = 0;
1059 syncDialog = new SyncDialog( this, "syncProgress", FALSE, 1069 syncDialog = new SyncDialog( this, "syncProgress", FALSE,
1060 WStyle_Tool | WStyle_Customize | 1070 WStyle_Tool | WStyle_Customize |
1061 Qt::WStyle_StaysOnTop ); 1071 Qt::WStyle_StaysOnTop );
1062 syncDialog->showMaximized(); 1072 syncDialog->showMaximized();
1063 syncDialog->whatLabel->setText( "<b>" + what + "</b>" ); 1073 syncDialog->whatLabel->setText( "<b>" + what + "</b>" );
1064 connect( syncDialog->buttonCancel, SIGNAL( clicked() ), 1074 connect( syncDialog->buttonCancel, SIGNAL( clicked() ),
1065 SLOT( cancelSync() ) ); 1075 SLOT( cancelSync() ) );
1066 } else if ( msg == "stopSync()") { 1076 } else if ( msg == "stopSync()") {
1067 delete syncDialog; syncDialog = 0; 1077 delete syncDialog; syncDialog = 0;
1068 } else if ( msg == "getAllDocLinks()" ) { 1078 } else if ( msg == "getAllDocLinks()" ) {
1069 loadDocs(); 1079 loadDocs();
1070 1080
1071 QString contents; 1081 QString contents;
1072 1082
1073 //Categories cats; 1083 //Categories cats;
1074 for ( QListIterator<DocLnk> it( docsFolder->children() ); it.current(); ++it ) { 1084 for ( QListIterator<DocLnk> it( docsFolder->children() ); it.current(); ++it ) {
1075 DocLnk *doc = it.current(); 1085 DocLnk *doc = it.current();
1076 QFileInfo fi( doc->file() ); 1086 QFileInfo fi( doc->file() );
1077 if ( !fi.exists() ) 1087 if ( !fi.exists() )
1078 continue; 1088 continue;
1079 1089
1080 bool fake = !doc->linkFileKnown(); 1090 bool fake = !doc->linkFileKnown();
1081 if ( !fake ) { 1091 if ( !fake ) {
1082 QFile f( doc->linkFile() ); 1092 QFile f( doc->linkFile() );
1083 if ( f.open( IO_ReadOnly ) ) { 1093 if ( f.open( IO_ReadOnly ) ) {
1084 QTextStream ts( &f ); 1094 QTextStream ts( &f );
1085 ts.setEncoding( QTextStream::UnicodeUTF8 ); 1095 ts.setEncoding( QTextStream::UnicodeUTF8 );
1086 contents += ts.read(); 1096 contents += ts.read();
1087 f.close(); 1097 f.close();
1088 } else 1098 } else
1089 fake = TRUE; 1099 fake = TRUE;
1090 } 1100 }
1091 if (fake) { 1101 if (fake) {
1092 contents += "[Desktop Entry]\n"; 1102 contents += "[Desktop Entry]\n";
1093 contents += "Categories = " + // No tr 1103 contents += "Categories = " + // No tr
1094 // cats.labels("Document View",doc->categories()).join(";") + "\n"; // No tr 1104 // cats.labels("Document View",doc->categories()).join(";") + "\n"; // No tr
1095 Qtopia::Record::idsToString( doc->categories() ) + "\n"; 1105 Qtopia::Record::idsToString( doc->categories() ) + "\n";
1096 contents += "Name = "+doc->name()+"\n"; // No tr 1106 contents += "Name = "+doc->name()+"\n"; // No tr
1097 contents += "Type = "+doc->type()+"\n"; // No tr 1107 contents += "Type = "+doc->type()+"\n"; // No tr
1098 } 1108 }
1099 contents += "File = "+doc->file()+"\n"; // No tr // (resolves path) 1109 contents += "File = "+doc->file()+"\n"; // No tr // (resolves path)
1100 contents += QString("Size = %1\n").arg( fi.size() ); // No tr 1110 contents += QString("Size = %1\n").arg( fi.size() ); // No tr
1101 } 1111 }
1102 1112
1103 //qDebug( "sending length %d", contents.length() ); 1113 //qDebug( "sending length %d", contents.length() );
1104#ifndef QT_NO_COP 1114#ifndef QT_NO_COP
1105 QCopEnvelope e( "QPE/Desktop", "docLinks(QString)" ); 1115 QCopEnvelope e( "QPE/Desktop", "docLinks(QString)" );
1106 e << contents; 1116 e << contents;
1107#endif 1117#endif
1108 1118
1109 //qDebug( "================ \n\n%s\n\n===============", 1119 //qDebug( "================ \n\n%s\n\n===============",
1110 //contents.latin1() ); 1120 //contents.latin1() );
1111 1121
1112 delete docsFolder; 1122 delete docsFolder;
1113 docsFolder = 0; 1123 docsFolder = 0;
1114#ifdef QWS 1124#ifdef QWS
1115 } else if ( msg == "setMouseProto(QString)" ) { 1125 } else if ( msg == "setMouseProto(QString)" ) {
1116 QString mice; 1126 QString mice;
1117 stream >> mice; 1127 stream >> mice;
1118 setenv("QWS_MOUSE_PROTO",mice.latin1(),1); 1128 setenv("QWS_MOUSE_PROTO",mice.latin1(),1);
1119 qwsServer->openMouse(); 1129 qwsServer->openMouse();
1120 } else if ( msg == "setKeyboard(QString)" ) { 1130 } else if ( msg == "setKeyboard(QString)" ) {
1121 QString kb; 1131 QString kb;
1122 stream >> kb; 1132 stream >> kb;
1123 setenv("QWS_KEYBOARD",kb.latin1(),1); 1133 setenv("QWS_KEYBOARD",kb.latin1(),1);
1124 qwsServer->openKeyboard(); 1134 qwsServer->openKeyboard();
1125#endif 1135#endif
1126 } 1136 }
1127} 1137}
1128 1138
1129void Launcher::cancelSync() 1139void Launcher::cancelSync()
1130{ 1140{
1131#ifndef QT_NO_COP 1141#ifndef QT_NO_COP
1132 QCopEnvelope e( "QPE/Desktop", "cancelSync()" ); 1142 QCopEnvelope e( "QPE/Desktop", "cancelSync()" );
1133#endif 1143#endif
1134} 1144}
1135 1145
1136void Launcher::launcherMessage( const QCString &msg, const QByteArray &data) 1146void Launcher::launcherMessage( const QCString &msg, const QByteArray &data)
1137{ 1147{
1138 QDataStream stream( data, IO_ReadOnly ); 1148 QDataStream stream( data, IO_ReadOnly );
1139 if ( msg == "setTabView(QString,int)" ) { 1149 if ( msg == "setTabView(QString,int)" ) {
1140 QString id; 1150 QString id;
1141 stream >> id; 1151 stream >> id;
1142 int mode; 1152 int mode;
1143 stream >> mode; 1153 stream >> mode;
1144 if ( tabs->view(id) ) 1154 if ( tabs->view(id) )
1145 tabs->view(id)->setViewMode( (LauncherView::ViewMode)mode ); 1155 tabs->view(id)->setViewMode( (LauncherView::ViewMode)mode );
1146 } else if ( msg == "setTabBackground(QString,int,QString)" ) { 1156 } else if ( msg == "setTabBackground(QString,int,QString)" ) {
1147 QString id; 1157 QString id;
1148 stream >> id; 1158 stream >> id;
1149 int mode; 1159 int mode;
1150 stream >> mode; 1160 stream >> mode;
1151 QString pixmapOrColor; 1161 QString pixmapOrColor;
1152 stream >> pixmapOrColor; 1162 stream >> pixmapOrColor;
1153 if ( tabs->view(id) ) 1163 if ( tabs->view(id) )
1154 tabs->view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); 1164 tabs->view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor );
1155 } else if ( msg == "setTextColor(QString,QString)" ) { 1165 } else if ( msg == "setTextColor(QString,QString)" ) {
1156 QString id; 1166 QString id;
1157 stream >> id; 1167 stream >> id;
1158 QString color; 1168 QString color;
1159 stream >> color; 1169 stream >> color;
1160 if ( tabs->view(id) ) 1170 if ( tabs->view(id) )
1161 tabs->view(id)->setTextColor( QColor(color) ); 1171 tabs->view(id)->setTextColor( QColor(color) );
1162 } else if ( msg == "setFont(QString,QString,int,int,int)" ) { 1172 } else if ( msg == "setFont(QString,QString,int,int,int)" ) {
1163 QString id; 1173 QString id;
1164 stream >> id; 1174 stream >> id;
1165 QString fam; 1175 QString fam;
1166 stream >> fam; 1176 stream >> fam;
1167 int size; 1177 int size;
1168 stream >> size; 1178 stream >> size;
1169 int weight; 1179 int weight;
1170 stream >> weight; 1180 stream >> weight;
1171 int italic; 1181 int italic;
1172 stream >> italic; 1182 stream >> italic;
1173 if ( tabs->view(id) ) 1183 if ( tabs->view(id) )
1174 if ( !fam. isEmpty ( )) 1184 if ( !fam. isEmpty ( ))
1175 tabs->view(id)->setViewFont( QFont(fam, size, weight, italic!=0) ); 1185 tabs->view(id)->setViewFont( QFont(fam, size, weight, italic!=0) );
1176 else 1186 else
1177 tabs->view(id)->unsetViewFont(); 1187 tabs->view(id)->unsetViewFont();
1178 qDebug( "setFont: %s, %d, %d, %d", fam.latin1(), size, weight, italic ); 1188 qDebug( "setFont: %s, %d, %d, %d", fam.latin1(), size, weight, italic );
1179 } 1189 }
1180 else if ( msg == "setBusyIndicatorType(QString)" ) { 1190 else if ( msg == "setBusyIndicatorType(QString)" ) {
1181 QString type; 1191 QString type;
1182 stream >> type; 1192 stream >> type;
1183 tabs->setBusyIndicatorType(type); 1193 tabs->setBusyIndicatorType(type);
1184 } 1194 }
1185 else if ( msg == "home()" ) { 1195 else if ( msg == "home()" ) {
1186 if ( isVisibleWindow( winId ( ))) 1196 if ( isVisibleWindow( winId ( )))
1187 nextView ( ); 1197 nextView ( );
1188 else 1198 else
1189 raise ( ); 1199 raise ( );
1190 1200
1191 } 1201 }
1192} 1202}
1193 1203
1194void Launcher::storageChanged() 1204void Launcher::storageChanged()
1195{ 1205{
1196 if ( in_lnk_props ) { 1206 if ( in_lnk_props ) {
1197 got_lnk_change = TRUE; 1207 got_lnk_change = TRUE;
1198 lnk_change = QString::null; 1208 lnk_change = QString::null;
1199 } else { 1209 } else {
1200 updateLink( QString::null ); 1210 updateLink( QString::null );
1201 } 1211 }
1202} 1212}
1203 1213
1204 1214
1205bool Launcher::mkdir(const QString &localPath) 1215bool Launcher::mkdir(const QString &localPath)
1206{ 1216{
1207 QDir fullDir(localPath); 1217 QDir fullDir(localPath);
1208 if (fullDir.exists()) 1218 if (fullDir.exists())
1209 return true; 1219 return true;
1210 1220
1211 // at this point the directory doesn't exist 1221 // at this point the directory doesn't exist
1212 // go through the directory tree and start creating the direcotories 1222 // go through the directory tree and start creating the direcotories
1213 // that don't exist; if we can't create the directories, return false 1223 // that don't exist; if we can't create the directories, return false
1214 1224
1215 QString dirSeps = "/"; 1225 QString dirSeps = "/";
1216 int dirIndex = localPath.find(dirSeps); 1226 int dirIndex = localPath.find(dirSeps);
1217 QString checkedPath; 1227 QString checkedPath;
1218 1228
1219 // didn't find any seps; weird, use the cur dir instead 1229 // didn't find any seps; weird, use the cur dir instead
1220 if (dirIndex == -1) { 1230 if (dirIndex == -1) {
1221 //qDebug("No seperators found in path %s", localPath.latin1()); 1231 //qDebug("No seperators found in path %s", localPath.latin1());
1222 checkedPath = QDir::currentDirPath(); 1232 checkedPath = QDir::currentDirPath();
1223 } 1233 }
1224 1234
1225 while (checkedPath != localPath) { 1235 while (checkedPath != localPath) {
1226 // no more seperators found, use the local path 1236 // no more seperators found, use the local path
1227 if (dirIndex == -1) 1237 if (dirIndex == -1)
1228 checkedPath = localPath; 1238 checkedPath = localPath;
1229 else { 1239 else {
1230 // the next directory to check 1240 // the next directory to check
1231 checkedPath = localPath.left(dirIndex) + "/"; 1241 checkedPath = localPath.left(dirIndex) + "/";
1232 // advance the iterator; the next dir seperator 1242 // advance the iterator; the next dir seperator
1233 dirIndex = localPath.find(dirSeps, dirIndex+1); 1243 dirIndex = localPath.find(dirSeps, dirIndex+1);
1234 } 1244 }
1235 1245
1236 QDir checkDir(checkedPath); 1246 QDir checkDir(checkedPath);
1237 if (!checkDir.exists()) { 1247 if (!checkDir.exists()) {
1238 //qDebug("mkdir making dir %s", checkedPath.latin1()); 1248 //qDebug("mkdir making dir %s", checkedPath.latin1());
1239 1249
1240 if (!checkDir.mkdir(checkedPath)) { 1250 if (!checkDir.mkdir(checkedPath)) {
1241 qDebug("Unable to make directory %s", checkedPath.latin1()); 1251 qDebug("Unable to make directory %s", checkedPath.latin1());
1242 return FALSE; 1252 return FALSE;
1243 } 1253 }
1244 } 1254 }
1245 1255
1246 } 1256 }
1247 return TRUE; 1257 return TRUE;
1248} 1258}
1249 1259
1250void Launcher::preloadApps() 1260void Launcher::preloadApps()
1251{ 1261{
1252 Config cfg("Launcher"); 1262 Config cfg("Launcher");
1253 cfg.setGroup("Preload"); 1263 cfg.setGroup("Preload");
1254 QStringList apps = cfg.readListEntry("Apps",','); 1264 QStringList apps = cfg.readListEntry("Apps",',');
1255 for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) { 1265 for (QStringList::ConstIterator it=apps.begin(); it!=apps.end(); ++it) {
1256#ifndef QT_NO_COP 1266#ifndef QT_NO_COP
1257 QCopEnvelope e("QPE/Application/"+(*it).local8Bit(), "enablePreload()"); 1267 QCopEnvelope e("QPE/Application/"+(*it).local8Bit(), "enablePreload()");
1258#endif 1268#endif
1259 } 1269 }
1260} 1270}