now MSW stuff is complete
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
293
utils/nplugin/src/npframe.cpp
Normal file
293
utils/nplugin/src/npframe.cpp
Normal file
@@ -0,0 +1,293 @@
|
||||
/*
|
||||
* File: NPFrame.cc
|
||||
* Purpose: wxPluginFrame implementation
|
||||
* Author: Julian Smart
|
||||
* Created: 1997
|
||||
* Updated:
|
||||
* Copyright: (c) Julian Smart
|
||||
*/
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/frame.h"
|
||||
#endif
|
||||
|
||||
#include "wx/dcprint.h"
|
||||
|
||||
#include "NPFrame.h"
|
||||
#include "NPApp.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
extern wxList wxModelessWindows;
|
||||
extern char wxFrameClassName[];
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxPluginFrame, wxFrame)
|
||||
|
||||
wxPluginFrame::wxPluginFrame(void)
|
||||
{
|
||||
m_npWindow = NULL;
|
||||
m_npInstance = NULL;
|
||||
m_nAttributes = 0;
|
||||
m_names = NULL;
|
||||
m_values = NULL;
|
||||
}
|
||||
|
||||
bool wxPluginFrame::Create(const wxPluginData& data)
|
||||
{
|
||||
SetName("pluginFrame");
|
||||
|
||||
m_npWindow = NULL;
|
||||
m_npInstance = NULL;
|
||||
m_nAttributes = 0;
|
||||
m_names = NULL;
|
||||
m_values = NULL;
|
||||
m_npWindow = data.m_window;
|
||||
m_npInstance = data.m_instance;
|
||||
|
||||
SetAttributeValues(data.m_argc, data.m_argn, data.m_argv);
|
||||
SetNPWindow(data.m_window);
|
||||
|
||||
wxModelessWindows.Append(this);
|
||||
|
||||
if (wxTheApp->IsKindOf(CLASSINFO(wxPluginApp)))
|
||||
{
|
||||
((wxPluginApp *)wxTheApp)->AddFrame(this);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
wxPluginFrame::~wxPluginFrame(void)
|
||||
{
|
||||
if (wxTheApp->IsKindOf(CLASSINFO(wxPluginApp)))
|
||||
{
|
||||
((wxPluginApp *)wxTheApp)->RemoveFrame(this);
|
||||
}
|
||||
|
||||
if ( GetHWND() )
|
||||
UnsubclassWin();
|
||||
m_hWnd = 0;
|
||||
|
||||
if ( m_names )
|
||||
delete[] m_names;
|
||||
if ( m_values )
|
||||
delete[] m_values;
|
||||
}
|
||||
|
||||
// Get size *available for subwindows* i.e. excluding menu bar etc.
|
||||
// For XView, this is the same as GetSize
|
||||
void wxPluginFrame::GetClientSize(int *x, int *y) const
|
||||
{
|
||||
if ( !m_hWnd )
|
||||
{
|
||||
*x = 0; *y = 0;
|
||||
return;
|
||||
}
|
||||
wxFrame::GetClientSize(x, y);
|
||||
}
|
||||
|
||||
// Set the client size (i.e. leave the calculation of borders etc.
|
||||
// to wxWindows)
|
||||
void wxPluginFrame::SetClientSize(const int width, const int height)
|
||||
{
|
||||
if ( !m_hWnd )
|
||||
return ;
|
||||
|
||||
wxFrame::SetClientSize(width, height);
|
||||
}
|
||||
|
||||
void wxPluginFrame::GetSize(int *width, int *height) const
|
||||
{
|
||||
if ( !m_hWnd )
|
||||
{
|
||||
*width = 0; *height = 0;
|
||||
return;
|
||||
}
|
||||
wxFrame::GetSize(width, height);
|
||||
}
|
||||
|
||||
void wxPluginFrame::GetPosition(int *x, int *y) const
|
||||
{
|
||||
if ( !m_hWnd )
|
||||
{
|
||||
*x = 0; *y = 0;
|
||||
return;
|
||||
}
|
||||
wxFrame::GetPosition(x, y);
|
||||
}
|
||||
|
||||
void wxPluginFrame::SetAttributeValues(const int n, const char *argn[], const char *argv[])
|
||||
{
|
||||
if ( m_names )
|
||||
delete[] m_names;
|
||||
if ( m_values )
|
||||
delete[] m_values;
|
||||
|
||||
m_nAttributes = n;
|
||||
|
||||
m_names = new wxString[n];
|
||||
m_values = new wxString[n];
|
||||
int i;
|
||||
for ( i = 0; i < n ; i ++)
|
||||
{
|
||||
m_names[i] = argn[i];
|
||||
m_values[i] = argv[i];
|
||||
}
|
||||
}
|
||||
|
||||
void wxPluginFrame::SetAttributeValues(const int n, const wxString* argn, const wxString* argv)
|
||||
{
|
||||
if ( m_names )
|
||||
delete[] m_names;
|
||||
if ( m_values )
|
||||
delete[] m_values;
|
||||
|
||||
m_nAttributes = n;
|
||||
|
||||
m_names = new wxString[n];
|
||||
m_values = new wxString[n];
|
||||
int i;
|
||||
for ( i = 0; i < n ; i ++)
|
||||
{
|
||||
m_names[i] = argn[i];
|
||||
m_values[i] = argv[i];
|
||||
}
|
||||
}
|
||||
|
||||
void wxPluginFrame::SetSize(const int x, const int y, const int width, const int height, const int sizeFlags)
|
||||
{
|
||||
// Can't allow app to set the size.
|
||||
return;
|
||||
}
|
||||
|
||||
// Sets and subclasses the platform-specific window handle
|
||||
bool wxPluginFrame::SetNPWindow(NPWindow *window)
|
||||
{
|
||||
if ( !window || !window->window)
|
||||
{
|
||||
if ( m_hWnd )
|
||||
{
|
||||
wxMessageBox("Unsubclassing window prematurely");
|
||||
UnsubclassWin();
|
||||
m_hWnd = 0;
|
||||
}
|
||||
m_npWindow = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( m_hWnd )
|
||||
{
|
||||
if ( m_hWnd == (WXHWND) window->window )
|
||||
{
|
||||
// Does this mean a resize?
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
m_npWindow = window;
|
||||
m_hWnd = (WXHWND) window->window;
|
||||
SubclassWin(m_hWnd);
|
||||
m_windowId = ::GetWindowLong((HWND) m_hWnd, GWL_ID);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
NPError wxPluginFrame::OnNPNewStream(NPMIMEType type, NPStream *stream, bool seekable, uint16* stype)
|
||||
{
|
||||
*stype = NP_ASFILE;
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
void wxPluginFrame::OnNPNewFile(NPStream *stream, const wxString& fname)
|
||||
{
|
||||
}
|
||||
|
||||
void wxPluginFrame::OnNPPrint(NPPrint* printInfo)
|
||||
{
|
||||
if (printInfo->mode == NP_FULL)
|
||||
{
|
||||
//
|
||||
// *Developers*: If your plugin would like to take over
|
||||
// printing completely when it is in full-screen mode,
|
||||
// set printInfo->pluginPrinted to TRUE and print your
|
||||
// plugin as you see fit. If your plugin wants Netscape
|
||||
// to handle printing in this case, set printInfo->pluginPrinted
|
||||
// to FALSE (the default) and do nothing. If you do want
|
||||
// to handle printing yourself, printOne is true if the
|
||||
// print button (as opposed to the print menu) was clicked.
|
||||
// On the Macintosh, platformPrint is a THPrint; on Windows,
|
||||
// platformPrint is a structure (defined in npapi.h) containing
|
||||
// the printer name, port, etc.
|
||||
//
|
||||
void* platformPrint = printInfo->print.fullPrint.platformPrint;
|
||||
NPBool printOne = printInfo->print.fullPrint.printOne;
|
||||
|
||||
printInfo->print.fullPrint.pluginPrinted = FALSE; // Do the default
|
||||
|
||||
}
|
||||
else // If not fullscreen, we must be embedded
|
||||
{
|
||||
//
|
||||
// *Developers*: If your plugin is embedded, or is full-screen
|
||||
// but you returned false in pluginPrinted above, NPP_Print
|
||||
// will be called with mode == NP_EMBED. The NPWindow
|
||||
// in the printInfo gives the location and dimensions of
|
||||
// the embedded plugin on the printed page. On the Macintosh,
|
||||
// platformPrint is the printer port; on Windows, platformPrint
|
||||
// is the handle to the printing device context.
|
||||
//
|
||||
NPWindow* printWindow = &(printInfo->print.embedPrint.window);
|
||||
void* platformPrint = printInfo->print.embedPrint.platformPrint;
|
||||
|
||||
HDC hDC = (HDC) platformPrint;
|
||||
wxRectangle rect;
|
||||
rect.x = printWindow->x;
|
||||
rect.y = printWindow->y;
|
||||
rect.width = printWindow->width;
|
||||
rect.height = printWindow->height;
|
||||
|
||||
int saveIt = ::SaveDC(hDC);
|
||||
|
||||
wxPrinterDC *printerDC = new wxPrinterDC((WXHDC) hDC);
|
||||
|
||||
OnPrint(*printerDC, rect);
|
||||
|
||||
printerDC->SetHDC(0);
|
||||
delete printerDC;
|
||||
|
||||
::RestoreDC(hDC, saveIt);
|
||||
}
|
||||
}
|
||||
|
||||
void wxPluginFrame::OnPrint(wxPrinterDC& dc, wxRectangle& rect)
|
||||
{
|
||||
// We must do some transformations here
|
||||
RECT winRect;
|
||||
/*
|
||||
winRect.left = rect.x;
|
||||
winRect.top = rect.y;
|
||||
winRect.right = rect.x + rect.right;
|
||||
winRect.bottom = rect.y + rect.height;
|
||||
*/
|
||||
POINT winPoint[2];
|
||||
winPoint[0].x = rect.x;
|
||||
winPoint[0].y = rect.y;
|
||||
winPoint[1].x = rect.x + rect.width;
|
||||
winPoint[1].y = rect.y + rect.height;
|
||||
|
||||
if (!LPtoDP((HDC) dc.GetHDC(), winPoint, 2))
|
||||
wxMessageBox("LPtoDP failed.");
|
||||
|
||||
OnDraw(dc);
|
||||
}
|
||||
|
||||
void wxPluginFrame::OnDraw(wxDC& dc)
|
||||
{
|
||||
}
|
||||
|
Reference in New Issue
Block a user