/* $Id: QtBookmarkMenu.cpp,v 1.1 1998/09/25 18:01:27 ramiro%netscape.com Exp $ * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Eirik Eng. * Further developed by Warwick Allison, Kalle Dalheimer, Eirik Eng, * Matthias Ettrich, Arnt Gulbrandsen, Haavard Nord and Paul Olav * Tvete. Copyright (C) 1998 Warwick Allison, Kalle Dalheimer, Eirik * Eng, Matthias Ettrich, Arnt Gulbrandsen, Haavard Nord and Paul Olav * Tvete. All Rights Reserved. */ #include "QtBookmarkMenu.h" #include "QtBookmarksContext.h" #include "QtBrowserContext.h" #include "menus.h" #include #include #include #include #include #define i18n(txt) txt class QtBMEntryDict : public QIntDict { public: QtBMEntryDict( int size = 17 ) : QIntDict(size) {} ~QtBMEntryDict() {} void insert( long k, const BM_Entry *d ) { QIntDict::insert( k,(void*)d); } void replace( long k, const BM_Entry *d ) { QIntDict::replace( k,(void*)d); } BM_Entry *take( long k ) { return (BM_Entry*) QIntDict::take(k); } BM_Entry *find( long k ) const { return (BM_Entry*) QIntDict::find(k); } BM_Entry *operator[]( long k ) const { return (BM_Entry*) QIntDict::operator[](k); } }; static QPtrDict menuDict; QtBookmarkMenu::QtBookmarkMenu( QtBrowserContext *b, QWidget *p, const char *wName ) : QPopupMenu( p, wName ) { root = 0; browser = b; dirty = TRUE; entryDict = new QtBMEntryDict; menuDict.insert( this, this ); connect( this, SIGNAL(highlighted(int)), SLOT(highlightedSlot(int)) ); connect( this, SIGNAL(activated(int)), SLOT(activatedSlot(int)) ); connect( this, SIGNAL(aboutToShow()), SLOT(beforeShow()) ); } QtBookmarkMenu::~QtBookmarkMenu() { delete entryDict; menuDict.remove( this ); } void QtBookmarkMenu::insertGuide() { QPopupMenu *tmp = new QPopupMenu(); insertItem( *getBMPixmap( QtBMFolderItem, FALSE ), "Guide", tmp ); tmp->insertItem( "The &Internet", this, SLOT(guideI()) ); tmp->insertItem( "&People", this, SLOT(guideP()) ); tmp->insertItem( "&Yellow Pages", this, SLOT(guideY()) ); tmp->insertItem( "What's &New", this, SLOT(guideN()) ); tmp->insertItem( "What's &Cool", this, SLOT(guideC()) ); } void QtBookmarkMenu::populate() { clear(); if ( browser ) { insertItem( i18n( "&Add Bookmark" ), this, SLOT(cmdAddBookmark()), ALT + Key_K, MENU_BOOKMARK_ADD ); setAccel( MENU_BOOKMARK_ADD, ALT+Key_K ); } insertItem( i18n( "&Edit Bookmarks" ), QtBookmarksContext::ptr(), SLOT(cmdEditBookmarks()), ALT + Key_B, MENU_BOOKMARK_EDIT ); int idCounter = MENU_BMF_BOOKMARKS_OFFSET; insertSeparator(); insertGuide(); insertItem( i18n( "Troll Tech" ), this, SLOT(trollTech()), idCounter++ ); insertSeparator(); idCounter++; populate( this, QtBookmarksContext::ptr()->rootEntry(), &idCounter); if ( width() > 250 ) resize( 250, height() ); } void QtBookmarkMenu::clear() { entryDict->clear(); QPopupMenu::clear(); } void QtBookmarkMenu::cmdAddBookmark() { if ( browser ) { BM_Entry* entry; MWContext *c = browser->mwContext(); entry = BM_NewUrl( c->title ? c->title : c->url, c->url, 0, time(0) ); BM_Entry *tmp = BM_GetChildren(QtBookmarksContext::ptr()->rootEntry()); BM_Entry *prev = 0; while( tmp ) { prev = tmp; tmp = BM_GetNext(tmp); } BM_InsertItemAfter( QtBookmarksContext::ptr()->mwContext(),prev,entry); BM_SaveBookmarks( QtBookmarksContext::ptr()->mwContext(), 0 ); } } void QtBookmarkMenu::highlightedSlot( int id ) { BM_Entry *entry = entryDict->find( id ); if ( entry ) { const char *url = BM_GetAddress( entry ); if ( browser ) browser->setMessage( url ); } } void QtBookmarkMenu::activatedSlot( int id ) { BM_Entry *entry = entryDict->find( id ); if ( entry ) { const char *url = BM_GetAddress( entry ); URL_Struct * urlStruct = NET_CreateURLStruct(url,NET_DONT_RELOAD); if ( browser ) browser->getURL( urlStruct ); else QtContext::makeNewWindow( urlStruct, 0, 0, 0 ); } } void QtBookmarkMenu::invalidate() { QPtrDictIterator it(menuDict); while( it.current() ) { it.current()->dirty = TRUE; ++it; } } void QtBookmarkMenu::beforeShow() { if ( dirty ) { populate(); dirty = FALSE; } } void QtBookmarkMenu::goTo( const char *url) { URL_Struct * urlStruct = NET_CreateURLStruct( url, NET_DONT_RELOAD ); if ( browser ) browser->getURL( urlStruct ); else QtContext::makeNewWindow( urlStruct, 0, 0, 0 ); } void QtBookmarkMenu::trollTech() { goTo( "http://www.troll.no" ); } void QtBookmarkMenu::guideI() { goTo( "http://guide.netscape.com/" ); } void QtBookmarkMenu::guideP() { goTo( "http://guide.netscape.com/guide/people.html" ); } void QtBookmarkMenu::guideY() { goTo( "http://guide.netscape.com/guide/yellow_pages.html" ); } void QtBookmarkMenu::guideN() { goTo( "http://guide.netscape.com/guide/whats_new.html" ); } void QtBookmarkMenu::guideC() { goTo( "http://guide.netscape.com/guide/whats_cool.html" ); } void QtBookmarkMenu::populate( QPopupMenu *popup, BM_Entry *entry, int *idCounter ) { BM_Entry *child = BM_GetChildren( entry ); while( child ) { if ( BM_IsHeader( child ) ) { QPopupMenu *tmp = new QPopupMenu(); connect( tmp, SIGNAL(highlighted(int)), SLOT(highlightedSlot(int)) ); connect( tmp, SIGNAL(activated(int)), SLOT(activatedSlot(int)) ); popup->insertItem( *getBMPixmap( QtBMFolderItem, FALSE ), BM_GetName(child), tmp ); populate( tmp, child, idCounter ); } else if ( BM_IsSeparator( child) ) { popup->insertSeparator(); } else if ( BM_IsUrl( child ) ) { popup->insertItem( *getBMPixmap( QtBMBookmarkItem, FALSE ), BM_GetName(child), *idCounter ); entryDict->insert( *idCounter, child ); (*idCounter)++; } child = BM_GetNext( child ); } }