121 lines
3.4 KiB
C++
121 lines
3.4 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: copy_to_clipboard.cpp
|
|
// Author: jean-pierre Charras
|
|
// Created: 18 aug 2006
|
|
// Licence: License GNU
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/metafile.h"
|
|
#include "fctsys.h"
|
|
#include "gr_basic.h"
|
|
#include "common.h"
|
|
#include "id.h"
|
|
#include "class_drawpanel.h"
|
|
#include "class_base_screen.h"
|
|
#include "confirm.h"
|
|
#include "wxstruct.h"
|
|
|
|
static const bool s_PlotBlackAndWhite = FALSE;
|
|
static const bool Print_Sheet_Ref = TRUE;
|
|
|
|
static bool DrawPage( EDA_DRAW_FRAME* aFrame );
|
|
|
|
|
|
/* calls the function to copy the current page or the current bock to
|
|
* the clipboard
|
|
*/
|
|
void EDA_DRAW_FRAME::CopyToClipboard( wxCommandEvent& event )
|
|
{
|
|
DrawPage( this );
|
|
|
|
if( event.GetId() == ID_GEN_COPY_BLOCK_TO_CLIPBOARD )
|
|
{
|
|
if( GetBaseScreen()->m_BlockLocate.m_Command != BLOCK_IDLE )
|
|
DrawPanel->SetCursor( wxCursor( DrawPanel->m_PanelCursor =
|
|
DrawPanel->m_PanelDefaultCursor ) );
|
|
|
|
DrawPanel->UnManageCursor( );
|
|
}
|
|
}
|
|
|
|
|
|
/* copy the current page or block to the clipboard ,
|
|
* to export drawings to other applications (word processing ...)
|
|
* This is not suitable for copy command within eeschema or pcbnew
|
|
*/
|
|
bool DrawPage( EDA_DRAW_FRAME* aFrame )
|
|
{
|
|
bool success = TRUE;
|
|
|
|
#ifdef __WINDOWS__
|
|
int tmpzoom;
|
|
wxPoint tmp_startvisu;
|
|
wxPoint old_org;
|
|
wxPoint DrawOffset;
|
|
int ClipboardSizeX, ClipboardSizeY;
|
|
bool DrawBlock = FALSE;
|
|
wxRect DrawArea;
|
|
BASE_SCREEN* screen = aFrame->DrawPanel->GetScreen();
|
|
|
|
/* scale is the ratio resolution/internal units */
|
|
float scale = 82.0 / aFrame->m_InternalUnits;
|
|
|
|
if( screen->m_BlockLocate.m_Command != BLOCK_IDLE )
|
|
{
|
|
DrawBlock = TRUE;
|
|
DrawArea.SetX( screen->m_BlockLocate.GetX() );
|
|
DrawArea.SetY( screen->m_BlockLocate.GetY() );
|
|
DrawArea.SetWidth( screen->m_BlockLocate.GetWidth() );
|
|
DrawArea.SetHeight( screen->m_BlockLocate.GetHeight() );
|
|
}
|
|
|
|
/* Change frames and local settings. */
|
|
tmp_startvisu = screen->m_StartVisu;
|
|
tmpzoom = screen->GetZoom();
|
|
old_org = screen->m_DrawOrg;
|
|
screen->m_DrawOrg.x = screen->m_DrawOrg.y = 0;
|
|
screen->m_StartVisu.x = screen->m_StartVisu.y = 0;
|
|
|
|
screen->SetZoom( 1 );
|
|
|
|
wxMetafileDC dc /*(wxT(""), DrawArea.GetWidth(), DrawArea.GetHeight())*/;
|
|
|
|
EDA_Rect tmp = aFrame->DrawPanel->m_ClipBox;
|
|
GRResetPenAndBrush( &dc );
|
|
GRForceBlackPen( s_PlotBlackAndWhite );
|
|
screen->m_IsPrinting = true;
|
|
dc.SetUserScale( scale, scale );
|
|
ClipboardSizeX = dc.MaxX() + 10;
|
|
ClipboardSizeY = dc.MaxY() + 10;
|
|
aFrame->DrawPanel->m_ClipBox.SetX( 0 );
|
|
aFrame->DrawPanel->m_ClipBox.SetY( 0 );
|
|
aFrame->DrawPanel->m_ClipBox.SetWidth( 0x7FFFFF0 );
|
|
aFrame->DrawPanel->m_ClipBox.SetHeight( 0x7FFFFF0 );
|
|
|
|
if( DrawBlock )
|
|
{
|
|
dc.SetClippingRegion( DrawArea );
|
|
}
|
|
|
|
aFrame->PrintPage( &dc, Print_Sheet_Ref, -1, false );
|
|
screen->m_IsPrinting = false;
|
|
aFrame->DrawPanel->m_ClipBox = tmp;
|
|
wxMetafile* mf = dc.Close();
|
|
|
|
if( mf )
|
|
{
|
|
success = mf->SetClipboard( ClipboardSizeX, ClipboardSizeY );
|
|
delete mf;
|
|
}
|
|
|
|
|
|
GRForceBlackPen( FALSE );
|
|
|
|
screen->m_StartVisu = tmp_startvisu;
|
|
screen->m_DrawOrg = old_org;
|
|
screen->SetZoom( tmpzoom );
|
|
#endif
|
|
|
|
return success;
|
|
}
|