• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeio/tdeio
 

tdeio/tdeio

  • tdeio
  • tdeio
renamedlg.cpp
1/* This file is part of the KDE libraries
2 Copyright (C) 2000 Stephan Kulow <coolo@kde.org>
3 David Faure <faure@kde.org>
4 2001 Holger Freyther <freyther@kde.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20*/
21
22#include "tdeio/renamedlg.h"
23#include "tdeio/renamedlgplugin.h"
24#include <stdio.h>
25#include <assert.h>
26
27#include <tqfileinfo.h>
28#include <tqlabel.h>
29#include <tqlayout.h>
30#include <tqlineedit.h>
31#include <tqdir.h>
32
33#include <tdemessagebox.h>
34#include <kpushbutton.h>
35#include <tdeapplication.h>
36#include <tdeio/global.h>
37#include <ktrader.h>
38#include <klibloader.h>
39#include <kdialog.h>
40#include <tdelocale.h>
41#include <tdeglobal.h>
42#include <kdebug.h>
43#include <kurl.h>
44#include <kmimetype.h>
45#include <kseparator.h>
46#include <kstringhandler.h>
47#include <kstdguiitem.h>
48#include <kguiitem.h>
49#include <ksqueezedtextlabel.h>
50
51#ifdef TQ_WS_X11
52#include <twin.h>
53#endif
54
55using namespace TDEIO;
56
57class RenameDlg::RenameDlgPrivate
58{
59 public:
60 RenameDlgPrivate(){
61 bCancel = 0;
62 bRename = bSkip = bAutoSkip = bOverwrite = bOverwriteAll = 0;
63 bResume = bResumeAll = bSuggestNewName = 0;
64 m_pLineEdit = 0;
65 }
66 KPushButton *bCancel;
67 TQPushButton *bRename;
68 TQPushButton *bSkip;
69 TQPushButton *bAutoSkip;
70 TQPushButton *bOverwrite;
71 TQPushButton *bOverwriteAll;
72 TQPushButton *bResume;
73 TQPushButton *bResumeAll;
74 TQPushButton *bSuggestNewName;
75 TQLineEdit* m_pLineEdit;
76 KURL src;
77 KURL dest;
78 TQString mimeSrc;
79 TQString mimeDest;
80 bool modal;
81 bool plugin;
82};
83
84RenameDlg::RenameDlg(TQWidget *parent, const TQString & _caption,
85 const TQString &_src, const TQString &_dest,
86 RenameDlg_Mode _mode,
87 TDEIO::filesize_t sizeSrc,
88 TDEIO::filesize_t sizeDest,
89 time_t ctimeSrc,
90 time_t ctimeDest,
91 time_t mtimeSrc,
92 time_t mtimeDest,
93 bool _modal)
94 : TQDialog ( parent, "TDEIO::RenameDialog" , _modal )
95{
96 d = new RenameDlgPrivate( );
97 d->modal = _modal;
98#if 0
99 // Set "StaysOnTop", because this dialog is typically used in tdeio_uiserver,
100 // i.e. in a separate process.
101 // ####### This isn't the case anymore - remove?
102#if !defined(TQ_WS_QWS) && !defined(TQ_WS_WIN) //FIXME(E): Implement for QT Embedded & win32
103 if (d->modal)
104 KWin::setState( winId(), NET::StaysOnTop );
105#endif
106#endif
107
108 d->src = _src;
109 d->dest = _dest;
110 d->plugin = false;
111
112
113 setCaption( _caption );
114
115 d->bCancel = new KPushButton( KStdGuiItem::cancel(), this );
116 connect(d->bCancel, TQ_SIGNAL(clicked()), this, TQ_SLOT(b0Pressed()));
117
118 if ( ! (_mode & M_NORENAME ) ) {
119 d->bRename = new TQPushButton( i18n( "&Rename" ), this );
120 d->bRename->setEnabled(false);
121 d->bSuggestNewName = new TQPushButton( i18n( "Suggest New &Name" ), this );
122 connect(d->bSuggestNewName, TQ_SIGNAL(clicked()), this, TQ_SLOT(b8Pressed()));
123 connect(d->bRename, TQ_SIGNAL(clicked()), this, TQ_SLOT(b1Pressed()));
124 }
125
126 if ( ( _mode & M_MULTI ) && ( _mode & M_SKIP ) ) {
127 d->bSkip = new TQPushButton( i18n( "&Skip" ), this );
128 connect(d->bSkip, TQ_SIGNAL(clicked()), this, TQ_SLOT(b2Pressed()));
129
130 d->bAutoSkip = new TQPushButton( i18n( "&Auto Skip" ), this );
131 connect(d->bAutoSkip, TQ_SIGNAL(clicked()), this, TQ_SLOT(b3Pressed()));
132 }
133
134 if ( _mode & M_OVERWRITE ) {
135 d->bOverwrite = new TQPushButton( i18n( "&Overwrite" ), this );
136 connect(d->bOverwrite, TQ_SIGNAL(clicked()), this, TQ_SLOT(b4Pressed()));
137
138 if ( _mode & M_MULTI ) {
139 d->bOverwriteAll = new TQPushButton( i18n( "O&verwrite All" ), this );
140 connect(d->bOverwriteAll, TQ_SIGNAL(clicked()), this, TQ_SLOT(b5Pressed()));
141 }
142 }
143
144 if ( _mode & M_RESUME ) {
145 d->bResume = new TQPushButton( i18n( "&Resume" ), this );
146 connect(d->bResume, TQ_SIGNAL(clicked()), this, TQ_SLOT(b6Pressed()));
147
148 if ( _mode & M_MULTI )
149 {
150 d->bResumeAll = new TQPushButton( i18n( "R&esume All" ), this );
151 connect(d->bResumeAll, TQ_SIGNAL(clicked()), this, TQ_SLOT(b7Pressed()));
152 }
153 }
154
155 TQVBoxLayout* pLayout = new TQVBoxLayout( this, KDialog::marginHint(),
156 KDialog::spacingHint() );
157 pLayout->addStrut( 360 ); // makes dlg at least that wide
158
159 // User tries to overwrite a file with itself ?
160 if ( _mode & M_OVERWRITE_ITSELF ) {
161 TQLabel *lb = new TQLabel( i18n( "This action would overwrite '%1' with itself.\n"
162 "Please enter a new file name:" ).arg( KStringHandler::csqueeze( d->src.pathOrURL(),100 ) ), this );
163 d->bRename->setText(i18n("C&ontinue"));
164 pLayout->addWidget( lb );
165 }
166 else if ( _mode & M_OVERWRITE ) {
167
168 // Figure out the mimetype and load one plugin
169 // (This is the only mode that is handled by plugins)
170 pluginHandling();
171 TDETrader::OfferList plugin_offers;
172 if( d->mimeSrc != KMimeType::defaultMimeType() ){
173 plugin_offers = TDETrader::self()->query(d->mimeSrc, "'RenameDlg/Plugin' in ServiceTypes");
174
175 }else if(d->mimeDest != KMimeType::defaultMimeType() ) {
176 plugin_offers = TDETrader::self()->query(d->mimeDest, "'RenameDlg/Plugin' in ServiceTypes");
177 }
178 if(!plugin_offers.isEmpty() ){
179 kdDebug(7024) << "Offers" << endl;
180 TDETrader::OfferList::ConstIterator it = plugin_offers.begin();
181 TDETrader::OfferList::ConstIterator end = plugin_offers.end();
182 for( ; it != end; ++it ){
183 TQString libName = (*it)->library();
184 if( libName.isEmpty() ){
185 kdDebug(7024) << "lib is empty" << endl;
186 continue;
187 }
188 KLibrary *lib = KLibLoader::self()->library(libName.local8Bit() );
189 if(!lib) {
190 continue;
191 }
192 KLibFactory *factory = lib->factory();
193 if(!factory){
194 lib->unload();
195 continue;
196 }
197 TQObject *obj = factory->create( this, (*it)->name().latin1() );
198 if(!obj) {
199 lib->unload();
200 continue;
201 }
202 RenameDlgPlugin *plugin = static_cast<RenameDlgPlugin *>(static_cast<TQWidget*>(obj));
203 if(!plugin ){
204 delete obj;
205 continue;
206 }
207 if( plugin->initialize( _mode, _src, _dest, d->mimeSrc,
208 d->mimeDest, sizeSrc, sizeDest,
209 ctimeSrc, ctimeDest,
210 mtimeSrc, mtimeDest ) ) {
211 d->plugin = true;
212 pLayout->addWidget(plugin );
213 kdDebug(7024) << "RenameDlgPlugin" << endl;
214 break;
215 } else {
216 delete obj;
217 }
218 }
219
220 }
221
222 if( !d->plugin ){
223 // No plugin found, build default dialog
224 TQGridLayout * gridLayout = new TQGridLayout( 0L, 9, 2, KDialog::marginHint(),
225 KDialog::spacingHint() );
226 pLayout->addLayout(gridLayout);
227 gridLayout->setColStretch(0,0);
228 gridLayout->setColStretch(1,10);
229
230 TQString sentence1;
231 if (mtimeDest < mtimeSrc)
232 sentence1 = i18n("An older item named '%1' already exists.");
233 else if (mtimeDest == mtimeSrc)
234 sentence1 = i18n("A similar file named '%1' already exists.");
235 else
236 sentence1 = i18n("A newer item named '%1' already exists.");
237
238 TQLabel * lb1 = new KSqueezedTextLabel( sentence1.arg(d->dest.pathOrURL() ), this );
239 gridLayout->addMultiCellWidget( lb1, 0, 0, 0, 1 ); // takes the complete first line
240
241 lb1 = new TQLabel( this );
242 lb1->setPixmap( KMimeType::pixmapForURL( d->dest ) );
243 gridLayout->addMultiCellWidget( lb1, 1, 3, 0, 0 ); // takes the first column on rows 1-3
244
245 int row = 1;
246 if ( sizeDest != (TDEIO::filesize_t)-1 )
247 {
248 TQLabel * lb = new TQLabel( i18n("size %1").arg( TDEIO::convertSize(sizeDest) ), this );
249 gridLayout->addWidget( lb, row, 1 );
250 row++;
251
252 }
253 if ( ctimeDest != (time_t)-1 )
254 {
255 TQDateTime dctime; dctime.setTime_t( ctimeDest );
256 TQLabel * lb = new TQLabel( i18n("created on %1").arg( TDEGlobal::locale()->formatDateTime(dctime) ), this );
257 gridLayout->addWidget( lb, row, 1 );
258 row++;
259 }
260 if ( mtimeDest != (time_t)-1 )
261 {
262 TQDateTime dmtime; dmtime.setTime_t( mtimeDest );
263 TQLabel * lb = new TQLabel( i18n("modified on %1").arg( TDEGlobal::locale()->formatDateTime(dmtime) ), this );
264 gridLayout->addWidget( lb, row, 1 );
265 row++;
266 }
267
268 if ( !d->src.isEmpty() )
269 {
270 // rows 1 to 3 are the details (size/ctime/mtime), row 4 is empty
271 gridLayout->addRowSpacing( 4, 20 );
272
273 TQLabel * lb2 = new KSqueezedTextLabel( i18n("The source file is '%1'").arg(d->src.pathOrURL()), this );
274 gridLayout->addMultiCellWidget( lb2, 5, 5, 0, 1 ); // takes the complete first line
275
276 lb2 = new TQLabel( this );
277 lb2->setPixmap( KMimeType::pixmapForURL( d->src ) );
278 gridLayout->addMultiCellWidget( lb2, 6, 8, 0, 0 ); // takes the first column on rows 6-8
279
280 row = 6;
281
282 if ( sizeSrc != (TDEIO::filesize_t)-1 )
283 {
284 TQLabel * lb = new TQLabel( i18n("size %1").arg( TDEIO::convertSize(sizeSrc) ), this );
285 gridLayout->addWidget( lb, row, 1 );
286 row++;
287 }
288 if ( ctimeSrc != (time_t)-1 )
289 {
290 TQDateTime dctime; dctime.setTime_t( ctimeSrc );
291 TQLabel * lb = new TQLabel( i18n("created on %1").arg( TDEGlobal::locale()->formatDateTime(dctime) ), this );
292 gridLayout->addWidget( lb, row, 1 );
293 row++;
294 }
295 if ( mtimeSrc != (time_t)-1 )
296 {
297 TQDateTime dmtime; dmtime.setTime_t( mtimeSrc );
298 TQLabel * lb = new TQLabel( i18n("modified on %1").arg( TDEGlobal::locale()->formatDateTime(dmtime) ), this );
299 gridLayout->addWidget( lb, row, 1 );
300 row++;
301 }
302 }
303 }
304 }
305 else
306 {
307 // This is the case where we don't want to allow overwriting, the existing
308 // file must be preserved (e.g. when renaming).
309 TQString sentence1;
310 if (mtimeDest < mtimeSrc)
311 sentence1 = i18n("An older item named '%1' already exists.");
312 else if (mtimeDest == mtimeSrc)
313 sentence1 = i18n("A similar file named '%1' already exists.");
314 else
315 sentence1 = i18n("A newer item named '%1' already exists.");
316
317 TQLabel *lb = new KSqueezedTextLabel( sentence1.arg(d->dest.pathOrURL()), this );
318 pLayout->addWidget(lb);
319 }
320 TQHBoxLayout* layout2 = new TQHBoxLayout();
321 pLayout->addLayout( layout2 );
322
323 d->m_pLineEdit = new TQLineEdit( this );
324 layout2->addWidget( d->m_pLineEdit );
325 TQString fileName = d->dest.fileName();
326 d->m_pLineEdit->setText( TDEIO::decodeFileName( fileName ) );
327 if ( d->bRename || d->bOverwrite )
328 connect(d->m_pLineEdit, TQ_SIGNAL(textChanged(const TQString &)),
329 TQ_SLOT(enableRenameButton(const TQString &)));
330 if ( d->bSuggestNewName )
331 {
332 layout2->addWidget( d->bSuggestNewName );
333 setTabOrder( d->m_pLineEdit, d->bSuggestNewName );
334 }
335
336 KSeparator* separator = new KSeparator( this );
337 pLayout->addWidget( separator );
338
339 TQHBoxLayout* layout = new TQHBoxLayout();
340 pLayout->addLayout( layout );
341
342 layout->addStretch(1);
343
344 if ( d->bRename )
345 {
346 layout->addWidget( d->bRename );
347 setTabOrder( d->bRename, d->bCancel );
348 }
349 if ( d->bSkip )
350 {
351 layout->addWidget( d->bSkip );
352 setTabOrder( d->bSkip, d->bCancel );
353 }
354 if ( d->bAutoSkip )
355 {
356 layout->addWidget( d->bAutoSkip );
357 setTabOrder( d->bAutoSkip, d->bCancel );
358 }
359 if ( d->bOverwrite )
360 {
361 layout->addWidget( d->bOverwrite );
362 setTabOrder( d->bOverwrite, d->bCancel );
363 }
364 if ( d->bOverwriteAll )
365 {
366 layout->addWidget( d->bOverwriteAll );
367 setTabOrder( d->bOverwriteAll, d->bCancel );
368 }
369 if ( d->bResume )
370 {
371 layout->addWidget( d->bResume );
372 setTabOrder( d->bResume, d->bCancel );
373 }
374 if ( d->bResumeAll )
375 {
376 layout->addWidget( d->bResumeAll );
377 setTabOrder( d->bResumeAll, d->bCancel );
378 }
379
380 d->bCancel->setDefault( true );
381 layout->addWidget( d->bCancel );
382
383 resize( sizeHint() );
384
385 d->m_pLineEdit->setFocus();
386}
387
388RenameDlg::~RenameDlg()
389{
390 delete d;
391 // no need to delete Pushbuttons,... qt will do this
392}
393
394void RenameDlg::enableRenameButton(const TQString &newDest)
395{
396 if ( newDest != TDEIO::decodeFileName( d->dest.fileName() ) && !newDest.isEmpty() )
397 {
398 d->bRename->setEnabled( true );
399 d->bRename->setDefault( true );
400 if ( d->bOverwrite )
401 d->bOverwrite->setEnabled( false ); // prevent confusion (#83114)
402 }
403 else
404 {
405 d->bRename->setEnabled( false );
406 if ( d->bOverwrite )
407 d->bOverwrite->setEnabled( true );
408 }
409}
410
411KURL RenameDlg::newDestURL()
412{
413 KURL newDest( d->dest );
414 TQString fileName = d->m_pLineEdit->text();
415 newDest.setFileName( TDEIO::encodeFileName( fileName ) );
416 return newDest;
417}
418
419void RenameDlg::b0Pressed()
420{
421 done( 0 );
422}
423
424// Rename
425void RenameDlg::b1Pressed()
426{
427 if ( d->m_pLineEdit->text().isEmpty() )
428 return;
429
430 KURL u = newDestURL();
431 if ( !u.isValid() )
432 {
433 KMessageBox::error( this, i18n( "Malformed URL\n%1" ).arg( u.url() ) );
434 return;
435 }
436
437 done( 1 );
438}
439
440TQString RenameDlg::suggestName(const KURL& baseURL, const TQString& oldName)
441{
442 TQString dotSuffix, suggestedName;
443 TQString basename = oldName;
444
445 int index = basename.find( '.' );
446 if ( index != -1 ) {
447 dotSuffix = basename.mid( index );
448 basename.truncate( index );
449 }
450
451 int pos = basename.findRev( '_' );
452 if(pos != -1 ){
453 TQString tmp = basename.mid( pos+1 );
454 bool ok;
455 int number = tmp.toInt( &ok );
456 if ( !ok ) {// ok there is no number
457 suggestedName = basename + "1" + dotSuffix;
458 }
459 else {
460 // yes there's already a number behind the _ so increment it by one
461 basename.replace( pos+1, tmp.length(), TQString::number(number+1) );
462 suggestedName = basename + dotSuffix;
463 }
464 }
465 else // no underscore yet
466 suggestedName = basename + "_1" + dotSuffix ;
467
468 // Check if suggested name already exists
469 bool exists = false;
470 // TODO: network transparency. However, using NetAccess from a modal dialog
471 // could be a problem, no? (given that it uses a modal widget itself....)
472 if ( baseURL.isLocalFile() )
473 exists = TQFileInfo( baseURL.path(+1) + suggestedName ).exists();
474
475 if ( !exists )
476 return suggestedName;
477 else // already exists -> recurse
478 return suggestName( baseURL, suggestedName );
479}
480
481// Propose button clicked
482void RenameDlg::b8Pressed()
483{
484 /* no name to play with */
485 if ( d->m_pLineEdit->text().isEmpty() )
486 return;
487
488 KURL destDirectory( d->dest );
489 destDirectory.setPath( destDirectory.directory() );
490 d->m_pLineEdit->setText( suggestName( destDirectory, d->m_pLineEdit->text() ) );
491 return;
492}
493
494void RenameDlg::b2Pressed()
495{
496 done( 2 );
497}
498
499void RenameDlg::b3Pressed()
500{
501 done( 3 );
502}
503
504void RenameDlg::b4Pressed()
505{
506 done( 4 );
507}
508
509void RenameDlg::b5Pressed()
510{
511 done( 5 );
512}
513
514void RenameDlg::b6Pressed()
515{
516 done( 6 );
517}
518
519void RenameDlg::b7Pressed()
520{
521 done( 7 );
522}
523
524static TQString mime( const KURL& src )
525{
526 KMimeType::Ptr type = KMimeType::findByURL( src );
527 //if( type->name() == KMimeType::defaultMimeType() ){ // ok no mimetype
528 // TQString ty = TDEIO::NetAccess::mimetype(d->src );
529 // return ty;
530 return type->name();
531}
532
539void RenameDlg::pluginHandling()
540{
541 d->mimeSrc = mime( d->src );
542 d->mimeDest = mime(d->dest );
543
544 kdDebug(7024) << "Source Mimetype: "<< d->mimeSrc << endl;
545 kdDebug(7024) << "Dest Mimetype: "<< d->mimeDest << endl;
546}
547
548
549RenameDlg_Result TDEIO::open_RenameDlg( const TQString & _caption,
550 const TQString & _src, const TQString & _dest,
551 RenameDlg_Mode _mode,
552 TQString& _new,
553 TDEIO::filesize_t sizeSrc,
554 TDEIO::filesize_t sizeDest,
555 time_t ctimeSrc,
556 time_t ctimeDest,
557 time_t mtimeSrc,
558 time_t mtimeDest)
559{
560 Q_ASSERT(tdeApp);
561
562 RenameDlg dlg( 0L, _caption, _src, _dest, _mode,
563 sizeSrc, sizeDest, ctimeSrc, ctimeDest, mtimeSrc, mtimeDest,
564 true /*modal*/ );
565 int i = dlg.exec();
566 _new = dlg.newDestURL().path();
567
568 return (RenameDlg_Result)i;
569}
570
571#include "renamedlg.moc"
572
573
574
575
576
KMimeType::findByURL
static Ptr findByURL(const KURL &_url, mode_t _mode=0, bool _is_local_file=false, bool _fast_mode=false)
Finds a KMimeType with the given _url.
Definition: kmimetype.cpp:165
KMimeType::defaultMimeType
static const TQString & defaultMimeType()
Returns the name of the default mimetype.
Definition: kmimetype.cpp:1160
KMimeType::pixmapForURL
static TQPixmap pixmapForURL(const KURL &_url, mode_t _mode=0, TDEIcon::Group _group=TDEIcon::Desktop, int _force_size=0, int _state=0, TQString *_path=0L)
Convenience method to find the pixmap for a URL.
Definition: kmimetype.cpp:489
RenameDlgPlugin
This is the base class for all RenameDlg plugins.
Definition: renamedlgplugin.h:35
RenameDlgPlugin::initialize
virtual bool initialize(TDEIO::RenameDlg_Mode, const TQString &, const TQString &, const TQString &, const TQString &, TDEIO::filesize_t, TDEIO::filesize_t, time_t, time_t, time_t, time_t)
This function will be called by RenameDlg.
Definition: renamedlgplugin.h:46
TDEIO::RenameDlg
A dialog for the options to rename two files.
Definition: renamedlg.h:49
TDEIO::RenameDlg::newDestURL
KURL newDestURL()
Definition: renamedlg.cpp:411
TDEIO::RenameDlg::suggestName
static TQString suggestName(const KURL &baseURL, const TQString &oldName)
Given a directory path and a filename (which usually exists already), this function returns a suggest...
Definition: renamedlg.cpp:440
TDEIO::RenameDlg::b0Pressed
void b0Pressed()
KDE4: rename to cancelPressed(), renamePressed() etc.
Definition: renamedlg.cpp:419
TDETrader::query
virtual OfferList query(const TQString &servicetype, const TQString &constraint=TQString::null, const TQString &preferences=TQString::null) const
The main function in the TDETrader class.
Definition: ktrader.cpp:106
TDETrader::self
static TDETrader * self()
This is a static pointer to a TDETrader instance.
Definition: ktrader.cpp:90
TDETrader::OfferList
TQValueList< KService::Ptr > OfferList
A list of services.
Definition: ktrader.h:92
TDEIO
A namespace for TDEIO globals.
Definition: authinfo.h:29
TDEIO::number
TDEIO_EXPORT TQString number(TDEIO::filesize_t size)
Converts a size to a string representation Not unlike TQString::number(...)
Definition: global.cpp:96
TDEIO::convertSize
TDEIO_EXPORT TQString convertSize(TDEIO::filesize_t size)
Converts size from bytes to the string representation.
Definition: global.cpp:53
TDEIO::encodeFileName
TDEIO_EXPORT TQString encodeFileName(const TQString &str)
Encodes (from the text displayed to the real filename) This translates % into %% and / into ∕ (U+2215...
Definition: global.cpp:165
TDEIO::decodeFileName
TDEIO_EXPORT TQString decodeFileName(const TQString &str)
Decodes (from the filename to the text displayed) This translates %2[fF] into /, %% into %,...
Definition: global.cpp:191
TDEIO::RenameDlg_Result
RenameDlg_Result
The result of open_RenameDlg().
Definition: renamedlg.h:40
TDEIO::filesize_t
TQ_ULLONG filesize_t
64-bit file size
Definition: global.h:39

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdeio by doxygen 1.9.4
This website is maintained by Timothy Pearson.