webengine/osswebengine/WebKit/s60/plugins/PluginPlayer.cpp
changeset 0 dd21522fd290
child 13 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebKit/s60/plugins/PluginPlayer.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,150 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Page overview control
+*
+*/
+#include "../../bidi.h"
+
+#include "PluginPlayer.h"
+#include "BrCtl.h"
+#include "PluginWin.h"
+#include "PluginSkin.h"
+#include "WebView.h"
+#include "WebFrame.h"
+#include <AknUtils.h>
+
+PluginPlayer* PluginPlayer::NewL( CBrCtl& parent, PluginWin* plugin )
+    {
+    PluginPlayer* self = new (ELeave) PluginPlayer(parent, plugin );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+PluginPlayer::PluginPlayer( CBrCtl& parent, PluginWin* plugin )
+    : m_brctl( parent ), m_plugin( plugin )
+    {
+    }
+
+void PluginPlayer::ConstructL()
+    {
+    SetContainerWindowL( m_brctl );
+    SetRect( m_brctl.Rect() );
+    if (AknLayoutUtils::PenEnabled()) {
+        DrawableWindow()->SetPointerGrab(ETrue);
+        EnableDragEvents();
+    }
+
+    ActivateL();
+    }
+
+PluginPlayer::~PluginPlayer()
+    {
+    }
+
+void PluginPlayer::Draw( const TRect& rect ) const
+    {
+    CWindowGc& gc = SystemGc();
+    
+    // draw the background
+    gc.SetPenStyle( CGraphicsContext::ESolidPen );
+    gc.SetPenColor( TRgb( 128, 128, 128 ) );
+    gc.SetBrushColor( TRgb( 192, 192, 192 ) );
+    gc.SetBrushStyle( CGraphicsContext::EDiamondCrossHatchBrush );
+    gc.DrawRect( rect );
+    }
+
+TInt PluginPlayer::CountComponentControls() const
+    {
+    if( m_plugin )
+        return 1;
+    else
+        return 0;
+    }
+
+CCoeControl *PluginPlayer::ComponentControl(TInt /*aIndex*/) const
+    {
+    return m_plugin;
+    }
+
+
+TKeyResponse PluginPlayer::OfferKeyEventL(const TKeyEvent keyEvent, TEventCode type)
+    {
+    return m_plugin->OfferKeyEventL( keyEvent, type );
+    }
+
+void PluginPlayer::start()
+    {
+    m_orgparent = m_plugin->Parent();    
+    m_orgrect = TRect( m_plugin->Position(), m_plugin->Size() );
+    
+    m_plugin->SetParent( this );
+
+    // try to guess what part the user wants to see, this way
+    // we can avoid unnecessary scrolling;
+    // - if the content can be made fully visible, we just center the content.
+    // - if any of the edge is clipped away, we try to show as much as possible while still
+    // keep the opposite edge visible.
+    // - if both edge are clipped away, don't do anything.
+    const TRect& rect = Rect();
+    TInt x = ( rect.Width() - m_orgrect.Width() )/2;
+    TInt y = ( rect.Height() - m_orgrect.Height() )/2;
+
+    // horizontal
+    if( x < 0 )
+        {
+        if( m_orgrect.iBr.iX < rect.iBr.iX )
+            x = m_orgrect.iTl.iX + rect.iBr.iX - m_orgrect.iBr.iX;    // right edge visible
+        else if( m_orgrect.iTl.iX > rect.iTl.iX )
+            x = rect.iTl.iX;                                        // left edge visible
+        else
+            x = m_orgrect.iTl.iX;                                    // both edges are clipped away
+        }
+
+    // vertical
+    if( y < 0 )
+        {
+        if( m_orgrect.iBr.iY < rect.iBr.iY )
+            y = m_orgrect.iTl.iY + rect.iBr.iY - m_orgrect.iBr.iY;    // bottom edge visible
+        else if( m_orgrect.iTl.iY > rect.iTl.iY )
+            y = rect.iTl.iY;                                        // top edge visible
+        else
+            y = m_orgrect.iTl.iY;                                    // both edges are clipped away
+        }
+        
+    m_plugin->SetRect( TRect( TPoint(x,y), m_orgrect.Size() ) );
+    m_plugin->makeVisible( ETrue );
+
+    DrawNow();
+    // not sure why we need this for bavp
+    m_plugin->SetRect( TRect( TPoint(x,y), m_orgrect.Size() ) );
+    m_plugin->setPluginFocusL(ETrue);
+    
+    }
+
+void PluginPlayer::stop()
+    {
+    m_plugin->setPluginFocusL(EFalse);
+    m_plugin->SetParent( m_orgparent );
+    m_plugin->SetRect( TRect( m_orgrect.iTl, m_orgrect.Size() ) );
+    m_plugin->makeVisible( EFalse );
+    }
+
+void PluginPlayer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+{
+    m_plugin->HandlePointerEventL(aPointerEvent);
+}
+
+// END OF FILE