File indexing completed on 2024-04-21 16:32:31
0001 /*************************************************************************** 0002 krenamefile.h - description 0003 ------------------- 0004 begin : Wed Apr 18 2007 0005 copyright : (C) 2007 by Dominik Seichter 0006 email : domseichter@web.de 0007 ***************************************************************************/ 0008 0009 /*************************************************************************** 0010 * * 0011 * This program is free software; you can redistribute it and/or modify * 0012 * it under the terms of the GNU General Public License as published by * 0013 * the Free Software Foundation; either version 2 of the License, or * 0014 * (at your option) any later version. * 0015 * * 0016 ***************************************************************************/ 0017 0018 #ifndef KRENAME_FILE_H 0019 #define KRENAME_FILE_H 0020 0021 #include <QVector> 0022 0023 #include <kfileitem.h> 0024 #include <QUrl> 0025 #include <QPixmap> 0026 0027 #include <kio/pixmaploader.h> 0028 0029 class KFileItem; 0030 0031 /** An enum to describe the mode to split 0032 * filename and extension. 0033 */ 0034 enum ESplitMode { 0035 eSplitMode_FirstDot, ///< Extension starts at the first dot found in the filename 0036 eSplitMode_LastDot, ///< Extension starts at the last dot found in the filename 0037 eSplitMode_NoExtension, ///< Do not use file extension handling 0038 eSplitMode_CustomDot ///< Extension starts at a user defined dot in the filename 0039 }; 0040 0041 /** 0042 * Type of manual change made. 0043 * Specifies on what kind of filename, the manual changes are based. 0044 */ 0045 enum EManualChangeMode { 0046 eManualChangeMode_None, ///< Use filename created by KRename 0047 eManualChangeMode_Input, ///< Use custom filename, based on input filename 0048 eManualChangeMode_Custom ///< Use custom filename 0049 }; 0050 0051 class KRenameFile 0052 { 0053 struct TFileDescription { 0054 QString filename; 0055 QString extension; 0056 QString directory; 0057 0058 QUrl url; 0059 0060 const TFileDescription &operator=(const TFileDescription &rhs) 0061 { 0062 filename = rhs.filename; 0063 extension = rhs.extension; 0064 directory = rhs.directory; 0065 url = rhs.url; 0066 0067 return *this; 0068 } 0069 }; 0070 0071 public: 0072 0073 /** A list of KRenameFile objects 0074 */ 0075 typedef QVector<KRenameFile> List; 0076 0077 /** Empty default constructor 0078 * which creates an invalid KRenameFile. 0079 * 0080 * \see isValid 0081 */ 0082 KRenameFile() 0083 : m_bValid(false) 0084 { 0085 } 0086 0087 /** Construct a new KRenameFile from an url. 0088 * 0089 * The url is expected to exist and is not 0090 * tested for existence. This is much faster than 0091 * the other constructor. 0092 * 0093 * \param src an url of a file or directory 0094 * \param directory must be true if the url referes 0095 * to a directory. 0096 * \param eSplitMode splitmode which is used to separate 0097 * filename and extension 0098 * \param dot dot to use as separator for eSplitMode_CustomDot 0099 */ 0100 KRenameFile(const QUrl &src, bool directory, ESplitMode eSplitMode, unsigned int dot); 0101 0102 /** Construct a new KRenameFile form a KFileItem which is faster 0103 * than construction from an URL. 0104 * 0105 * \param item a KFileItem 0106 * \param eSplitMode splitmode which is used to separate 0107 * filename and extension 0108 * \param dot dot to use as separator for eSplitMode_CustomDot 0109 */ 0110 0111 KRenameFile(const QUrl &src, ESplitMode eSplitMode, unsigned int dot); 0112 0113 KRenameFile(const KFileItem &item, ESplitMode eSplitMode, unsigned int dot); 0114 0115 /** Copy constructor 0116 * \param rhs KRenameFile to copy 0117 */ 0118 KRenameFile(const KRenameFile &rhs); 0119 0120 /** Set the splitmode to separate filename from fileextension 0121 * 0122 * \param eSplitMode splitmode which is used to separate 0123 * filename and extension 0124 * \param dot dot to use as separator for eSplitMode_CustomDot 0125 * 0126 * \see srcFilename() 0127 * \see srcExtension() 0128 */ 0129 void setCurrentSplitMode(ESplitMode eSplitMode, unsigned int dot = 1); 0130 0131 /** 0132 * \returns the number of dots in this filename that can be used to separate filename and extension 0133 */ 0134 int dots() const; 0135 0136 /** Convert the KRenameFile into a string 0137 * that can be displayed to the user. 0138 * 0139 * \returns original source url as string representation 0140 */ 0141 inline const QString toString() const 0142 { 0143 return m_src.url.toDisplayString(QUrl::PreferLocalFile); 0144 } 0145 0146 /** Get a preview icon of the KRenameFile 0147 * 0148 * @returns a QPixmap containing a preview of this KRenameFile. 0149 * This might be only a mimetype icon depending on the current KDE settings. 0150 */ 0151 inline const QPixmap &icon() const 0152 { 0153 if (m_icon.isNull()) { 0154 const_cast<KRenameFile *>(this)->loadPreviewIcon(); 0155 } 0156 0157 return m_icon; 0158 } 0159 0160 /** Set the preview icon of the KRenameFile 0161 * 0162 * @param icon a preview icon. 0163 * 0164 * This method is only here for performance reason 0165 * to easily and fast set the icon from one 0166 * KRenameFile onto another. 0167 * 0168 * Normally KRenameFile knows how to load the icon itself. 0169 */ 0170 inline void setIcon(const QPixmap &icon) 0171 { 0172 m_icon = icon; 0173 } 0174 0175 /** Set this error code to value != 0 0176 * if an error has occurred during renaming this 0177 * particular file. 0178 * 0179 * @param error an error code (0 means no error) 0180 */ 0181 inline void setError(int error) 0182 { 0183 m_error = error;; 0184 } 0185 0186 /** 0187 * @returns true if an error code was set for this KRenameFile 0188 */ 0189 inline bool hasError() const 0190 { 0191 return m_error != 0; 0192 } 0193 0194 /** Assigns another KRenameFile to this KRenameFile 0195 * \param rhs object to assign 0196 */ 0197 const KRenameFile &operator=(const KRenameFile &rhs); 0198 0199 /** Compare a KRenameFile object to a KFileItem 0200 * 0201 * \returns true if the file item of this KRenameFile 0202 * is identical to the parameter 0203 */ 0204 bool operator==(const KFileItem &item) const; 0205 0206 /** 0207 * \returns true if this file references 0208 * an existing file or directory 0209 */ 0210 inline bool isValid() const 0211 { 0212 return m_bValid; 0213 } 0214 0215 /** 0216 * \returns manualChanges the user has made to the filename 0217 */ 0218 inline const QString &manualChanges() const 0219 { 0220 return m_manual; 0221 } 0222 0223 /** 0224 * Sets manual changes made by the user 0225 * 0226 * \param manual manual changes for filename and extension 0227 * \param mode mode of change 0228 */ 0229 inline void setManualChanges(const QString &manual, EManualChangeMode mode) 0230 { 0231 m_manual = manual; 0232 m_manualMode = mode; 0233 } 0234 0235 /** 0236 * \returns the change mode 0237 */ 0238 inline EManualChangeMode manualChangeMode() const 0239 { 0240 return m_manualMode; 0241 } 0242 0243 /** 0244 * \returns always the original source directory 0245 */ 0246 inline const QString &realSrcDirectory() const 0247 { 0248 return m_src.directory; 0249 } 0250 0251 inline void setOverrideSrcDirectory(const QString &dir) 0252 { 0253 m_overrideDir = dir; 0254 } 0255 0256 inline const QString &srcFilename() const 0257 { 0258 return m_src.filename; 0259 } 0260 0261 inline const QString &srcExtension() const 0262 { 0263 return m_src.extension; 0264 } 0265 0266 inline const QString &srcDirectory() const 0267 { 0268 return (m_overrideDir.isNull() ? m_src.directory : m_overrideDir); 0269 } 0270 0271 const QUrl srcUrl() const; 0272 0273 inline void setDstFilename(const QString &filename) 0274 { 0275 m_dst.filename = filename; 0276 } 0277 0278 inline const QString &dstFilename() const 0279 { 0280 return m_dst.filename; 0281 } 0282 0283 inline void setDstExtension(const QString &extension) 0284 { 0285 m_dst.extension = extension; 0286 } 0287 0288 inline const QString &dstExtension() const 0289 { 0290 return m_dst.extension; 0291 } 0292 0293 inline void setDstDirectory(const QString &directory) 0294 { 0295 m_dst.directory = directory; 0296 } 0297 0298 inline const QString &dstDirectory() const 0299 { 0300 return m_dst.directory; 0301 } 0302 0303 inline void setDstUrl(const QUrl &url) 0304 { 0305 m_dst.url = url; 0306 } 0307 0308 inline const QUrl &dstUrl() const 0309 { 0310 return m_dst.url; 0311 } 0312 0313 inline bool isDirectory() const 0314 { 0315 return m_bDirectory; 0316 } 0317 0318 /** 0319 * Get access to the internal file item 0320 * 0321 * @returns a KFileItem 0322 */ 0323 const KFileItem &fileItem() const; 0324 0325 /** 0326 * Set the icon (preview) size 0327 * 0328 * @param size the icon size 0329 */ 0330 static void setIconSize(int size); 0331 /** 0332 * @returns the icon size 0333 */ 0334 static int iconSize(); 0335 /** 0336 * @returns the default icon size 0337 */ 0338 static int getDefaultIconSize(); 0339 0340 private: 0341 void initFileDescription(TFileDescription &rDescription, const QUrl &url, ESplitMode eSplitMode, unsigned int dot) const; 0342 0343 /** Load a preview icon for this KRenameFile object 0344 * using KDEs preview loading mechanism. 0345 */ 0346 void loadPreviewIcon(); 0347 0348 static const int DEFAULT_ICON_SIZE; 0349 static const char *EXTRA_DATA_KEY; 0350 0351 private: 0352 KFileItem m_fileItem; 0353 static int m_iconSize; 0354 0355 TFileDescription m_src; 0356 TFileDescription m_dst; 0357 0358 QString m_overrideDir; ///< A changed sourcedirectory (required when renaming directories) 0359 0360 bool m_bDirectory; ///< If true this is a directory 0361 bool m_bValid; ///< If true this item is valid 0362 0363 QPixmap m_icon; ///< This is the file preview icon 0364 0365 int m_error; ///< This value is set to != 0 if an error occurred during renaming 0366 QString m_manual; ///< Manual changes to the filename+extension by the user are stored here 0367 EManualChangeMode m_manualMode; 0368 }; 0369 0370 #endif // KRENAME_FILE_H