From 6f79af3c556146444b5c759f9483220db1223393 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Fri, 23 May 2014 15:38:10 +0200 Subject: [PATCH] Web+: move BookmarbKar to own file. It's a bit long for an inline class, and I'm going to add more stuff to it. --- src/apps/webpositive/BookmarkBar.cpp | 154 +++++++++++++++++++++ src/apps/webpositive/BookmarkBar.h | 42 ++++++ src/apps/webpositive/BrowserWindow.cpp | 137 +----------------- src/apps/webpositive/Jamfile | 1 + src/system/libroot/posix/string/strdup.cpp | 29 ++++ 5 files changed, 227 insertions(+), 136 deletions(-) create mode 100644 src/apps/webpositive/BookmarkBar.cpp create mode 100644 src/apps/webpositive/BookmarkBar.h create mode 100644 src/system/libroot/posix/string/strdup.cpp diff --git a/src/apps/webpositive/BookmarkBar.cpp b/src/apps/webpositive/BookmarkBar.cpp new file mode 100644 index 0000000000..4501e75759 --- /dev/null +++ b/src/apps/webpositive/BookmarkBar.cpp @@ -0,0 +1,154 @@ +/* + * Copyright 2014, Adrien Destugues . + * Distributed under the terms of the MIT License. + */ + + +#include "BookmarkBar.h" + +#include +#include +#include +#include +#include + +#include "NavMenu.h" + + +BookmarkBar::BookmarkBar(const char* title, BHandler* target, + const entry_ref* navDir) + : BMenuBar(title) +{ + BEntry(navDir).GetNodeRef(&fNodeRef); +} + + +BookmarkBar::~BookmarkBar() +{ + stop_watching(BMessenger(this)); +} + + +void +BookmarkBar::AttachedToWindow() +{ + BMenuBar::AttachedToWindow(); + watch_node(&fNodeRef, B_WATCH_DIRECTORY, BMessenger(this)); + + // Enumerate initial directory content + BDirectory dir(&fNodeRef); + BEntry bookmark; + while(dir.GetNextEntry(&bookmark) == B_OK) { + node_ref ref; + bookmark.GetNodeRef(&ref); + _AddItem(ref.node, &bookmark); + } +} + + +void +BookmarkBar::MessageReceived(BMessage* message) +{ + switch(message->what) { + case B_NODE_MONITOR: + { + int32 opcode = message->FindInt32("opcode"); + ino_t inode = message->FindInt64("node"); + switch(opcode) { + case B_ENTRY_CREATED: + { + entry_ref ref; + const char *name; + + message->FindInt32("device", &ref.device); + message->FindInt64("directory", &ref.directory); + message->FindString("name", &name); + ref.set_name(name); + + BEntry entry(&ref); + _AddItem(inode, &entry); + break; + } + case B_ENTRY_MOVED: + { + if (fItemsMap[inode] == NULL) + { + entry_ref ref; + const char *name; + + message->FindInt32("device", &ref.device); + message->FindInt64("to directory", &ref.directory); + message->FindString("name", &name); + ref.set_name(name); + + BEntry entry(&ref); + _AddItem(inode, &entry); + break; + } else { + // Existing item. Check if it's a rename or a move + // to some other folder. + ino_t from, to; + message->FindInt64("to directory", &to); + message->FindInt64("from directory", &from); + if (from == to) + { + const char *name; + message->FindString("name", &name); + fItemsMap[inode]->SetLabel(name); + break; + } + } + + // fall through: the item was moved from here to + // elsewhere, remove it from the bar. + } + case B_ENTRY_REMOVED: + { + IconMenuItem* item = fItemsMap[inode]; + RemoveItem(item); + fItemsMap.erase(inode); + delete item; + } + } + return; + } + } + + BMenuBar::MessageReceived(message); +} + + +void +BookmarkBar::_AddItem(ino_t inode, BEntry* entry) +{ + char name[B_FILE_NAME_LENGTH]; + entry->GetName(name); + + // make sure the item doesn't already exists + if (fItemsMap[inode] != NULL) + return; + + entry_ref ref; + entry->GetRef(&ref); + + IconMenuItem* item = NULL; + + if(entry->IsDirectory()) { + BNavMenu* menu = new BNavMenu(name, B_REFS_RECEIVED, Window()); + menu->SetNavDir(&ref); + item = new IconMenuItem(menu, NULL, + "application/x-vnd.Be-directory", B_MINI_ICON); + + } else { + BNode node(entry); + BNodeInfo info(&node); + + BMessage* message = new BMessage(B_REFS_RECEIVED); + message->AddRef("refs", &ref); + item = new IconMenuItem(name, message, &info, + B_MINI_ICON); + } + + BMenuBar::AddItem(item); + fItemsMap[inode] = item; +} diff --git a/src/apps/webpositive/BookmarkBar.h b/src/apps/webpositive/BookmarkBar.h new file mode 100644 index 0000000000..af0e8bd079 --- /dev/null +++ b/src/apps/webpositive/BookmarkBar.h @@ -0,0 +1,42 @@ +/* + * Copyright 2014, Adrien Destugues . + * Distributed under the terms of the MIT License. + */ +#ifndef BOOKMARK_BAR_H +#define BOOKMARK_BAR_H + + +#include + +#include +#include +#include + + +class BEntry; + +namespace BPrivate { + class IconMenuItem; +} + + +class BookmarkBar: public BMenuBar { +public: + BookmarkBar(const char* title, + BHandler* target, + const entry_ref* navDir); + ~BookmarkBar(); + + void AttachedToWindow(); + void MessageReceived(BMessage* message); + +private: + void _AddItem(ino_t inode, BEntry* entry); + +private: + node_ref fNodeRef; + std::map fItemsMap; +}; + + +#endif // BOOKMARK_BAR_H diff --git a/src/apps/webpositive/BrowserWindow.cpp b/src/apps/webpositive/BrowserWindow.cpp index bbb2a915bd..b25e18016e 100644 --- a/src/apps/webpositive/BrowserWindow.cpp +++ b/src/apps/webpositive/BrowserWindow.cpp @@ -74,6 +74,7 @@ #include "AuthenticationPanel.h" #include "BaseURL.h" #include "BitmapButton.h" +#include "BookmarkBar.h" #include "BrowserApp.h" #include "BrowsingHistory.h" #include "CredentialsStorage.h" @@ -176,142 +177,6 @@ private: }; -class BookmarkBar: public BMenuBar { -public: - BookmarkBar(const char* title, BHandler* target, const entry_ref* navDir) - : BMenuBar(title) - { - BEntry(navDir).GetNodeRef(&fNodeRef); - } - - ~BookmarkBar() - { - stop_watching(BMessenger(this)); - } - - void AttachedToWindow() - { - BMenuBar::AttachedToWindow(); - watch_node(&fNodeRef, B_WATCH_DIRECTORY, BMessenger(this)); - - // Enumerate initial directory content - BDirectory dir(&fNodeRef); - BEntry bookmark; - while(dir.GetNextEntry(&bookmark) == B_OK) { - node_ref ref; - bookmark.GetNodeRef(&ref); - AddItem(ref.node, &bookmark); - } - } - - void MessageReceived(BMessage* message) - { - switch(message->what) { - case B_NODE_MONITOR: - int32 opcode = message->FindInt32("opcode"); - ino_t inode = message->FindInt64("node"); - switch(opcode) { - case B_ENTRY_CREATED: - { - entry_ref ref; - const char *name; - - message->FindInt32("device", &ref.device); - message->FindInt64("directory", &ref.directory); - message->FindString("name", &name); - ref.set_name(name); - - BEntry entry(&ref); - AddItem(inode, &entry); - break; - } - case B_ENTRY_MOVED: - { - if (fItemsMap[inode] == NULL) - { - entry_ref ref; - const char *name; - - message->FindInt32("device", &ref.device); - message->FindInt64("to directory", &ref.directory); - message->FindString("name", &name); - ref.set_name(name); - - BEntry entry(&ref); - AddItem(inode, &entry); - break; - } else { - // Existing item. Check if it's a rename or a move - // to some other folder. - ino_t from, to; - message->FindInt64("to directory", &to); - message->FindInt64("from directory", &from); - if (from == to) - { - const char *name; - message->FindString("name", &name); - fItemsMap[inode]->SetLabel(name); - break; - } - } - - // fall through: the item was moved from here to - // elsewhere, remove it from the bar. - } - case B_ENTRY_REMOVED: - { - IconMenuItem* item = fItemsMap[inode]; - RemoveItem(item); - fItemsMap.erase(inode); - delete item; - } - } - return; - } - - BMenuBar::MessageReceived(message); - } - -private: - void AddItem(ino_t inode, BEntry* entry) - { - char name[B_FILE_NAME_LENGTH]; - entry->GetName(name); - - // make sure the item doesn't already exists - if (fItemsMap[inode] != NULL) - return; - - entry_ref ref; - entry->GetRef(&ref); - - IconMenuItem* item = NULL; - - if(entry->IsDirectory()) { - BNavMenu* menu = new BNavMenu(name, B_REFS_RECEIVED, Window()); - menu->SetNavDir(&ref); - item = new IconMenuItem(menu, NULL, - "application/x-vnd.Be-directory", B_MINI_ICON); - - } else { - BNode node(entry); - BNodeInfo info(&node); - - BMessage* message = new BMessage(B_REFS_RECEIVED); - message->AddRef("refs", &ref); - item = new IconMenuItem(name, message, &info, - B_MINI_ICON); - } - - BMenuBar::AddItem(item); - fItemsMap[inode] = item; - } - - node_ref fNodeRef; - std::map fItemsMap; -}; - - class PageUserData : public BWebView::UserData { public: PageUserData(BView* focusedView) diff --git a/src/apps/webpositive/Jamfile b/src/apps/webpositive/Jamfile index df84daa81a..65fa4716fe 100644 --- a/src/apps/webpositive/Jamfile +++ b/src/apps/webpositive/Jamfile @@ -19,6 +19,7 @@ local sources = # support BaseURL.cpp BitmapButton.cpp + BookmarkBar.cpp FontSelectionView.cpp SettingsMessage.cpp diff --git a/src/system/libroot/posix/string/strdup.cpp b/src/system/libroot/posix/string/strdup.cpp new file mode 100644 index 0000000000..a4306f0899 --- /dev/null +++ b/src/system/libroot/posix/string/strdup.cpp @@ -0,0 +1,29 @@ +/* + * Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ + + +#include +#include + + +char* +strdup(const char *string) +{ + char* copied; + size_t length; + + // unlike the standard strdup() function, the BeOS implementation + // handles NULL strings gracefully + if (string == NULL) + return NULL; + + length = strlen(string) + 1; + + if ((copied = (char *)malloc(length)) == NULL) + return NULL; + + memcpy(copied, string, length); + return copied; +}