| 1 | /* |
| 2 | This file is part of the KDE libraries |
| 3 | SPDX-FileCopyrightText: 2000-2005 David Faure <faure@kde.org> |
| 4 | |
| 5 | SPDX-License-Identifier: LGPL-2.0-only |
| 6 | */ |
| 7 | #ifndef __kbookmark_h |
| 8 | #define __kbookmark_h |
| 9 | |
| 10 | #include <kbookmarks_export.h> |
| 11 | |
| 12 | #include <QDomElement> |
| 13 | #include <QList> |
| 14 | #include <QMetaType> |
| 15 | #include <QString> |
| 16 | #include <QUrl> |
| 17 | |
| 18 | class QMimeData; |
| 19 | class KBookmarkGroup; |
| 20 | |
| 21 | /*! |
| 22 | * \class KBookmark |
| 23 | * \inmodule KBookmarks |
| 24 | * |
| 25 | * \brief A class representing a bookmark. |
| 26 | */ |
| 27 | class KBOOKMARKS_EXPORT KBookmark |
| 28 | { |
| 29 | friend class KBookmarkGroup; |
| 30 | |
| 31 | public: |
| 32 | /*! |
| 33 | * \value OverwriteMetaData |
| 34 | * \value DontOverwriteMetaData |
| 35 | */ |
| 36 | enum MetaDataOverwriteMode { |
| 37 | OverwriteMetaData, |
| 38 | DontOverwriteMetaData, |
| 39 | }; |
| 40 | |
| 41 | /*! |
| 42 | * \inmodule KBookmarks |
| 43 | * KBookmark::List is a QList that contains bookmarks with a few |
| 44 | * convenience methods. |
| 45 | * \sa KBookmark |
| 46 | * \sa QList |
| 47 | */ |
| 48 | class KBOOKMARKS_EXPORT List : public QList<KBookmark> |
| 49 | { |
| 50 | public: |
| 51 | /*! |
| 52 | */ |
| 53 | List(); |
| 54 | |
| 55 | /*! |
| 56 | * Adds this list of bookmark into the given QMimeData. |
| 57 | * |
| 58 | * \a mimeData the QMimeData instance used to drag or copy this bookmark |
| 59 | */ |
| 60 | void populateMimeData(QMimeData *mimeData) const; |
| 61 | |
| 62 | /*! |
| 63 | * Return true if \a mimeData contains bookmarks |
| 64 | */ |
| 65 | static bool canDecode(const QMimeData *mimeData); |
| 66 | |
| 67 | /*! |
| 68 | * Return the list of mimeTypes that can be decoded by fromMimeData |
| 69 | */ |
| 70 | static QStringList mimeDataTypes(); |
| 71 | |
| 72 | /*! |
| 73 | * Extract a list of bookmarks from the contents of \a mimeData. |
| 74 | * Decoding will fail if \a mimeData does not contain any bookmarks. |
| 75 | * |
| 76 | * \a mimeData the mime data to extract from; cannot be 0 |
| 77 | * |
| 78 | * \a parentDocument pass an empty QDomDocument here, it will be used as |
| 79 | * container for the bookmarks. You just need to make sure it stays alive longer |
| 80 | * (or just as long) as the returned bookmarks. |
| 81 | * |
| 82 | * Returns the list of bookmarks |
| 83 | * \since 4.3.2 |
| 84 | */ |
| 85 | static KBookmark::List fromMimeData(const QMimeData *mimeData, QDomDocument &parentDocument); |
| 86 | }; |
| 87 | |
| 88 | /*! |
| 89 | * Constructs a null bookmark, i.e. a bookmark for which isNull() returns true |
| 90 | * If you want to create a new bookmark use eitehr KBookmarkGroup.addBookmark |
| 91 | * or if you want an interactive dialog use KBookmarkDialog. |
| 92 | */ |
| 93 | KBookmark(); |
| 94 | |
| 95 | /*! |
| 96 | * Creates the KBookmark wrapper for \a elem |
| 97 | * Mostly for internal usage. |
| 98 | */ |
| 99 | explicit KBookmark(const QDomElement &elem); |
| 100 | |
| 101 | /*! |
| 102 | * Creates a stand alone bookmark. This is fairly expensive since a new QDom Tree is build. |
| 103 | */ |
| 104 | static KBookmark standaloneBookmark(const QString &text, const QUrl &url, const QString &icon); |
| 105 | |
| 106 | /*! |
| 107 | * Whether the bookmark is a group or a normal bookmark |
| 108 | */ |
| 109 | bool isGroup() const; |
| 110 | |
| 111 | /*! |
| 112 | * Whether the bookmark is a separator |
| 113 | */ |
| 114 | bool isSeparator() const; |
| 115 | |
| 116 | /*! |
| 117 | * Returns true if this is a null bookmark. This will never |
| 118 | * be the case for a real bookmark (in a menu), but it's used |
| 119 | * for instance as the end condition for KBookmarkGroup::next() |
| 120 | */ |
| 121 | bool isNull() const; |
| 122 | |
| 123 | /*! |
| 124 | * Returns true if bookmark is contained by a QDomDocument, |
| 125 | * if not it is most likely that it has become separated and |
| 126 | * is thus invalid and/or has been deleted from the bookmarks. |
| 127 | */ |
| 128 | bool hasParent() const; |
| 129 | |
| 130 | /*! |
| 131 | * Text shown for the bookmark |
| 132 | * If bigger than 40, the text is shortened by |
| 133 | * replacing middle characters with "..." (see KStringHandler::csqueeze) |
| 134 | */ |
| 135 | QString text() const; |
| 136 | /*! |
| 137 | * Text shown for the bookmark, not truncated. |
| 138 | * You should not use this - this is mainly for keditbookmarks. |
| 139 | */ |
| 140 | QString fullText() const; |
| 141 | /*! |
| 142 | * Set the text shown for the bookmark. |
| 143 | * |
| 144 | * \a fullText the new bookmark title |
| 145 | */ |
| 146 | void setFullText(const QString &fullText); |
| 147 | /*! |
| 148 | * URL contained by the bookmark |
| 149 | */ |
| 150 | QUrl url() const; |
| 151 | /*! |
| 152 | * Set the URL of the bookmark |
| 153 | * |
| 154 | * \a url the new bookmark URL |
| 155 | */ |
| 156 | void setUrl(const QUrl &url); |
| 157 | |
| 158 | /*! |
| 159 | * Returns the pixmap file for this bookmark |
| 160 | * (i.e. the name of the icon) |
| 161 | */ |
| 162 | QString icon() const; |
| 163 | |
| 164 | /*! |
| 165 | * Set the icon name of the bookmark |
| 166 | * |
| 167 | * \a icon the new icon name for this bookmark |
| 168 | */ |
| 169 | void setIcon(const QString &icon); |
| 170 | |
| 171 | /*! |
| 172 | * Returns Description of the bookmark |
| 173 | * \since 4.4 |
| 174 | */ |
| 175 | QString description() const; |
| 176 | |
| 177 | /*! |
| 178 | * Set the description of the bookmark |
| 179 | * |
| 180 | * \a description |
| 181 | * \since 4.4 |
| 182 | */ |
| 183 | void setDescription(const QString &description); |
| 184 | |
| 185 | /*! |
| 186 | * Returns Mime-Type of this item |
| 187 | * \since 4.1 |
| 188 | */ |
| 189 | QString mimeType() const; |
| 190 | |
| 191 | /*! |
| 192 | * Set the Mime-Type of this item |
| 193 | * \since 4.1 |
| 194 | */ |
| 195 | void setMimeType(const QString &mimeType); |
| 196 | |
| 197 | /*! |
| 198 | * Returns if the bookmark should be shown in the toolbar |
| 199 | * (used by the filtered toolbar) |
| 200 | */ |
| 201 | bool showInToolbar() const; |
| 202 | |
| 203 | /*! |
| 204 | * Set whether this bookmark is show in a filterd toolbar |
| 205 | */ |
| 206 | void setShowInToolbar(bool show); |
| 207 | |
| 208 | /*! |
| 209 | * Returns the group containing this bookmark |
| 210 | */ |
| 211 | KBookmarkGroup parentGroup() const; |
| 212 | |
| 213 | /*! |
| 214 | * Convert this to a group - do this only if |
| 215 | * isGroup() returns true. |
| 216 | */ |
| 217 | KBookmarkGroup toGroup() const; |
| 218 | |
| 219 | /*! |
| 220 | * Return the "address" of this bookmark in the whole tree. |
| 221 | * This is used when telling other processes about a change |
| 222 | * in a given bookmark. The encoding of the address is "/4/2", for |
| 223 | * instance, to designate the 2nd child inside the 4th child of the |
| 224 | * root bookmark. |
| 225 | */ |
| 226 | QString address() const; |
| 227 | |
| 228 | /*! |
| 229 | * Return the position in the parent, i.e. the last number in the address |
| 230 | */ |
| 231 | int positionInParent() const; |
| 232 | |
| 233 | /*! |
| 234 | * \internal for KEditBookmarks |
| 235 | */ |
| 236 | QDomElement internalElement() const; |
| 237 | |
| 238 | /*! |
| 239 | * Updates the bookmarks access metadata |
| 240 | * Call when a user accesses the bookmark |
| 241 | */ |
| 242 | void updateAccessMetadata(); |
| 243 | |
| 244 | // Utility functions (internal) |
| 245 | |
| 246 | /*! |
| 247 | * Returns address of parent |
| 248 | */ |
| 249 | static QString parentAddress(const QString &address); |
| 250 | |
| 251 | /*! |
| 252 | * Returns position in parent (e.g. /4/5/2 -> 2) |
| 253 | */ |
| 254 | static uint positionInParent(const QString &address); |
| 255 | |
| 256 | /*! |
| 257 | * Returns address of previous sibling (e.g. /4/5/2 -> /4/5/1) |
| 258 | * Returns QString() for a first child |
| 259 | */ |
| 260 | static QString previousAddress(const QString &address); |
| 261 | |
| 262 | /*! |
| 263 | * Returns address of next sibling (e.g. /4/5/2 -> /4/5/3) |
| 264 | * This doesn't check whether it actually exists |
| 265 | */ |
| 266 | static QString nextAddress(const QString &address); |
| 267 | |
| 268 | /*! |
| 269 | * Returns the common parent of both addresses which |
| 270 | * has the greatest depth |
| 271 | */ |
| 272 | static QString commonParent(const QString &A, const QString &B); |
| 273 | |
| 274 | /*! |
| 275 | * Returns the metadata container node for a certain metadata owner |
| 276 | * \since 4.1 |
| 277 | */ |
| 278 | QDomNode metaData(const QString &owner, bool create) const; |
| 279 | |
| 280 | /*! |
| 281 | * Get the value of a specific metadata item (owner = "http://www.kde.org"). |
| 282 | * \ |
| 283 | * a key Name of the metadata item |
| 284 | * |
| 285 | * Returns Value of the metadata item. QString() is returned in case |
| 286 | * the specified key does not exist. |
| 287 | */ |
| 288 | QString metaDataItem(const QString &key) const; |
| 289 | |
| 290 | /*! |
| 291 | * Change the value of a specific metadata item, or create the given item |
| 292 | * if it doesn't exist already (owner = "http://www.kde.org"). |
| 293 | * |
| 294 | * \a key Name of the metadata item to change |
| 295 | * |
| 296 | * \a value Value to use for the specified metadata item |
| 297 | * |
| 298 | * \a mode Whether to overwrite the item's value if it exists already or not. |
| 299 | */ |
| 300 | void setMetaDataItem(const QString &key, const QString &value, MetaDataOverwriteMode mode = OverwriteMetaData); |
| 301 | |
| 302 | /*! |
| 303 | * Adds this bookmark into the given QMimeData. |
| 304 | * |
| 305 | * \warning do not call this method multiple times, use KBookmark::List::populateMimeData instead. |
| 306 | * |
| 307 | * \a mimeData the QMimeData instance used to drag or copy this bookmark |
| 308 | */ |
| 309 | void populateMimeData(QMimeData *mimeData) const; |
| 310 | |
| 311 | /*! |
| 312 | * Comparison operator |
| 313 | */ |
| 314 | bool operator==(const KBookmark &rhs) const; |
| 315 | |
| 316 | protected: |
| 317 | QDomElement element; |
| 318 | // Note: you can't add new member variables here. |
| 319 | // The KBookmarks are created on the fly, as wrappers |
| 320 | // around internal QDomElements. Any additional information |
| 321 | // has to be implemented as an attribute of the QDomElement. |
| 322 | }; |
| 323 | |
| 324 | /*! |
| 325 | * \class KBookmarkGroup |
| 326 | * \inmodule KBookmarks |
| 327 | * \inheaderfile KBookmark |
| 328 | * |
| 329 | * A group of bookmarks |
| 330 | */ |
| 331 | class KBOOKMARKS_EXPORT KBookmarkGroup : public KBookmark |
| 332 | { |
| 333 | public: |
| 334 | /*! |
| 335 | * Create an invalid group. This is mostly for use in QList, |
| 336 | * and other places where we need a null group. |
| 337 | * Also used as a parent for a bookmark that doesn't have one |
| 338 | * (e.g. Netscape bookmarks) |
| 339 | */ |
| 340 | KBookmarkGroup(); |
| 341 | |
| 342 | /*! |
| 343 | * Create a bookmark group as specified by the given element |
| 344 | */ |
| 345 | KBookmarkGroup(const QDomElement &elem); |
| 346 | |
| 347 | /*! |
| 348 | * Returns true if the bookmark folder is opened in the bookmark editor |
| 349 | */ |
| 350 | bool isOpen() const; |
| 351 | |
| 352 | /*! |
| 353 | * Return the first child bookmark of this group |
| 354 | */ |
| 355 | KBookmark first() const; |
| 356 | /*! |
| 357 | * Return the previous sibling of a child bookmark of this group |
| 358 | * |
| 359 | * \a current has to be one of our child bookmarks. |
| 360 | */ |
| 361 | KBookmark previous(const KBookmark ¤t) const; |
| 362 | /*! |
| 363 | * Return the next sibling of a child bookmark of this group |
| 364 | * |
| 365 | * \a current has to be one of our child bookmarks. |
| 366 | */ |
| 367 | KBookmark next(const KBookmark ¤t) const; |
| 368 | |
| 369 | /*! |
| 370 | * Return the index of a child bookmark, -1 if not found |
| 371 | */ |
| 372 | int indexOf(const KBookmark &child) const; |
| 373 | |
| 374 | /*! |
| 375 | * Create a new bookmark folder, as the last child of this group |
| 376 | * |
| 377 | * \a text for the folder. |
| 378 | * |
| 379 | * If you want an dialog use KBookmarkDialog |
| 380 | */ |
| 381 | KBookmarkGroup createNewFolder(const QString &text); |
| 382 | /*! |
| 383 | * Create a new bookmark separator |
| 384 | * Don't forget to use KBookmarkManager::self()->emitChanged( parentBookmark ); |
| 385 | */ |
| 386 | KBookmark createNewSeparator(); |
| 387 | |
| 388 | /*! |
| 389 | * Create a new bookmark, as the last child of this group |
| 390 | * Don't forget to use KBookmarkManager::self()->emitChanged( parentBookmark ); |
| 391 | * |
| 392 | * \a bm the bookmark to add |
| 393 | */ |
| 394 | KBookmark addBookmark(const KBookmark &bm); |
| 395 | |
| 396 | /*! |
| 397 | * Create a new bookmark, as the last child of this group |
| 398 | * Don't forget to use KBookmarkManager::self()->emitChanged( parentBookmark ); |
| 399 | * |
| 400 | * \a text for the bookmark |
| 401 | * |
| 402 | * \a url the URL that the bookmark points to. |
| 403 | * It will be stored in its QUrl::FullyEncoded string format. |
| 404 | * |
| 405 | * \a icon the name of the icon to associate with the bookmark. A suitable default |
| 406 | * will be determined from the URL if not specified. |
| 407 | */ |
| 408 | KBookmark addBookmark(const QString &text, const QUrl &url, const QString &icon); |
| 409 | |
| 410 | /*! |
| 411 | * Moves \a bookmark after \a after (which should be a child of ours). |
| 412 | * If after is null, \a bookmark is moved as the first child. |
| 413 | * Don't forget to use KBookmarkManager::self()->emitChanged( parentBookmark ); |
| 414 | */ |
| 415 | bool moveBookmark(const KBookmark &bookmark, const KBookmark &after); |
| 416 | |
| 417 | /*! |
| 418 | * Delete a bookmark - it has to be one of our children ! |
| 419 | * Don't forget to use KBookmarkManager::self()->emitChanged( parentBookmark ); |
| 420 | */ |
| 421 | void deleteBookmark(const KBookmark &bk); |
| 422 | |
| 423 | /*! |
| 424 | * Returns true if this is the toolbar group |
| 425 | */ |
| 426 | bool isToolbarGroup() const; |
| 427 | /*! |
| 428 | * \internal |
| 429 | */ |
| 430 | QDomElement findToolbar() const; |
| 431 | |
| 432 | /*! |
| 433 | * Returns the list of urls of bookmarks at top level of the group |
| 434 | */ |
| 435 | QList<QUrl> groupUrlList() const; |
| 436 | |
| 437 | protected: |
| 438 | QDomElement nextKnownTag(const QDomElement &start, bool goNext) const; |
| 439 | |
| 440 | private: |
| 441 | // Note: you can't add other member variables here, except for caching info. |
| 442 | // The KBookmarks are created on the fly, as wrappers |
| 443 | // around internal QDomElements. Any additional information |
| 444 | // has to be implemented as an attribute of the QDomElement. |
| 445 | }; |
| 446 | |
| 447 | /*! |
| 448 | * \class KBookmarkGroupTraverser |
| 449 | * \inmodule KBookmarks |
| 450 | * \inheaderfile KBookmark |
| 451 | * |
| 452 | * A class to traverse bookarm groups |
| 453 | */ |
| 454 | class KBOOKMARKS_EXPORT KBookmarkGroupTraverser |
| 455 | { |
| 456 | protected: |
| 457 | virtual ~KBookmarkGroupTraverser(); |
| 458 | |
| 459 | /*! |
| 460 | */ |
| 461 | void traverse(const KBookmarkGroup &); |
| 462 | |
| 463 | /*! |
| 464 | */ |
| 465 | virtual void visit(const KBookmark &); |
| 466 | |
| 467 | /*! |
| 468 | */ |
| 469 | virtual void visitEnter(const KBookmarkGroup &); |
| 470 | |
| 471 | /*! |
| 472 | */ |
| 473 | virtual void visitLeave(const KBookmarkGroup &); |
| 474 | }; |
| 475 | |
| 476 | #define KIO_KBOOKMARK_METATYPE_DEFINED 1 |
| 477 | Q_DECLARE_METATYPE(KBookmark) |
| 478 | |
| 479 | #endif |
| 480 | |