examples/Graphics/WS/PtBuffer/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         // If a parent window was specified, use it; if not, use the window group
00046         // (aParent defaults to 0).
00047         RWindowTreeNode* parent= aParent ? (RWindowTreeNode*) &(aParent->Window()) : &(iClient->iGroup);
00048         // Allocate and construct the window
00049         iWindow=RWindow(iClient->iWs);
00050         User::LeaveIfError(iWindow.Construct(*parent,(TUint32)this));
00051         // Store the window's extent
00052         iRect = aRect;
00053         // Set up the new window's extent
00054         iWindow.SetExtent(iRect.iTl, iRect.Size());
00055         // Set its background color
00056         iWindow.SetBackgroundColor (aColor);
00057         // Set pointer grab to enable drag and drop
00058         iWindow.SetPointerGrab (ETrue);
00059         // Allocate pointer move buffer for freehand drawing
00060         iWindow.AllocPointerMoveBuffer(KPointerMoveBufferSize, 0);
00061         iWindow.DisablePointerMoveBuffer();
00062         // Tell the window server to deliver drag events
00063         iWindow.PointerFilter(EPointerFilterDrag, 0);
00064         // Activate the window
00065         iWindow.Activate();
00066         }
00067 
00068 CWindow::~CWindow()
00069         {
00070         iWindow.FreePointerMoveBuffer();
00071         iWindow.Close();
00072         }
00073 
00074 RWindow& CWindow::Window()
00075         {
00076         return iWindow;
00077         }
00078 
00079 CWindowGc* CWindow::SystemGc()
00080         {
00081         return iClient->iGc;
00082         }
00083 
00084 CWsScreenDevice* CWindow::Screen()
00085         {
00086         return iClient->iScreen;
00087         }
00088 
00090 //                                                      CWsRedrawer implementation
00092 
00093 CWsRedrawer::CWsRedrawer()
00094         : CActive(CActive::EPriorityLow)
00095         {
00096         }
00097 
00098 void CWsRedrawer::ConstructL(CWsClient* aClient)
00099         {
00100         iClient=aClient; // remember WsClient that owns us
00101         CActiveScheduler::Add(this); // add ourselves to the scheduler
00102         IssueRequest(); // issue request to draw
00103         }
00104 
00105 CWsRedrawer::~CWsRedrawer()
00106         {
00107         Cancel();
00108         }
00109 
00110 void CWsRedrawer::IssueRequest()
00111         {
00112         iClient->iWs.RedrawReady(&iStatus);
00113         SetActive();
00114         }
00115 
00116 void CWsRedrawer::DoCancel()
00117         {
00118         iClient->iWs.RedrawReadyCancel();
00119         }
00120 
00121 void CWsRedrawer::RunL()
00122         {       
00123         // find out what needs to be done in response to the event
00124         TWsRedrawEvent redrawEvent;
00125     iClient->iWs.GetRedraw(redrawEvent); // get event
00126         CWindow* window=(CWindow*)(redrawEvent.Handle()); // get window
00127         if (window)
00128                 {
00129                 TRect rect=redrawEvent.Rect(); // and rectangle that needs redrawing
00130                 // now do drawing
00131                 iClient->iGc->Activate(window->Window());
00132                 window->Window().BeginRedraw();
00133                 window->Draw(rect);
00134                 window->Window().EndRedraw();
00135                 iClient->iGc->Deactivate();
00136                 }
00137         // maintain outstanding request
00138         IssueRequest();
00139         }
00140 
00141 
00143 //                                                              CWsClient implementation
00145 CWsClient::CWsClient()
00146         : CActive(CActive::EPriorityStandard)
00147         {
00148         }
00149 
00150 void CWsClient::ConstructL()
00151         {
00152         // add ourselves to scheduler
00153         CActiveScheduler::Add(this);
00154         // get a session going
00155         User::LeaveIfError(iWs.Connect());
00156         // construct our one and only window group
00157         iGroup=RWindowGroup(iWs);
00158         User::LeaveIfError(iGroup.Construct(2,ETrue)); // '2' is a meaningless handle
00159         // construct screen device and graphics context
00160         iScreen=new (ELeave) CWsScreenDevice(iWs); // make device for this session
00161         User::LeaveIfError(iScreen->Construct()); // and complete its construction
00162         User::LeaveIfError(iScreen->CreateContext(iGc)); // create graphics context
00163         // construct redrawer
00164         iRedrawer=new (ELeave) CWsRedrawer;
00165         iRedrawer->ConstructL(this);
00166         // construct main window
00167         ConstructMainWindowL();
00168         // request first event and start scheduler
00169         IssueRequest();
00170         }
00171 
00172 CWsClient::~CWsClient()
00173         {
00174         // neutralize us as an active object
00175         Deque(); // cancels and removes from scheduler
00176         // get rid of everything we allocated
00177         delete iGc;
00178         delete iScreen;
00179         delete iRedrawer;
00180         // destroy window group
00181         iGroup.Close();
00182         // finish with window server
00183         iWs.Close();
00184         }
00185 
00186 void CWsClient::IssueRequest()
00187         {
00188         iWs.EventReady(&iStatus); // request an event
00189         SetActive(); // so we're now active
00190         }
00191 
00192 void CWsClient::DoCancel()
00193         {
00194         iWs.EventReadyCancel(); // cancel event request
00195         }
00196 
00197 void CWsClient::ConstructMainWindowL()
00198         {
00199         }
00200 

Generated by  doxygen 1.6.2