kicad/common/copy_to_clipboard.cpp

142 lines
3.8 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: copy_to_clipboard.cpp
// Author: jean-pierre Charras
// Created: 18 aug 2006
// Licence: License GNU
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <ctype.h>
#include "wx/metafile.h"
#include "fctsys.h"
#include "common.h"
#include "id.h"
extern BASE_SCREEN * ActiveScreen;
static const bool s_PlotBlackAndWhite = FALSE;
static const bool Print_Sheet_Ref = TRUE;
static bool DrawPage(WinEDA_DrawPanel * panel);
/************************************************************/
void WinEDA_DrawFrame::CopyToClipboard(wxCommandEvent& event)
/************************************************************/
/* calls the function to copy the current page or the current bock to the clipboard
*/
{
DrawPage(DrawPanel);
if( event.GetId() == ID_GEN_COPY_BLOCK_TO_CLIPBOARD )
{
if (GetScreen()->BlockLocate.m_Command != BLOCK_IDLE)
DrawPanel->SetCursor(wxCursor(DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor) );
if( DrawPanel->ManageCurseur && DrawPanel->ForceCloseManageCurseur )
{
wxClientDC dc(DrawPanel);
DrawPanel->PrepareGraphicContext(&dc);
DrawPanel->ForceCloseManageCurseur(DrawPanel, &dc);
}
}
}
/*****************************************************************/
bool DrawPage(WinEDA_DrawPanel * panel)
/*****************************************************************/
/* copy the current page or block to the clipboard ,
to export drawings to other applications (word processing ...)
Thi is not suitable for copy command within eeschema or pcbnew
*/
{
bool success = TRUE;
#ifdef __WINDOWS__
int tmpzoom;
wxPoint tmp_startvisu;
wxPoint old_org;
wxPoint DrawOffset; // Offset de trace
int ClipboardSizeX, ClipboardSizeY;
bool DrawBlock = FALSE;
wxRect DrawArea;
/* scale is the ratio resolution/internal units */
float scale = 82.0 / panel->m_Parent->m_InternalUnits;
if ( ActiveScreen->BlockLocate.m_Command != BLOCK_IDLE )
{
DrawBlock = TRUE;
DrawArea.SetX((int)(ActiveScreen->BlockLocate.GetX()) );
DrawArea.SetY((int)(ActiveScreen->BlockLocate.GetY()));
DrawArea.SetWidth((int)(ActiveScreen->BlockLocate.GetWidth()));
DrawArea.SetHeight((int)(ActiveScreen->BlockLocate.GetHeight()));
}
/* modification des cadrages et reglages locaux */
tmp_startvisu = ActiveScreen->m_StartVisu;
tmpzoom = ActiveScreen->GetZoom();
old_org = ActiveScreen->m_DrawOrg;
ActiveScreen->m_DrawOrg.x = ActiveScreen->m_DrawOrg.y = 0;
ActiveScreen->m_StartVisu.x = ActiveScreen->m_StartVisu.y = 0;
ActiveScreen->SetZoom(1);
wxMetafileDC dc/*(wxT(""), DrawArea.GetWidth(), DrawArea.GetHeight())*/;
if ( ! dc.Ok() )
{
DisplayError(NULL, wxT("CopyToClipboard: DrawPage error: wxMetafileDC not OK"));
success = FALSE;
}
else
{
EDA_Rect tmp = panel->m_ClipBox;
GRResetPenAndBrush(&dc);
GRForceBlackPen(s_PlotBlackAndWhite);
g_IsPrinting = TRUE;
dc.SetUserScale(scale, scale);
ClipboardSizeX = dc.MaxX() + 10;
ClipboardSizeY = dc.MaxY() + 10;
panel->m_ClipBox.SetX(0);panel->m_ClipBox.SetY(0);
panel->m_ClipBox.SetWidth(0x7FFFFF0); panel->m_ClipBox.SetHeight(0x7FFFFF0);
if ( DrawBlock )
{
dc.SetClippingRegion( DrawArea );
}
panel->PrintPage(&dc, Print_Sheet_Ref, -1);
g_IsPrinting = FALSE;
panel->m_ClipBox = tmp;
wxMetafile *mf = dc.Close();
if (mf)
{
success = mf->SetClipboard(ClipboardSizeX, ClipboardSizeY);
delete mf;
}
}
GRForceBlackPen(FALSE);
SetPenMinWidth(1);
ActiveScreen->m_StartVisu = tmp_startvisu;
ActiveScreen->m_DrawOrg = old_org;
ActiveScreen->SetZoom(tmpzoom);
#endif
return success;
}