-rw-r--r-- | library/lnkproperties.cpp | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/library/lnkproperties.cpp b/library/lnkproperties.cpp new file mode 100644 index 0000000..e278cb2 --- a/dev/null +++ b/library/lnkproperties.cpp | |||
@@ -0,0 +1,289 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of Qtopia Environment. | ||
5 | ** | ||
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 | ||
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
9 | ** packaging of this file. | ||
10 | ** | ||
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. | ||
13 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
15 | ** | ||
16 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
17 | ** not clear to you. | ||
18 | ** | ||
19 | **********************************************************************/ | ||
20 | |||
21 | #include "lnkproperties.h" | ||
22 | #include "lnkpropertiesbase_p.h" | ||
23 | #include "ir.h" | ||
24 | |||
25 | #include <qpe/applnk.h> | ||
26 | #include <qpe/global.h> | ||
27 | #include <qpe/categorywidget.h> | ||
28 | #include <qpe/qcopenvelope_qws.h> | ||
29 | #include <qpe/filemanager.h> | ||
30 | #include <qpe/config.h> | ||
31 | #include <qpe/storage.h> | ||
32 | #include <qpe/qpemessagebox.h> | ||
33 | |||
34 | #include <qlineedit.h> | ||
35 | #include <qtoolbutton.h> | ||
36 | #include <qpushbutton.h> | ||
37 | #include <qgroupbox.h> | ||
38 | #include <qcheckbox.h> | ||
39 | #include <qlabel.h> | ||
40 | #include <qlayout.h> | ||
41 | #include <qfile.h> | ||
42 | #include <qfileinfo.h> | ||
43 | #include <qmessagebox.h> | ||
44 | #include <qsize.h> | ||
45 | #include <qcombobox.h> | ||
46 | #include <qregexp.h> | ||
47 | |||
48 | #include <stdlib.h> | ||
49 | |||
50 | LnkProperties::LnkProperties( AppLnk* l, QWidget* parent ) | ||
51 | : QDialog( parent, 0, TRUE ), lnk(l), fileSize( 0 ) | ||
52 | { | ||
53 | QVBoxLayout *vbox = new QVBoxLayout( this ); | ||
54 | d = new LnkPropertiesBase( this ); | ||
55 | vbox->add( d ); | ||
56 | |||
57 | d->docname->setText(l->name()); | ||
58 | QString inf; | ||
59 | if ( l->type().isEmpty() ) { | ||
60 | d->type->hide(); | ||
61 | d->typeLabel->hide(); | ||
62 | } else { | ||
63 | d->type->setText( l->type() ); | ||
64 | } | ||
65 | |||
66 | if ( l->comment().isEmpty() ) { | ||
67 | d->comment->hide(); | ||
68 | d->commentLabel->hide(); | ||
69 | } else { | ||
70 | d->comment->setText( l->comment() ); | ||
71 | } | ||
72 | |||
73 | connect(d->beam,SIGNAL(clicked()),this,SLOT(beamLnk())); | ||
74 | if ( lnk->type().contains('/') ) { // A document? (#### better predicate needed) | ||
75 | connect(d->unlink,SIGNAL(clicked()),this,SLOT(unlinkLnk())); | ||
76 | connect(d->duplicate,SIGNAL(clicked()),this,SLOT(duplicateLnk())); | ||
77 | |||
78 | d->docname->setReadOnly( FALSE ); | ||
79 | d->preload->hide(); | ||
80 | d->spacer->hide(); | ||
81 | |||
82 | // ### THIS MUST GO, FIX WIERD BUG in QLAYOUT | ||
83 | d->categoryEdit->kludge(); | ||
84 | |||
85 | d->categoryEdit->setCategories( lnk->categories(), | ||
86 | "Document View", | ||
87 | tr("Document View") ); | ||
88 | setupLocations(); | ||
89 | } else { | ||
90 | d->unlink->hide(); | ||
91 | d->duplicate->hide(); | ||
92 | d->beam->hide(); | ||
93 | d->hline->hide(); | ||
94 | d->locationLabel->hide(); | ||
95 | d->locationCombo->hide(); | ||
96 | |||
97 | // Can't edit categories, since the app .desktop files are global, | ||
98 | // possibly read-only. | ||
99 | d->categoryEdit->hide(); | ||
100 | |||
101 | d->docname->setReadOnly( TRUE ); | ||
102 | |||
103 | if ( l->property("CanFastload") == "0" ) | ||
104 | d->preload->hide(); | ||
105 | |||
106 | Config cfg("Launcher"); | ||
107 | cfg.setGroup("Preload"); | ||
108 | QStringList apps = cfg.readListEntry("Apps",','); | ||
109 | d->preload->setChecked( apps.contains(l->exec()) ); | ||
110 | if ( Global::isBuiltinCommand(lnk->exec()) ) | ||
111 | d->preload->hide(); // builtins are always fast | ||
112 | |||
113 | currentLocation = 0; // apps not movable (yet) | ||
114 | } | ||
115 | } | ||
116 | |||
117 | LnkProperties::~LnkProperties() | ||
118 | { | ||
119 | } | ||
120 | |||
121 | void LnkProperties::unlinkLnk() | ||
122 | { | ||
123 | if ( QPEMessageBox::confirmDelete( this, tr("Delete"), lnk->name() ) ) { | ||
124 | lnk->removeFiles(); | ||
125 | if ( QFile::exists(lnk->file()) ) { | ||
126 | QMessageBox::warning( this, tr("Delete"), tr("File deletion failed.") ); | ||
127 | } else { | ||
128 | reject(); | ||
129 | } | ||
130 | } | ||
131 | } | ||
132 | |||
133 | void LnkProperties::setupLocations() | ||
134 | { | ||
135 | QFileInfo fi( lnk->file() ); | ||
136 | fileSize = fi.size(); | ||
137 | StorageInfo storage; | ||
138 | const QList<FileSystem> &fs = storage.fileSystems(); | ||
139 | QListIterator<FileSystem> it ( fs ); | ||
140 | QString s; | ||
141 | QString homeDir = getenv("HOME"); | ||
142 | QString hardDiskHome; | ||
143 | QString hardDiskPath; | ||
144 | int index = 0; | ||
145 | currentLocation = -1; | ||
146 | for ( ; it.current(); ++it ) { | ||
147 | // we add 10k to the file size so we are sure we can also save the desktop file | ||
148 | if ( (*it)->availBlocks() * (*it)->blockSize() > fileSize + 10000 ) { | ||
149 | if ( (*it)->isRemovable() || | ||
150 | (*it)->disk() == "/dev/mtdblock1" || | ||
151 | (*it)->disk() == "/dev/mtdblock/1" ) { | ||
152 | d->locationCombo->insertItem( (*it)->name(), index ); | ||
153 | locations.append( ((*it)->isRemovable() ? (*it)->path() : homeDir) ); | ||
154 | if ( lnk->file().contains( (*it)->path() ) ) { | ||
155 | d->locationCombo->setCurrentItem( index ); | ||
156 | currentLocation = index; | ||
157 | } | ||
158 | index++; | ||
159 | } else if ( (*it)->name().contains( "Hard Disk") && | ||
160 | homeDir.contains( (*it)->path() ) && | ||
161 | (*it)->path().length() > hardDiskHome.length() ) { | ||
162 | hardDiskHome = (*it)->name(); | ||
163 | hardDiskPath = (*it)->path(); | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | if ( !hardDiskHome.isEmpty() ) { | ||
168 | d->locationCombo->insertItem( hardDiskHome ); | ||
169 | locations.append( hardDiskPath ); | ||
170 | if ( currentLocation == -1 ) { // assume it's the hard disk | ||
171 | d->locationCombo->setCurrentItem( index ); | ||
172 | currentLocation = index; | ||
173 | } | ||
174 | } | ||
175 | } | ||
176 | |||
177 | void LnkProperties::duplicateLnk() | ||
178 | { | ||
179 | // The duplicate takes the new properties. | ||
180 | DocLnk newdoc( *((DocLnk *)lnk) ); | ||
181 | if ( d->docname->text() == lnk->name() ) | ||
182 | newdoc.setName(tr("Copy of ")+d->docname->text()); | ||
183 | else | ||
184 | newdoc.setName(d->docname->text()); | ||
185 | |||
186 | if ( !copyFile( newdoc ) ) { | ||
187 | QMessageBox::warning( this, tr("Duplicate"), tr("File copy failed.") ); | ||
188 | return; | ||
189 | } | ||
190 | reject(); | ||
191 | } | ||
192 | |||
193 | bool LnkProperties::moveLnk() | ||
194 | { | ||
195 | DocLnk newdoc( *((DocLnk *)lnk) ); | ||
196 | newdoc.setName(d->docname->text()); | ||
197 | |||
198 | if ( !copyFile( newdoc ) ) { | ||
199 | QMessageBox::warning( this, tr("Details"), tr("Moving Document failed.") ); | ||
200 | return FALSE; | ||
201 | } | ||
202 | // remove old lnk | ||
203 | lnk->removeFiles(); | ||
204 | |||
205 | return TRUE; | ||
206 | } | ||
207 | |||
208 | void LnkProperties::beamLnk() | ||
209 | { | ||
210 | Ir ir; | ||
211 | DocLnk doc( *((DocLnk *)lnk) ); | ||
212 | ir.send( doc, doc.comment() ); | ||
213 | } | ||
214 | |||
215 | bool LnkProperties::copyFile( DocLnk &newdoc ) | ||
216 | { | ||
217 | const char *linkExtn = ".desktop"; | ||
218 | QString fileExtn; | ||
219 | int extnPos = lnk->file().findRev( '.' ); | ||
220 | if ( extnPos > 0 ) | ||
221 | fileExtn = lnk->file().mid( extnPos ); | ||
222 | |||
223 | QString safename = newdoc.name(); | ||
224 | safename.replace(QRegExp("/"),"_"); | ||
225 | |||
226 | QString fn = locations[ d->locationCombo->currentItem() ] | ||
227 | + "/Documents/" + newdoc.type() + "/" + safename; | ||
228 | if ( QFile::exists(fn + fileExtn) || QFile::exists(fn + linkExtn) ) { | ||
229 | int n=1; | ||
230 | QString nn = fn + "_" + QString::number(n); | ||
231 | while ( QFile::exists(nn+fileExtn) || QFile::exists(nn+linkExtn) ) { | ||
232 | n++; | ||
233 | nn = fn + "_" + QString::number(n); | ||
234 | } | ||
235 | fn = nn; | ||
236 | } | ||
237 | newdoc.setFile( fn + fileExtn ); | ||
238 | newdoc.setLinkFile( fn + linkExtn ); | ||
239 | |||
240 | // Copy file | ||
241 | FileManager fm; | ||
242 | if ( !fm.copyFile( *lnk, newdoc ) ) | ||
243 | return FALSE; | ||
244 | return TRUE; | ||
245 | } | ||
246 | |||
247 | void LnkProperties::done(int ok) | ||
248 | { | ||
249 | if ( ok ) { | ||
250 | bool changed=FALSE; | ||
251 | if ( lnk->name() != d->docname->text() ) { | ||
252 | lnk->setName(d->docname->text()); | ||
253 | changed=TRUE; | ||
254 | } | ||
255 | if ( d->categoryEdit->isVisible() ) { | ||
256 | QArray<int> tmp = d->categoryEdit->newCategories(); | ||
257 | if ( lnk->categories() != tmp ) { | ||
258 | lnk->setCategories( tmp ); | ||
259 | changed = TRUE; | ||
260 | } | ||
261 | } | ||
262 | if ( d->preload->isHidden() && d->locationCombo->currentItem() != currentLocation ) { | ||
263 | moveLnk(); | ||
264 | } else if ( changed ) { | ||
265 | lnk->writeLink(); | ||
266 | } | ||
267 | |||
268 | if ( !d->preload->isHidden() ) { | ||
269 | Config cfg("Launcher"); | ||
270 | cfg.setGroup("Preload"); | ||
271 | QStringList apps = cfg.readListEntry("Apps",','); | ||
272 | QString exe = lnk->exec(); | ||
273 | if ( apps.contains(exe) != d->preload->isChecked() ) { | ||
274 | if ( d->preload->isChecked() ) { | ||
275 | apps.append(exe); | ||
276 | QCopEnvelope e("QPE/Application/"+exe.local8Bit(), | ||
277 | "enablePreload()"); | ||
278 | } else { | ||
279 | apps.remove(exe); | ||
280 | QCopEnvelope e("QPE/Application/"+exe.local8Bit(), | ||
281 | "quitIfInvisible()"); | ||
282 | } | ||
283 | cfg.writeEntry("Apps",apps,','); | ||
284 | } | ||
285 | } | ||
286 | } | ||
287 | QDialog::done( ok ); | ||
288 | } | ||
289 | |||