16e93305f2
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1102 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
294 lines
7.1 KiB
C++
294 lines
7.1 KiB
C++
/*
|
|
* 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;
|
|
wxRect 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, wxRect& 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)
|
|
{
|
|
}
|
|
|