From 4aff3e342249e36db5bcef9b37be1adb9944e41f Mon Sep 17 00:00:00 2001 From: barrett Date: Wed, 14 Dec 2011 23:36:27 +0000 Subject: [PATCH] Added a new deskbar replicant with related classes and icons, disabled libdownload and curl depencency, fixed some warnings and style violations around the code --- Jamrules | 8 +- application/Caya.rdef | 147 ++++++++ application/CayaMessages.h | 19 +- application/CayaResources.h | 9 +- application/ChatWindow.cpp | 2 +- application/Jamfile | 2 + application/MainWindow.cpp | 83 +++- application/MainWindow.h | 9 +- application/Server.cpp | 48 ++- application/Server.h | 12 +- application/TheApp.cpp | 29 +- application/TheApp.h | 2 + .../preferences/PreferencesBehavior.cpp | 15 + application/preferences/PreferencesBehavior.h | 4 + application/views/ReplicantMenuItem.cpp | 88 +++++ application/views/ReplicantMenuItem.h | 34 ++ application/views/ReplicantStatusView.cpp | 355 ++++++++++++++++++ application/views/ReplicantStatusView.h | 71 ++++ application/views/StatusMenuItem.h | 5 +- libs/Jamfile | 2 +- tests/Jamfile | 2 +- 21 files changed, 914 insertions(+), 32 deletions(-) create mode 100644 application/views/ReplicantMenuItem.cpp create mode 100644 application/views/ReplicantMenuItem.h create mode 100644 application/views/ReplicantStatusView.cpp create mode 100644 application/views/ReplicantStatusView.h diff --git a/Jamrules b/Jamrules index 02affa7..eb4ff51 100644 --- a/Jamrules +++ b/Jamrules @@ -45,10 +45,10 @@ LOCATE on $(HCACHEFILE) $(JCACHEFILE) = $(GENERATED_DIR) ; # Perform configuration checks include [ FDirName $(JAM_DIR) CheckRules ] ; CheckGccPlatform ; -CheckCurl ; -if ! $(HAVE_CURL) { - Echo "** Caya needs Curl" ; -} +#CheckCurl ; +#if ! $(HAVE_CURL) { +# Echo "** Caya needs Curl" ; +#} # Include jam scripts include [ FDirName $(JAM_DIR) HelperRules ] ; diff --git a/application/Caya.rdef b/application/Caya.rdef index ae3c282..b1d6c85 100644 --- a/application/Caya.rdef +++ b/application/Caya.rdef @@ -109,3 +109,150 @@ resource(kSearchIcon) #'VICN' array { $"0000000000414992CA3294CA67470A070109023D49920000000000003D49923A" $"DA753AC02E" }; + +/* + * Deskbar replicant icons + */ + +// Connecting Green +resource(kConnectingReplicant) #'VICN' array { + $"6E636966070501040156020106023DB0753A5ED7B9F9EE3D18204A5B813F873F" + $"C376A70251C9FF89020106023DE0000000000000003D40004A200049A0005376" + $"A702CBC9FF89020106023F5C743B37D1BAB2F23ED1AC471CEC4937F8BF77A703" + $"48C9FF89020106023EC0D03BF7CDBAC4EE3DD7C849909B4875A356C9FF89CD77" + $"A704020112023EA645399A4BB883763DB26D497A2947E6FF00FFFFFFFF000D02" + $"045040C9A540C29A40405040C29A40C9A55060C29A60C9A560605060C9A560C2" + $"9A0002492E492E2A1E354F204A354F0002492E492EC20DB7EABFC2B752C0DBB7" + $"82BFC2B7520002BFC2B752BFC2B752BA7BB668B6FEBE79B765BA6DB6FEBE7900" + $"02B6FEBE79B6FEBE79B6ABC1B2354FB80BC4EF354F0002C43BC1E9C43BC1E9C5" + $"C2C1A8C54CBFB7C660C0E5C54CBFB7000233403340BF87C25CC5C9C112C52BC2" + $"93C5C9C1120002C5C9C112C5C9C112C61CC047453AC50ABF02453A0405FE0340" + $"3C44394238463A4F374D3951354432483140333C3A3C373C3A0404EF2B442B44" + $"2F503550324C385436573E4D3F553E4D00024728472842252E2B37222E2B0402" + $"0E2A302834293227360002333B333B373D4A3E45444A3E120A0101000241CBC6" + $"3EAFF7BDA3754091DCCA48B8CB509A0A0001073020B2C001179420040A050107" + $"3820B2C0001501178E20040A0501073820B2C015FF01179020040A0101082020" + $"B2C00A0001013020B2C001179420040A0201023820B2C0001501178E20040A02" + $"01023820B2C015FF01179020040A0301033820B2C0001501178E20040A030103" + $"3820B2C015FF01179020040A0401043820B2C0001501178E20040A0401043820" + $"B2C015FF01179020040A0101092020B2C00A0001063020B2C001179420040A05" + $"01063820B2C0001501178E20040A0501063820B2C015FF01179020040A050105" + $"3820B2C015FF01179020040A06030A0C0B100117842004" +}; + +// Caya icon + +resource(kCayaIconReplicant) #'VICN' array { + $"6E636966070501040156020106023DB0753A5ED7B9F9EE3D18204A5B813F873F" + $"C3BD2CCE51EDADE7020106023DE0000000000000003D40004A200049A00053BC" + $"2CCECBEDADE7020106023F5C743B37D1BAB2F23ED1AC471CEC4937F8BFBD2CCE" + $"48EDADE7020106023EC0D03BF7CDBAC4EE3DD7C849909B4875A357E3FCC6CD89" + $"B226020112023EA645399A4BB883763DB26D497A2947E6FF00FFFFFFFF000D02" + $"045040C9A540C29A40405040C29A40C9A55060C29A60C9A560605060C9A560C2" + $"9A0002492E492E2A1E354F204A354F0002492E492EC20DB7EABFC2B752C0DBB7" + $"82BFC2B7520002BFC2B752BFC2B752BA7BB668B6FEBE79B765BA6DB6FEBE7900" + $"02B6FEBE79B6FEBE79B6ABC1B2354FB80BC4EF354F0002C43BC1E9C43BC1E9C5" + $"C2C1A8C54CBFB7C660C0E5C54CBFB7000233403340BF87C25CC5C9C112C52BC2" + $"93C5C9C1120002C5C9C112C5C9C112C61CC047453AC50ABF02453A0405FE0340" + $"3C44394238463A4F374D3951354432483140333C3A3C373C3A0404EF2B442B44" + $"2F503550324C385436573E4D3F553E4D00024728472842252E2B37222E2B0402" + $"0E2A302834293227360002333B333B373D4A3E45444A3E120A0101000241CBC6" + $"3EAFF7BDA3754091DCCA48B8CB509A0A0001073020B2C001179420040A050107" + $"3820B2C0001501178E20040A0501073820B2C015FF01179020040A0101082020" + $"B2C00A0001013020B2C001179420040A0201023820B2C0001501178E20040A02" + $"01023820B2C015FF01179020040A0301033820B2C0001501178E20040A030103" + $"3820B2C015FF01179020040A0401043820B2C0001501178E20040A0401043820" + $"B2C015FF01179020040A0101092020B2C00A0001063020B2C001179420040A05" + $"01063820B2C0001501178E20040A0501063820B2C015FF01179020040A050105" + $"3820B2C015FF01179020040A06030A0C0B100117842004" +}; + +// Offline + +resource(kOfflineReplicant) #'VICN' array { + $"6E636966080501040156020116023DB0753A5ED7B9F9EE3D18204A5B813F873F" + $"C3A551F3020116023DE0000000000000003D40004A200049A00053A5CBF30201" + $"16023F5C743B37D1BAB2F23ED1AC471CEC4937F8BFA548F3020116023EC0D03B" + $"F7CDBAC4EE3DD7C849909B4875A357F3CDA2020112023EA645399A4BB883763D" + $"B26D497A2947E6FF00FFFFFFFF0003647F000D02045040C9A540C29A40405040" + $"C29A40C9A55060C29A60C9A560605060C9A560C29A0002492E492E2A1E354F20" + $"4A354F0002492E492EC20DB7EABFC2B752C0DBB782BFC2B7520002BFC2B752BF" + $"C2B752BA7BB668B6FEBE79B765BA6DB6FEBE790002B6FEBE79B6FEBE79B6ABC1" + $"B2354FB80BC4EF354F0002C43BC1E9C43BC1E9C5C2C1A8C54CBFB7C660C0E5C5" + $"4CBFB7000233403340BF87C25CC5C9C112C52BC293C5C9C1120002C5C9C112C5" + $"C9C112C61CC047453AC50ABF02453A0405FE03403C44394238463A4F374D3951" + $"354432483140333C3A3C373C3A0404EF2B442B442F503550324C385436573E4D" + $"3F553E4D00024728472842252E2B37222E2B04020E2A30283429322736000233" + $"3B333B373D4A3E45444A3E120A0101000241CBC63EAFF7BDA3754091DCCA48B8" + $"CB509A0A0001073020B2C001179420040A0501073820B2C0001501178E20040A" + $"0501073820B2C015FF01179020040A0101082020B2C00A0001013020B2C00117" + $"9420040A0201023820B2C0001501178E20040A0201023820B2C015FF01179020" + $"040A0301033820B2C0001501178E20040A0301033820B2C015FF01179020040A" + $"0401043820B2C0001501178E20040A0401043820B2C015FF01179020040A0101" + $"092020B2C00A0001063020B2C001179420040A0501063820B2C0001501178E20" + $"040A0501063820B2C015FF01179020040A0501053820B2C015FF01179020040A" + $"06030A0C0B100117842004" +}; + +// Busy + +resource(kBusyReplicant) #'VICN' array { + $"6E636966070501040156020106023DB0753A5ED7B9F9EE3D18204A5B813F873F" + $"C3D6111151FFB3B3020106023DE0000000000000003D40004A200049A00053D6" + $"1111CBFFB3B3020106023F5C743B37D1BAB2F23ED1AC471CEC4937F8BFD61111" + $"48FFB3B3020106023EC0D03BF7CDBAC4EE3DD7C849909B4875A357FFB3B3CDF2" + $"3434020112023EA645399A4BB883763DB26D497A2947E6FF00FFFFFFFF000D02" + $"045040C9A540C29A40405040C29A40C9A55060C29A60C9A560605060C9A560C2" + $"9A0002492E492E2A1E354F204A354F0002492E492EC20DB7EABFC2B752C0DBB7" + $"82BFC2B7520002BFC2B752BFC2B752BA7BB668B6FEBE79B765BA6DB6FEBE7900" + $"02B6FEBE79B6FEBE79B6ABC1B2354FB80BC4EF354F0002C43BC1E9C43BC1E9C5" + $"C2C1A8C54CBFB7C660C0E5C54CBFB7000233403340BF87C25CC5C9C112C52BC2" + $"93C5C9C1120002C5C9C112C5C9C112C61CC047453AC50ABF02453A0405FE0340" + $"3C44394238463A4F374D3951354432483140333C3A3C373C3A0404EF2B442B44" + $"2F503550324C385436573E4D3F553E4D00024728472842252E2B37222E2B0402" + $"0E2A302834293227360002333B333B373D4A3E45444A3E120A0101000241CBC6" + $"3EAFF7BDA3754091DCCA48B8CB509A0A0001073020B2C001179420040A050107" + $"3820B2C0001501178E20040A0501073820B2C015FF01179020040A0101082020" + $"B2C00A0001013020B2C001179420040A0201023820B2C0001501178E20040A02" + $"01023820B2C015FF01179020040A0301033820B2C0001501178E20040A030103" + $"3820B2C015FF01179020040A0401043820B2C0001501178E20040A0401043820" + $"B2C015FF01179020040A0101092020B2C00A0001063020B2C001179420040A05" + $"01063820B2C0001501178E20040A0501063820B2C015FF01179020040A050105" + $"3820B2C015FF01179020040A06030A0C0B100117842004" +}; + +// Away + +resource(kAwayReplicant) #'VICN' array { + $"6E636966070501040156020106023DB0753A5ED7B9F9EE3D18204A5B813F873F" + $"C3FF930651FFFCB3020106023DE0000000000000003D40004A200049A00053FF" + $"9306CBFFFCB3020106023F5C743B37D1BAB2F23ED1AC471CEC4937F8BFFF9306" + $"48FFFCB3020106023EC0D03BF7CDBAC4EE3DD7C849909B4875A357FFFCB3CDFF" + $"B006020112023EA645399A4BB883763DB26D497A2947E6FF00FFFFFFFF000D02" + $"045040C9A540C29A40405040C29A40C9A55060C29A60C9A560605060C9A560C2" + $"9A0002492E492E2A1E354F204A354F0002492E492EC20DB7EABFC2B752C0DBB7" + $"82BFC2B7520002BFC2B752BFC2B752BA7BB668B6FEBE79B765BA6DB6FEBE7900" + $"02B6FEBE79B6FEBE79B6ABC1B2354FB80BC4EF354F0002C43BC1E9C43BC1E9C5" + $"C2C1A8C54CBFB7C660C0E5C54CBFB7000233403340BF87C25CC5C9C112C52BC2" + $"93C5C9C1120002C5C9C112C5C9C112C61CC047453AC50ABF02453A0405FE0340" + $"3C44394238463A4F374D3951354432483140333C3A3C373C3A0404EF2B442B44" + $"2F503550324C385436573E4D3F553E4D00024728472842252E2B37222E2B0402" + $"0E2A302834293227360002333B333B373D4A3E45444A3E120A0101000241CBC6" + $"3EAFF7BDA3754091DCCA48B8CB509A0A0001073020B2C001179420040A050107" + $"3820B2C0001501178E20040A0501073820B2C015FF01179020040A0101082020" + $"B2C00A0001013020B2C001179420040A0201023820B2C0001501178E20040A02" + $"01023820B2C015FF01179020040A0301033820B2C0001501178E20040A030103" + $"3820B2C015FF01179020040A0401043820B2C0001501178E20040A0401043820" + $"B2C015FF01179020040A0101092020B2C00A0001063020B2C001179420040A05" + $"01063820B2C0001501178E20040A0501063820B2C015FF01179020040A050105" + $"3820B2C015FF01179020040A06030A0C0B100117842004" +}; + +// Replicant menu exit + +resource(kExitMenuReplicant) #'VICN' array { + $"6E63696601020104040000337F558B9097A92D3541FF0F12160102044030C345" + $"30BC3A30304030BC3A30C3454050BC3A50C34550504050C34550BC3A010A0001" + $"0002408000000000000000408000C60000C60000" +}; + diff --git a/application/CayaMessages.h b/application/CayaMessages.h index 8883c39..acd40d5 100644 --- a/application/CayaMessages.h +++ b/application/CayaMessages.h @@ -5,13 +5,28 @@ #ifndef _CAYA_MESSAGES_H #define _CAYA_MESSAGES_H +//! Show settings window +const uint32 CAYA_SHOW_SETTINGS = 'RPST'; + //! Open chat window -const uint32 CAYA_OPEN_WINDOW = 'CYow'; +const uint32 CAYA_OPEN_CHAT_WINDOW = 'CYow'; //! Close chat window -const uint32 CAYA_CLOSE_WINDOW = 'CYcw'; +const uint32 CAYA_CLOSE_CHAT_WINDOW = 'CYcw'; //! Chat messages const uint32 CAYA_CHAT = 'CYch'; +//! Send replicant's messenger to Caya +const uint32 CAYA_REPLICANT_MESSENGER = 'RPme'; + +//! Status notification from the replicant +const uint32 CAYA_REPLICANT_STATUS_SET = 'RPMS'; + +//! Exit notification from replicant +const uint32 CAYA_REPLICANT_EXIT = 'RPEX'; + +//! Show main window replicant notification +const uint32 CAYA_REPLICANT_SHOW_WINDOW = 'CYSW'; + #endif // _CAYA_MESSAGES_H diff --git a/application/CayaResources.h b/application/CayaResources.h index 8d5a646..3e25199 100644 --- a/application/CayaResources.h +++ b/application/CayaResources.h @@ -14,7 +14,14 @@ enum { kToolIcon = 20, kSearchIcon = 21, - kProtocolSettingsTemplate = 1000 + kProtocolSettingsTemplate = 1000, + + kConnectingReplicant = 1200, + kCayaIconReplicant = 1220, + kOfflineReplicant = 1300, + kBusyReplicant = 1333, + kAwayReplicant = 1400, + kExitMenuReplicant = 1401 }; #endif // _CAYA_RESOURCES_H diff --git a/application/ChatWindow.cpp b/application/ChatWindow.cpp index 398948a..35c92e5 100644 --- a/application/ChatWindow.cpp +++ b/application/ChatWindow.cpp @@ -71,7 +71,7 @@ ChatWindow::ChatWindow(ContactLinker* cl) bool ChatWindow::QuitRequested() { - BMessage msg(CAYA_CLOSE_WINDOW); + BMessage msg(CAYA_CLOSE_CHAT_WINDOW); msg.AddString("id", fContactLinker->GetId()); fContactLinker->Messenger().SendMessage(&msg); return false; diff --git a/application/Jamfile b/application/Jamfile index 4bd0968..9e125da 100644 --- a/application/Jamfile +++ b/application/Jamfile @@ -53,6 +53,8 @@ Application Caya : StatusMenuItem.cpp StatusView.cpp CayaRenderView.cpp + ReplicantStatusView.cpp + ReplicantMenuItem.cpp : be $(TARGET_LIBSTDC++) translation expat libinterface.a librunview.a libsupport.a : Caya.rdef diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 8a9be72..91795ad 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include +#include "AccountManager.h" #include "CayaConstants.h" #include "CayaMessages.h" #include "CayaProtocolMessages.h" @@ -41,6 +43,7 @@ #include "NotifyMessage.h" #include "MainWindow.h" #include "PreferencesDialog.h" +#include "ReplicantStatusView.h" #include "RosterItem.h" #include "RosterListView.h" #include "Server.h" @@ -49,12 +52,11 @@ const uint32 kLogin = 'LOGI'; const uint32 kSearchContact = 'SRCH'; -const uint32 kPreferences = 'WPRF'; - MainWindow::MainWindow() : - BWindow(BRect(0, 0, 300, 400), "Caya", B_DOCUMENT_WINDOW, 0) + BWindow(BRect(0, 0, 300, 400), "Caya", B_DOCUMENT_WINDOW, 0), + fWorkspaceChanged(false) { fStatusView = new StatusView("statusView"); @@ -62,7 +64,7 @@ MainWindow::MainWindow() new BMessage(kSearchContact)); fListView = new RosterListView("buddyView"); - fListView->SetInvocationMessage(new BMessage(CAYA_OPEN_WINDOW)); + fListView->SetInvocationMessage(new BMessage(CAYA_OPEN_CHAT_WINDOW)); BScrollView* scrollView = new BScrollView("scrollview", fListView, B_WILL_DRAW, false, true); @@ -72,7 +74,7 @@ MainWindow::MainWindow() new BMessage(B_ABOUT_REQUESTED))); (void)wrenchMenu->AddItem(new BSeparatorItem()); (void)wrenchMenu->AddItem(new BMenuItem("Preferences" B_UTF8_ELLIPSIS, - new BMessage(kPreferences))); + new BMessage(CAYA_SHOW_SETTINGS))); (void)wrenchMenu->AddItem(new BSeparatorItem()); (void)wrenchMenu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED))); @@ -105,6 +107,9 @@ MainWindow::MainWindow() AddFilter(fServer); CenterOnScreen(); + + //TODO check for errors here + _InstallReplicant(); } @@ -122,6 +127,7 @@ MainWindow::QuitRequested() fListView->MakeEmpty(); fServer->Quit(); CayaPreferences::Get()->Save(); + _RemoveReplicant(); be_app->PostMessage(B_QUIT_REQUESTED); return true; } @@ -158,18 +164,47 @@ MainWindow::MessageReceived(BMessage* message) } break; } - case kPreferences: { + case CAYA_SHOW_SETTINGS: { PreferencesDialog* dialog = new PreferencesDialog(); dialog->Show(); break; } - case CAYA_OPEN_WINDOW: { + case CAYA_OPEN_CHAT_WINDOW: { int index = message->FindInt32("index"); RosterItem* ritem = ItemAt(index); if (ritem != NULL) ritem->GetContactLinker()->ShowWindow(); break; } + + case CAYA_REPLICANT_STATUS_SET: + { + int32 status; + message->FindInt32("status", &status); + AccountManager* accountManager = AccountManager::Get(); + accountManager->SetStatus((CayaStatus)status); + break; + } + + case CAYA_REPLICANT_SHOW_WINDOW: + { + if (LockLooper()) { + SetWorkspaces(B_CURRENT_WORKSPACE); + + if ((IsMinimized() || IsHidden()) + || fWorkspaceChanged) { + Minimize(false); + Show(); + fWorkspaceChanged = false; + } else if ((!IsMinimized() || !IsHidden()) + || (!fWorkspaceChanged)) { + Minimize(true); + } + UnlockLooper(); + } + break; + } + case IM_MESSAGE: ImMessage(message); break; @@ -179,6 +214,7 @@ MainWindow::MessageReceived(BMessage* message) case B_ABOUT_REQUESTED: be_app->PostMessage(message); break; + default: BWindow::MessageReceived(message); } @@ -357,3 +393,36 @@ MainWindow::RemoveItem(RosterItem* item) fListView->RemoveItem(item); fListView->Sort(); } + + +void +MainWindow::WorkspaceActivated(int32 workspace, bool active) +{ + if (active) + fWorkspaceChanged = false; + else + fWorkspaceChanged = true; +} + + +// The following methods install +// and remove the Caya's replicant +// from Deskbar. +status_t +MainWindow::_InstallReplicant() +{ + BDeskbar deskbar; + if (deskbar.HasItem("ReplicantStatusView")) { + _RemoveReplicant(); + } + ReplicantStatusView* view = new ReplicantStatusView(); + return deskbar.AddItem(view); +} + + +status_t +MainWindow::_RemoveReplicant() +{ + BDeskbar deskbar; + return deskbar.RemoveItem("ReplicantStatusView"); +} diff --git a/application/MainWindow.h b/application/MainWindow.h index e8cdad7..f8a0150 100644 --- a/application/MainWindow.h +++ b/application/MainWindow.h @@ -29,6 +29,9 @@ public: void ImError(BMessage* msg); virtual bool QuitRequested(); + virtual void WorkspaceActivated(int32 workspace, + bool active); + void ObserveInteger(int32 what, int32 val); Server* GetServer() const { return fServer; } @@ -40,11 +43,15 @@ public: void AddItem(RosterItem*); bool HasItem(RosterItem*); void RemoveItem(RosterItem*); - + private: + status_t _InstallReplicant(); + status_t _RemoveReplicant(); + StatusView* fStatusView; RosterListView* fListView; Server* fServer; + bool fWorkspaceChanged; }; #endif // _MAIN_WINDOW_H diff --git a/application/Server.cpp b/application/Server.cpp index 1d2b679..ca6422c 100644 --- a/application/Server.cpp +++ b/application/Server.cpp @@ -6,6 +6,9 @@ * Authors: * Andrea Anzani, andrea.anzani@gmail.com * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com + * + * Contributors: + * Dario Casalinuovo */ #include @@ -30,7 +33,8 @@ Server::Server() : - BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE) + BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE), + fReplicantMessenger(NULL) { } @@ -38,6 +42,8 @@ Server::Server() void Server::Quit() { + delete fReplicantMessenger; + ContactLinker* linker = NULL; while ((linker = fRosterMap.ValueAt(0))) { @@ -132,7 +138,7 @@ Server::Filter(BMessage* message, BHandler **target) result = B_SKIP_MESSAGE; break; } - case CAYA_CLOSE_WINDOW: + case CAYA_CLOSE_CHAT_WINDOW: { BString id = message->FindString("id"); if (id.Length() > 0) { @@ -148,6 +154,21 @@ Server::Filter(BMessage* message, BHandler **target) case IM_MESSAGE: result = ImMessage(message); break; + + case CAYA_REPLICANT_MESSENGER: + { + fReplicantMessenger = new BMessenger(); + + status_t ret = message->FindMessenger( + "messenger", fReplicantMessenger); + + if (ret != B_OK || !fReplicantMessenger->IsValid()) { + message->PrintToStream(); + printf("err %s\n", strerror(ret)); + } + break; + } + default: // Dispatch not handled messages to main window break; @@ -200,9 +221,9 @@ Server::ImMessage(BMessage* msg) } case IM_OWN_STATUS_SET: { + //msg->PrintToStream(); int32 status; const char* protocol; - if (msg->FindInt32("status", &status) != B_OK) return B_SKIP_MESSAGE; if (msg->FindString("protocol", &protocol) != B_OK) @@ -210,6 +231,8 @@ Server::ImMessage(BMessage* msg) AccountManager* accountManager = AccountManager::Get(); accountManager->SetStatus((CayaStatus)status); + + _ReplicantStatusNotify((CayaStatus)status); break; } case IM_STATUS_SET: @@ -219,12 +242,15 @@ Server::ImMessage(BMessage* msg) if (msg->FindInt32("status", &status) != B_OK) return B_SKIP_MESSAGE; + _ReplicantStatusNotify((CayaStatus)status); + ContactLinker* linker = _EnsureContactLinker(msg); if (!linker) break; linker->SetNotifyStatus((CayaStatus)status); linker->SetNotifyPersonalStatus(msg->FindString("message")); + break; } case IM_CONTACT_INFO: @@ -310,11 +336,11 @@ Server::ImMessage(BMessage* msg) return result; if (msg->FindFloat("progress", &progress) != B_OK) return result; +#if 0 CayaProtocolAddOn* addOn = ProtocolManager::Get()->ProtocolAddOn(protocol); -#if 0 BNotification notification(B_PROGRESS_NOTIFICATION); notification.SetGroup(BString("Caya")); notification.SetTitle(title); @@ -341,10 +367,10 @@ Server::ImMessage(BMessage* msg) if (msg->FindString("message", &message) != B_OK) return result; +#if 0 CayaProtocolAddOn* addOn = ProtocolManager::Get()->ProtocolAddOn(protocol); -#if 0 BNotification notification((notification_type)type); notification.SetGroup(BString("Caya")); notification.SetTitle(title); @@ -354,6 +380,7 @@ Server::ImMessage(BMessage* msg) #endif break; } + default: break; } @@ -411,3 +438,14 @@ Server::_EnsureContactLinker(BMessage* message) return item; } + +void +Server::_ReplicantStatusNotify(CayaStatus status) +{ + if(fReplicantMessenger != NULL && fReplicantMessenger->IsValid()) { + BMessage mess(IM_OWN_STATUS_SET); + mess.AddInt32("status", status); + //mess.PrintToStream(); + fReplicantMessenger->SendMessage(&mess); + } +} diff --git a/application/Server.h b/application/Server.h index 4f23295..7d78c74 100644 --- a/application/Server.h +++ b/application/Server.h @@ -46,12 +46,14 @@ public: ContactLinker* GetOwnContact(); private: - ProtocolLooper* _LooperFromMessage(BMessage* message); - ContactLinker* _EnsureContactLinker(BMessage* message); + ProtocolLooper* _LooperFromMessage(BMessage* message); + ContactLinker* _EnsureContactLinker(BMessage* message); + void _ReplicantStatusNotify(CayaStatus status); - RosterMap fRosterMap; - ProtocolLoopers fLoopers; - ContactLinker* fMySelf; + RosterMap fRosterMap; + ProtocolLoopers fLoopers; + ContactLinker* fMySelf; + BMessenger* fReplicantMessenger; }; #endif // _SERVER_H diff --git a/application/TheApp.cpp b/application/TheApp.cpp index 323c7e8..fe968c5 100644 --- a/application/TheApp.cpp +++ b/application/TheApp.cpp @@ -16,16 +16,17 @@ #include "AboutWindow.h" #include "Caya.h" +#include "CayaMessages.h" #include "Emoticor.h" #include "FilePanel.h" #include "MainWindow.h" #include "ProtocolManager.h" +#include "ReplicantStatusView.h" #include "Server.h" #include "TheApp.h" #include "svn_revision.h" - TheApp::TheApp() : BApplication(CAYA_SIGNATURE), @@ -36,7 +37,7 @@ TheApp::TheApp() void TheApp::ReadyToRun() -{ +{ app_info theInfo; fMainWin = new MainWindow(); @@ -90,12 +91,14 @@ TheApp::AboutRequested() const char* holders[] = { "2009-2010 Andrea Anzani", "2009-2010 Pier Luigi Fiorini", + "2011-2012 Casalinuovo Dario", NULL }; const char* authors[] = { "Andrea Anzani", "Pier Luigi Fiorini", + "Casalinuovo Dario", NULL }; @@ -115,3 +118,25 @@ TheApp::GetMainWindow() const { return fMainWin; } + + +void +TheApp::MessageReceived(BMessage* message) +{ + //message->PrintToStream(); + switch (message->what) { + case CAYA_REPLICANT_STATUS_SET: + case CAYA_REPLICANT_SHOW_WINDOW: + case CAYA_SHOW_SETTINGS: + case CAYA_REPLICANT_MESSENGER: + DetachCurrentMessage(); + fMainWin->PostMessage(message); + break; + case CAYA_REPLICANT_EXIT: + // TODO BAlert here + PostMessage(B_QUIT_REQUESTED); + break; + default: + BLooper::MessageReceived(message); + } +} diff --git a/application/TheApp.h b/application/TheApp.h index 94e03ec..6c444f2 100644 --- a/application/TheApp.h +++ b/application/TheApp.h @@ -17,6 +17,8 @@ public: virtual void ReadyToRun(); virtual void AboutRequested(); + virtual void MessageReceived(BMessage* message); + MainWindow* GetMainWindow() const; private: diff --git a/application/preferences/PreferencesBehavior.cpp b/application/preferences/PreferencesBehavior.cpp index 2c5ccf7..a608eb7 100644 --- a/application/preferences/PreferencesBehavior.cpp +++ b/application/preferences/PreferencesBehavior.cpp @@ -55,6 +55,18 @@ PreferencesBehavior::PreferencesBehavior() fMarkUnreadWindow->SetEnabled(false); // not implemented + fDisableReplicant = new BCheckBox("DisableReplicant", + "Disable Deskbar replicant", NULL); + fDisableReplicant->SetEnabled(true); + + fPermanentReplicant = new BCheckBox("PermanentReplicant", + "Permanent Deskbar Replicant", NULL); + fPermanentReplicant->SetEnabled(true); + + fHideCayaTracker = new BCheckBox("HideCayaTracker", + "Hide Caya in Tracker", NULL); + fHideCayaTracker->SetEnabled(false); + const float spacing = be_control_look->DefaultItemSpacing(); SetLayout(new BGroupLayout(B_HORIZONTAL, spacing)); @@ -65,6 +77,9 @@ PreferencesBehavior::PreferencesBehavior() .Add(fActivateChatWindow) .Add(fMarkUnreadWindow) .Add(fPlaySoundOnMessageReceived) + .Add(fDisableReplicant) + .Add(fPermanentReplicant) + .Add(fHideCayaTracker) .SetInsets(spacing * 2, spacing, spacing, spacing) .End() .Add(fIgnoreEmoticons) diff --git a/application/preferences/PreferencesBehavior.h b/application/preferences/PreferencesBehavior.h index 752285c..ef7e8e5 100644 --- a/application/preferences/PreferencesBehavior.h +++ b/application/preferences/PreferencesBehavior.h @@ -27,6 +27,10 @@ private: BCheckBox* fIgnoreEmoticons; + BCheckBox* fDisableReplicant; + BCheckBox* fPermanentReplicant; + BCheckBox* fHideCayaTracker; + }; #endif // _PREFERENCES_BEHAVIOR_H diff --git a/application/views/ReplicantMenuItem.cpp b/application/views/ReplicantMenuItem.cpp new file mode 100644 index 0000000..7f1a093 --- /dev/null +++ b/application/views/ReplicantMenuItem.cpp @@ -0,0 +1,88 @@ +/* + * Copyright 2009, Pier Luigi Fiorini. All rights reserved. + * Copyright 2011, Pier Luigi Fiorini. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com + * Dario Casalinuovo + */ +#include "ReplicantMenuItem.h" + +#include + +#include +#include + +#include + +#include "CayaMessages.h" +#include "CayaResources.h" +#include "CayaUtils.h" +#include "ReplicantStatusView.h" + +const float kSize = 16; +const float kCircle = 12; + + +ReplicantMenuItem::ReplicantMenuItem(const char* label, CayaStatus status, + bool custom = false, char shortcut, uint32 modifiers) + : + BitmapMenuItem(label, NULL, NULL, shortcut, modifiers), + fStatus(status), + fCustom(custom) +{ + BMessage* msg = new BMessage(CAYA_REPLICANT_STATUS_SET); + msg->AddInt32("status", fStatus); + SetMessage(msg); + + SetIcon(); +} + + +CayaStatus +ReplicantMenuItem::Status() const +{ + return fStatus; +} + + +bool +ReplicantMenuItem::IsCustom() const +{ + return fCustom; +} + + +void +ReplicantMenuItem::SetIcon() +{ + BResources* res = CayaResources(); + if (!res) + return; + + int32 num = 0; + + switch (fStatus) { + case CAYA_ONLINE: + num = kConnectingReplicant; + break; + case CAYA_EXTENDED_AWAY: + case CAYA_AWAY: + num = kAwayReplicant; + break; + case CAYA_DO_NOT_DISTURB: + num = kBusyReplicant; + break; + case CAYA_OFFLINE: + num = kOfflineReplicant; + break; + default: + break; + } + + BBitmap* bitmap = IconFromResources(res, num, B_MINI_ICON); + SetBitmap(bitmap); + + delete res; +} diff --git a/application/views/ReplicantMenuItem.h b/application/views/ReplicantMenuItem.h new file mode 100644 index 0000000..74cb0e5 --- /dev/null +++ b/application/views/ReplicantMenuItem.h @@ -0,0 +1,34 @@ +/* + * Copyright 2009, Pier Luigi Fiorini. All rights reserved. + * Copyright 2011, Dario Casalinuovo. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _STATUS_MENU_ITEM_H +#define _STATUS_MENU_ITEM_H + +#include + +#include + +#include "CayaConstants.h" + +class BBitmap; + +const int32 kSetStatus = 'SEST'; + +class ReplicantMenuItem : public BitmapMenuItem { +public: + ReplicantMenuItem(const char* label, CayaStatus status, + bool custom = false, char shortcut = 0, uint32 modifiers = 0); + + CayaStatus Status() const; + bool IsCustom() const; + +private: + CayaStatus fStatus; + bool fCustom; + + void SetIcon(); +}; + +#endif // _STATUS_MENU_ITEM_H diff --git a/application/views/ReplicantStatusView.cpp b/application/views/ReplicantStatusView.cpp new file mode 100644 index 0000000..45123ac --- /dev/null +++ b/application/views/ReplicantStatusView.cpp @@ -0,0 +1,355 @@ +/* + * Copyright 2011, Dario Casalinuovo. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Dario Casalinuovo + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "AccountManager.h" +#include "BitmapView.h" +#include "Caya.h" +#include "CayaMessages.h" +#include "CayaProtocolMessages.h" +#include "CayaUtils.h" +#include "NicknameTextControl.h" +#include "ReplicantStatusView.h" +#include "ReplicantMenuItem.h" + +#include + +extern "C" _EXPORT BView *instantiate_deskbar_item(void); + + +// The following handler is added to the Deskbar's looper +// to receive notifications from Caya +class ReplicantHandler : public BHandler { +public: + ReplicantHandler(const char* name, ReplicantStatusView* target) + : BHandler(name) + { + fTarget = target; + } + + ~ReplicantHandler() {} + + virtual void MessageReceived(BMessage* message) + { + switch (message->what) { + case IM_OWN_STATUS_SET: + { + int32 status; + + if (message->FindInt32("status", &status) != B_OK) + return; + fTarget->SetStatus((CayaStatus)status); + break; + } + default: + BHandler::MessageReceived(message); + } + } +private: + ReplicantStatusView* fTarget; +}; + + +ReplicantStatusView::ReplicantStatusView() + : + BView(BRect(0, 0, 15, 15), "ReplicantStatusView", + B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW) +{ + _Init(); +} + + +ReplicantStatusView::ReplicantStatusView(BMessage* archive) + : + BView(archive) +{ + _Init(); +} + + +ReplicantStatusView::~ReplicantStatusView() +{ + delete fResources; + delete fCayaMsg; + delete fReplicantHandler; +// delete fStatusMenu; +// delete fReplicantMenu; + + // TODO: Use a list for that + // maybe our List wrapper to std::list + delete fConnectingIcon; + delete fCayaIcon; + delete fOfflineIcon; + delete fBusyIcon; + delete fAwayIcon; +} + + +void +ReplicantStatusView::MessageReceived(BMessage* msg) +{ + switch (msg->what) { + case CAYA_REPLICANT_STATUS_SET: + { + int32 status; + + if (msg->FindInt32("status", &status) != B_OK) + return; + + SetStatus((CayaStatus)status); + fCayaMsg->SendMessage(msg); + break; + } + case CAYA_REPLICANT_EXIT: + case CAYA_SHOW_SETTINGS: + case CAYA_REPLICANT_SHOW_WINDOW: + case CAYA_REPLICANT_MESSENGER: + fCayaMsg->SendMessage(msg); + break; + default: + BView::MessageReceived(msg); + } +} + + +void +ReplicantStatusView::SetStatus(CayaStatus status) +{ + for (int32 i = 0; i < fReplicantMenu->CountItems(); i++) { + ReplicantMenuItem* item + = dynamic_cast(fReplicantMenu->ItemAt(i)); + if (item == NULL) + continue; + + if (item->IsMarked()) + item->SetMarked(false); + + if (item && item->Status() == status && !item->IsCustom()) + item->SetMarked(true); + + } + + switch (status) { + case CAYA_AWAY: + case CAYA_EXTENDED_AWAY: + fIcon = fAwayIcon; + break; + case CAYA_DO_NOT_DISTURB: + fIcon = fBusyIcon; + break; + case CAYA_OFFLINE: + fIcon = fOfflineIcon; + break; + default: + fIcon = fCayaIcon; + break; + } + Invalidate(); +} + + + +// Draw our deskbar icon. +void +ReplicantStatusView::Draw(BRect rect) +{ + SetDrawingMode(B_OP_ALPHA); + DrawBitmap(fIcon); +} + + +ReplicantStatusView* +ReplicantStatusView::Instantiate(BMessage* archive) +{ + if (!validate_instantiation(archive, "ReplicantStatusView")) + return NULL; + + return new ReplicantStatusView(archive); +} + + +status_t +ReplicantStatusView::Archive(BMessage* archive, bool deep) const +{ + status_t status = BView::Archive(archive, deep); + + if (status == B_OK) + status = archive->AddString("add_on", CAYA_SIGNATURE); + + if (status == B_OK) + status = archive->AddString("class", "ReplicantStatusView"); + + return status; +} + + +void +ReplicantStatusView::AttachedToWindow() +{ + BView::AttachedToWindow(); + if (Parent()) + SetViewColor(Parent()->ViewColor()); + else + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + + SetLowColor(ViewColor()); + + fReplicantHandler = new ReplicantHandler("CayaReplicantHandler", this); + if (Window()->Lock()) { + Window()->AddHandler(fReplicantHandler); + Window()->Unlock(); + } + + BMessage msg(CAYA_REPLICANT_MESSENGER); + BMessenger messenger(fReplicantHandler); + if (!messenger.IsValid()) + return; + msg.AddMessenger("messenger", messenger); + fCayaMsg->SendMessage(&msg); +} + + +void +ReplicantStatusView::DetachedFromWindow() +{ + if (Window()->Lock()) { + Window()->RemoveHandler(fReplicantHandler); + Window()->Unlock(); + } +} + + +void +ReplicantStatusView::MouseDown(BPoint point) +{ + + unsigned long buttons; + if (LockLooper()) { + GetMouse(&point, &buttons, false); + UnlockLooper(); + } + if (buttons & B_PRIMARY_MOUSE_BUTTON) { + // Show / Hide Window command + BMessage msg(CAYA_REPLICANT_SHOW_WINDOW); + fCayaMsg->SendMessage(&msg); + } else if(buttons & B_SECONDARY_MOUSE_BUTTON) { + // Build replicant menu + _ShowMenu(point); + } +} + + +void +ReplicantStatusView::_Init() +{ + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + + // Creating the Send messenger and sending + // a messenger targeting this to Caya. + // This will allow the Replicant to communicate + // whith Caya. + fCayaMsg = new BMessenger(CAYA_SIGNATURE); + + fResources = CayaResources(); + + //Get icons from resources + fConnectingIcon = _GetIcon(kConnectingReplicant); + fCayaIcon = _GetIcon(kCayaIconReplicant); + fOfflineIcon = _GetIcon(kOfflineReplicant); + fIcon = fOfflineIcon; + fBusyIcon = _GetIcon(kBusyReplicant); + fAwayIcon = _GetIcon(kAwayReplicant); + fExitMenuIcon = _GetIcon(kExitMenuReplicant); + + // Build the replicant menu + _BuildMenu(); +} + + +BBitmap* +ReplicantStatusView::_GetIcon(const uint32 id) +{ + BBitmap* icon = IconFromResources(fResources, id, B_MINI_ICON); + return icon; +} + + +void +ReplicantStatusView::_BuildMenu() +{ + // Status menu + //fStatusMenu = new BPopUpMenu("Status", false, false); + fReplicantMenu = new BPopUpMenu(" - ", false, false); + // Add status menu items + int32 s = CAYA_ONLINE; + while (s >= CAYA_ONLINE && s < CAYA_STATUSES) { + if (s == CAYA_EXTENDED_AWAY) { + s++; + continue; + } + BMessage* msg = new BMessage(CAYA_REPLICANT_STATUS_SET); + msg->AddInt32("status", s); + + ReplicantMenuItem* item = new ReplicantMenuItem( + CayaStatusToString((CayaStatus)s), (CayaStatus)s); + fReplicantMenu->AddItem(item); + + // Add items for custom messages + if (s == CAYA_ONLINE/* || s == CAYA_DO_NOT_DISTURB*/) { + item = new ReplicantMenuItem("Custom...", (CayaStatus) s, true); + fReplicantMenu->AddItem(item); + fReplicantMenu->AddItem(new BSeparatorItem()); + } + + // Mark offline status by default + if (s == CAYA_OFFLINE) + item->SetMarked(true); + s++; + } + + //fReplicantMenu->AddItem(fStatusMenu); + fReplicantMenu->AddItem(new BSeparatorItem()); + + fReplicantMenu->AddItem(new BitmapMenuItem("Preferences ", + new BMessage(CAYA_SHOW_SETTINGS), fCayaIcon)); + + fReplicantMenu->AddItem(new BitmapMenuItem("Exit", + new BMessage(CAYA_REPLICANT_EXIT), fExitMenuIcon)); + + //fStatusMenu->SetTargetForItems(fReplicantMenu); + fReplicantMenu->SetTargetForItems(this); +} + + +void +ReplicantStatusView::_ShowMenu(BPoint point) +{ + fReplicantMenu->SetTargetForItems(this); + ConvertToScreen(&point); + fReplicantMenu->Go(point, true, true, true); +} + + +extern "C" _EXPORT BView * +instantiate_deskbar_item(void) +{ + return new ReplicantStatusView(); +} diff --git a/application/views/ReplicantStatusView.h b/application/views/ReplicantStatusView.h new file mode 100644 index 0000000..558f784 --- /dev/null +++ b/application/views/ReplicantStatusView.h @@ -0,0 +1,71 @@ +/* + * Copyright 2011, Dario Casalinuovo. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Dario Casalinuovo + */ +#ifndef _REPLICANT_STATUS_VIEW_H +#define _REPLICANT_STATUS_VIEW_H + +#include +#include +#include +#include + +#include "CayaConstants.h" +#include "CayaResources.h" + +class BPopUpMenu; +class BMenuField; + +class BitmapView; +class NicknameTextControl; + +class ReplicantHandler; + +class ReplicantStatusView : public BView { +public: + ReplicantStatusView(); + ReplicantStatusView(BMessage* archive); + ~ReplicantStatusView(); + + virtual void MessageReceived(BMessage* msg); + virtual void AttachedToWindow(); + virtual void DetachedFromWindow(); + + virtual void Draw(BRect rect); + + void SetStatus(CayaStatus status); + + virtual status_t Archive(BMessage* archive, bool deep) const; + + static ReplicantStatusView* Instantiate(BMessage* archive); + + void MouseDown(BPoint point); +private: + void _Init(); + void _BuildMenu(); + void _ShowMenu(BPoint point); + BBitmap* _GetIcon(const uint32 id); + + BBitmap* fIcon; + + BBitmap* fConnectingIcon; + BBitmap* fCayaIcon; + BBitmap* fOfflineIcon; + BBitmap* fBusyIcon; + BBitmap* fAwayIcon; + BBitmap* fExitMenuIcon; + + BResources* fResources; + + BPopUpMenu* fReplicantMenu; + + bool fIsInstalled; + BMessenger* fCayaMsg; + + ReplicantHandler* fReplicantHandler; +}; + +#endif diff --git a/application/views/StatusMenuItem.h b/application/views/StatusMenuItem.h index 2e828eb..a7287c9 100644 --- a/application/views/StatusMenuItem.h +++ b/application/views/StatusMenuItem.h @@ -17,8 +17,9 @@ const int32 kSetStatus = 'SEST'; class StatusMenuItem : public BitmapMenuItem { public: - StatusMenuItem(const char* label, CayaStatus status, bool custom = false, - char shortcut = 0, uint32 modifiers = 0); + StatusMenuItem(const char* label, CayaStatus status, + bool custom = false, char shortcut = 0, + uint32 modifiers = 0); CayaStatus Status() const; bool IsCustom() const; diff --git a/libs/Jamfile b/libs/Jamfile index 3a3e528..9ac465f 100644 --- a/libs/Jamfile +++ b/libs/Jamfile @@ -1,7 +1,7 @@ SubDir TOP libs ; # Include all the components. -SubInclude TOP libs libdownload ; +#SubInclude TOP libs libdownload ; SubInclude TOP libs librunview ; SubInclude TOP libs libsupport ; SubInclude TOP libs libinterface ; diff --git a/tests/Jamfile b/tests/Jamfile index 9dd9149..42cf980 100644 --- a/tests/Jamfile +++ b/tests/Jamfile @@ -1,4 +1,4 @@ SubDir TOP tests ; # Include all the components -SubInclude TOP tests libdownload ; +#SubInclude TOP tests libdownload ;