X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2bda0e173844e8e0f8acf4e8ad8b5c26e5c6fe5d..bbf1f0e5cffb8c01696eb26e254857a61f017d70:/utils/nplugin/src/npframe.cpp diff --git a/utils/nplugin/src/npframe.cpp b/utils/nplugin/src/npframe.cpp new file mode 100644 index 0000000000..e3e3f63661 --- /dev/null +++ b/utils/nplugin/src/npframe.cpp @@ -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 + +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) +{ +} +