764 lines
22 KiB
C++
764 lines
22 KiB
C++
/*
|
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
|
*
|
|
* Copyright (C) 1992-2010 Kicad Developers, see AUTHORS.txt for contributors.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, you may find one here:
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
/**
|
|
* @file dialog_page_settings.cpp
|
|
*/
|
|
|
|
#include <fctsys.h>
|
|
#include <macros.h> // DIM()
|
|
#include <common.h>
|
|
#include <gr_basic.h>
|
|
#include <base_struct.h>
|
|
#include <class_drawpanel.h>
|
|
#include <class_title_block.h>
|
|
#include <wxstruct.h>
|
|
#include <class_base_screen.h>
|
|
|
|
#include <wx/valgen.h>
|
|
#include <wx/tokenzr.h>
|
|
|
|
#ifdef EESCHEMA
|
|
#include <class_sch_screen.h>
|
|
#include <general.h>
|
|
#endif
|
|
|
|
#include <dialog_page_settings.h>
|
|
|
|
// dialog should remember its previous screen position and size
|
|
wxPoint DIALOG_PAGES_SETTINGS::s_LastPos( -1, -1 );
|
|
wxSize DIALOG_PAGES_SETTINGS::s_LastSize;
|
|
|
|
// List of page formats.
|
|
// should be statically initialized, because we need both
|
|
// the translated and the not translated version.
|
|
// when displayed in dialog we should explicitely call wxGetTranslation()
|
|
// to show the translated version.
|
|
const wxString pageFmts[] =
|
|
{
|
|
_("A4 210x297mm"),
|
|
_("A3 297x420mm"),
|
|
_("A2 420x594mm"),
|
|
_("A1 594x841mm"),
|
|
_("A0 841x1189mm"),
|
|
_("A 8.5x11in"),
|
|
_("B 11x17in"),
|
|
_("C 17x22in"),
|
|
_("D 22x34in"),
|
|
_("E 34x44in"),
|
|
_("USLetter 8.5x11in"),
|
|
_("USLegal 8.5x14in"),
|
|
_("USLedger 11x17in"),
|
|
_("User (Custom)"),
|
|
wxT("") // end of list
|
|
};
|
|
|
|
void EDA_DRAW_FRAME::Process_PageSettings( wxCommandEvent& event )
|
|
{
|
|
DIALOG_PAGES_SETTINGS frame( this );
|
|
int diag = frame.ShowModal();
|
|
|
|
if( m_canvas && diag )
|
|
m_canvas->Refresh();
|
|
}
|
|
|
|
|
|
DIALOG_PAGES_SETTINGS::DIALOG_PAGES_SETTINGS( EDA_DRAW_FRAME* parent ) :
|
|
DIALOG_PAGES_SETTINGS_BASE( parent ),
|
|
m_initialized( false )
|
|
{
|
|
m_Parent = parent;
|
|
m_Screen = m_Parent->GetScreen();
|
|
m_modified = false;
|
|
m_page_bitmap = NULL;
|
|
m_tb = m_Parent->GetTitleBlock();
|
|
|
|
initDialog();
|
|
|
|
GetSizer()->SetSizeHints( this );
|
|
Centre();
|
|
}
|
|
|
|
|
|
DIALOG_PAGES_SETTINGS::~DIALOG_PAGES_SETTINGS()
|
|
{
|
|
if( m_page_bitmap )
|
|
delete m_page_bitmap;
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::initDialog()
|
|
{
|
|
wxString msg;
|
|
double customSizeX;
|
|
double customSizeY;
|
|
|
|
SetFocus();
|
|
|
|
// initalize page format choice box and page format list.
|
|
// The first shows translated strings, the second contains not tralated strings
|
|
m_paperSizeComboBox->Clear();
|
|
|
|
for( unsigned ii = 0; ; ii++ )
|
|
{
|
|
if( pageFmts[ii].IsEmpty() )
|
|
break;
|
|
|
|
m_pageFmt.Add( pageFmts[ii] );
|
|
m_paperSizeComboBox->Append( wxGetTranslation( pageFmts[ii] ) );
|
|
}
|
|
|
|
|
|
#ifdef EESCHEMA
|
|
// Init display value for sheet User size
|
|
wxString format = m_TextSheetCount->GetLabel();
|
|
msg.Printf( format, m_Screen->m_NumberOfScreen );
|
|
m_TextSheetCount->SetLabel( msg );
|
|
|
|
format = m_TextSheetNumber->GetLabel();
|
|
msg.Printf( format, m_Screen->m_ScreenNumber );
|
|
m_TextSheetNumber->SetLabel( msg );
|
|
#else
|
|
m_TextSheetCount->Show( false );
|
|
m_TextSheetNumber->Show( false );
|
|
#endif
|
|
|
|
m_pageInfo = m_Parent->GetPageSettings();
|
|
SetCurrentPageSizeSelection( m_pageInfo.GetType() );
|
|
m_orientationComboBox->SetSelection( m_pageInfo.IsPortrait() );
|
|
|
|
// only a click fires the "selection changed" event, so have to fabricate this check
|
|
wxCommandEvent dummy;
|
|
OnPaperSizeChoice( dummy );
|
|
|
|
switch( g_UserUnit )
|
|
{
|
|
case MILLIMETRES:
|
|
customSizeX = m_pageInfo.GetCustomWidthMils() * 25.4e-3;
|
|
customSizeY = m_pageInfo.GetCustomHeightMils()* 25.4e-3;
|
|
|
|
msg.Printf( wxT( "%.2f" ), customSizeX );
|
|
m_TextUserSizeX->SetValue( msg );
|
|
|
|
msg.Printf( wxT( "%.2f" ), customSizeY );
|
|
m_TextUserSizeY->SetValue( msg );
|
|
break;
|
|
|
|
default:
|
|
case INCHES:
|
|
customSizeX = m_pageInfo.GetCustomWidthMils() / 1000.0;
|
|
customSizeY = m_pageInfo.GetCustomHeightMils() / 1000.0;
|
|
|
|
msg.Printf( wxT( "%.3f" ), customSizeX );
|
|
m_TextUserSizeX->SetValue( msg );
|
|
|
|
msg.Printf( wxT( "%.3f" ), customSizeY );
|
|
m_TextUserSizeY->SetValue( msg );
|
|
break;
|
|
}
|
|
|
|
#if 0
|
|
m_TextRevision->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Revision ) );
|
|
m_TextTitle->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Title ) );
|
|
m_TextCompany->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Company ) );
|
|
m_TextComment1->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Commentaire1 ) );
|
|
m_TextComment2->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Commentaire2 ) );
|
|
m_TextComment3->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Commentaire3 ) );
|
|
m_TextComment4->SetValidator( wxTextValidator( wxFILTER_NONE, &m_Screen->m_Commentaire4 ) );
|
|
#else
|
|
m_TextRevision->SetValue( m_tb.GetRevision() );
|
|
m_TextTitle->SetValue( m_tb.GetTitle() );
|
|
m_TextCompany->SetValue( m_tb.GetCompany() );
|
|
m_TextComment1->SetValue( m_tb.GetComment1() );
|
|
m_TextComment2->SetValue( m_tb.GetComment2() );
|
|
m_TextComment3->SetValue( m_tb.GetComment3() );
|
|
m_TextComment4->SetValue( m_tb.GetComment4() );
|
|
#endif
|
|
|
|
#ifndef EESCHEMA
|
|
m_RevisionExport->Show( false );
|
|
m_TitleExport->Show( false );
|
|
m_CompanyExport->Show( false );
|
|
m_Comment1Export->Show( false );
|
|
m_Comment2Export->Show( false );
|
|
m_Comment3Export->Show( false );
|
|
m_Comment4Export->Show( false );
|
|
#endif
|
|
|
|
GetPageLayoutInfoFromDialog();
|
|
UpdatePageLayoutExample();
|
|
|
|
// Make the OK button the default.
|
|
m_sdbSizer1OK->SetDefault();
|
|
m_initialized = true;
|
|
}
|
|
|
|
|
|
bool DIALOG_PAGES_SETTINGS::Show( bool show )
|
|
{
|
|
bool ret;
|
|
|
|
if( show )
|
|
{
|
|
ret = DIALOG_PAGES_SETTINGS_BASE::Show( show );
|
|
|
|
if( s_LastPos.x != -1 )
|
|
{
|
|
SetSize( s_LastPos.x, s_LastPos.y, s_LastSize.x, s_LastSize.y, 0 );
|
|
}
|
|
else
|
|
{
|
|
// Do nothing: last position not yet saved.
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Save the dialog's position before hiding
|
|
s_LastPos = GetPosition();
|
|
s_LastSize = GetSize();
|
|
ret = DIALOG_PAGES_SETTINGS_BASE::Show( show );
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnCloseWindow( wxCloseEvent& event )
|
|
{
|
|
EndModal( m_modified );
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnOkClick( wxCommandEvent& event )
|
|
{
|
|
m_save_flag = false;
|
|
SavePageSettings( event );
|
|
|
|
if( m_save_flag )
|
|
{
|
|
m_modified = true;
|
|
Close( true );
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnCancelClick( wxCommandEvent& event )
|
|
{
|
|
Close( true );
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnPaperSizeChoice( wxCommandEvent& event )
|
|
{
|
|
int idx = m_paperSizeComboBox->GetSelection();
|
|
|
|
if( idx < 0 )
|
|
idx = 0;
|
|
|
|
const wxString paperType = m_pageFmt[idx];
|
|
|
|
if( paperType.Contains( PAGE_INFO::Custom ) )
|
|
{
|
|
m_orientationComboBox->Enable( false );
|
|
m_TextUserSizeX->Enable( true );
|
|
m_TextUserSizeY->Enable( true );
|
|
}
|
|
else
|
|
{
|
|
m_orientationComboBox->Enable( true );
|
|
|
|
if( paperType.Contains( wxT( "A4" ) ) && IsGOST() )
|
|
{
|
|
m_orientationComboBox->SetStringSelection( _( "Portrait" ) );
|
|
m_orientationComboBox->Enable( false );
|
|
}
|
|
|
|
m_TextUserSizeX->Enable( false );
|
|
m_TextUserSizeY->Enable( false );
|
|
}
|
|
|
|
GetPageLayoutInfoFromDialog();
|
|
UpdatePageLayoutExample();
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnUserPageSizeXTextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextUserSizeX->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnUserPageSizeYTextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextUserSizeY->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnPageOrientationChoice( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnRevisionTextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextRevision->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetRevision( m_TextRevision->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnTitleTextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextTitle->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetTitle( m_TextTitle->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnCompanyTextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextCompany->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetCompany( m_TextCompany->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnComment1TextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextComment1->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetComment1( m_TextComment1->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnComment2TextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextComment2->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetComment2( m_TextComment2->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnComment3TextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextComment3->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetComment3( m_TextComment3->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::OnComment4TextUpdated( wxCommandEvent& event )
|
|
{
|
|
if( m_initialized && m_TextComment4->IsModified() )
|
|
{
|
|
GetPageLayoutInfoFromDialog();
|
|
m_tb.SetComment4( m_TextComment4->GetValue() );
|
|
UpdatePageLayoutExample();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::SavePageSettings( wxCommandEvent& event )
|
|
{
|
|
bool retSuccess = false;
|
|
|
|
m_save_flag = true;
|
|
|
|
int idx = m_paperSizeComboBox->GetSelection();
|
|
|
|
if( idx < 0 )
|
|
idx = 0;
|
|
|
|
const wxString paperType = m_pageFmt[idx];
|
|
|
|
if( paperType.Contains( PAGE_INFO::Custom ) )
|
|
{
|
|
GetCustomSizeMilsFromDialog();
|
|
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::Custom );
|
|
|
|
if( retSuccess )
|
|
{
|
|
if( m_layout_size.x < MIN_PAGE_SIZE || m_layout_size.y < MIN_PAGE_SIZE ||
|
|
m_layout_size.x > MAX_PAGE_SIZE || m_layout_size.y > MAX_PAGE_SIZE )
|
|
{
|
|
wxString msg = wxString::Format( _( "Selected custom paper size\nis out of the permissible \
|
|
limits\n%.1f - %.1f %s!\nSelect another custom paper size?" ),
|
|
g_UserUnit == INCHES ? MIN_PAGE_SIZE / 1000. : MIN_PAGE_SIZE * 25.4 / 1000,
|
|
g_UserUnit == INCHES ? MAX_PAGE_SIZE / 1000. : MAX_PAGE_SIZE * 25.4 / 1000,
|
|
g_UserUnit == INCHES ? _( "inches" ) : _( "mm" ) );
|
|
|
|
if( wxMessageBox( msg, _( "Warning!" ), wxYES_NO | wxICON_EXCLAMATION, this ) == wxYES )
|
|
{
|
|
m_save_flag = false;
|
|
return;
|
|
}
|
|
|
|
m_layout_size.x = Clamp( MIN_PAGE_SIZE, m_layout_size.x, MAX_PAGE_SIZE );
|
|
m_layout_size.y = Clamp( MIN_PAGE_SIZE, m_layout_size.y, MAX_PAGE_SIZE );
|
|
}
|
|
|
|
PAGE_INFO::SetCustomWidthMils( m_layout_size.x );
|
|
PAGE_INFO::SetCustomHeightMils( m_layout_size.y );
|
|
|
|
m_pageInfo.SetWidthMils( m_layout_size.x );
|
|
m_pageInfo.SetHeightMils( m_layout_size.y );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// search for longest common string first, e.g. A4 before A
|
|
if( paperType.Contains( PAGE_INFO::USLetter ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::USLetter );
|
|
else if( paperType.Contains( PAGE_INFO::USLegal ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::USLegal );
|
|
else if( paperType.Contains( PAGE_INFO::USLedger ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::USLedger );
|
|
else if( paperType.Contains( PAGE_INFO::GERBER ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::GERBER );
|
|
else if( paperType.Contains( PAGE_INFO::A4 ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::A4 );
|
|
else if( paperType.Contains( PAGE_INFO::A3 ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::A3 );
|
|
else if( paperType.Contains( PAGE_INFO::A2 ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::A2 );
|
|
else if( paperType.Contains( PAGE_INFO::A1 ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::A1 );
|
|
else if( paperType.Contains( PAGE_INFO::A0 ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::A0 );
|
|
else if( paperType.Contains( PAGE_INFO::A ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::A );
|
|
else if( paperType.Contains( PAGE_INFO::B ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::B );
|
|
else if( paperType.Contains( PAGE_INFO::C ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::C );
|
|
else if( paperType.Contains( PAGE_INFO::D ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::D );
|
|
else if( paperType.Contains( PAGE_INFO::E ) )
|
|
retSuccess = m_pageInfo.SetType( PAGE_INFO::E );
|
|
|
|
if( retSuccess )
|
|
{
|
|
int choice = m_orientationComboBox->GetSelection();
|
|
m_pageInfo.SetPortrait( choice != 0 );
|
|
}
|
|
}
|
|
|
|
if( !retSuccess )
|
|
{
|
|
wxASSERT_MSG( false, wxT( "the translation for paper size must preserve original spellings" ) );
|
|
m_pageInfo.SetType( PAGE_INFO::A4 );
|
|
}
|
|
|
|
m_Parent->SetPageSettings( m_pageInfo );
|
|
|
|
m_tb.SetRevision( m_TextRevision->GetValue() );
|
|
m_tb.SetCompany( m_TextCompany->GetValue() );
|
|
m_tb.SetTitle( m_TextTitle->GetValue() );
|
|
m_tb.SetComment1( m_TextComment1->GetValue() );
|
|
m_tb.SetComment2( m_TextComment2->GetValue() );
|
|
m_tb.SetComment3( m_TextComment3->GetValue() );
|
|
m_tb.SetComment4( m_TextComment4->GetValue() );
|
|
|
|
m_Parent->SetTitleBlock( m_tb );
|
|
|
|
#ifdef EESCHEMA
|
|
// Exports settings to other sheets if requested:
|
|
SCH_SCREEN* screen;
|
|
|
|
// Build the screen list
|
|
SCH_SCREENS ScreenList;
|
|
|
|
// Update title blocks for all screens
|
|
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
|
|
{
|
|
if( screen == m_Screen )
|
|
continue;
|
|
|
|
TITLE_BLOCK tb2 = screen->GetTitleBlock();
|
|
|
|
if( m_RevisionExport->IsChecked() )
|
|
tb2.SetRevision( m_tb.GetRevision() );
|
|
|
|
if( m_TitleExport->IsChecked() )
|
|
tb2.SetTitle( m_tb.GetTitle() );
|
|
|
|
if( m_CompanyExport->IsChecked() )
|
|
tb2.SetCompany( m_tb.GetCompany() );
|
|
|
|
if( m_Comment1Export->IsChecked() )
|
|
tb2.SetComment1( m_tb.GetComment1() );
|
|
|
|
if( m_Comment2Export->IsChecked() )
|
|
tb2.SetComment2( m_tb.GetComment2() );
|
|
|
|
if( m_Comment3Export->IsChecked() )
|
|
tb2.SetComment3( m_tb.GetComment3() );
|
|
|
|
if( m_Comment4Export->IsChecked() )
|
|
tb2.SetComment4( m_tb.GetComment4() );
|
|
|
|
screen->SetTitleBlock( tb2 );
|
|
}
|
|
|
|
#endif
|
|
|
|
m_Screen->SetModify();
|
|
m_Parent->GetCanvas()->Refresh();
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::SetCurrentPageSizeSelection( const wxString& aPaperSize )
|
|
{
|
|
// search all the not translated label list containing our paper type
|
|
for( unsigned i = 0; i < m_pageFmt.GetCount(); ++i )
|
|
{
|
|
// parse each label looking for aPaperSize within it
|
|
wxStringTokenizer st( m_pageFmt[i] );
|
|
|
|
while( st.HasMoreTokens() )
|
|
{
|
|
if( st.GetNextToken() == aPaperSize )
|
|
{
|
|
m_paperSizeComboBox->SetSelection( i );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::UpdatePageLayoutExample()
|
|
{
|
|
int lyWidth, lyHeight;
|
|
|
|
wxSize clamped_layout_size( Clamp( MIN_PAGE_SIZE, m_layout_size.x, MAX_PAGE_SIZE ),
|
|
Clamp( MIN_PAGE_SIZE, m_layout_size.y, MAX_PAGE_SIZE ) );
|
|
|
|
double lyRatio = clamped_layout_size.x < clamped_layout_size.y ?
|
|
(double) clamped_layout_size.y / clamped_layout_size.x :
|
|
(double) clamped_layout_size.x / clamped_layout_size.y;
|
|
|
|
if( clamped_layout_size.x < clamped_layout_size.y )
|
|
{
|
|
lyHeight = MAX_PAGE_EXAMPLE_SIZE;
|
|
lyWidth = KiROUND( (double) lyHeight / lyRatio );
|
|
}
|
|
else
|
|
{
|
|
lyWidth = MAX_PAGE_EXAMPLE_SIZE;
|
|
lyHeight = KiROUND( (double) lyWidth / lyRatio );
|
|
}
|
|
|
|
if( m_page_bitmap )
|
|
{
|
|
m_PageLayoutExampleBitmap->SetBitmap( wxNullBitmap );
|
|
delete m_page_bitmap;
|
|
}
|
|
|
|
m_page_bitmap = new wxBitmap( lyWidth + 1, lyHeight + 1 );
|
|
|
|
if( m_page_bitmap->IsOk() )
|
|
{
|
|
// Save current clip box and temporary expand it.
|
|
EDA_RECT save_clip_box = *m_Parent->GetCanvas()->GetClipBox();
|
|
m_Parent->GetCanvas()->SetClipBox( EDA_RECT( wxPoint( 0, 0 ),
|
|
wxSize( INT_MAX / 2, INT_MAX / 2 ) ) );
|
|
// Calculate layout preview scale.
|
|
int appScale = m_Screen->MilsToIuScalar();
|
|
|
|
double scaleW = (double) lyWidth / clamped_layout_size.x / appScale;
|
|
double scaleH = (double) lyHeight / clamped_layout_size.y / appScale;
|
|
|
|
// Prepare DC.
|
|
wxSize example_size( lyWidth, lyHeight );
|
|
wxMemoryDC memDC;
|
|
memDC.SetClippingRegion( wxPoint( 0, 0 ), example_size );
|
|
memDC.SelectObject( *m_page_bitmap );
|
|
memDC.Clear();
|
|
memDC.SetUserScale( scaleW, scaleH );
|
|
|
|
// Get logical page size and margins.
|
|
PAGE_INFO pageDUMMY;
|
|
|
|
pageDUMMY.SetWidthMils( clamped_layout_size.x );
|
|
pageDUMMY.SetHeightMils( clamped_layout_size.y );
|
|
|
|
wxSize dummySize = pageDUMMY.GetSizeMils();
|
|
wxPoint pointLeftTop( pageDUMMY.GetLeftMarginMils(), pageDUMMY.GetTopMarginMils() );
|
|
wxPoint pointRightBottom( pageDUMMY.GetRightMarginMils(), pageDUMMY.GetBottomMarginMils() );
|
|
|
|
// Draw layout preview.
|
|
wxString emptyString;
|
|
GRResetPenAndBrush( ( wxDC* ) &memDC );
|
|
|
|
m_Parent->TraceWorkSheet( (wxDC*) &memDC, dummySize, pointLeftTop, pointRightBottom,
|
|
emptyString, emptyString, m_tb, m_Screen->m_NumberOfScreen,
|
|
m_Screen->m_ScreenNumber, 1, appScale, LIGHTGRAY, RED );
|
|
|
|
memDC.SelectObject( wxNullBitmap );
|
|
m_PageLayoutExampleBitmap->SetBitmap( *m_page_bitmap );
|
|
|
|
// Restore current clip box.
|
|
m_Parent->GetCanvas()->SetClipBox( save_clip_box );
|
|
|
|
// Refresh the dialog.
|
|
Layout();
|
|
Refresh();
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::GetPageLayoutInfoFromDialog()
|
|
{
|
|
int idx = m_paperSizeComboBox->GetSelection();
|
|
|
|
if( idx < 0 )
|
|
idx = 0;
|
|
|
|
const wxString paperType = m_pageFmt[idx];
|
|
|
|
// here we assume translators will keep original paper size spellings
|
|
if( paperType.Contains( PAGE_INFO::Custom ) )
|
|
{
|
|
GetCustomSizeMilsFromDialog();
|
|
|
|
if( m_layout_size.x && m_layout_size.y )
|
|
{
|
|
if( m_layout_size.x < m_layout_size.y )
|
|
m_orientationComboBox->SetStringSelection( _( "Portrait" ) );
|
|
else
|
|
m_orientationComboBox->SetStringSelection( _( "Landscape" ) );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PAGE_INFO pageInfo; // SetType() later to lookup size
|
|
|
|
static const wxString* papers[] = {
|
|
// longest common string first, since sequential search below
|
|
&PAGE_INFO::A4,
|
|
&PAGE_INFO::A3,
|
|
&PAGE_INFO::A2,
|
|
&PAGE_INFO::A1,
|
|
&PAGE_INFO::A0,
|
|
&PAGE_INFO::A,
|
|
&PAGE_INFO::B,
|
|
&PAGE_INFO::C,
|
|
&PAGE_INFO::D,
|
|
&PAGE_INFO::E,
|
|
//&PAGE_INFO::GERBER,
|
|
&PAGE_INFO::USLetter,
|
|
&PAGE_INFO::USLegal,
|
|
&PAGE_INFO::USLedger,
|
|
};
|
|
|
|
unsigned i;
|
|
|
|
for( i=0; i < DIM( papers ); ++i )
|
|
{
|
|
if( paperType.Contains( *papers[i] ) )
|
|
{
|
|
pageInfo.SetType( *papers[i] );
|
|
break;
|
|
}
|
|
}
|
|
|
|
wxASSERT( i != DIM(papers) ); // dialog UI match the above list?
|
|
|
|
m_layout_size = pageInfo.GetSizeMils();
|
|
|
|
// swap sizes to match orientation
|
|
bool isPortrait = (bool) m_orientationComboBox->GetSelection();
|
|
|
|
if( ( isPortrait && m_layout_size.x >= m_layout_size.y ) ||
|
|
( !isPortrait && m_layout_size.x < m_layout_size.y ) )
|
|
{
|
|
m_layout_size.Set( m_layout_size.y, m_layout_size.x );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void DIALOG_PAGES_SETTINGS::GetCustomSizeMilsFromDialog()
|
|
{
|
|
double customSizeX;
|
|
double customSizeY;
|
|
wxString msg;
|
|
|
|
msg = m_TextUserSizeX->GetValue();
|
|
msg.ToDouble( &customSizeX );
|
|
|
|
msg = m_TextUserSizeY->GetValue();
|
|
msg.ToDouble( &customSizeY );
|
|
|
|
switch( g_UserUnit )
|
|
{
|
|
case MILLIMETRES:
|
|
customSizeX *= 1000. / 25.4;
|
|
customSizeY *= 1000. / 25.4;
|
|
break;
|
|
|
|
default:
|
|
case INCHES:
|
|
customSizeX *= 1000.;
|
|
customSizeY *= 1000.;
|
|
}
|
|
|
|
// Prepare to painless double -> int conversion.
|
|
customSizeX = Clamp( double( INT_MIN ), customSizeX, double( INT_MAX ) );
|
|
customSizeY = Clamp( double( INT_MIN ), customSizeY, double( INT_MAX ) );
|
|
m_layout_size = wxSize( KiROUND( customSizeX ), KiROUND( customSizeY ) );
|
|
}
|