summaryrefslogtreecommitdiffstats
path: root/kbabel/catalogmanager/catalogmanagerview.h
blob: e4421973cbef3a58754b1ec2d9e7f5e6892e09f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
/* ****************************************************************************
  This file is part of KBabel

  Copyright (C) 1999-2000 by Matthias Kiefer
                            <matthias.kiefer@gmx.de>
                2001-2004 by Stanislav Visnovsky <visnovsky@kde.org>
  Copyright (C) 2005, 2006 by Nicolas GOUTTE <goutte@kde.org>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

  In addition, as a special exception, the copyright holders give
  permission to link the code of this program with any edition of
  the Qt library by Trolltech AS, Norway (or with modified versions
  of Qt that use the same license as Qt), and distribute linked
  combinations including the two.  You must obey the GNU General
  Public License in all respects for all of the code used other than
  Qt. If you modify this file, you may extend this exception to
  your version of the file, but you are not obligated to do so.  If
  you do not wish to do so, delete this exception statement from
  your version.

**************************************************************************** */
#ifndef CATALOGMANAGERVIEW_H
#define CATALOGMANAGERVIEW_H

#include <qdict.h>
#include <qlistview.h>
#include <qdatetime.h>
#include <qtimer.h>
#include <qfileinfo.h>
#include <qguardedptr.h>

#include <kdialogbase.h>
#include <kdirwatch.h>
#include <kprocess.h>
#include <qptrlist.h>

#include "kbproject.h"
#include "projectsettings.h"
#include "findoptions.h"
#include "cvsresources.h"
#include "svnresources.h"

class CatManListItem;
class QPixmap;
class QPopupMenu;
class KBabelDictBox;
class CatManPreferences;
class QTextEdit;
class KProgress;
class KConfig;
class KDataToolInfo;
class ValidateProgressDialog;
class CVSHandler;
class SVNHandler;
class MarkPatternDialog;
class ValidationOptions;

namespace KBabel
{
    class KBabelMailer;
    class PoInfo;
}

class CatalogManagerView : public QListView
{
   Q_OBJECT
public:
   CatalogManagerView(KBabel::Project::Ptr project, QWidget* parent=0, const char* name=0);
   virtual ~CatalogManagerView();

   KBabel::CatManSettings settings() const;
   /** clears the tree */
   virtual void clear();

   /** pauses the update timer */
   void pause(bool);

   /** if file fileWithPath exists in the treeview, this is updated */
   void updateFile(QString fileWithPath, bool force = false);

   void updateAfterSave(QString fileWithPath, KBabel::PoInfo &info);

   bool isActive() const {return _active;}
   bool isStopped() const {return _stop;}

   void restoreView(KConfig *config);
   void saveView(KConfig *config) const;

   void setRMBMenuFile( QPopupMenu *m);
   void setRMBMenuDir( QPopupMenu *m);
   void setDirCommandsMenu( QPopupMenu *m);
   void setFileCommandsMenu( QPopupMenu *m);

   CVSHandler * cvsHandler();
   SVNHandler * svnHandler();

public slots:
   void setSettings(KBabel::CatManSettings newSettings);
   void toggleMark();
   /**
   * removes all marks in directory of current item (must be a directory)
   */
   void slotClearMarksInDir();
   void clearAllMarks();
   void toggleAllMarks();
   void markModifiedFiles();
   void loadMarks();
   void saveMarks();
   void slotMarkPattern( );
   void slotUnmarkPattern( );
   /**
   * traverses all childs in the directory of the current item
   * (including all subdirectories) and displays some statistics
   * about the translations. If the item is a file, its
   * parent directory is used instead.
   */
   void statistics();
   /**
   * traverses all marked childs in the directory of the current item
   * (including all subdirectories) and displays some statistics
   * about the translations. If the item is a file, its
   * parent directory is used instead.
   */
   void markedStatistics();
   /**
	* calls @ref Msgfmt::checkSyntax, to check the po-file of
	* the selected item
	*/
   void checkSyntax();

   void roughTranslation();
   void markedRoughTranslation();

   /** Send the selected item as a compressed mail attachment. If the
    *  selected item is a directory send the items contained in the
    *  directory.
    */
   void mailFiles();
   /** Send the marked items as a compressed mail attachment.
    */
   void mailMarkedFiles();

   void packageFiles();
   void packageMarkedFiles();

   void cvsUpdate( );
   void cvsUpdateMarked( );
   void cvsCommit( );
   void cvsCommitMarked( );
   void cvsStatus( );
   void cvsStatusMarked( );
   void cvsUpdateTemplate( );
   void cvsUpdateMarkedTemplate( );
   void cvsCommitTemplate( );
   void cvsCommitMarkedTemplate( );
   void cvsDiff( );

