Author: czeidler Date: 2011-03-22 11:31:54 +0100 (Tue, 22 Mar 2011) New Revision: 41078 Changeset: https://dev.haiku-os.org/changeset/41078 Ticket: https://dev.haiku-os.org/ticket/7384 Modified: haiku/trunk/src/preferences/mail/ConfigWindow.cpp Log: Incoming and outgoing protocols can be disabled/enabled using a right click menu in the account list view. Fixes #7384. Modified: haiku/trunk/src/preferences/mail/ConfigWindow.cpp =================================================================== --- haiku/trunk/src/preferences/mail/ConfigWindow.cpp 2011-03-22 10:28:22 UTC (rev 41077) +++ haiku/trunk/src/preferences/mail/ConfigWindow.cpp 2011-03-22 10:31:54 UTC (rev 41078) @@ -66,6 +66,7 @@ const rgb_color kLinkColor = { 40, 40, 180, 255 }; +const uint32 kMsgAccountsRightClicked = 'arcl'; const uint32 kMsgAccountSelected = 'acsl'; const uint32 kMsgAddAccount = 'adac'; const uint32 kMsgRemoveAccount = 'rmac'; @@ -133,19 +134,54 @@ class AccountsListView : public BListView { - public: - AccountsListView(BRect rect) : BListView(rect,NULL,B_SINGLE_SELECTION_LIST,B_FOLLOW_ALL) {} - virtual void KeyDown(const char *bytes, int32 numBytes) { - if (numBytes != 1) - return; +public: + AccountsListView(BRect rect, BHandler* target) + : + BListView(rect, NULL, B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL), + fTarget(target) + { + } - if ((*bytes == B_DELETE) || (*bytes == B_BACKSPACE)) - Window()->PostMessage(kMsgRemoveAccount); + void + KeyDown(const char *bytes, int32 numBytes) + { + if (numBytes != 1) + return; - BListView::KeyDown(bytes,numBytes); - } + if ((*bytes == B_DELETE) || (*bytes == B_BACKSPACE)) + Window()->PostMessage(kMsgRemoveAccount); + + BListView::KeyDown(bytes,numBytes); + } + + void + MouseDown(BPoint point) + { + BListView::MouseDown(point); + + BPoint dummy; + uint32 buttons; + GetMouse(&dummy, &buttons); + if (buttons != B_SECONDARY_MOUSE_BUTTON) + return; + + int32 index = IndexOf(point); + if (index < 0) + return; + + BMessage message(kMsgAccountsRightClicked); + ConvertToScreen(&point); + message.AddPoint("point", point); + message.AddInt32("index", index); + BMessenger messenger(fTarget); + messenger.SendMessage(&message); + } + +private: + BHandler* fTarget; }; + class BitmapView : public BView { public: @@ -338,7 +374,7 @@ rect = view->Bounds().InsetByCopy(8, 8); rect.right = 140 - B_V_SCROLL_BAR_WIDTH; rect.bottom -= height + 12; - fAccountsListView = new AccountsListView(rect); + fAccountsListView = new AccountsListView(rect, this); view->AddChild(new BScrollView(NULL, fAccountsListView, B_FOLLOW_ALL, 0, false, true)); rect.right += B_V_SCROLL_BAR_WIDTH; @@ -721,6 +757,59 @@ AutoConfigWindow *autoConfigWindow = NULL; switch (msg->what) { + case kMsgAccountsRightClicked: + { + BPoint point; + msg->FindPoint("point", &point); + int32 index = msg->FindInt32("index"); + AccountItem* clickedItem = dynamic_cast<AccountItem*>( + fAccountsListView->ItemAt(index)); + if (clickedItem == NULL || clickedItem->GetType() != ACCOUNT_ITEM) + break; + + BPopUpMenu rightClickMenu("accounts", false, false); + + BMenuItem* inMenuItem = new BMenuItem("Incoming", NULL); + BMenuItem* outMenuItem = new BMenuItem("Outgoing", NULL); + rightClickMenu.AddItem(inMenuItem); + rightClickMenu.AddItem(outMenuItem); + + BMailAccountSettings* settings = clickedItem->GetAccount(); + if (settings->IsInboundEnabled()) + inMenuItem->SetMarked(true); + if (settings->IsOutboundEnabled()) + outMenuItem->SetMarked(true); + + BMenuItem* selectedItem = rightClickMenu.Go(point); + if (selectedItem == NULL) + break; + if (selectedItem == inMenuItem) { + AccountItem* item = dynamic_cast<AccountItem*>( + fAccountsListView->ItemAt(index + 1)); + if (item == NULL) + break; + if (settings->IsInboundEnabled()) { + settings->SetInboundEnabled(false); + item->SetEnabled(false); + } else { + settings->SetInboundEnabled(true); + item->SetEnabled(true); + } + } else { + AccountItem* item = dynamic_cast<AccountItem*>( + fAccountsListView->ItemAt(index + 2)); + if (item == NULL) + break; + if (settings->IsOutboundEnabled()) { + settings->SetOutboundEnabled(false); + item->SetEnabled(false); + } else { + settings->SetOutboundEnabled(true); + item->SetEnabled(true); + } + } + } + case kMsgAccountSelected: { int32 index; @@ -787,6 +876,7 @@ _SaveSettings(); AccountUpdated(fLastSelectedAccount); _MakeHowToView(); + fAccountsListView->DeselectAll(); break; default: @@ -929,10 +1019,14 @@ item = new AccountItem(B_TRANSLATE(" · Incoming"), account, INBOUND_ITEM); fAccountsListView->AddItem(item); + if (!account->IsInboundEnabled()) + item->SetEnabled(false); item = new AccountItem(B_TRANSLATE(" · Outgoing"), account, OUTBOUND_ITEM); fAccountsListView->AddItem(item); + if (!account->IsOutboundEnabled()) + item->SetEnabled(false); item = new AccountItem(B_TRANSLATE(" · E-mail filters"), account, FILTER_ITEM);