|
S60 3rd Edition SDK for Symbian OS Example Applications Guide |
00001 /* 00002 * ============================================================================== 00003 * Name : ChatAppui.cpp 00004 * Part of : Chat 00005 * Interface : 00006 * Description : 00007 * Version : 00008 * 00009 * Copyright (c) 2005-2006 Nokia Corporation. 00010 * This material, including documentation and any related 00011 * computer programs, is protected by copyright controlled by 00012 * Nokia Corporation. 00013 * ============================================================================== 00014 */ 00015 00016 // INCLUDE FILES 00017 #include "ChatAppui.h" 00018 #include "ChatContainer.h" 00019 #include <ChatEx.rsg> 00020 #include "Chat.hrh" 00021 00022 #include <avkon.hrh> 00023 #include <eikmenup.h> 00024 #include <aknnotewrappers.h> 00025 #include <stringloader.h> 00026 00027 #include "Chat.pan" 00028 00029 #include "ChatContainer.h" 00030 #include "ChatInet.h" 00031 #include "ChatBt.h" 00032 00033 #include "ChatProtocolConstants.h" 00034 00035 00036 // ================= MEMBER FUNCTIONS ======================= 00037 00038 // ---------------------------------------------------------- 00039 // CChatAppUi::ConstructL() 00040 // 00041 // ---------------------------------------------------------- 00042 // 00043 void CChatAppUi::ConstructL() 00044 { 00045 BaseConstructL( CAknAppUi::EAknEnableSkin ); 00046 00047 iAppContainer = CChatContainer::NewL( ClientRect() ); 00048 00049 // so view can update scroll bars 00050 iAppContainer->SetMopParent( this ); 00051 00052 AddToStackL( iAppContainer ); 00053 00054 iChatBt = CChatBt::NewL( *iAppContainer ); 00055 iChatInet = CChatInet::NewL( *iAppContainer ); 00056 00057 // check whether BT is available or not 00058 00059 RSdp sdpSession; 00060 00061 if ( sdpSession.Connect() == KErrNone ) 00062 { 00063 sdpSession.Close(); 00064 00065 iBtAvailable = ETrue; 00066 } 00067 else 00068 { 00069 iBtAvailable = EFalse; 00070 } 00071 } 00072 00073 // ---------------------------------------------------- 00074 // CChatAppUi::~CChatAppUi() 00075 // Destructor 00076 // Frees reserved resources 00077 // ---------------------------------------------------- 00078 // 00079 CChatAppUi::~CChatAppUi() 00080 { 00081 delete iChatBt; 00082 iChatBt = NULL; 00083 00084 delete iChatInet; 00085 iChatInet= NULL; 00086 00087 if ( iAppContainer ) 00088 { 00089 RemoveFromStack( iAppContainer ); 00090 delete iAppContainer; 00091 iAppContainer = NULL; 00092 } 00093 } 00094 00095 // ------------------------------------------------------------------------------ 00096 // CChatAppUi::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane) 00097 // This function is called by the EIKON framework just before it displays 00098 // a menu pane. Its default implementation is empty, and by overriding it, 00099 // the application can set the state of menu items dynamically according 00100 // to the state of application data. 00101 // ------------------------------------------------------------------------------ 00102 // 00103 void CChatAppUi::DynInitMenuPaneL( 00104 TInt aResourceId,CEikMenuPane* aMenuPane) 00105 { 00106 if ( aResourceId == R_CHAT_MENU ) 00107 { 00108 if ( iChatBt->IsConnected() ) 00109 { 00110 aMenuPane->SetItemDimmed( EChatBtChat, ETrue ); 00111 aMenuPane->SetItemDimmed( EChatIpChat, ETrue ); 00112 aMenuPane->SetItemDimmed( EChatStopBtChat, !iChatBt->Server() ); 00113 aMenuPane->SetItemDimmed( EChatStopIpChat, ETrue ); 00114 aMenuPane->SetItemDimmed( EChatDisconnect, iChatBt->Server() ); 00115 aMenuPane->SetItemDimmed( EChatSendMessage, 00116 !iChatBt->IsReadyToSendMessage() ); 00117 } 00118 00119 else if ( iChatInet->IsConnected() ) 00120 { 00121 aMenuPane->SetItemDimmed( EChatBtChat, ETrue ); 00122 aMenuPane->SetItemDimmed( EChatIpChat, ETrue ); 00123 aMenuPane->SetItemDimmed( EChatStopBtChat, ETrue ); 00124 aMenuPane->SetItemDimmed( EChatStopIpChat, !iChatInet->Server() ); 00125 aMenuPane->SetItemDimmed( EChatDisconnect, iChatInet->Server() ); 00126 aMenuPane->SetItemDimmed( EChatSendMessage, 00127 !iChatInet->IsReadyToSendMessage() ); 00128 } 00129 00130 else if ( iChatBt->IsConnecting() ) 00131 { 00132 aMenuPane->SetItemDimmed( EChatBtChat, ETrue ); 00133 aMenuPane->SetItemDimmed( EChatIpChat, ETrue ); 00134 aMenuPane->SetItemDimmed( EChatStopIpChat, ETrue ); 00135 aMenuPane->SetItemDimmed( EChatStopBtChat, EFalse ); 00136 aMenuPane->SetItemDimmed( EChatDisconnect, ETrue ); 00137 aMenuPane->SetItemDimmed( EChatSendMessage, ETrue ); 00138 } 00139 00140 else if ( iChatInet->IsConnecting() ) 00141 { 00142 aMenuPane->SetItemDimmed( EChatBtChat, ETrue ); 00143 aMenuPane->SetItemDimmed( EChatIpChat, ETrue ); 00144 aMenuPane->SetItemDimmed( EChatStopBtChat, ETrue ); 00145 aMenuPane->SetItemDimmed( EChatStopIpChat, EFalse ); 00146 aMenuPane->SetItemDimmed( EChatDisconnect, ETrue ); 00147 aMenuPane->SetItemDimmed( EChatSendMessage, ETrue ); 00148 } 00149 00150 else if ( iChatBt->IsSendingMessage() ) 00151 { 00152 aMenuPane->SetItemDimmed( EChatBtChat, ETrue ); 00153 aMenuPane->SetItemDimmed( EChatIpChat, ETrue ); 00154 aMenuPane->SetItemDimmed( EChatStopBtChat, ETrue ); 00155 aMenuPane->SetItemDimmed( EChatStopIpChat, ETrue ); 00156 aMenuPane->SetItemDimmed( EChatDisconnect, EFalse ); 00157 aMenuPane->SetItemDimmed( EChatSendMessage, ETrue ); 00158 } 00159 00160 else if ( iChatInet->IsSendingMessage() ) 00161 { 00162 aMenuPane->SetItemDimmed( EChatBtChat, ETrue ); 00163 aMenuPane->SetItemDimmed( EChatIpChat, ETrue ); 00164 aMenuPane->SetItemDimmed( EChatStopBtChat, ETrue ); 00165 aMenuPane->SetItemDimmed( EChatStopIpChat, ETrue ); 00166 aMenuPane->SetItemDimmed( EChatDisconnect, iChatInet->Server() ); 00167 aMenuPane->SetItemDimmed( EChatSendMessage, ETrue ); 00168 } 00169 00170 else // both the server and the client are not connected 00171 { 00172 aMenuPane->SetItemDimmed( EChatBtChat, EFalse ); 00173 aMenuPane->SetItemDimmed( EChatIpChat, EFalse ); 00174 aMenuPane->SetItemDimmed( EChatStopBtChat, ETrue ); 00175 aMenuPane->SetItemDimmed( EChatStopIpChat, ETrue ); 00176 aMenuPane->SetItemDimmed( EChatDisconnect, ETrue ); 00177 aMenuPane->SetItemDimmed( EChatSendMessage, ETrue ); 00178 } 00179 aMenuPane->SetItemDimmed( EChatClearList, 00180 !iAppContainer->ContainsEntries() ); 00181 } 00182 } 00183 00184 // ---------------------------------------------------- 00185 // CChatAppUi::HandleKeyEventL( 00186 // const TKeyEvent& aKeyEvent,TEventCode /*aType*/) 00187 // takes care of key event handling 00188 // ---------------------------------------------------- 00189 // 00190 TKeyResponse CChatAppUi::HandleKeyEventL( 00191 const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/) 00192 { 00193 return EKeyWasNotConsumed; 00194 } 00195 00196 // ---------------------------------------------------- 00197 // CChatAppUi::HandleCommandL(TInt aCommand) 00198 // takes care of command handling 00199 // ---------------------------------------------------- 00200 // 00201 void CChatAppUi::HandleCommandL(TInt aCommand) 00202 { 00203 TBuf<KChatTextBufLength> text; 00204 00205 switch ( aCommand ) 00206 { 00207 00208 case EAknSoftkeyExit: 00209 case EEikCmdExit: 00210 { 00211 if ( iChatInet->IsConnected() || iChatInet->IsConnecting() ) 00212 { 00213 if ( iChatInet->Server() ) 00214 { 00215 iChatInet->Stop(); 00216 } 00217 else 00218 { 00219 iChatInet->DisconnectL(); 00220 } 00221 } 00222 if ( iChatBt->IsConnected() || iChatBt->IsConnecting() ) 00223 { 00224 if ( iChatBt->Server() ) 00225 { 00226 iChatBt->StopL(); 00227 } 00228 else 00229 { 00230 iChatBt->DisconnectL(); 00231 } 00232 } 00233 00234 Exit(); 00235 break; 00236 } 00237 00238 case EChatBtChat: 00239 { 00240 break; 00241 } 00242 00243 case EChatIpChat: 00244 { 00245 break; 00246 } 00247 00248 case EChatStartChat: 00249 { 00250 if ( !iBtAvailable ) 00251 { 00252 ShowBTNotAvailableNoteL(); 00253 } 00254 else 00255 { 00256 iChatBt->StartL(); 00257 } 00258 break; 00259 } 00260 00261 case EChatConnect: 00262 { 00263 if ( !iBtAvailable ) 00264 { 00265 ShowBTNotAvailableNoteL(); 00266 } 00267 else 00268 { 00269 iChatBt->ConnectL(); 00270 } 00271 break; 00272 } 00273 00274 case EChatStartIpChat: 00275 { 00276 iChatInet->StartL(); 00277 break; 00278 } 00279 00280 case EChatIpConnect: 00281 { 00282 iAppContainer->ShowDataQueryL( 00283 R_CHAT_SERVERDATA_QUERY, 00284 0, 00285 0, 00286 KChatTextBufLength, 00287 EFalse, 00288 text ); 00289 00290 if ( text.Length() != 0 ) 00291 { 00292 iChatInet->ConnectL( text ); 00293 } 00294 break; 00295 } 00296 00297 case EChatDisconnect: 00298 { 00299 if ( iChatInet->IsConnected() ) 00300 { 00301 iChatInet->DisconnectL(); 00302 } 00303 if ( iChatBt->IsConnected() ) 00304 { 00305 iChatBt->DisconnectL(); 00306 } 00307 break; 00308 } 00309 00310 case EChatStopBtChat: 00311 { 00312 if ( !iBtAvailable ) 00313 { 00314 ShowBTNotAvailableNoteL(); 00315 } 00316 else 00317 { 00318 iChatBt->StopL(); 00319 } 00320 break; 00321 } 00322 00323 case EChatStopIpChat: 00324 { 00325 iChatInet->Stop(); 00326 break; 00327 } 00328 00329 case EChatSendMessage: 00330 { 00331 iAppContainer->ShowDataQueryL( 00332 R_CHAT_DATA_QUERY, 00333 0, 00334 0, 00335 KChatTextBufLength, 00336 ETrue, 00337 text ); 00338 00339 if ( iChatInet->IsConnected() ) 00340 { 00341 iChatInet->SendMessageL( text ); 00342 } 00343 if( iChatBt->IsConnected() ) 00344 { 00345 iChatBt->SendMessageL( text ); 00346 } 00347 break; 00348 } 00349 00350 case EChatClearList: 00351 { 00352 iAppContainer->ClearMessageListL(); 00353 break; 00354 } 00355 00356 default: 00357 break; 00358 } 00359 } 00360 00361 // ----------------------------------------------------------------------------- 00362 // CChatAppUi::ShowBTNotAvailableNoteL() 00363 // Show note if BT is not available 00364 // ----------------------------------------------------------------------------- 00365 // 00366 void CChatAppUi::ShowBTNotAvailableNoteL() 00367 { 00368 // Load a string from the resource file and display it 00369 HBufC* textResource = StringLoader::LoadLC( R_CHAT_NO_BT ); 00370 CAknErrorNote* errorNote; 00371 00372 errorNote = new ( ELeave ) CAknErrorNote; 00373 00374 // Show the information Note with 00375 // textResource loaded with StringLoader. 00376 errorNote->ExecuteLD( *textResource); 00377 00378 // Pop HBuf from CleanUpStack and Destroy it. 00379 CleanupStack::PopAndDestroy( textResource ); 00380 } 00381 00382 00383 // ----------------------------------------------------------------------------- 00384 // CChatAppUi::HandleResourceChangeL( TInt aType ) 00385 // Called by framework when layout is changed. 00386 // ----------------------------------------------------------------------------- 00387 // 00388 void CChatAppUi::HandleResourceChangeL( TInt aType ) 00389 { 00390 CAknAppUi::HandleResourceChangeL( aType ); 00391 00392 // ADDED FOR SCALABLE UI SUPPORT 00393 // ***************************** 00394 if ( aType==KEikDynamicLayoutVariantSwitch ) 00395 { 00396 iAppContainer->SetRect( ClientRect() ); 00397 } 00398 //Controls derived from CCoeControl, handled in container class 00399 iAppContainer->HandleResourceChange( aType ); 00400 } 00401 00402 00403 // End of File
|
© Nokia 2006 |