   void svnUpdate( );
   void svnUpdateMarked( );
   void svnCommit( );
   void svnCommitMarked( );
   void svnStatusRemote();
   void svnStatusRemoteMarked();
   void svnStatusLocal();
   void svnStatusLocalMarked();
   void svnUpdateTemplate( );
   void svnUpdateMarkedTemplate( );
   void svnCommitTemplate( );
   void svnCommitMarkedTemplate( );
   void svnDiff( );
   void svnInfo();
   void svnInfoMarked();

   QString find(KBabel::FindOptions &options, QStringList &rest);

   void showLog();

   void stop(bool s = true);

   /**
   * Stop searching, do not try to proceed to the next file
   * @ref @find will return clear list of rest to be searched
   * and @ref QString::null, if search string was not is the last searched file
   */
   void stopSearch();

   /**
   * Information for this file has been read. If the file is in
   * @ref @_readInfoFileList, it will update progress bar by emitting @ref @progress
   */
   void fileInfoRead( QString file );

   void gotoNextUntranslated();
   void gotoPreviousUntranslated();
   void gotoNextFuzzy();
   void gotoPreviousFuzzy();
   void gotoNextFuzzyOrUntranslated();
   void gotoPreviousFuzzyOrUntranslated();
   void gotoNextError();
   void gotoPreviousError();
   void gotoNextTemplate();
   void gotoPreviousTemplate();
   void gotoNextPo();
   void gotoPreviousPo();
   void gotoNextMarked();
   void gotoPreviousMarked();

   void validateUsingTool( const KDataToolInfo &, const QString& );
   void validateMarkedUsingTool( const KDataToolInfo &, const QString& );

   void showError( const QString package, const int num);

   void updateCurrent();

   /**
    * An update for more than one file has become necessary. For instance
    * after 'cvs commit' or 'svn commit' the file contents have not changed
    * but the CVS/SVN file status could have changed.
    */
   void updateFiles( const QStringList& files );

   /**
   * Returns the list of all currently selected files. If current selection is dir,
   * it returns list of all its children.
   */
   QStringList current();
   /**
   * Returns the list of all currently marked files.
   */
   QStringList marked();

signals:
   void openFile(QString filename,QString package);
   void openFileInNewWindow(QString filename,QString package);
   void openTemplate(QString openFilename,QString saveFileName,QString package);
   void openTemplateInNewWindow(QString openFilename,QString saveFileName,QString package);
   void gotoFileEntry(QString filename,QString package,int msgid);
   void prepareProgressBar(QString msg,int max);
   void progress(int);
   void clearProgressBar();
   void prepareFindProgressBar(int max);
   void signalBuildTree(bool done);
   void signalSearchedFile(int count);

   void newValidationFile(QString);
   void newValidationTool(QString);
   void setValidationProgressBar(int);
   void advanceValidationFileProgressBar(int);
   void setMaxValidationProgressBar(int);
   void setMaxValidationFileProgressBar(int);

   /**
    * The selected item in the tree view has changed.
    * This signal emits the corresponding action value for this item.
    * @param actionValue Action value for the selected item.
    */
   void selectedChanged(uint actionValue);

signals:
   void updateFinished();

protected:
   /**
   * builds the tree under dir relDir, but does not update any files
   * this functions always traverses all subdirs
   *
   * @param relDir the relative dir under the po- and pot- base directories
   * @param fast if true, no files will be updated
   *
   * @return true, if the directory contains any po or pot-files
   * @see CatalogManagerView::buildDir
   * @see CatalogManagerView::updateDir
   */
   bool buildDir(QString relDir,bool fast=true);

   /**
   * This function is traversing the real directory on the
   * disc using baseDir as the
   * base directory and starts at baseDir+relDir
   * @param extension the extension of the files in this directory
   * @param fast if true, no file will be updated
   *
   * @return true, if the directory contains any po or pot-files
   * @see CatalogManagerView::buildDir
   * @see CatalogManagerView::updateDir
   */
   bool buildDir(const QString& baseDir,const QString& relDir, const QString extension,bool fast=true);

   /**
   * updates dir relDir and if any new subdir is added
   * builds this with @ref buildDir
   *
   * This function doesn't enters subdirs except when a new subdir is added.
   * @see CatalogManagerView::buildDir
   */
   void updateDir(QString relDir);

   /**
   * stops the update timer and the dirwatch
   * @see KDirWatch::stop
   * @see QTimer::stop
   */
   virtual void hideEvent(QHideEvent*);
   /**
   * restarts the update timer and the dirwatch
   * @see KDirWatch::start
   * @see QTimer::start
   */
   virtual void showEvent(QShowEvent*);

