22 #include "kbookmark.h" 23 #include <tqvaluestack.h> 25 #include <kmimetype.h> 26 #include <kstringhandler.h> 27 #include <kinputdialog.h> 31 #include <kapplication.h> 32 #include <dcopclient.h> 33 #include <kbookmarkmanager.h> 36 : KBookmark( TQDomElement() )
47 if (m_address.isEmpty())
48 m_address = address();
54 return element.attribute(
"folded") ==
"no";
58 static TQDomElement firstElement(TQDomNode n)
60 while(!n.isNull() && !n.isElement())
66 static TQDomElement lastElement(TQDomNode n)
68 while(!n.isNull() && !n.isElement())
69 n = n.previousSibling();
75 return KBookmark( nextKnownTag( firstElement(element.firstChild()),
true ) );
80 return KBookmark( nextKnownTag( lastElement(current.element.previousSibling()),
false ) );
85 return KBookmark( nextKnownTag( firstElement(current.element.nextSibling()),
true ) );
90 TQDomElement KBookmarkGroup::nextKnownTag( TQDomElement start,
bool goNext )
const 92 static const TQString & bookmark = KGlobal::staticQString(
"bookmark");
93 static const TQString & folder = KGlobal::staticQString(
"folder");
94 static const TQString & separator = KGlobal::staticQString(
"separator");
96 for( TQDomNode n = start; !n.isNull(); )
98 TQDomElement elem = n.toElement();
99 TQString tag = elem.tagName();
100 if (tag == folder || tag == bookmark || tag == separator)
105 n = n.previousSibling();
107 return TQDomElement();
112 TQString txt( text );
113 if ( text.isEmpty() )
116 TQString caption = parentGroup().fullText().isEmpty() ?
117 i18n(
"Create New Bookmark Folder" ) :
118 i18n(
"Create New Bookmark Folder in %1" )
119 .arg( parentGroup().text() );
120 txt = KInputDialog::getText( caption, i18n(
"New folder:" ),
121 TQString::null, &ok );
126 Q_ASSERT(!element.isNull());
127 TQDomDocument doc = element.ownerDocument();
128 TQDomElement groupElem = doc.createElement(
"folder" );
129 element.appendChild( groupElem );
130 TQDomElement textElem = doc.createElement(
"title" );
131 groupElem.appendChild( textElem );
132 textElem.appendChild( doc.createTextNode( txt ) );
137 emit mgr->
notifier().createdNewFolder(
138 mgr->
path(), grp.fullText(),
147 Q_ASSERT(!element.isNull());
148 TQDomDocument doc = element.ownerDocument();
149 Q_ASSERT(!doc.isNull());
150 TQDomElement sepElem = doc.createElement(
"separator" );
151 element.appendChild( sepElem );
152 return KBookmark(sepElem);
158 if ( !after.isNull() )
159 n = element.insertAfter( item.element, after.element );
162 if ( element.firstChild().isNull() )
163 n = element.insertBefore( item.element, TQDomElement() );
166 TQDomElement firstChild = nextKnownTag(element.firstChild().toElement(),
true);
167 if ( !firstChild.isNull() )
168 n = element.insertBefore( item.element, firstChild );
172 n = element.appendChild( item.element );
175 return (!n.isNull());
180 element.appendChild( bm.internalElement() );
183 if ( bm.hasMetaData() ) {
187 mgr->
path(), bm.url().url(),
188 bm.fullText(), bm.address(), bm.icon() );
198 TQDomDocument doc = element.ownerDocument();
199 TQDomElement elem = doc.createElement(
"bookmark" );
200 elem.setAttribute(
"href", url.url( 0, 106 ) );
201 TQString _icon = icon;
202 if ( _icon.isEmpty() )
203 _icon = KMimeType::iconForURL( url );
204 elem.setAttribute(
"icon", _icon );
206 TQDomElement textElem = doc.createElement(
"title" );
207 elem.appendChild( textElem );
208 textElem.appendChild( doc.createTextNode( text ) );
210 return addBookmark( mgr, KBookmark( elem ), emitSignal );
215 element.removeChild( bk.element );
220 return ( element.attribute(
"toolbar") ==
"yes" );
223 TQDomElement KBookmarkGroup::findToolbar()
const 225 if ( element.attribute(
"toolbar") ==
"yes" )
227 for (TQDomNode n = element.firstChild(); !n.isNull() ; n = n.nextSibling() )
229 TQDomElement e = n.toElement();
231 if ( e.tagName() ==
"folder" )
233 if ( e.attribute(
"toolbar") ==
"yes" )
238 if (!result.isNull())
243 return TQDomElement();
248 TQValueList<KURL> urlList;
249 for ( KBookmark bm =
first(); !bm.isNull(); bm =
next(bm) )
251 if ( bm.isSeparator() || bm.isGroup() )
260 bool KBookmark::isGroup()
const 262 TQString tag = element.tagName();
263 return ( tag ==
"folder" 267 bool KBookmark::isSeparator()
const 269 return (element.tagName() ==
"separator");
272 bool KBookmark::hasParent()
const 274 TQDomElement parent = element.parentNode().toElement();
275 return !parent.isNull();
278 TQString KBookmark::text()
const 280 return KStringHandler::csqueeze( fullText() );
283 TQString KBookmark::fullText()
const 286 return i18n(
"--- separator ---");
288 return element.namedItem(
"title").toElement().text();
291 KURL KBookmark::url()
const 293 return KURL(element.attribute(
"href"), 106);
296 TQString KBookmark::icon()
const 298 TQString icon = element.attribute(
"icon");
299 if ( icon.isEmpty() ) {
303 icon =
"bookmark_folder";
306 if ( isSeparator() ) {
310 icon = KMimeType::iconForURL( url() );
324 Q_ASSERT( isGroup() );
328 TQString KBookmark::address()
const 330 if ( element.tagName() ==
"xbel" )
337 Q_ASSERT(hasParent());
341 TQString parentAddress = group.address();
345 for ( KBookmark bk = group.
first() ; !bk.isNull() ; bk = group.
next(bk), ++counter )
347 if ( bk.element == element )
348 return parentAddress +
"/" + TQString::number(counter);
350 kdWarning() <<
"KBookmark::address : this can't happen! " << parentAddress << endl;
355 KBookmark KBookmark::standaloneBookmark(
const TQString & text,
const KURL & url,
const TQString & icon )
357 TQDomDocument doc(
"xbel");
358 TQDomElement elem = doc.createElement(
"xbel");
359 doc.appendChild( elem );
367 TQString KBookmark::left(
const TQString & str, uint len)
373 return str.left(len);
376 TQString KBookmark::commonParent(TQString A, TQString B)
378 TQString error(
"ERROR");
379 if(A == error || B == error)
385 uint lastCommonSlash = 0;
386 uint lastPos = A.length() < B.length() ? A.length() : B.length();
387 for(uint i=0; i < lastPos; ++i)
390 return left(A, lastCommonSlash);
394 return left(A, lastCommonSlash);
397 static TQDomNode cd_or_create(TQDomNode node, TQString name)
399 TQDomNode subnode = node.namedItem(name);
400 if (subnode.isNull())
402 subnode = node.ownerDocument().createElement(name);
403 node.appendChild(subnode);
408 static TQDomText get_or_create_text(TQDomNode node)
410 TQDomNode subnode = node.firstChild();
411 if (subnode.isNull())
413 subnode = node.ownerDocument().createTextNode(
"");
414 node.appendChild(subnode);
416 return subnode.toText();
420 static TQDomNode findOrCreateMetadata( TQDomNode& parent )
422 static const char kdeOwner[] =
"http://www.kde.org";
423 TQDomElement metadataElement;
424 for ( TQDomNode _node = parent.firstChild(); !_node.isNull(); _node = _node.nextSibling() ) {
425 TQDomElement elem = _node.toElement();
426 if ( !elem.isNull() && elem.tagName() ==
"metadata" ) {
427 const TQString owner = elem.attribute(
"owner" );
428 if ( owner == kdeOwner )
430 if ( owner.isEmpty() )
431 metadataElement = elem;
434 if ( metadataElement.isNull() ) {
435 metadataElement = parent.ownerDocument().createElement(
"metadata" );
436 parent.appendChild(metadataElement);
438 metadataElement.setAttribute(
"owner", kdeOwner );
439 return metadataElement;
442 bool KBookmark::hasMetaData()
const 447 TQDomNode n = cd_or_create( internalElement(),
"info" );
448 return findOrCreateMetadata( n ).hasChildNodes();
451 void KBookmark::updateAccessMetadata()
453 kdDebug(7043) <<
"KBookmark::updateAccessMetadata " << address() <<
" " << url().prettyURL() << endl;
455 const uint timet = TQDateTime::currentDateTime().toTime_t();
456 setMetaDataItem(
"time_added", TQString::number( timet ), DontOverwriteMetaData );
457 setMetaDataItem(
"time_visited", TQString::number( timet ) );
459 TQString countStr = metaDataItem(
"visit_count" );
461 int currentCount = countStr.toInt(&ok);
465 setMetaDataItem(
"visit_count", TQString::number( currentCount ) );
470 TQString KBookmark::metaDataItem(
const TQString &key )
const 472 TQDomNode infoNode = cd_or_create( internalElement(),
"info" );
473 infoNode = findOrCreateMetadata( infoNode );
474 for ( TQDomNode n = infoNode.firstChild(); !n.isNull(); n = n.nextSibling() ) {
475 if ( !n.isElement() ) {
478 const TQDomElement e = n.toElement();
479 if ( e.tagName() == key ) {
483 return TQString::null;
486 void KBookmark::setMetaDataItem(
const TQString &key,
const TQString &value, MetaDataOverwriteMode mode )
488 TQDomNode infoNode = cd_or_create( internalElement(),
"info" );
489 infoNode = findOrCreateMetadata( infoNode );
491 TQDomNode item = cd_or_create( infoNode, key );
492 TQDomText text = get_or_create_text( item );
493 if ( mode == DontOverwriteMetaData && !text.data().isEmpty() ) {
497 text.setData( value );
500 void KBookmarkGroupTraverser::traverse(
const KBookmarkGroup &root)
503 TQValueStack<KBookmarkGroup> stack;
505 KBookmark bk = stack.top().first();
511 if (stack.count() > 1)
512 visitLeave(stack.top());
514 bk = stack.top().next(bk);
523 if (!gp.
first().isNull())
535 bk = stack.top().next(bk);
KBookmark previous(const KBookmark ¤t) const
Return the prevous sibling of a child bookmark of this group.
KBookmarkNotifier & notifier()
Access to bookmark notifier, for emitting signals.
bool isToolbarGroup() const
KBookmark createNewSeparator()
Create a new bookmark separator Don't forget to use KBookmarkManager::self()->emitChanged( parentBook...
KBookmarkGroup createNewFolder(KBookmarkManager *mgr, const TQString &text=TQString::null, bool emitSignal=true)
Create a new bookmark folder, as the last child of this group.
KBookmark addBookmark(KBookmarkManager *mgr, const KBookmark &bm, bool emitSignal=true)
Create a new bookmark, as the last child of this group Don't forget to use KBookmarkManager::self()->...
This class implements the reading/writing of bookmarks in XML.
TQValueList< KURL > groupUrlList() const
TQString groupAddress() const
Much like KBookmark::address, but caches the address into m_address.
KBookmarkGroup()
Create an invalid group.
ASYNC notifyCompleteChange(TQString caller)
Reparse the whole bookmarks file and notify about the change (Called by the bookmark editor) ...
TQString path()
This will return the path that this manager is using to read the bookmarks.
void deleteBookmark(KBookmark bk)
Delete a bookmark - it has to be one of our children ! Don't forget to use KBookmarkManager::self()->...
bool moveItem(const KBookmark &item, const KBookmark &after)
Moves item after after (which should be a child of ours).
KBookmark next(const KBookmark ¤t) const
Return the next sibling of a child bookmark of this group.
KBookmark first() const
Return the first child bookmark of this group.