From 66570f5d3b3d089cc565cc92de253993d10267f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 9 Nov 2009 13:17:47 +0000 Subject: [PATCH] =?UTF-8?q?*=20Replaced=20"Mark=20As=20New"=20with=20a=20"?= =?UTF-8?q?Mark=20As=C3=A2=C2=80=C2=A6"=20Tracker=20add-on=20that=20let=20?= =?UTF-8?q?you=20choose=20=20=20among=20all=20defined=20status.=20*=20Note?= =?UTF-8?q?,=20until=20bug=20#4851=20is=20solved,=20the=20list=20Mail=20sh?= =?UTF-8?q?ows=20might=20differ=20from=20the=20=20=20one=20"Mark=20As?= =?UTF-8?q?=C3=A2=C2=80=C2=A6"=20shows.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33960 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- build/jam/HaikuImage | 6 +- src/add-ons/tracker/mark_as/Jamfile | 7 +- src/add-ons/tracker/mark_as/MarkAs.cpp | 122 +++++++++++++++--- .../mark_as/{MarkAsNew.rdef => MarkAs.rdef} | 10 +- src/add-ons/tracker/mark_as/MarkAsRead.cpp | 37 +++++- src/add-ons/tracker/mark_as/MarkAsRead.rdef | 8 +- 6 files changed, 151 insertions(+), 39 deletions(-) rename src/add-ons/tracker/mark_as/{MarkAsNew.rdef => MarkAs.rdef} (70%) diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index f4c03c1b4e..fd0bf0fbbf 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -70,7 +70,7 @@ SYSTEM_APPS = AboutSystem ActivityMonitor CharacterMap CodyCam DeskCalc Devices ; SYSTEM_PREFERENCES = Appearance Backgrounds CPUFrequency DataTranslations Deskbar E-mail FileTypes Fonts Keyboard Keymap Locale Media - Mouse Network OpenGL Printers Screen ScreenSaver Shortcuts Sounds Time + Mouse Network OpenGL Printers Screen ScreenSaver Shortcuts Sounds Time Touchpad Tracker VirtualMemory ; SYSTEM_DEMOS = BSnow Chart Clock Cortex FontDemo @@ -499,7 +499,7 @@ AddFilesToHaikuImage system add-ons media : $(SYSTEM_ADD_ONS_MEDIA) ; AddFilesToHaikuImage system add-ons media plugins : $(SYSTEM_ADD_ONS_MEDIA_PLUGINS) ; AddFilesToHaikuImage system add-ons Tracker - : FileType-F Mark\ as\ New-N Mark\ as\ Read-R Open\ Target\ Folder-O OpenTerminal-T ZipOMatic-Z ; + : FileType-F Mark\ as… Mark\ as\ Read-R Open\ Target\ Folder-O OpenTerminal-T ZipOMatic-Z ; AddSymlinkToHaikuImage system add-ons Tracker : /boot/system/preferences/Backgrounds : Background-B ; AddSymlinkToHaikuImage system add-ons Tracker @@ -508,7 +508,7 @@ AddSymlinkToHaikuImage system add-ons Tracker : /boot/system/apps/DiskUsage : DiskUsage-I ; AddFilesToHaikuImage system add-ons input_server devices : keyboard mouse wacom ; -AddFilesToHaikuImage system add-ons input_server filters +AddFilesToHaikuImage system add-ons input_server filters : screen_saver shortcut_catcher ; AddFilesToHaikuImage system add-ons kernel network : notifications stack ; diff --git a/src/add-ons/tracker/mark_as/Jamfile b/src/add-ons/tracker/mark_as/Jamfile index 61cc67aafa..34ba0ba2ec 100644 --- a/src/add-ons/tracker/mark_as/Jamfile +++ b/src/add-ons/tracker/mark_as/Jamfile @@ -2,11 +2,11 @@ SubDir HAIKU_TOP src add-ons tracker mark_as ; SetSubDirSupportedPlatformsBeOSCompatible ; -AddResources Mark\ as\ New-N : MarkAsNew.rdef ; +AddResources Mark\ as… : MarkAs.rdef ; AddResources Mark\ as\ Read-R : MarkAsRead.rdef ; -Addon Mark\ as\ New-N : - MarkAsNew.cpp +Addon Mark\ as… : + MarkAs.cpp : be tracker ; @@ -14,4 +14,3 @@ Addon Mark\ as\ Read-R : MarkAsRead.cpp : be tracker ; - diff --git a/src/add-ons/tracker/mark_as/MarkAs.cpp b/src/add-ons/tracker/mark_as/MarkAs.cpp index 7ddc2ef873..244d6cfef6 100644 --- a/src/add-ons/tracker/mark_as/MarkAs.cpp +++ b/src/add-ons/tracker/mark_as/MarkAs.cpp @@ -1,33 +1,121 @@ /* - * Copyright 2006, Ryan Leavengood, leavengood@gmail.com. All rights reserved. + * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ +#include #include +#include +#include #include #include +#include +#include #include -#include +#include +#include + + +/*! Returns the current mouse position in screen coordinates. + Since there is no method to retrieve this in the Be API without a view, + this looks a bit more complicated. +*/ +static BPoint +mouse_position() +{ + BWindow* window = new BWindow(BRect(-1000, -1000, -900, -900), "mouse", + B_NO_BORDER_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, + B_AVOID_FRONT | B_AVOID_FOCUS); + BView* view = new BView(window->Bounds(), "mouse", B_FOLLOW_ALL, 0); + window->AddChild(view); + window->Run(); + + window->Lock(); + + BPoint position; + uint32 buttons; + view->GetMouse(&position, &buttons); + view->ConvertToScreen(&position); + + window->Quit(); + + return position; +} + + +static void +add_status_item(BMenu* menu, const char* name) +{ + if (menu->FindItem(name) != NULL) + return; + + // Sort items alphabetically + int32 index; + for (index = 0; index < menu->CountItems(); index++) { + if (strcmp(menu->ItemAt(index)->Label(), name) > 0) + break; + } + + menu->AddItem(new BMenuItem(name, NULL), index); +} + + +static void +retrieve_status_items(BMenu* menu) +{ + BPath path; + if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) + return; + + path.Append("Mail/status"); + + BDirectory directory(path.Path()); + + entry_ref ref; + while (directory.GetNextRef(&ref) == B_OK) { + if (!strcmp(ref.name, ".") || !strcmp(ref.name, "..")) + continue; + + add_status_item(menu, ref.name); + } + + add_status_item(menu, "New"); + add_status_item(menu, "Read"); + add_status_item(menu, "Replied"); +} + + +// #pragma mark - extern "C" void -process_refs(entry_ref dir, BMessage* msg, void* /*reserved*/) +process_refs(entry_ref dir, BMessage* message, void* /*reserved*/) { - int32 refs; + BPopUpMenu* menu = new BPopUpMenu("status"); + retrieve_status_items(menu); + + BMenuItem* item = menu->Go(mouse_position() - BPoint(5, 5), false, true); + if (item == NULL) + return; + + BString status = item->Label(); + entry_ref ref; - BString status(STATUS_HERE); - // The above will be substituted with a real value (such as "New" or - // "Read") by a #define and #include in another file. This is done - // to avoid duplicate code. - BString type; - - for (refs = 0; msg->FindRef("refs", refs, &ref) == B_NO_ERROR; refs++) { + for (int i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) { BNode node(&ref); - if ((node.InitCheck() == B_NO_ERROR) - && (node.ReadAttrString("BEOS:TYPE", &type) == B_NO_ERROR) - && (type == "text/x-email")) - node.WriteAttrString("MAIL:status", &status); - } -} + BString type; + + if (node.InitCheck() == B_OK + && node.ReadAttrString("BEOS:TYPE", &type) == B_OK + && type == "text/x-email") { + BString previousStatus; + + // Only update the attribute if there is an actual change + if (node.ReadAttrString("MAIL:status", &previousStatus) != B_OK + || previousStatus != status) + node.WriteAttrString("MAIL:status", &status); + } + } +} diff --git a/src/add-ons/tracker/mark_as/MarkAsNew.rdef b/src/add-ons/tracker/mark_as/MarkAs.rdef similarity index 70% rename from src/add-ons/tracker/mark_as/MarkAsNew.rdef rename to src/add-ons/tracker/mark_as/MarkAs.rdef index a528b5e929..76168d9d3f 100644 --- a/src/add-ons/tracker/mark_as/MarkAsNew.rdef +++ b/src/add-ons/tracker/mark_as/MarkAs.rdef @@ -1,8 +1,4 @@ -/* - * MarkAsNew.rdef - */ - -resource app_signature "application/x-vnd.Haiku-MarkAsNew"; +resource app_signature "application/x-vnd.Haiku-MarkAs"; resource file_types message { "types" = "text/x-email" @@ -19,8 +15,8 @@ resource app_version { internal = 1, - short_info = "Marks emails as New", - long_info = "MarkAsNew, Copyright 2006-2009 Haiku, Inc. A Tracker Add-on which marks the status of emails as New." + short_info = "MarkAs, Copyright 2006-2009 Haiku, Inc.", + long_info = "A Tracker Add-on that marks emails with the chosen status." }; resource vector_icon { diff --git a/src/add-ons/tracker/mark_as/MarkAsRead.cpp b/src/add-ons/tracker/mark_as/MarkAsRead.cpp index 604f05eae4..6c37376be8 100644 --- a/src/add-ons/tracker/mark_as/MarkAsRead.cpp +++ b/src/add-ons/tracker/mark_as/MarkAsRead.cpp @@ -1,2 +1,35 @@ -#define STATUS_HERE "Read" -#include "MarkAs.cpp" +/* + * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2006, Ryan Leavengood, leavengood@gmail.com. All rights reserved. + * Distributed under the terms of the MIT License. + */ + + +#include +#include +#include +#include + + +extern "C" void +process_refs(entry_ref dir, BMessage* message, void* /*reserved*/) +{ + entry_ref ref; + for (int i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) { + BNode node(&ref); + BString type; + + if (node.InitCheck() == B_OK + && node.ReadAttrString("BEOS:TYPE", &type) == B_OK + && type == "text/x-email") { + BString previousStatus; + BString status("Read"); + + // Only update the attribute if there is an actual change + if (node.ReadAttrString("MAIL:status", &previousStatus) != B_OK + || previousStatus != status) + node.WriteAttrString("MAIL:status", &status); + } + } +} + diff --git a/src/add-ons/tracker/mark_as/MarkAsRead.rdef b/src/add-ons/tracker/mark_as/MarkAsRead.rdef index 1c32c62ced..03eef69129 100644 --- a/src/add-ons/tracker/mark_as/MarkAsRead.rdef +++ b/src/add-ons/tracker/mark_as/MarkAsRead.rdef @@ -1,7 +1,3 @@ -/* - * MarkAsRead.rdef - */ - resource app_signature "application/x-vnd.Haiku-MarkAsRead"; resource file_types message { @@ -19,8 +15,8 @@ resource app_version { internal = 1, - short_info = "Marks email as Read", - long_info = "MarkAsRead, Copyright 2006-2009 Haiku, Inc. A Tracker Add-on which marks the status of emails as Read." + short_info = "MarkAsRead, Copyright 2006-2009 Haiku, Inc.", + long_info = "A Tracker Add-on which marks the status of emails as Read." }; resource vector_icon {