   /** used for dragging */
   virtual void contentsMousePressEvent(QMouseEvent* e);
   /** used for dragging */
   virtual void contentsMouseMoveEvent(QMouseEvent* e);

   void showStatistics( CatManListItem *i, QStringList &packages);

protected slots:
   /** rebuilds the tree*/
   void buildTree();
   /**
   * recurse all visible files and updates them if necessary
   * @see CatManListItem::checkUpdate
   */
   void checkUpdate();

   /** this is called from KDirWatch when a directory has changed */
   void directoryChanged(const QString& dir);
   /** this is called from KDirWatch when a directory has been deleted */
   void directoryDeleted(const QString& dir);

   void showContentsMenu(QListViewItem *, const QPoint &, int col);
   /** does the default action on the currently selected item*/
   void activateItem(QListViewItem *);
   /** emits the state of the selected item using selectedChanged*/
   void checkSelected();
   /** calls @ref activateItem with the selected item as argument*/
   void slotOpenFile();
   void slotOpenFileInNewWindow();
   /** emits signal @ref openTemplate */
   void slotOpenTemplate();
   /** deletes the po-file on the disc, that belongs to the selected item */
   void slotDeleteFile();
   /** toggles the mark of the selected item */
   void slotToggleMark();
   /**
   * toggles all marks in directory of current item (must be a directory)
   */
   void slotToggleMarksInDir();
   void slotDirCommand(int);
   void slotFileCommand(int);

private slots:
   void showOutput(KProcess *proc, char *buffer, int buflen);
   void processEnded(KProcess *proc);
   void columnClicked(QListViewItem * item, const QPoint & pnt, int c);

   void slotToggleCVSOrSVNColumn( bool );

   void slotValidPOCVSRepository( bool );
   void slotValidPOSVNRepository( bool );
   void slotValidPOTCVSRepository( bool );
   void slotValidPOTSVNRepository( bool );

private:
   void toggleColumn( uint id, bool show);

   void readMarker(KConfig *config);
   void saveMarker(KConfig *config) const;
   /**
   * remove marked entries, which are not in the current file list
   */
   void updateMarkerList();

   /**
    * Mark or unmark entries.
    *
    * @param mark If true the items are marked, if false the marks are removed.
    */
   void setPatternMarks(bool mark);

   /**
	* deletes item with package name (relative directory) relDir
	* and makes sure, that all subitems are removed from the lists
	*/
   void deleteDirItem(QString relDir);

   bool hasMatchingWords( QStringList &itemWords, QStringList &searchWords);

   CatManListItem *itemBelow( CatManListItem *item );
   CatManListItem *itemAbove( CatManListItem *item );

   void validate_internal( const QStringList&, const KDataToolInfo &, const QString& );

   void doCVSCommand( CVS::Command cmd, bool marked = false, bool templates = false );
   void doSVNCommand( SVN::Command cmd, bool marked = false, bool templates = false );

private:
   QDict<CatManListItem> _dirList;
   QDict<CatManListItem> _fileList;

   KDirWatch *_dirWatch;
   QTimer *_updateTimer;

   // list of files for which was calculated the progress bar for reading file info
   QStringList _readInfoFileList;
   // current count of already read files in @ref @_readInfoFileList.
   int _readInfoCount;

   KBabel::CatManSettings _settings;

   QStringList _markerList;

   bool _active;
   // stopping, application quit
   bool _stop;
   // stop searching, do not proceed to the next file
   bool _stopSearch;
   int _updateNesting;

   QPtrList<KProcess> _pendingProcesses;

   QTextEdit* _logView;
   KDialogBase* _logWindow;
   QPopupMenu* _fileContentsMenu;
   QPopupMenu* _dirContentsMenu;
   QPopupMenu* _dirCommandsMenu;
   QPopupMenu* _fileCommandsMenu;

   /** used for starting a drag */
   QPoint _pressPos;

   KBabelDictBox* _dictBox;

   KBabel::KBabelMailer* mailer;

   CVSHandler* cvshandler;
   SVNHandler* svnhandler;

   /// Is the PO path a valid CVS repository?
   bool m_validPOCVSRepository;
   /// Is the POT path a valid CVS repository?
   bool m_validPOTCVSRepository;
   /// Is the PO path a valid SVN repository?
   bool m_validPOSVNRepository;
   /// Is the POT path a valid SVN repository?
   bool m_validPOTSVNRepository;

   MarkPatternDialog * markPatternDialog;

   //validation
   ValidateProgressDialog* _validateDialog;
   ValidationOptions* _validateOptions;
   KDialogBase* _validateOptionsDlg;
   bool _markAsFuzzy;
   bool _ignoreFuzzy;

   KBabel::Project::Ptr _project;
};

#endif // CATALOGMANAGERVIEW_H