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 );
361 grp.addBookmark( 0L, text, url, icon,
false );
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);