examples/Graphics/WS/Ordinal/Base.cpp

00001 /*
00002 Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
00003 
00004 Redistribution and use in source and binary forms, with or without
00005 modification, are permitted provided that the following conditions are met:
00006 
00007 * Redistributions of source code must retain the above copyright notice, this
00008   list of conditions and the following disclaimer.
00009 * Redistributions in binary form must reproduce the above copyright notice,
00010   this list of conditions and the following disclaimer in the documentation
00011   and/or other materials provided with the distribution.
00012 * Neither the name of Nokia Corporation nor the names of its contributors
00013   may be used to endorse or promote products derived from this software
00014   without specific prior written permission.
00015 
00016 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00017 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00018 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00019 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00020 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00021 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00022 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00023 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00024 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00025 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00026 
00027 Description:  
00028 */
00029 
00030 
00031 #include <w32std.h>
00032 #include "Base.h"
00033 
00035 //                                                      CWindow implementation
00037 
00038 CWindow::CWindow(CWsClient* aClient)
00039         : iClient(aClient)
00040         {
00041         }
00042 
00043 void CWindow::ConstructL (const TRect& aRect, const TRgb& aColor, CWindow* aParent)
00044         {
00045         _LIT(KFontName,"Swiss");
00046         // If a parent window was specified, use it; if not, use the window group
00047         // (aParent defaults to 0).
00048         RWindowTreeNode* parent= aParent ? (RWindowTreeNode*) &(aParent->Window()) : &(iClient->iGroup);
00049         // Allocate and construct the window
00050         iWindow=RWindow(iClient->iWs);
00051         User::LeaveIfError(iWindow.Construct(*parent,(TUint32)this));
00052         // Store the window's extent
00053         iRect = aRect;
00054         // Set up the new window's extent
00055         iWindow.SetExtent(iRect.iTl, iRect.Size());
00056         // Set its background color
00057         iWindow.SetBackgroundColor (aColor);
00058         // Set pointer grab to enable drag and drop
00059         iWindow.SetPointerGrab (ETrue);
00060         // Set up font for displaying text
00061         TFontSpec fontSpec(KFontName,200);
00062         User::LeaveIfError(iClient->iScreen->GetNearestFontInTwips(iFont,fontSpec));
00063         // Activate the window
00064         iWindow.Activate();
00065         }
00066 
00067 CWindow::~CWindow()
00068         {
00069         iWindow.Close();
00070         iClient->iScreen->ReleaseFont(iFont);
00071         }
00072 
00073 RWindow& CWindow::Window()
00074         {
00075         return iWindow;
00076         }
00077 
00078 CWindowGc* CWindow::SystemGc()
00079         {
00080         return iClient->iGc;
00081         }
00082 
00083 CWsScreenDevice* CWindow::Screen()
00084         {
00085         return iClient->iScreen;
00086         }
00087 
00088 CFont* CWindow::Font()
00089         {
00090         return iFont;
00091         }
00092 
00093 
00095 //                                                      CWsRedrawer implementation
00097 
00098 CWsRedrawer::CWsRedrawer()
00099         : CActive(CActive::EPriorityLow)
00100         {
00101         }
00102 
00103 void CWsRedrawer::ConstructL(CWsClient* aClient)
00104         {
00105         iClient=aClient; // remember WsClient that owns us
00106         CActiveScheduler::Add(this); // add ourselves to the scheduler
00107         IssueRequest(); // issue request to draw
00108         }
00109 
00110 CWsRedrawer::~CWsRedrawer()
00111         {
00112         Cancel();
00113         }
00114 
00115 void CWsRedrawer::IssueRequest()
00116         {
00117         iClient->iWs.RedrawReady(&iStatus);
00118         SetActive();
00119         }
00120 
00121 void CWsRedrawer::DoCancel()
00122         {
00123         iClient->iWs.RedrawReadyCancel();
00124         }
00125 
00126 void CWsRedrawer::RunL()
00127         {       
00128         // find out what needs to be done in response to the event
00129         TWsRedrawEvent redrawEvent;
00130     iClient->iWs.GetRedraw(redrawEvent); // get event
00131         CWindow* window=(CWindow*)(redrawEvent.Handle()); // get window
00132         if (window)
00133                 {
00134                 TRect rect=redrawEvent.Rect(); // and rectangle that needs redrawing
00135                 // now do drawing
00136                 iClient->iGc->Activate(window->Window());
00137                 window->Window().BeginRedraw(rect);
00138                 window->Draw(rect);
00139                 window->Window().EndRedraw();
00140                 iClient->iGc->Deactivate();
00141                 }
00142         // maintain outstanding request
00143         IssueRequest();
00144         }
00145 
00146 
00148 //                                                              CWsClient implementation
00150 CWsClient::CWsClient()
00151         : CActive(CActive::EPriorityStandard)
00152         {
00153         }
00154 
00155 void CWsClient::ConstructL()
00156         {
00157         // add ourselves to active scheduler 
00158         CActiveScheduler::Add(this);
00159         // get a session going
00160         User::LeaveIfError(iWs.Connect());
00161         // construct our one and only window group
00162         iGroup=RWindowGroup(iWs);
00163         User::LeaveIfError(iGroup.Construct(2,ETrue)); // '2' is a meaningless handle
00164         // construct screen device and graphics context
00165         iScreen=new (ELeave) CWsScreenDevice(iWs); // make device for this session
00166         User::LeaveIfError(iScreen->Construct()); // and complete its construction
00167         User::LeaveIfError(iScreen->CreateContext(iGc)); // create graphics context
00168         // construct redrawer
00169         iRedrawer=new (ELeave) CWsRedrawer;
00170         iRedrawer->ConstructL(this);
00171         // construct main window
00172         ConstructMainWindowL();
00173         // request first event and start scheduler
00174         IssueRequest();
00175         }
00176 
00177 CWsClient::~CWsClient()
00178         {
00179         // neutralize us as an active object
00180         Deque(); // cancels and removes from scheduler
00181         // get rid of everything we allocated
00182         delete iGc;
00183         delete iScreen;
00184         delete iRedrawer;
00185         // destroy window group
00186         iGroup.Close();
00187         // finish with window server
00188         iWs.Close();
00189         }
00190 
00191 void CWsClient::IssueRequest()
00192         {
00193         iWs.EventReady(&iStatus); // request an event
00194         SetActive(); // so we're now active
00195         }
00196 
00197 void CWsClient::DoCancel()
00198         {
00199         iWs.EventReadyCancel(); // cancel event request
00200         }
00201 
00202 void CWsClient::ConstructMainWindowL()
00203         {
00204         }
00205 

Generated by  doxygen 1.6.2