--- /dev/null
+/*
+ * 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)
+{
+}
+