Show
Ignore:
Timestamp:
07/09/07 10:02:18 (2 years ago)
Author:
daboo
Message:

Some 4.1 changes. Mostly vCard/CardDAV and CalDAV scheduling support.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Mulberry/branches/v4.1d1/Sources_Common/Application/Address_Book_Manager/CAdbkManagerTableCommon.cp

    r19 r86  
    2424#include "CAdbkProtocol.h" 
    2525#include "CAdbkSearchWindow.h" 
    26 #include "CAddressBookDoc.h" 
     26#include "CAddressBook.h" 
    2727#include "CAddressBookManager.h" 
    2828#include "CAddressBookView.h" 
     
    3838#include "CMulberryApp.h" 
    3939#include "CMulberryCommon.h" 
    40 #include "CRemoteAddressBook.h" 
    4140#if __dest_os == __mac_os || __dest_os == __mac_os_x 
    4241#include "CResources.h" 
     
    4443#include "CPreferences.h" 
    4544#include "CTaskClasses.h" 
     45#include "CWaitCursor.h" 
    4646 
    4747#if __dest_os == __mac_os || __dest_os == __mac_os_x 
     
    6262 
    6363// O T H E R  M E T H O D S ____________________________________________________________________________ 
     64 
     65// Set the address book manager 
     66void CAdbkManagerTable::SetManager(CAddressBookManager* manager) 
     67{ 
     68        // Save server 
     69        mManager = manager; 
     70         
     71        if (mManager) 
     72        { 
     73                mManager->Add_Listener(this); 
     74 
     75                // Make sure its open so items will actually be displayed 
     76                mTableView->SetOpen(); 
     77 
     78                // Calculate number of rows for first time 
     79                ResetTable(); 
     80        } 
     81} 
     82 
     83// Reset the table 
     84void CAdbkManagerTable::ResetTable() 
     85{ 
     86        // Start cursor for busy operation 
     87        CWaitCursor wait; 
     88 
     89        // Delete all existing rows 
     90        Clear(); 
     91        mHierarchyCol = 1; 
     92        mData.clear(); 
     93 
     94        // Only if we have the manager 
     95        if (!mManager) 
     96                return; 
     97 
     98        // Get list from manager 
     99        const CAddressBookList& nodes = mManager->GetNodes(); 
     100 
     101        // Add each node 
     102        TableIndexT row = 0; 
     103        TableIndexT exp_row = 1; 
     104        for(CAddressBookList::const_iterator iter = nodes.begin(); iter != nodes.end(); iter++) 
     105        { 
     106                AddNode(*iter, row, false); 
     107 
     108                // Listen to each protocol 
     109                CAdbkProtocol* proto = (*iter)->GetProtocol(); 
     110                if (proto) 
     111                        proto->Add_Listener(this); 
     112                 
     113                // Bump up exposed row counter 
     114                exp_row++; 
     115        } 
     116 
     117        // Always expand a single account 
     118        if (exp_row == 2) 
     119                ExpandRow(1); 
     120 
     121        // Refresh list 
     122        FRAMEWORK_REFRESH_WINDOW(this) 
     123         
     124        // Force toolbar update 
     125        mTableView->RefreshToolbar(); 
     126 
     127} 
     128 
     129// Reset the table from the mboxList 
     130void CAdbkManagerTable::ClearTable() 
     131{ 
     132        // Delete all existing rows 
     133        Clear(); 
     134        mData.clear(); 
     135 
     136        // Refresh list 
     137        FRAMEWORK_REFRESH_WINDOW(this) 
     138         
     139        // Force toolbar update 
     140        mTableView->RefreshToolbar(); 
     141} 
    64142 
    65143void CAdbkManagerTable::ListenTo_Message(long msg, void* param) 
     
    83161                RefreshProtocol(static_cast<CAdbkProtocol*>(param)); 
    84162                break; 
     163        case CINETProtocol::eBroadcast_Logon: 
     164                SwitchProtocol(static_cast<CAdbkProtocol*>(param)); 
     165                break; 
    85166        case CINETProtocol::eBroadcast_Logoff: 
    86                 LogoffProtocol(static_cast<CAdbkProtocol*>(param)); 
     167                SwitchProtocol(static_cast<CAdbkProtocol*>(param)); 
    87168                break; 
    88         } 
    89 } 
    90  
    91 // Test for selected adbk 
    92 bool CAdbkManagerTable::TestSelectionAdbk(TableIndexT row) 
    93 { 
    94         // This is an adbk 
    95         return IsCellAdbk(row); 
    96 } 
    97  
    98 // Test for selected adbk 
    99 bool CAdbkManagerTable::TestSelectionAdbkDisconnected(TableIndexT row) 
    100 { 
    101         // This is an adbk 
    102         if (IsCellAdbk(row)) 
    103         { 
    104                 CRemoteAddressBook* adbk = dynamic_cast<CRemoteAddressBook*>(GetCellAdbk(row)); 
    105  
    106                 return adbk && adbk->GetProtocol()->CanDisconnect() && !adbk->GetProtocol()->IsDisconnected(); 
    107         } 
    108          
    109         return false; 
    110 } 
    111  
    112 // Test for selected adbk 
    113 bool CAdbkManagerTable::TestSelectionAdbkClearDisconnected(TableIndexT row) 
    114 { 
    115         // This is an adbk 
    116         if (IsCellAdbk(row)) 
    117         { 
    118                 CRemoteAddressBook* adbk = dynamic_cast<CRemoteAddressBook*>(GetCellAdbk(row)); 
    119  
    120                 return adbk && adbk->GetProtocol()->CanDisconnect(); 
    121         } 
    122          
    123         return false; 
    124 } 
    125  
    126 // Set the address book manager 
    127 void CAdbkManagerTable::SetManager(CAddressBookManager* manager) 
    128 { 
    129         // Save server 
    130         mManager = manager; 
    131          
    132         if (mManager) 
    133         { 
    134                 mManager->Add_Listener(this); 
    135  
    136                 // Make sure its open so items will actually be displayed 
    137                 mTableView->SetOpen(); 
    138  
    139                 // Calculate number of rows for first time 
    140                 ResetTable(); 
    141         } 
     169        case CAdbkProtocol::eBroadcast_ClearSubList: 
     170                ClearSubList(static_cast<CAddressBook*>(param)); 
     171                break; 
     172        case CAdbkProtocol::eBroadcast_RefreshSubList: 
     173                RefreshSubList(static_cast<CAddressBook*>(param)); 
     174                break; 
     175        case CAddressBookManager::eBroadcast_InsertNode: 
     176                InsertNode(static_cast<CAddressBook*>(param)); 
     177                break; 
     178        case CAddressBookManager::eBroadcast_RemoveNode: 
     179        case CAddressBookManager::eBroadcast_DeleteNode: 
     180                DeleteNode(static_cast<CAddressBook*>(param)); 
     181                break; 
     182        case CAdbkProtocol::eBroadcast_RefreshNode: 
     183                RefreshNode(static_cast<CAddressBook*>(param)); 
     184                break; 
     185        } 
     186} 
     187 
     188void CAdbkManagerTable::DoSelectionChanged() 
     189{ 
     190        CHierarchyTableDrag::DoSelectionChanged(); 
     191         
     192        // Determine whether preview is triggered 
     193        const CUserAction& preview = mTableView->GetPreviewAction(); 
     194        if (preview.GetSelection()) 
     195                DoPreview(); 
     196 
     197        // Determine whether full view is triggered 
     198        const CUserAction& fullview = mTableView->GetFullViewAction(); 
     199        if (fullview.GetSelection()) 
     200                DoFullView(); 
     201} 
     202 
     203// Handle single click 
     204void CAdbkManagerTable::DoSingleClick(unsigned long row, const CKeyModifiers& mods) 
     205{ 
     206        // Determine whether preview is triggered 
     207        const CUserAction& preview = mTableView->GetPreviewAction(); 
     208        if (preview.GetSingleClick() && 
     209                (preview.GetSingleClickModifiers() == mods)) 
     210                DoPreview(); 
     211 
     212        // Determine whether full view is triggered 
     213        const CUserAction& fullview = mTableView->GetFullViewAction(); 
     214        if (fullview.GetSingleClick() && 
     215                (fullview.GetSingleClickModifiers() == mods)) 
     216                DoFullView(); 
     217        } 
     218         
     219// Handle double click 
     220void CAdbkManagerTable::DoDoubleClick(unsigned long row, const CKeyModifiers& mods) 
     221{ 
     222        // Determine whether preview is triggered 
     223        const CUserAction& preview = mTableView->GetPreviewAction(); 
     224        if (preview.GetDoubleClick() && 
     225                (preview.GetDoubleClickModifiers() == mods)) 
     226                DoPreview(); 
     227 
     228        // Determine whether full view is triggered 
     229        const CUserAction& fullview = mTableView->GetFullViewAction(); 
     230        if (fullview.GetDoubleClick() && 
     231                (fullview.GetDoubleClickModifiers() == mods)) 
     232                DoFullView(); 
     233} 
     234 
     235void CAdbkManagerTable::DoPreview() 
     236{ 
     237        PreviewAddressBook(); 
     238        } 
     239         
     240void CAdbkManagerTable::DoPreview(CAddressBook* adbk) 
     241{ 
     242        PreviewAddressBook(adbk); 
     243} 
     244 
     245// Just edit the item 
     246void CAdbkManagerTable::DoFullView() 
     247{ 
     248        OnOpenAddressBook(); 
    142249} 
    143250 
     
    154261        { 
    155262                // Add selection to list 
    156                 CFlatAdbkList selected; 
     263                CAddressBookList selected; 
     264                selected.set_delete_data(false); 
    157265                if (DoToSelection1((DoToSelection1PP) &CAdbkManagerTable::AddSelectionToList, &selected) && (selected.size() == 1)) 
     266                { 
    158267                        adbk = selected.front(); 
     268                        if (!adbk->IsAdbk()) 
     269                                adbk = NULL; 
     270                } 
    159271        } 
    160272         
     
    177289                // Check whether different 
    178290                CAddressBook* old_adbk = mTableView->GetPreview()->GetAddressBook(); 
    179                 cdstring old_url = old_adbk ? old_adbk->GetURL(true) : cdstring::null_str; 
    180                 if ((adbk ? adbk->GetURL(true) : cdstring::null_str) != old_url) 
     291                cdstring old_url = old_adbk ? old_adbk->GetAccountName() : cdstring::null_str; 
     292                if ((adbk ? adbk->GetAccountName() : cdstring::null_str) != old_url) 
    181293                { 
    182294                        // Set flag to force update 
     
    205317void CAdbkManagerTable::OnAddressBookProperties(void) 
    206318{ 
    207         CFlatAdbkList selected; 
     319        CAddressBookList selected; 
     320        selected.set_delete_data(false); 
    208321 
    209322        try 
     
    213326                { 
    214327                        // Check all addressbooks first 
    215                         for(CFlatAdbkList::iterator iter = selected.begin(); iter != selected.end(); iter++) 
     328                        for(CAddressBookList::iterator iter = selected.begin(); iter != selected.end(); iter++) 
    216329                        { 
    217330                                long new_msgs = 0; 
     
    219332                                // IMPORTANT: if the connection is lost the addressbooks are removed by the protocol 
    220333                                // being logged off. Must protect against this case 
    221                                 const CAdbkProtocol* proto = NULL; 
    222                                 CRemoteAddressBook* radbk = dynamic_cast<CRemoteAddressBook*>(*iter); 
    223                                 if (radbk) 
    224                                         proto = radbk->GetProtocol(); 
     334                                const CAdbkProtocol* proto = (*iter)->GetProtocol(); 
    225335 
    226336                                // Must not allow one failure to stop others 
     
    318428} // CAdbkManagerTable::DoAddressBookProperties 
    319429 
     430void CAdbkManagerTable::OnLogin() 
     431{ 
     432        // Must have single selected protocol 
     433        if (!IsSingleSelection()) 
     434                return; 
     435         
     436        TableIndexT row = GetFirstSelectedRow(); 
     437        CAddressBook* adbk = GetCellNode(row); 
     438         
     439        if (!adbk->IsProtocol()) 
     440                return; 
     441         
     442        // Policy: 
     443        // 
     444        // 1.   Local protocols are always logged in 
     445        // 2.   Protocols that cannot disconnect 
     446        // 2.1  can change login state only when global state is connected 
     447        // 2.2  are always logged out when global state is disconnected 
     448        // 3.   Protocols that can disconnect 
     449        // 3.1  can change login/disconnect state when global state is connected 
     450        // 3.1  are always logged in when global state is disconnected 
     451 
     452        // 1. (as above) 
     453        if (adbk->GetProtocol()->IsOffline() && !adbk->GetProtocol()->IsDisconnected()) 
     454        { 
     455                // Ignore - should already be in logged in state 
     456                return; 
     457        } 
     458 
     459        // 2. (as above) 
     460        else if (!adbk->GetProtocol()->CanDisconnect()) 
     461        { 
     462                // 2.1 (as above) 
     463                if (CConnectionManager::sConnectionManager.IsConnected()) 
     464                { 
     465                        // Toggle login state 
     466                        if (adbk->GetProtocol()->IsLoggedOn()) 
     467                        { 
     468                                mManager->StopProtocol(adbk->GetProtocol()); 
     469                        } 
     470                        else 
     471                        { 
     472                                mManager->StartProtocol(adbk->GetProtocol()); 
     473                        } 
     474                } 
     475                // 2.2 (as above) 
     476                else 
     477                { 
     478                        // Ignore - should already be in logged out state 
     479                        return; 
     480                } 
     481        } 
     482         
     483        // 3. (as above) 
     484        else 
     485        { 
     486                // 3.1 (as above) 
     487                if (CConnectionManager::sConnectionManager.IsConnected()) 
     488                { 
     489                        // Toggle force disconnect state 
     490                        adbk->GetProtocol()->ForceDisconnect(!adbk->GetProtocol()->IsForceDisconnect()); 
     491                } 
     492                // 3.2 (as above) 
     493                else 
     494                { 
     495                        // Ignore - should already be in logged in state 
     496                        return; 
     497                } 
     498        } 
     499 
     500        // Reset all views 
     501        //CCalendarView::ResetAll(); 
     502} 
     503 
    320504// New address book 
    321505void CAdbkManagerTable::OnNewAddressBook(void) 
    322506{ 
    323         STableCell aCell(0,0); 
    324         GetNextSelectedCell(aCell); 
    325         TableIndexT row = aCell.row; 
    326         if (!IsSelectionValid() || 
    327                 mHasOthers && (row > 1) || 
    328                 !mHasOthers && (row > 0)) 
    329         { 
     507        CCreateAdbkDialog::SCreateAdbk create; 
     508        create.open_on_startup = true; 
     509        create.use_nicknames = true; 
     510        create.use_search = true; 
     511 
    330512                CAdbkProtocol* proto = NULL; 
     513        CAddressBook* node = NULL; 
     514        CAddressBook* result = NULL; 
     515        bool insert_delim = false; 
     516 
     517        // Determine initial creation type 
    331518                if (IsSelectionValid()) 
    332519                { 
    333                         TableIndexT     woRow = GetWideOpenIndex(row + TABLE_ROW_ADJUST); 
    334  
    335                         CAdbkList::node_type* node = (CAdbkList::node_type*) GetCellData(woRow); 
    336                         proto = GetCellAdbkProtocol(row); 
    337  
    338                         // If proto is null we have an address book - so get its protocol 
     520                TableIndexT row = GetFirstSelectedRow(); 
     521                TableIndexT woRow = mCollapsableTree->GetWideOpenIndex(row); 
     522 
     523                // First check logged in state of server - may come back as NULL if cabinet selected 
     524                CAdbkProtocol* server = GetCellAdbkProtocol(row); 
     525                node = GetCellNode(row); 
     526 
     527                // If logged in then use current selection as reference point 
     528                if (server && server->IsLoggedOn()) 
     529                { 
     530                        proto = server; 
     531                        create.account = proto->GetAccountName(); 
     532 
     533                        if (node->IsProtocol()) 
     534                        { 
     535                                create.use_wd = false; 
     536                        } 
     537                        else if (node->IsDirectory()) 
     538                        { 
     539                                create.use_wd = true; 
     540                                create.parent = node->GetName(); 
     541                        } 
     542                        else 
     543                        { 
     544                                create.use_wd = false; 
     545                        } 
     546                } 
     547                else 
     548                { 
     549                        // Force generic create 
     550                        create.use_wd = false; 
     551                } 
     552                        } 
     553 
     554        try 
     555        { 
     556                if (CCreateAdbkDialog::PoseDialog(&create)) 
     557                { 
     558                        cdstring new_name; 
     559                        if (create.use_wd) 
     560                        { 
     561                                new_name = create.parent; 
     562                                if (node->GetProtocol()->GetDirDelim()) 
     563                                        new_name += node->GetProtocol()->GetDirDelim(); 
     564                                new_name += create.name; 
     565                        } 
     566                        else 
     567                                new_name = create.name; 
     568 
     569                        // Check and get proto from dialog 
    339570                        if (!proto) 
    340                         { 
    341                                 CRemoteAddressBook* radbk = dynamic_cast<CRemoteAddressBook*>(node->GetSelectData()); 
    342                                 proto = radbk ? radbk->GetProtocol() : NULL; 
    343                         } 
    344  
    345                         // Must have a proto 
     571                                proto = mManager->GetProtocol(create.account); 
    346572                        if (!proto) 
    347                                 return; 
    348                 } 
    349  
    350                 // Get name for new address book 
    351                 CCreateAdbkDialog::SCreateAdbk details; 
    352                 details.personal = true; 
    353                 details.account = proto ? proto->GetAccountName() : cdstring::null_str; 
    354                 details.open_on_startup = true; 
    355                 details.use_nicknames = true; 
    356                 details.use_search = true; 
    357                  
    358                 if (CCreateAdbkDialog::PoseDialog(&details)) 
    359                 { 
    360                         // Get the chosen protocol 
    361                         proto = mManager->GetProtocol(details.account); 
    362  
    363                  
    364                         // never allow personal on local account 
    365                         if ((details.account == CPreferences::sPrefs->mLocalAdbkAccount.GetValue().GetName()) || 
    366                                 (details.account == CPreferences::sPrefs->mOSAdbkAccount.GetValue().GetName())) 
    367                                 details.personal = false; 
    368  
    369                         // Adjust name if required 
    370                         cdstring adbk_name = details.name; 
    371                         if (details.personal) 
    372                         { 
    373                                 cdstring default_name = proto->GetUserPrefix(); 
    374                                 default_name += proto->GetAccount()->GetAuthenticator().GetAuthenticator()->GetActualUID(); 
    375  
    376                                 // Add user id to address book name 
    377                                 adbk_name = default_name; 
    378                                 adbk_name += proto->GetSeparator(); 
    379                                 adbk_name += details.name; 
    380                         } 
    381  
    382                         CRemoteAddressBook* adbk = NULL; 
    383                         try 
    384                         { 
     573                        { 
     574                                CLOG_LOGTHROW(CGeneralException, -1); 
     575                                throw CGeneralException(-1); 
     576                        } 
     577 
     578                        CAddressBook* adbk = NULL; 
     579 
    385580                                // Create address book 
    386                                 adbk = new CRemoteAddressBook(proto, adbk_name); 
    387  
    388                                 // New it 
    389                                 adbk->New(); 
    390  
     581                        adbk = mManager->NewAddressBook(proto, new_name, create.directory); 
     582 
     583                        if (adbk && !create.directory) 
     584                        { 
    391585                                // Set chosen flags 
    392                                 adbk->SetFlags(CAddressBook::eOpenOnStart, details.open_on_startup); 
    393                                 adbk->SetFlags(CAddressBook::eLookup, details.use_nicknames); 
    394                                 adbk->SetFlags(CAddressBook::eSearch, details.use_search); 
     586                                adbk->SetFlags(CAddressBook::eOpenOnStart, create.open_on_startup); 
     587                                adbk->SetFlags(CAddressBook::eLookup, create.use_nicknames); 
     588                                adbk->SetFlags(CAddressBook::eSearch, create.use_search); 
    395589 
    396590                                // Change prefs list 
    397591                                mManager->SyncAddressBook(adbk, true); 
    398                                 CPreferences::sPrefs->ChangeAddressBookOpenOnStart(adbk, details.open_on_startup); 
    399                                 CPreferences::sPrefs->ChangeAddressBookLookup(adbk, details.use_nicknames); 
    400                                 CPreferences::sPrefs->ChangeAddressBookSearch(adbk, details.use_search); 
    401  
    402                                 // Update table 
    403  
    404                                 // Always force table to logged off state 
    405                                 int pos = 0; 
    406  
    407                                 if (mManager->FindProtocol(proto, pos)) 
    408                                 { 
    409                                         TableIndexT temp = pos; 
    410                                         CAdbkList::node_type* proto_node = (CAdbkList::node_type*) GetCellData(temp); 
    411  
    412                                         // Iterate over all adbk manager windows 
    413                                         cdmutexprotect<CAdbkManagerView::CAdbkManagerViewList>::lock _lock(CAdbkManagerView::sAdbkManagerViews); 
    414                                         for(CAdbkManagerView::CAdbkManagerViewList::iterator iter = CAdbkManagerView::sAdbkManagerViews->begin(); iter != CAdbkManagerView::sAdbkManagerViews->end(); iter++) 
    415                                         { 
    416                                                 (*iter)->GetTable()->RemoveChildren(temp, true); 
    417                                                 (*iter)->GetTable()->AddChildren(proto_node, temp, false); 
    418                                                 (*iter)->GetTable()->RefreshRow(row); 
    419                                                 (*iter)->GetTable()->RefreshRowsBelow(temp); 
    420                                         } 
     592                                CPreferences::sPrefs->ChangeAddressBookOpenOnStart(adbk, create.open_on_startup); 
     593                                CPreferences::sPrefs->ChangeAddressBookLookup(adbk, create.use_nicknames); 
     594                                CPreferences::sPrefs->ChangeAddressBookSearch(adbk, create.use_search); 
     595                        } 
     596                         
     597                        result = adbk; 
    421598                                } 
    422599                        } 
     
    424601                        { 
    425602                                CLOG_LOGCATCH(...); 
    426  
    427                                 // Remove from manager 
    428                                 if (adbk) 
    429                                         adbk->Close(); 
    430                                 delete adbk; 
    431                                 adbk = NULL; 
    432                         } 
    433                 } 
    434         } 
    435         else 
    436 #if __dest_os == __mac_os || __dest_os == __mac_os_x 
    437                 CMulberryApp::sApp->MakeNewAddressBookDoc(); 
    438 #elif __dest_os == __win32_os || __dest_os == __linux_os 
    439                 CMulberryApp::sApp->OnAppNewLocalAddressBook(); 
    440 #else 
    441 #error __dest_os 
    442 #endif 
    443 } 
     603                } 
     604        } 
    444605 
    445606// Open address book 
    446607void CAdbkManagerTable::OnOpenAddressBook(void) 
    447608{ 
    448         if (IsSingleSelection() || !mHasOthers && !IsSelectionValid()) 
    449         { 
    450                 STableCell aCell; 
    451                 GetFirstSelection(aCell); 
    452                 if (mHasOthers && (aCell.row > 1) || 
    453                         !mHasOthers && (aCell.row > 0)) 
    454                 { 
    455                         // Open each selected address book 
    456                         DoToSelection((DoToSelectionPP) &CAdbkManagerTable::OpenAddressBook); 
    457                 } 
    458                 else 
    459 #if __dest_os == __mac_os || __dest_os == __mac_os_x 
    460                         CMulberryApp::sApp->ChooseAddressBookDoc(); 
    461 #elif __dest_os == __win32_os || __dest_os == __linux_os 
    462                         CMulberryApp::sApp->OnAppOpenLocalAddressBook(); 
    463 #else 
    464 #error __dest_os 
    465 #endif 
    466         } 
    467         else 
    468609                // Display each selected address book 
    469610                DoToSelection((DoToSelectionPP) &CAdbkManagerTable::OpenAddressBook); 
     
    474615{ 
    475616        // Get node 
    476         TableIndexT     woRow = GetWideOpenIndex(row + TABLE_ROW_ADJUST); 
    477  
    478         CAdbkList::node_type* node = (CAdbkList::node_type*) GetCellData(woRow); 
    479  
    480         // Only open selectable 
    481