Commit ba04f832 authored by CHARRAS's avatar CHARRAS

small change on hotkey management. Added: drag component

parent 3e3ae892
......@@ -4,6 +4,18 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2007-sept-22 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+ all
* small change in hotkeys handling
(Ki_HotkeyInfo: new member m_IdMenuEvent to call an existing event handler from a hotkey list)
+ eeschema:
* added drag component in pop up menu and hotkeys
* plot svg format: incorrect arc draw fixed
2007-Sep-22 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+ pcbnew
......
......@@ -166,10 +166,11 @@ char Line[256];
void PlotPolyPS(int nb_segm, int * coord, int fill, int width)
/*****************************************************************/
/* Trace un polygone ( ferme si rempli ) en format POSTSCRIPT
* coord = tableau des coord des sommets
* nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau )
* fill : si != 0 polygone rempli
/* Draw a polygon ( a filled polygon if fill == 1 ) in POSTSCRIPT format
* @param nb_segm = corner count
* @param coord = corner list (a corner uses 2 int = X coordinate followed by Y coordinate
* @param fill :if == 0 : filled polygon
* @param width = line width
*/
{
int ii;
......
/////////////////////////////////////////////////////////////////////////////
// Name: svg.cpp
// Purpose: SVG plot
// Author: Chris Elliott
......@@ -23,11 +24,12 @@
#include "wx/image.h"
#define wxSVG_DEBUG FALSE
// or TRUE to see the calls being executed
#define newline wxString(wxT("\n"))
#define space wxString(wxT(" "))
#define semicolon wxString(wxT(";"))
#define wx_round(a) (int)((a)+.5)
#define newline wxString( wxT( "\n" ) )
#define space wxString( wxT( " " ) )
#define semicolon wxString( wxT( ";" ) )
#define wx_round( a ) (int) ( (a) + .5 )
#ifdef __BORLANDC__
#pragma warn -rch
......@@ -43,72 +45,79 @@
#define pt2mm 0.352777777778
#endif
static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } ;
static inline double DegToRad( double deg )
{
return (deg * M_PI) / 180.0;
};
wxString wxColStr ( wxColour c )
wxString wxColStr( wxColour c )
{
unsigned char r, g, b ;
r = c.Red ();
g = c.Green ();
b = c. Blue ();
unsigned char r, g, b;
r = c.Red();
g = c.Green();
b = c.Blue();
// possible Unicode bug here
wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b) ;
return s ;
wxString s = wxDecToHex( r ) + wxDecToHex( g ) + wxDecToHex( b );
return s;
}
wxString wxBrushString ( wxColour c, int style )
wxString wxBrushString( wxColour c, int style )
{
wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ;
switch ( style )
wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space;
switch( style )
{
case wxSOLID :
s = s + wxT("fill-opacity:1.0; ");
break ;
case wxTRANSPARENT:
s = s + wxT("fill-opacity:0.0; ");
break ;
case wxSOLID:
s = s + wxT( "fill-opacity:1.0; " );
break;
default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
case wxTRANSPARENT:
s = s + wxT( "fill-opacity:0.0; " );
break;
default:
wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) );
}
s = s + newline ;
return s ;
s = s + newline;
return s;
}
/***********************************************************************/
void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi )
/***********************************************************************/
/* set up things first wxDCBase does all this?
*/
*/
{
m_width = Width ;
m_height = Height ;
m_width = Width;
m_height = Height;
m_clipping = FALSE;
m_OK = TRUE;
m_mm_to_pix_x = dpi/25.4;
m_mm_to_pix_y = dpi/25.4;
m_mm_to_pix_x = dpi / 25.4;
m_mm_to_pix_y = dpi / 25.4;
m_signX = m_signY = 1;
m_userScaleX = m_userScaleY =
m_deviceOriginX = m_deviceOriginY = 0;
m_deviceOriginX = m_deviceOriginY = 0;
m_OriginX = m_OriginY = 0;
m_logicalOriginX = m_logicalOriginY = 0;
m_logicalScaleX = m_logicalScaleY = 0 ;
m_scaleX = m_scaleY = 1.0 ;
m_logicalScaleX = m_logicalScaleY = 0;
m_scaleX = m_scaleY = 1.0;
m_logicalFunction = wxCOPY;
m_backgroundMode = wxTRANSPARENT;
m_backgroundMode = wxTRANSPARENT;
m_mappingMode = wxMM_TEXT;
m_backgroundBrush = *wxTRANSPARENT_BRUSH;
m_backgroundBrush = *wxTRANSPARENT_BRUSH;
m_textForegroundColour = *wxBLACK;
m_textBackgroundColour = *wxWHITE;
m_colour = wxColourDisplay();
......@@ -117,411 +126,483 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
m_font = *wxNORMAL_FONT;
m_brush = *wxWHITE_BRUSH;
m_graphics_changed = TRUE ;
m_graphics_changed = TRUE;
////////////////////code here
m_outfile = new wxFileOutputStream(f) ;
m_OK = m_outfile->Ok ();
if (m_OK)
m_outfile = new wxFileOutputStream( f );
m_OK = m_outfile->Ok();
if( m_OK )
{
m_filename = f ;
m_sub_images = 0 ;
wxString s ;
s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s = s + newline ;
write(s);
s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" ") + newline ;
write(s);
s = wxT("\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"> ")+ newline ;
write(s);
s.Printf ( wxT("<svg\n") );
write(s);
s.Printf ( wxT(" xmlns=\"http://www.w3.org/2000/svg\"\n") );
write(s);
s.Printf ( wxT(" version=\"1.1\"\n") );
write(s);
s.Printf ( wxT(" width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
write(s);
s.Printf ( wxT(">\n") );
write(s);
s = wxT(" <title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ;
write(s);
s = wxString (wxT(" <desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ;
write(s);
s = wxT(" <g style=\"fill:black; stroke:black; stroke-width:1\">") + newline ;
write(s);
m_filename = f;
m_sub_images = 0;
wxString s;
s = wxT( "<?xml version=\"1.0\" standalone=\"no\"?>" ); s = s + newline;
write( s );
s = wxT( "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" " ) + newline;
write( s );
s = wxT( "\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"> " ) + newline;
write( s );
s.Printf( wxT( "<svg\n" ) );
write( s );
s.Printf( wxT( " xmlns=\"http://www.w3.org/2000/svg\"\n" ) );
write( s );
s.Printf( wxT( " version=\"1.1\"\n" ) );
write( s );
s.Printf( wxT( " width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n" ),
float (Width) / dpi * 2.54, float (Height) / dpi * 2.54, Width, Height );
write( s );
s.Printf( wxT( ">\n" ) );
write( s );
s = wxT( " <title>SVG Picture created as " ) + wxFileNameFromPath( f ) +
wxT( " </title>" ) + newline;
write( s );
s = wxString( wxT( " <desc>Picture generated by wxSVG " ) ) + wxSVGVersion + wxT(
" </desc>" ) + newline;
write( s );
s = wxT( " <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline;
write( s );
}
}
// constructors
wxSVGFileDC::wxSVGFileDC (wxString f)
wxSVGFileDC::wxSVGFileDC( wxString f )
{
// quarter 640x480 screen display at 72 dpi
Init (f,320,240,72.0);
Init( f, 320, 240, 72.0 );
};
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height)
wxSVGFileDC::wxSVGFileDC( wxString f, int Width, int Height )
{
Init (f,Width,Height,72.0);
Init( f, Width, Height, 72.0 );
};
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
wxSVGFileDC::wxSVGFileDC( wxString f, int Width, int Height, float dpi )
{
Init (f,Width,Height,dpi);
Init( f, Width, Height, dpi );
};
wxSVGFileDC::~wxSVGFileDC()
{
wxString s = wxT("</g> \n</svg> \n") ;
write(s);
delete m_outfile ;
wxString s = wxT( "</g> \n</svg> \n" );
write( s );
delete m_outfile;
}
//////////////////////////////////////////////////////////////////////////////////////////
void wxSVGFileDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
{
if (m_graphics_changed) NewGraphics ();
wxString s ;
s.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \n"), x1,y1,x2,y2 );
if (m_OK)
if( m_graphics_changed )
NewGraphics();
wxString s;
s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 );
if( m_OK )
{
write(s);
write( s );
}
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed")) ;
CalcBoundingBox(x1, y1) ;
CalcBoundingBox(x2, y2) ;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawLine Call executed" ) );
CalcBoundingBox( x1, y1 );
CalcBoundingBox( x2, y2 );
return;
};
void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset )
void wxSVGFileDC::DoDrawLines( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset )
{
for ( int i = 1; i < n ; i++ )
for( int i = 1; i < n; i++ )
{
DoDrawLine ( points [i-1].x + xoffset, points [i-1].y + yoffset,
points [ i ].x + xoffset, points [ i ].y + yoffset ) ;
DoDrawLine( points[i - 1].x + xoffset, points[i - 1].y + yoffset,
points[ i ].x + xoffset, points[ i ].y + yoffset );
}
}
void wxSVGFileDC::DoDrawPoint (wxCoord x1, wxCoord y1)
void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 )
{
wxString s;
if (m_graphics_changed) NewGraphics ();
s = wxT("<g style = \"stroke-linecap:round;\" > ") + newline ;
write(s);
DrawLine ( x1,y1,x1,y1 );
s = wxT("</g>");
write(s);
if( m_graphics_changed )
NewGraphics();
s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline;
write( s );
DrawLine( x1, y1, x1, y1 );
s = wxT( "</g>" );
write( s );
}
void wxSVGFileDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
void wxSVGFileDC::DoDrawCheckMark( wxCoord x1, wxCoord y1, wxCoord width, wxCoord height )
{
wxDCBase::DoDrawCheckMark (x1,y1,width,height) ;
wxDCBase::DoDrawCheckMark( x1, y1, width, height );
}
void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1)
void wxSVGFileDC::DoDrawText( const wxString& text, wxCoord x1, wxCoord y1 )
{
DoDrawRotatedText(text, x1,y1,0.0);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawText Call executed")) ;
DoDrawRotatedText( text, x1, y1, 0.0 );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawText Call executed" ) );
}
void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle)
void wxSVGFileDC::DoDrawRotatedText( const wxString& sText, wxCoord x, wxCoord y, double angle )
{
//known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
if (m_graphics_changed) NewGraphics ();
if( m_graphics_changed )
NewGraphics();
wxString s, sTmp;
// calculate bounding box
wxCoord w, h, desc ;
DoGetTextExtent(sText, &w, &h, &desc);
wxCoord w, h, desc;
DoGetTextExtent( sText, &w, &h, &desc );
double rad = DegToRad(angle);
double rad = DegToRad( angle );
// wxT("upper left") and wxT("upper right")
CalcBoundingBox(x, y);
CalcBoundingBox((wxCoord)(x + w*cos(rad)), (wxCoord)(y - h*sin(rad)));
CalcBoundingBox( x, y );
CalcBoundingBox( (wxCoord) ( x + w * cos( rad ) ), (wxCoord) ( y - h * sin( rad ) ) );
// wxT("bottom left") and wxT("bottom right")
x += (wxCoord)(h*sin(rad));
y += (wxCoord)(h*cos(rad));
CalcBoundingBox(x, y);
CalcBoundingBox((wxCoord)(x + h*sin(rad)), (wxCoord)(y + h*cos(rad)));
x += (wxCoord) ( h * sin( rad ) );
y += (wxCoord) ( h * cos( rad ) );
CalcBoundingBox( x, y );
CalcBoundingBox( (wxCoord) ( x + h * sin( rad ) ), (wxCoord) ( y + h * cos( rad ) ) );
if (m_backgroundMode == wxSOLID)
if( m_backgroundMode == wxSOLID )
{
// draw background first
// just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ;
sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h );
s = sTmp + wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
s = s + wxT("stroke-width:1; stroke:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
sTmp.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle, x,y ) ;
s = s + sTmp + newline ;
write(s);
wxASSERT_MSG( !wxSVG_DEBUG,
wxT( "wxSVGFileDC::Draw Rotated Text Call plotting text background" ) );
sTmp.Printf( wxT(
" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" " ), x, y + desc -
h, w, h );
s = sTmp + wxT( "style=\"fill:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " );
s = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " );
sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d ) \">" ), -angle, x, y );
s = s + sTmp + newline;
write( s );
}
//now do the text itself
s.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x,y );
sTmp = m_font.GetFaceName () ;
if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
else s = s + wxT("style=\" ") ;
//now do the text itself
s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y );
wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
sTmp = m_font.GetFaceName();
if( sTmp.Len() > 0 )
s = s + wxT( "style=\"font-family:" ) + sTmp + wxT( "; " );
else
s = s + wxT( "style=\" " );
wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") };
s = s + wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space;
wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) };
s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
sTmp.Printf (wxT("font-size:%dpt; fill:#"), m_font.GetPointSize () );
s = s + sTmp ;
s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ;
sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle, x,y ) ;
s = s + sTmp + sText + wxT("</text> ") + newline ;
if (m_OK)
wxString fontstyles[5] = {
wxT( "normal" ), wxT( "style error" ), wxT( "style error" ), wxT(
"italic" ), wxT( "oblique" )
};
s = s + wxT( "font-style:" ) + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space;
sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() );
s = s + sTmp;
s = s + wxColStr( m_textForegroundColour ) + wxT( "; stroke:#" ) + wxColStr(
m_textForegroundColour ) + wxT( "; " );
sTmp.Printf( wxT( "stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >" ), -angle, x, y );
s = s + sTmp + sText + wxT( "</text> " ) + newline;
if( m_OK )
{
write(s);
write( s );
}
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) );
}
void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
void wxSVGFileDC::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
{
DoDrawRoundedRectangle(x, y, width, height, 0) ;
DoDrawRoundedRectangle( x, y, width, height, 0 );
}
void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
void wxSVGFileDC::DoDrawRoundedRectangle( wxCoord x,
wxCoord y,
wxCoord width,
wxCoord height,
double radius )
{
if (m_graphics_changed) NewGraphics ();
wxString s ;
s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
x, y, width, height, radius );
if( m_graphics_changed )
NewGraphics();
wxString s;
s = s + wxT(" /> ") + newline ;
write(s);
s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ),
x, y, width, height, radius );
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
CalcBoundingBox(x, y) ;
CalcBoundingBox(x + width, y + height) ;
s = s + wxT( " /> " ) + newline;
write( s );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) );
CalcBoundingBox( x, y );
CalcBoundingBox( x + width, y + height );
}
void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle)
void wxSVGFileDC::DoDrawPolygon( int n,
wxPoint points[],
wxCoord xoffset,
wxCoord yoffset,
int fillStyle )
{
if (m_graphics_changed) NewGraphics ();
wxString s, sTmp ;
s = wxT("<polygon style=\"") ;
if ( fillStyle == wxODDEVEN_RULE )
s = s + wxT("fill-rule:evenodd; ");
if( m_graphics_changed )
NewGraphics();
wxString s, sTmp;
s = wxT( "<polygon style=\"" );
if( fillStyle == wxODDEVEN_RULE )
s = s + wxT( "fill-rule:evenodd; " );
else
s = s + wxT("fill-rule:nonzero; ");
s = s + wxT( "fill-rule:nonzero; " );
s = s + wxT("\" \npoints=\"") ;
s = s + wxT( "\" \npoints=\"" );
for (int i = 0; i < n; i++)
for( int i = 0; i < n; i++ )
{
sTmp.Printf ( wxT("%d,%d"), points [i].x+xoffset, points[i].y+yoffset );
s = s + sTmp + newline ;
CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset);
sTmp.Printf( wxT( "%d,%d" ), points[i].x + xoffset, points[i].y + yoffset );
s = s + sTmp + newline;
CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset );
}
s = s + wxT("\" /> ") ;
s = s + newline ;
write(s);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ;
s = s + wxT( "\" /> " );
s = s + newline;
write( s );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawPolygon Call executed" ) );
}
void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height)
void wxSVGFileDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
{
if (m_graphics_changed) NewGraphics ();
if( m_graphics_changed )
NewGraphics();
int rh = height /2 ;
int rw = width /2 ;
int rh = height / 2;
int rw = width / 2;
wxString s;
s.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x+rw,y+rh, rw, rh );
s = s + wxT(" /> ") + newline ;
s.Printf( wxT( "<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" " ), x + rw, y + rh, rw, rh );
s = s + wxT( " /> " ) + newline;
write(s);
write( s );
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
CalcBoundingBox(x, y) ;
CalcBoundingBox(x + width, y + height) ;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawEllipse Call executed" ) );
CalcBoundingBox( x, y );
CalcBoundingBox( x + width, y + height );
}
void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
void wxSVGFileDC::DoDrawArc( wxCoord x1,
wxCoord y1,
wxCoord x2,
wxCoord y2,
wxCoord xc,
wxCoord yc )
{
/* Draws an arc of a circle, centred on (xc, yc), with starting point
(x1, y1) and ending at (x2, y2). The current pen is used for the outline
and the current brush for filling the shape.
The arc is drawn in an anticlockwise direction from the start point to
the end point. */
if (m_graphics_changed) NewGraphics ();
wxString s ;
* (x1, y1) and ending at (x2, y2). The current pen is used for the outline
* and the current brush for filling the shape.
*
* The arc is drawn in an anticlockwise direction from the start point to
* the end point. */
if( m_graphics_changed )
NewGraphics();
wxString s;
// we need the radius of the circle which has two estimates
double r1 = sqrt ( double( (x1-xc)*(x1-xc) ) + double( (y1-yc)*(y1-yc) ) );
double r2 = sqrt ( double( (x2-xc)*(x2-xc) ) + double( (y2-yc)*(y2-yc) ) );
double r1 = sqrt( double ( (x1 - xc) * (x1 - xc) ) + double ( (y1 - yc) * (y1 - yc) ) );
double r2 = sqrt( double ( (x2 - xc) * (x2 - xc) ) + double ( (y2 - yc) * (y2 - yc) ) );
wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
if ( fabs ( r2-r1 ) > 3 ) //pixels
wxASSERT_MSG( (fabs( r2 - r1 ) <= 3),
wxT( "wxSVGFileDC::DoDrawArc Error in getting radii of circle" ) );
if( fabs( r2 - r1 ) > 3 ) //pixels
{
s = wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n") ;
write(s);
s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" );
write( s );
}
double theta1 = atan2((double)(yc-y1),(double)(x1-xc));
if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2;
double theta2 = atan2((double)(yc-y2), (double)(x2-xc));
if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2;
if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2 ;
int fArc ; // flag for large or small arc 0 means less than 180 degrees
if ( fabs(theta2 - theta1) > M_PI ) fArc = 1; else fArc = 0 ;
int fSweep = 0 ; // flag for sweep always 0
double theta1 = atan2( (double) (yc - y1), (double) (x1 - xc) );
if( theta1 < 0 )
theta1 = theta1 + M_PI * 2;
double theta2 = atan2( (double) (yc - y2), (double) (x2 - xc) );
if( theta2 < 0 )
theta2 = theta2 + M_PI * 2;
if( theta2 < theta1 )
theta2 = theta2 + M_PI * 2;
int fArc; // flag for large or small arc 0 means less than 180 degrees
if( fabs( theta2 - theta1 ) > M_PI )
fArc = 1;else
fArc = 0;
int fSweep;
if( (theta2 - theta1) > 0 )
fSweep = 0;else
fSweep = 1;
float Axis_rotation = 0.0;
// Draw arc as pie:
// s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
// the z means close the path and fill (usefull to draw a pie)
s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d"),
x1, y1, r1, r2, fArc, fSweep, x2, y2, xc, yc );
// x1, y1, r1, r2, fArc, fSweep, x2, y2, xc ,yc );
// Draw a single arc:
s.Printf( wxT( "<path d=\"M%d %d A%.2g %.2g %g %d %d %d %d" ),
x1, y1, r1, r2,
Axis_rotation,
fArc, fSweep, x2, y2 );
s = s + wxT(" \" /> ") + newline ;
s = s + wxT( " \" /> " ) + newline;
if (m_OK)
if( m_OK )
{
write(s);
write( s );
}
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed")) ;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawArc Call executed" ) );
}
void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
void wxSVGFileDC::DoDrawEllipticArc( wxCoord x,
wxCoord y,
wxCoord w,
wxCoord h,
double sa,
double ea )
{
/*
Draws an arc of an ellipse. The current pen is used for drawing the arc
and the current brush is used for drawing the pie. This function is
currently only available for X window and PostScript device contexts.
x and y specify the x and y coordinates of the upper-left corner of the
rectangle that contains the ellipse.
width and height specify the width and height of the rectangle that
contains the ellipse.
start and end specify the start and end of the arc relative to the
three-o'clock position from the center of the rectangle. Angles are
specified in degrees (360 is a complete circle). Positive values mean
counter-clockwise motion. If start is equal to end, a complete ellipse
will be drawn. */
* Draws an arc of an ellipse. The current pen is used for drawing the arc
* and the current brush is used for drawing the pie. This function is
* currently only available for X window and PostScript device contexts.
*
* x and y specify the x and y coordinates of the upper-left corner of the
* rectangle that contains the ellipse.
*
* width and height specify the width and height of the rectangle that
* contains the ellipse.
*
* start and end specify the start and end of the arc relative to the
* three-o'clock position from the center of the rectangle. Angles are
* specified in degrees (360 is a complete circle). Positive values mean
* counter-clockwise motion. If start is equal to end, a complete ellipse
* will be drawn. */
//known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
if (m_graphics_changed) NewGraphics ();
if( m_graphics_changed )
NewGraphics();
wxString s;
wxString s ;
//radius
double rx = w / 2 ;
double ry = h / 2 ;
double rx = w / 2;
double ry = h / 2;
// center
double xc = x + rx ;
double yc = y + ry ;
double xc = x + rx;
double yc = y + ry;
double xs, ys, xe, ye ;
xs = xc + rx * cos (DegToRad(sa)) ;
xe = xc + rx * cos (DegToRad(ea)) ;
ys = yc - ry * sin (DegToRad(sa)) ;
ye = yc - ry * sin (DegToRad(ea)) ;
double xs, ys, xe, ye;
xs = xc + rx* cos( DegToRad (sa) );
xe = xc + rx* cos( DegToRad (ea) );
ys = yc - ry* sin( DegToRad (sa) );
ye = yc - ry* sin( DegToRad (ea) );
///now same as circle arc...
double theta1 = atan2(ys-yc, xs-xc);
double theta2 = atan2(ye-yc, xe-xc);
double theta1 = atan2( ys - yc, xs - xc );
double theta2 = atan2( ye - yc, xe - xc );
int fArc ; // flag for large or small arc 0 means less than 180 degrees
if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ;
int fArc; // flag for large or small arc 0 means less than 180 degrees
if( fabs( theta2 - theta1 ) > M_PI )
fArc = 1;else
fArc = 0;
int fSweep ;
if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ;
int fSweep;
if( (theta2 - theta1) > 0 )
fSweep = 0;else
fSweep = 1;
float Axis_rotation = 0.0;
// s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d "),
int(xs), int(ys), int(rx), int(ry),
fArc, fSweep, int(xe), int(ye), int(xc), int(yc) );
// Draw a single arc:
s.Printf( wxT( "<path d=\"M%d,%d A%d,%d %g %d %d %d,%d" ),
int (xs), int (ys),
int (rx), int (ry),
Axis_rotation,
fArc, fSweep, int (xe), int (ye) );
s = s + wxT(" \" /> ") + newline ;
s = s + wxT( " \" /> " ) + newline;
if (m_OK)
if( m_OK )
{
write(s);
write( s );
}
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawEllipticArc Call executed" ) );
}
void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , wxFont *font) const
void wxSVGFileDC::DoGetTextExtent( const wxString& string,
wxCoord* w,
wxCoord* h,
wxCoord* descent,
wxCoord* externalLeading,
wxFont* font ) const
{
wxScreenDC sDC ;
wxScreenDC sDC;
sDC.SetFont (m_font);
if ( font != NULL ) sDC.SetFont ( *font );
sDC.GetTextExtent(string, w, h, descent, externalLeading );
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetTextExtent Call executed")) ;
sDC.SetFont( m_font );
if( font != NULL )
sDC.SetFont( *font );
sDC.GetTextExtent( string, w, h, descent, externalLeading );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) );
}
wxCoord wxSVGFileDC::GetCharHeight() const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
wxScreenDC sDC;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;
return ( sDC.GetCharHeight() );
sDC.SetFont( m_font );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) );
return sDC.GetCharHeight();
}
wxCoord wxSVGFileDC::GetCharWidth() const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
wxScreenDC sDC;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing")) ;
return ( sDC.GetCharWidth() ) ;
sDC.SetFont( m_font );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) );
return sDC.GetCharWidth();
}
/// Set Functions /////////////////////////////////////////////////////////////////
void wxSVGFileDC::SetBackground( const wxBrush &brush )
void wxSVGFileDC::SetBackground( const wxBrush& brush )
{
m_backgroundBrush = brush;
return;
}
......@@ -534,147 +615,167 @@ void wxSVGFileDC::SetBackgroundMode( int mode )
}
void wxSVGFileDC::SetBrush(const wxBrush& brush)
void wxSVGFileDC::SetBrush( const wxBrush& brush )
{
m_brush = brush ;
m_brush = brush;
m_graphics_changed = TRUE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")) ;
m_graphics_changed = TRUE;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetBrush Call executed" ) );
}
void wxSVGFileDC::SetPen(const wxPen& pen)
void wxSVGFileDC::SetPen( const wxPen& pen )
{
// width, color, ends, joins : currently implemented
// dashes, stipple : not implemented
m_pen = pen ;
m_pen = pen;
m_graphics_changed = TRUE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ;
m_graphics_changed = TRUE;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) );
}
void wxSVGFileDC::NewGraphics ()
{
int w = m_pen.GetWidth ();
wxColour c = m_pen.GetColour () ;
void wxSVGFileDC::NewGraphics()
{
int w = m_pen.GetWidth();
wxColour c = m_pen.GetColour();
wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;
sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () )
+ wxT(" stroke:#") + wxColStr (c) + wxT("; ") ;
sBrush = wxT( "</g>\n<g style=\"" ) + wxBrushString( m_brush.GetColour(), m_brush.GetStyle() )
+ wxT( " stroke:#" ) + wxColStr( c ) + wxT( "; " );
switch ( m_pen.GetCap () )
switch( m_pen.GetCap() )
{
case wxCAP_PROJECTING :
sPenCap = wxT("stroke-linecap:square; ") ;
break ;
case wxCAP_BUTT :
sPenCap = wxT("stroke-linecap:butt; ") ;
break ;
case wxCAP_ROUND :
default :
sPenCap = wxT("stroke-linecap:round; ") ;
};
switch ( m_pen.GetJoin () )
case wxCAP_PROJECTING:
sPenCap = wxT( "stroke-linecap:square; " );
break;
case wxCAP_BUTT:
sPenCap = wxT( "stroke-linecap:butt; " );
break;
case wxCAP_ROUND:
default:
sPenCap = wxT( "stroke-linecap:round; " );
}
;
switch( m_pen.GetJoin() )
{
case wxJOIN_BEVEL :
sPenJoin = wxT("stroke-linejoin:bevel; ") ;
break ;
case wxJOIN_MITER :
sPenJoin = wxT("stroke-linejoin:miter; ") ;
break ;
case wxJOIN_ROUND :
default :
sPenJoin = wxT("stroke-linejoin:round; ") ;
};
case wxJOIN_BEVEL:
sPenJoin = wxT( "stroke-linejoin:bevel; " );
break;
case wxJOIN_MITER:
sPenJoin = wxT( "stroke-linejoin:miter; " );
break;
switch ( m_pen.GetStyle () )
case wxJOIN_ROUND:
default:
sPenJoin = wxT( "stroke-linejoin:round; " );
}
;
switch( m_pen.GetStyle() )
{
case wxSOLID :
sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
break ;
case wxTRANSPARENT :
sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ;
break ;
default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
case wxSOLID:
sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " );
break;
case wxTRANSPARENT:
sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " );
break;
default:
wxASSERT_MSG( FALSE,
wxT( "wxSVGFileDC::SetPen Call called to set a Style which is not available" )
);
sWarn = sWarn + wxT(
"<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n" );
}
sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
w, m_OriginX, m_OriginY, m_scaleX, m_scaleY );
sLast.Printf( wxT(
"stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">" ),
w, m_OriginX, m_OriginY, m_scaleX, m_scaleY );
s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
write(s);
m_graphics_changed = FALSE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")) ;
write( s );
m_graphics_changed = FALSE;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::NewGraphics Call executed" ) );
}
void wxSVGFileDC::SetFont(const wxFont& font)
void wxSVGFileDC::SetFont( const wxFont& font )
{
m_font = font ;
m_font = font;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")) ;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetFont Call executed" ) );
}
void wxSVGFileDC::ComputeScaleAndOrigin()
{
m_scaleX = m_logicalScaleX * m_userScaleX;
m_scaleY = m_logicalScaleY * m_userScaleY;
m_OriginX = m_logicalOriginX * m_logicalScaleX + m_deviceOriginX ;
m_OriginY = m_logicalOriginY * m_logicalScaleY + m_deviceOriginY ;
m_scaleX = m_logicalScaleX * m_userScaleX;
m_scaleY = m_logicalScaleY * m_userScaleY;
m_OriginX = m_logicalOriginX * m_logicalScaleX + m_deviceOriginX;
m_OriginY = m_logicalOriginY * m_logicalScaleY + m_deviceOriginY;
m_graphics_changed = TRUE;
}
int wxSVGFileDC::GetMapMode()
{
return m_mappingMode ;
return m_mappingMode;
}
void wxSVGFileDC::SetMapMode( int mode )
{
switch (mode)
switch( mode )
{
case wxMM_TWIPS:
SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
break;
case wxMM_POINTS:
SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
break;
case wxMM_METRIC:
SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
break;
case wxMM_LOMETRIC:
SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
break;
default:
case wxMM_TEXT:
SetLogicalScale( 1.0, 1.0 );
break;
case wxMM_TWIPS:
SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y );
break;
case wxMM_POINTS:
SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y );
break;
case wxMM_METRIC:
SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
break;
case wxMM_LOMETRIC:
SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 );
break;
default:
case wxMM_TEXT:
SetLogicalScale( 1.0, 1.0 );
break;
}
m_mappingMode = mode;
/* we don't do this mega optimisation
if (mode != wxMM_TEXT)
{
m_needComputeScaleX = TRUE;
m_needComputeScaleY = TRUE;
}
*/
* if (mode != wxMM_TEXT)
* {
* m_needComputeScaleX = TRUE;
* m_needComputeScaleY = TRUE;
* }
*/
}
void wxSVGFileDC::GetUserScale(double *x, double *y) const
void wxSVGFileDC::GetUserScale( double* x, double* y ) const
{
*x = m_userScaleX ;
*y = m_userScaleY ;
*x = m_userScaleX;
*y = m_userScaleY;
}
......@@ -724,84 +825,93 @@ void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
// export a bitmap as a raster image in png
bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
wxDC* source, wxCoord xsrc, wxCoord ysrc,
int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/,
wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/)
bool wxSVGFileDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
wxDC* source, wxCoord xsrc, wxCoord ysrc,
int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/,
wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/ )
{
if (logicalFunc != wxCOPY)
if( logicalFunc != wxCOPY )
{
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
return FALSE ;
wxASSERT_MSG( FALSE,
wxT( "wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible" )
);
return FALSE;
}
if (useMask != FALSE)
if( useMask != FALSE )
{
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
return FALSE ;
wxASSERT_MSG( FALSE,
wxT( "wxSVGFileDC::DoBlit Call requested False mask ; this is not possible" )
);
return FALSE;
}
wxBitmap myBitmap (width, height) ;
wxBitmap myBitmap( width, height );
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.Blit(0, 0, width, height, source, xsrc, ysrc);
memDC.Blit( 0, 0, width, height, source, xsrc, ysrc );
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, xdest, ydest);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed")) ;
return FALSE ;
DoDrawBitmap( myBitmap, xdest, ydest );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoBlit Call executed" ) );
return FALSE;
}
void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
void wxSVGFileDC::DoDrawIcon( const class wxIcon& myIcon, wxCoord x, wxCoord y )
{
wxBitmap myBitmap (myIcon.GetWidth(), myIcon.GetHeight() ) ;
wxBitmap myBitmap( myIcon.GetWidth(), myIcon.GetHeight() );
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.DrawIcon(myIcon,0,0);
memDC.DrawIcon( myIcon, 0, 0 );
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, x, y);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;
return ;
DoDrawBitmap( myBitmap, x, y );
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawIcon Call executed" ) );
return;
}
void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ )
void wxSVGFileDC::DoDrawBitmap( const class wxBitmap& bmp,
wxCoord x,
wxCoord y,
bool WXUNUSED ( bTransparent) /*=0*/ )
{
if (m_graphics_changed) NewGraphics ();
if( m_graphics_changed )
NewGraphics();
wxString sTmp, s, sPNG ;
wxImage::AddHandler(new wxPNGHandler);
wxString sTmp, s, sPNG;
wxImage::AddHandler( new wxPNGHandler );
// create suitable file name
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
while (wxFile::Exists(sPNG) )
sTmp.Printf( wxT( "_image%d.png" ), m_sub_images );
sPNG = m_filename.BeforeLast( wxT( '.' ) ) + sTmp;
while( wxFile::Exists( sPNG ) )
{
m_sub_images ++ ;
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
m_sub_images++;
sTmp.Printf( wxT( "_image%d.png" ), m_sub_images );
sPNG = m_filename.BeforeLast( wxT( '.' ) ) + sTmp;
}
//create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
wxBitmap myBitmap = bmp ;
wxBitmap myBitmap = bmp;
//save it
bool bPNG_OK = myBitmap.SaveFile(sPNG,wxBITMAP_TYPE_PNG);
bool bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG );
// refrence the bitmap from the SVG doc
int w = myBitmap.GetWidth();
int h = myBitmap.GetHeight();
sTmp.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x,y,w,h );
s = s + sTmp ;
sTmp.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG.c_str() );
s = s + sTmp + wxT("<title>Image from wxSVG</title> </image>") + newline;
if (m_OK && bPNG_OK)
int w = myBitmap.GetWidth();
int h = myBitmap.GetHeight();
sTmp.Printf( wxT( " <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" " ), x, y, w, h );
s = s + sTmp;
sTmp.Printf( wxT( " xlink:href=\"%s\"> \n" ), sPNG.c_str() );
s = s + sTmp + wxT( "<title>Image from wxSVG</title> </image>" ) + newline;
if( m_OK && bPNG_OK )
{
write(s);
write( s );
}
m_OK = m_outfile->Ok () && bPNG_OK;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;
m_OK = m_outfile->Ok() && bPNG_OK;
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawBitmap Call executed" ) );
return ;
return;
}
......@@ -809,60 +919,63 @@ void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y
// coordinates transformations
// ---------------------------------------------------------------------------
wxCoord wxSVGFileDC::DeviceToLogicalX(wxCoord x) const
wxCoord wxSVGFileDC::DeviceToLogicalX( wxCoord x ) const
{
return XDEV2LOG(x);
return XDEV2LOG( x );
}
wxCoord wxSVGFileDC::DeviceToLogicalY(wxCoord y) const
wxCoord wxSVGFileDC::DeviceToLogicalY( wxCoord y ) const
{
return YDEV2LOG(y);
return YDEV2LOG( y );
}
wxCoord wxSVGFileDC::DeviceToLogicalXRel(wxCoord x) const
wxCoord wxSVGFileDC::DeviceToLogicalXRel( wxCoord x ) const
{
return XDEV2LOGREL(x);
return XDEV2LOGREL( x );
}
wxCoord wxSVGFileDC::DeviceToLogicalYRel(wxCoord y) const
wxCoord wxSVGFileDC::DeviceToLogicalYRel( wxCoord y ) const
{
return YDEV2LOGREL(y);
return YDEV2LOGREL( y );
}
wxCoord wxSVGFileDC::LogicalToDeviceX(wxCoord x) const
wxCoord wxSVGFileDC::LogicalToDeviceX( wxCoord x ) const
{
return XLOG2DEV(x);
return XLOG2DEV( x );
}
wxCoord wxSVGFileDC::LogicalToDeviceY(wxCoord y) const
wxCoord wxSVGFileDC::LogicalToDeviceY( wxCoord y ) const
{
return YLOG2DEV(y);
return YLOG2DEV( y );
}
wxCoord wxSVGFileDC::LogicalToDeviceXRel(wxCoord x) const
wxCoord wxSVGFileDC::LogicalToDeviceXRel( wxCoord x ) const
{
return XLOG2DEVREL(x);
return XLOG2DEVREL( x );
}
wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const
wxCoord wxSVGFileDC::LogicalToDeviceYRel( wxCoord y ) const
{
return YLOG2DEVREL(y);
return YLOG2DEVREL( y );
}
void wxSVGFileDC::write(const wxString &s)
void wxSVGFileDC::write( const wxString& s )
{
const wxWX2MBbuf buf = s.mb_str(wxConvUTF8);
m_outfile->Write(buf, strlen((const char *)buf));
const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 );
m_outfile->Write( buf, strlen( (const char*) buf ) );
m_OK = m_outfile->Ok();
}
#ifdef __BORLANDC__
#pragma warn .rch
#pragma warn .ccc
......
......@@ -18,11 +18,12 @@
* This class allows the real key code changed by user from a key code list file
*/
Ki_HotkeyInfo::Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode )
Ki_HotkeyInfo::Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent )
{
m_KeyCode = keycode; // Key code (ascii value for ascii keys or wxWidgets code for function key
m_InfoMsg = infomsg; // info message.
m_Idcommand = idcommand; // internal id for the corresponding command (see hotkey_id_commnand list)
m_KeyCode = keycode; // Key code (ascii value for ascii keys or wxWidgets code for function key
m_InfoMsg = infomsg; // info message.
m_Idcommand = idcommand; // internal id for the corresponding command (see hotkey_id_commnand list)
m_IdMenuEvent = idmenuevent; // id to call the corresponding event (if any) (see id.h)
}
......@@ -37,101 +38,101 @@ struct hotkey_name_descr
static struct hotkey_name_descr s_Hotkey_Name_List[] =
{
{ wxT( "F1" ), WXK_F1 },
{ wxT( "F2" ), WXK_F2 },
{ wxT( "F3" ), WXK_F3 },
{ wxT( "F4" ), WXK_F4 },
{ wxT( "F5" ), WXK_F5 },
{ wxT( "F6" ), WXK_F6 },
{ wxT( "F7" ), WXK_F7 },
{ wxT( "F8" ), WXK_F8 },
{ wxT( "F9" ), WXK_F9 },
{ wxT( "F10" ), WXK_F10 },
{ wxT( "F11" ), WXK_F11 },
{ wxT( "F12" ), WXK_F12 },
{ wxT( "Esc" ), WXK_ESCAPE },
{ wxT( "Delete" ), WXK_DELETE },
{ wxT( "Esc" ), WXK_ESCAPE },
{ wxT( "Tab" ), '\t' },
{ wxT( "F1" ), WXK_F1 },
{ wxT( "F2" ), WXK_F2 },
{ wxT( "F3" ), WXK_F3 },
{ wxT( "F4" ), WXK_F4 },
{ wxT( "F5" ), WXK_F5 },
{ wxT( "F6" ), WXK_F6 },
{ wxT( "F7" ), WXK_F7 },
{ wxT( "F8" ), WXK_F8 },
{ wxT( "F9" ), WXK_F9 },
{ wxT( "F10" ), WXK_F10 },
{ wxT( "F11" ), WXK_F11 },
{ wxT( "F12" ), WXK_F12 },
{ wxT( "Esc" ), WXK_ESCAPE },
{ wxT( "Delete" ), WXK_DELETE },
{ wxT( "Esc" ), WXK_ESCAPE },
{ wxT( "Tab" ), '\t' },
{ wxT( "Backspace" ), WXK_BACK },
{ wxT( "Insert" ), WXK_INSERT },
{ wxT( "Insert" ), WXK_INSERT },
{ wxT( "End" ), WXK_END },
{ wxT( "Page Up" ), WXK_PAGEUP },
{ wxT( "End" ), WXK_END },
{ wxT( "Page Up" ), WXK_PAGEUP },
{ wxT( "Page Down" ), WXK_PAGEDOWN },
{ wxT( "+" ), WXK_ADD },
{ wxT( "-" ), WXK_SUBTRACT },
{ wxT( "Up" ), WXK_UP },
{ wxT( "Down" ), WXK_DOWN },
{ wxT( "Left" ), WXK_LEFT },
{ wxT( "Right" ), WXK_RIGHT },
{ wxT( "space" ), ' ' },
{ wxT( "?" ), '?' },
{ wxT( "!" ), '!' },
{ wxT( ":" ), ':' },
{ wxT( "," ), ',' },
{ wxT( "*" ), '*' },
{ wxT( "+" ), '+' },
{ wxT( "-" ), '-' },
{ wxT( "\%" ), '%' },
{ wxT( "A" ), 'A' },
{ wxT( "B" ), 'B' },
{ wxT( "C" ), 'C' },
{ wxT( "D" ), 'D' },
{ wxT( "E" ), 'E' },
{ wxT( "F" ), 'F' },
{ wxT( "G" ), 'G' },
{ wxT( "H" ), 'H' },
{ wxT( "I" ), 'I' },
{ wxT( "J" ), 'J' },
{ wxT( "K" ), 'K' },
{ wxT( "L" ), 'L' },
{ wxT( "M" ), 'M' },
{ wxT( "N" ), 'N' },
{ wxT( "O" ), 'O' },
{ wxT( "P" ), 'P' },
{ wxT( "Q" ), 'Q' },
{ wxT( "R" ), 'R' },
{ wxT( "S" ), 'S' },
{ wxT( "T" ), 'T' },
{ wxT( "U" ), 'U' },
{ wxT( "V" ), 'V' },
{ wxT( "W" ), 'W' },
{ wxT( "X" ), 'X' },
{ wxT( "Y" ), 'Y' },
{ wxT( "Z" ), 'Z' },
{ wxT( "Ctrl A" ), GR_KB_CTRL + 'A' },
{ wxT( "Ctrl B" ), GR_KB_CTRL + 'B' },
{ wxT( "Ctrl C" ), GR_KB_CTRL + 'C' },
{ wxT( "Ctrl D" ), GR_KB_CTRL + 'D' },
{ wxT( "Ctrl E" ), GR_KB_CTRL + 'E' },
{ wxT( "Ctrl F" ), GR_KB_CTRL + 'F' },
{ wxT( "Ctrl G" ), GR_KB_CTRL + 'G' },
{ wxT( "Ctrl H" ), GR_KB_CTRL + 'H' },
{ wxT( "Ctrl I" ), GR_KB_CTRL + 'I' },
{ wxT( "Ctrl J" ), GR_KB_CTRL + 'J' },
{ wxT( "Ctrl K" ), GR_KB_CTRL + 'K' },
{ wxT( "Ctrl L" ), GR_KB_CTRL + 'L' },
{ wxT( "Ctrl M" ), GR_KB_CTRL + 'M' },
{ wxT( "Ctrl N" ), GR_KB_CTRL + 'N' },
{ wxT( "Ctrl O" ), GR_KB_CTRL + 'O' },
{ wxT( "Ctrl P" ), GR_KB_CTRL + 'P' },
{ wxT( "Ctrl Q" ), GR_KB_CTRL + 'Q' },
{ wxT( "Ctrl R" ), GR_KB_CTRL + 'R' },
{ wxT( "Ctrl S" ), GR_KB_CTRL + 'S' },
{ wxT( "Ctrl T" ), GR_KB_CTRL + 'T' },
{ wxT( "Ctrl U" ), GR_KB_CTRL + 'U' },
{ wxT( "Ctrl V" ), GR_KB_CTRL + 'V' },
{ wxT( "Ctrl W" ), GR_KB_CTRL + 'W' },
{ wxT( "Ctrl X" ), GR_KB_CTRL + 'X' },
{ wxT( "Ctrl Y" ), GR_KB_CTRL + 'Y' },
{ wxT( "Ctrl Z" ), GR_KB_CTRL + 'Z' },
{ wxT( "" ), 0 } // Do not change: end of list
{ wxT( "+" ), WXK_ADD },
{ wxT( "-" ), WXK_SUBTRACT },
{ wxT( "Up" ), WXK_UP },
{ wxT( "Down" ), WXK_DOWN },
{ wxT( "Left" ), WXK_LEFT },
{ wxT( "Right" ), WXK_RIGHT },
{ wxT( "space" ), ' ' },
{ wxT( "?" ), '?' },
{ wxT( "!" ), '!' },
{ wxT( ":" ), ':' },
{ wxT( "," ), ',' },
{ wxT( "*" ), '*' },
{ wxT( "+" ), '+' },
{ wxT( "-" ), '-' },
{ wxT( "\%" ), '%' },
{ wxT( "A" ), 'A' },
{ wxT( "B" ), 'B' },
{ wxT( "C" ), 'C' },
{ wxT( "D" ), 'D' },
{ wxT( "E" ), 'E' },
{ wxT( "F" ), 'F' },
{ wxT( "G" ), 'G' },
{ wxT( "H" ), 'H' },
{ wxT( "I" ), 'I' },
{ wxT( "J" ), 'J' },
{ wxT( "K" ), 'K' },
{ wxT( "L" ), 'L' },
{ wxT( "M" ), 'M' },
{ wxT( "N" ), 'N' },
{ wxT( "O" ), 'O' },
{ wxT( "P" ), 'P' },
{ wxT( "Q" ), 'Q' },
{ wxT( "R" ), 'R' },
{ wxT( "S" ), 'S' },
{ wxT( "T" ), 'T' },
{ wxT( "U" ), 'U' },
{ wxT( "V" ), 'V' },
{ wxT( "W" ), 'W' },
{ wxT( "X" ), 'X' },
{ wxT( "Y" ), 'Y' },
{ wxT( "Z" ), 'Z' },
{ wxT( "Ctrl A" ), GR_KB_CTRL + 'A' },
{ wxT( "Ctrl B" ), GR_KB_CTRL + 'B' },
{ wxT( "Ctrl C" ), GR_KB_CTRL + 'C' },
{ wxT( "Ctrl D" ), GR_KB_CTRL + 'D' },
{ wxT( "Ctrl E" ), GR_KB_CTRL + 'E' },
{ wxT( "Ctrl F" ), GR_KB_CTRL + 'F' },
{ wxT( "Ctrl G" ), GR_KB_CTRL + 'G' },
{ wxT( "Ctrl H" ), GR_KB_CTRL + 'H' },
{ wxT( "Ctrl I" ), GR_KB_CTRL + 'I' },
{ wxT( "Ctrl J" ), GR_KB_CTRL + 'J' },
{ wxT( "Ctrl K" ), GR_KB_CTRL + 'K' },
{ wxT( "Ctrl L" ), GR_KB_CTRL + 'L' },
{ wxT( "Ctrl M" ), GR_KB_CTRL + 'M' },
{ wxT( "Ctrl N" ), GR_KB_CTRL + 'N' },
{ wxT( "Ctrl O" ), GR_KB_CTRL + 'O' },
{ wxT( "Ctrl P" ), GR_KB_CTRL + 'P' },
{ wxT( "Ctrl Q" ), GR_KB_CTRL + 'Q' },
{ wxT( "Ctrl R" ), GR_KB_CTRL + 'R' },
{ wxT( "Ctrl S" ), GR_KB_CTRL + 'S' },
{ wxT( "Ctrl T" ), GR_KB_CTRL + 'T' },
{ wxT( "Ctrl U" ), GR_KB_CTRL + 'U' },
{ wxT( "Ctrl V" ), GR_KB_CTRL + 'V' },
{ wxT( "Ctrl W" ), GR_KB_CTRL + 'W' },
{ wxT( "Ctrl X" ), GR_KB_CTRL + 'X' },
{ wxT( "Ctrl Y" ), GR_KB_CTRL + 'Y' },
{ wxT( "Ctrl Z" ), GR_KB_CTRL + 'Z' },
{ wxT( "" ), 0 } // Do not change: end of list
};
......@@ -315,25 +316,25 @@ void DisplayHotkeyList( WinEDA_DrawFrame* frame, struct Ki_HotkeyInfoSectionDesc
}
/******************************************************************/
int GetCommandCodeFromHotkey( int key, Ki_HotkeyInfo** List )
/******************************************************************/
/************************************************************************/
Ki_HotkeyInfo* GetDescriptorFromHotkey( int key, Ki_HotkeyInfo** List )
/***********************************************************************/
/*
* Return an id identifier fron a key code for OnHotKey() function
* Return a Ki_HotkeyInfo * pointer fron a key code for OnHotKey() function
* @param key = key code (ascii value, or wxWidgets value for function keys
* @param List = pointer to a Ki_HotkeyInfo list of commands
* @return the corresponding function identifier from the Ki_HotkeyInfo List
* @return the corresponding Ki_HotkeyInfo * pointer from the Ki_HotkeyInfo List
*/
{
for( ; *List != NULL; List++ )
{
Ki_HotkeyInfo* hk_decr = *List;
if( hk_decr->m_KeyCode == key )
return hk_decr->m_Idcommand;
return hk_decr;
}
return 0;
return NULL;
}
......@@ -606,8 +607,9 @@ void AddHotkeyConfigMenu( wxMenu* menu )
if( menu == NULL )
return;
item = new wxMenuItem( menu, ID_PREFERENCES_CREATE_CONFIG_HOTKEYS,
_( "Create Hotkey config file" ),
_( "Create or Recreate the hotkey config file from current hotkey list" ) );
_( "Create Hotkey config file" ),
_( "Create or Recreate the hotkey config file from current hotkey list" )
);
item->SetBitmap( save_setup_xpm );
menu->Append( item );
item = new wxMenuItem( menu, ID_PREFERENCES_READ_CONFIG_HOTKEYS,
......@@ -623,64 +625,67 @@ void AddHotkeyConfigMenu( wxMenu* menu )
wxMenu* submenu_hkcfg = new wxMenu();
item = new wxMenuItem( submenu_hkcfg, ID_PREFERENCES_HOTKEY_PATH_IS_HOME,
_( "home directory" ),
_( "Use home directory to load or store Hotkey config files" ),
wxITEM_CHECK );
_( "home directory" ),
_( "Use home directory to load or store Hotkey config files" ),
wxITEM_CHECK );
submenu_hkcfg->Append( item );
item = new wxMenuItem( submenu_hkcfg, ID_PREFERENCES_HOTKEY_PATH_IS_KICAD,
_( "kicad/template directory" ),
_( "Use kicad/templatedirectory to load or store Hotkey config files" ),
wxITEM_CHECK );
_( "kicad/template directory" ),
_( "Use kicad/templatedirectory to load or store Hotkey config files" ),
wxITEM_CHECK );
submenu_hkcfg->Append( item );
ADD_MENUITEM_WITH_HELP_AND_SUBMENU( menu, submenu_hkcfg,
ADD_MENUITEM_WITH_HELP_AND_SUBMENU( menu, submenu_hkcfg,
-1,
_( "Hotkey config location" ),
_( "Hotkey config file location selection (home directory or kicad tree)" ),
_( "Hotkey config location" ),
_(
"Hotkey config file location selection (home directory or kicad tree)" ),
right_xpm );
submenu_hkcfg->Check(ID_PREFERENCES_HOTKEY_PATH_IS_HOME,
g_ConfigFileLocationChoice == 0);
submenu_hkcfg->Check(ID_PREFERENCES_HOTKEY_PATH_IS_KICAD,
g_ConfigFileLocationChoice == 1);
submenu_hkcfg->Check( ID_PREFERENCES_HOTKEY_PATH_IS_HOME,
g_ConfigFileLocationChoice == 0 );
submenu_hkcfg->Check( ID_PREFERENCES_HOTKEY_PATH_IS_KICAD,
g_ConfigFileLocationChoice == 1 );
}
/************************************************************************/
void HandleHotkeyConfigMenuSelection( WinEDA_DrawFrame * frame, int id )
void HandleHotkeyConfigMenuSelection( WinEDA_DrawFrame* frame, int id )
/************************************************************************/
/* called on hotkey file location selecton menu
* @param frame = current WinEDA_DrawFrame
* @param id = selected menu id
* @return g_ConfigFileLocationChoice (global) = new selection
*/
* @param frame = current WinEDA_DrawFrame
* @param id = selected menu id
* @return g_ConfigFileLocationChoice (global) = new selection
*/
{
wxMenuBar * menu = frame->GetMenuBar();
switch (id )
{
case ID_PREFERENCES_HOTKEY_PATH_IS_HOME:
if ( g_ConfigFileLocationChoice != 0 )
{
g_ConfigFileLocationChoice = 0;
menu->Check(ID_PREFERENCES_HOTKEY_PATH_IS_HOME, true);
menu->Check(ID_PREFERENCES_HOTKEY_PATH_IS_KICAD, false);
frame->m_Parent->m_EDA_CommonConfig->Write(HOTKEY_CFG_PATH_OPT, g_ConfigFileLocationChoice);
}
break;
case ID_PREFERENCES_HOTKEY_PATH_IS_KICAD:
if ( g_ConfigFileLocationChoice != 1 )
{
g_ConfigFileLocationChoice = 1;
menu->Check(ID_PREFERENCES_HOTKEY_PATH_IS_HOME, false);
menu->Check(ID_PREFERENCES_HOTKEY_PATH_IS_KICAD, true);
frame->m_Parent->m_EDA_CommonConfig->Write(HOTKEY_CFG_PATH_OPT, g_ConfigFileLocationChoice);
}
break;
default:
break;
}
}
wxMenuBar* menu = frame->GetMenuBar();
switch( id )
{
case ID_PREFERENCES_HOTKEY_PATH_IS_HOME:
if( g_ConfigFileLocationChoice != 0 )
{
g_ConfigFileLocationChoice = 0;
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_HOME, true );
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_KICAD, false );
frame->m_Parent->m_EDA_CommonConfig->Write( HOTKEY_CFG_PATH_OPT,
g_ConfigFileLocationChoice );
}
break;
case ID_PREFERENCES_HOTKEY_PATH_IS_KICAD:
if( g_ConfigFileLocationChoice != 1 )
{
g_ConfigFileLocationChoice = 1;
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_HOME, false );
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_KICAD, true );
frame->m_Parent->m_EDA_CommonConfig->Write( HOTKEY_CFG_PATH_OPT,
g_ConfigFileLocationChoice );
}
break;
default:
break;
}
}
......@@ -15,7 +15,7 @@
#include "colors.h"
// Define print format d to display a schematic component line
#define CMP_FORMAT wxT("%3d %+8s - %+16s : %-.32s")
#define CMP_FORMAT wxT("%3d %8s - %16s : %-.32s")
#define FILTERFOOTPRINTKEY "FilterFootprint"
......
......@@ -27,7 +27,7 @@
* add the HkMyNewEntry pointer in the s_Schematic_Hotkey_List list or the s_LibEdit_Hotkey_List list
* ( or s_Common_Hotkey_List if the same command is added both in eeschema and libedit)
* Add the new code in the switch in OnHotKey() function.
* when the variable PopupOn is true, an item is currently edited.
* when the variable ItemInEdit is true, an item is currently edited.
* This can be usefull if the new function cannot be executed while an item is currently being edited
* ( For example, one cannot start a new wire when a component is moving.)
*
......@@ -48,8 +48,8 @@ static Ki_HotkeyInfo HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 );
static Ki_HotkeyInfo HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 );
static Ki_HotkeyInfo HkHelp( wxT( "Help: this message" ), HK_HELP, '?' );
static Ki_HotkeyInfo HkResetLocalCoord( wxT( "Reset local coord." ), HK_RESET_LOCAL_COORD, ' ' );
static Ki_HotkeyInfo HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z' );
static Ki_HotkeyInfo HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y' );
static Ki_HotkeyInfo HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z', (int)ID_SCHEMATIC_UNDO );
static Ki_HotkeyInfo HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y', (int)ID_SCHEMATIC_REDO );
// Schematic editor
static Ki_HotkeyInfo HkBeginWire( wxT( "begin Wire" ), HK_BEGIN_WIRE, 'W' );
......@@ -62,7 +62,8 @@ static Ki_HotkeyInfo HkOrientNormalComponent( wxT(
"Orient Normal Component" ),
HK_ORIENT_NORMAL_COMPONENT, 'N' );
static Ki_HotkeyInfo HkRotateComponent( wxT( "Rotate Component" ), HK_ROTATE_COMPONENT, 'R' );
static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ), HK_MOVE_COMPONENT, 'M' );
static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ), HK_MOVE_COMPONENT, 'M', ID_POPUP_SCH_MOVE_CMP_REQUEST );
static Ki_HotkeyInfo HkDragComponent( wxT( "Drag Component" ), HK_DRAG_COMPONENT, 'G', ID_POPUP_SCH_DRAG_CMP_REQUEST );
static Ki_HotkeyInfo HkMove2Drag( wxT(
"Switch move block to drag block" ),
HK_MOVEBLOCK_TO_DRAGBLOCK, '\t' );
......@@ -80,7 +81,7 @@ Ki_HotkeyInfo* s_Common_Hotkey_List[] =
&HkHelp,
&HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter,
&HkResetLocalCoord,
&HkUndo, &HkRedo,
&HkUndo, &HkRedo,
NULL
};
......@@ -88,7 +89,7 @@ Ki_HotkeyInfo* s_Common_Hotkey_List[] =
Ki_HotkeyInfo* s_Schematic_Hotkey_List[] = {
&HkNextSearch,
&HkDelete, &HkInsert, &HkMove2Drag,
&HkMoveComponent, &HkAddComponent,
&HkMoveComponent, &HkDragComponent, &HkAddComponent,
&HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, &HkOrientNormalComponent,
&HkBeginWire,
NULL
......@@ -135,7 +136,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
* Commands are case insensitive
*/
{
bool PopupOn = m_CurrentScreen->GetCurItem()
bool ItemInEdit = m_CurrentScreen->GetCurItem()
&& m_CurrentScreen->GetCurItem()->m_Flags;
bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified
......@@ -152,11 +153,12 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
hotkey += 'A' - 'a';
// Search command from key :
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
if( CommandCode == HK_NOT_FOUND )
CommandCode = GetCommandCodeFromHotkey( hotkey, s_Schematic_Hotkey_List );
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
if( HK_Descr == NULL )
HK_Descr = GetDescriptorFromHotkey( hotkey, s_Schematic_Hotkey_List );
if( HK_Descr == NULL ) return;
switch( CommandCode )
switch( HK_Descr->m_Idcommand )
{
default:
case HK_NOT_FOUND:
......@@ -188,25 +190,22 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
break;
case HK_UNDO:
{
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_SCHEMATIC_UNDO);
wxPostEvent(this, event);
}
break;
case HK_REDO:
{
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_SCHEMATIC_REDO);
wxPostEvent(this, event);
}
break;
if( ItemInEdit )
break;
{
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
wxPostEvent( this, event );
}
break;
case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving
HandleBlockEndByPopUp( BLOCK_DRAG, DC );
break;
case HK_DELETE:
if( PopupOn )
if( ItemInEdit )
break;
RefreshToolBar = LocateAndDeleteItem( this, DC );
m_CurrentScreen->SetModify();
......@@ -215,23 +214,25 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
break;
case HK_REPEAT_LAST:
if( ItemInEdit )
break;
if( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) )
{
RepeatDrawItem( DC );
}
else
wxBell();
break;
case HK_NEXT_SEARCH:
if( g_LastSearchIsMarker )
if( ItemInEdit )
break;
if( g_LastSearchIsMarker )
WinEDA_SchematicFrame::FindMarker( 1 );
else
FindSchematicItem( wxEmptyString, 2 );
break;
case HK_ADD_NEW_COMPONENT: // Add component
if( DrawStruct && DrawStruct->m_Flags )
if( ItemInEdit )
break;
// switch to m_ID_current_state = ID_COMPONENT_BUTT;
......@@ -351,15 +352,18 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
}
break;
case HK_MOVE_COMPONENT: // Start move Component
if( PopupOn )
case HK_DRAG_COMPONENT: // Start drag Component
case HK_MOVE_COMPONENT: // Start move Component
if( ItemInEdit )
break;
if( DrawStruct == NULL )
DrawStruct = LocateSmallestComponent( GetScreen() );
if( DrawStruct && (DrawStruct->m_Flags ==0) )
{
m_CurrentScreen->SetCurItem( DrawStruct );
Process_Move_Item( m_CurrentScreen->GetCurItem(), DC );
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
wxPostEvent( this, event );
}
break;
}
......@@ -378,6 +382,8 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
* Commands are case insensitive
*/
{
bool ItemInEdit = m_CurrentScreen->GetCurItem()
&& m_CurrentScreen->GetCurItem()->m_Flags;
bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified
if( hotkey == 0 )
......@@ -391,11 +397,12 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
/* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */
if( (hotkey >= 'a') && (hotkey <= 'z') )
hotkey += 'A' - 'a';
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
if( CommandCode == HK_NOT_FOUND )
CommandCode = GetCommandCodeFromHotkey( hotkey, s_LibEdit_Hotkey_List );
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
if( HK_Descr == NULL )
HK_Descr = GetDescriptorFromHotkey( hotkey, s_LibEdit_Hotkey_List );
if( HK_Descr == NULL ) return;
switch( CommandCode )
switch( HK_Descr->m_Idcommand )
{
default:
case HK_NOT_FOUND:
......@@ -426,19 +433,16 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
OnZoom( ID_ZOOM_CENTER_KEY );
break;
case HK_UNDO:
{
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_LIBEDIT_UNDO);
wxPostEvent(this, event);
}
break;
case HK_REDO:
{
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_LIBEDIT_REDO);
wxPostEvent(this, event);
}
break;
case HK_UNDO:
case HK_REDO:
if( ItemInEdit )
break;
{
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
wxPostEvent( this, event );
}
break;
case HK_REPEAT_LAST:
if( LibItemToRepeat && (LibItemToRepeat->m_Flags == 0)
......
......@@ -25,6 +25,7 @@ enum hotkey_id_commnand {
HK_MIRROR_Y_COMPONENT,
HK_ORIENT_NORMAL_COMPONENT,
HK_MOVE_COMPONENT,
HK_DRAG_COMPONENT,
HK_ADD_NEW_COMPONENT,
HK_BEGIN_WIRE
};
......
......@@ -284,6 +284,9 @@ void AddMenusForComponent( wxMenu* PopMenu, EDA_SchComponentStruct* Component )
msg = AddHotkeyName( _( "Move Component" ), s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT );
ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_CMP_REQUEST,
msg, move_xpm );
msg = AddHotkeyName( _( "Drag Component" ), s_Schematic_Hokeys_Descr, HK_DRAG_COMPONENT );
ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_CMP_REQUEST,
msg, move_xpm );
}
// add menu orient et sous menu:
......
......@@ -53,6 +53,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_MOVE_PINSHEET:
case ID_POPUP_SCH_MOVE_ITEM_REQUEST:
case ID_POPUP_SCH_MOVE_CMP_REQUEST:
case ID_POPUP_SCH_DRAG_CMP_REQUEST:
case ID_POPUP_SCH_EDIT_CMP:
case ID_POPUP_SCH_MIROR_X_CMP:
case ID_POPUP_SCH_MIROR_Y_CMP:
......@@ -486,21 +487,27 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
m_CurrentScreen->GetCurItem(), &dc );
break;
case ID_POPUP_SCH_DRAG_CMP_REQUEST:
case ID_POPUP_SCH_MOVE_CMP_REQUEST:
// Ensure the struct is a component (could be a struct of a component, like Field, text..)
if( m_CurrentScreen->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
m_CurrentScreen->SetCurItem( LocateSmallestComponent( GetScreen() ) );
if( m_CurrentScreen->GetCurItem() == NULL )
break;
case ID_POPUP_SCH_MOVE_ITEM_REQUEST:
DrawPanel->MouseToCursorSchema();
Process_Move_Item( m_CurrentScreen->GetCurItem(), &dc );
if ( id == ID_POPUP_SCH_DRAG_CMP_REQUEST )
{ // The easiest way to handle a drag component is simulate a block drag command
if( GetScreen()->BlockLocate.m_State == STATE_NO_BLOCK )
{
if( !HandleBlockBegin( &dc, BLOCK_DRAG, GetScreen()->m_Curseur ) ) break;
HandleBlockEnd( &dc );
}
}
else Process_Move_Item( m_CurrentScreen->GetCurItem(), &dc );
break;
case ID_POPUP_SCH_EDIT_CMP:
// Ensure the struct is a component (could be a struct of a component, like Field, text..)
if( m_CurrentScreen->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
m_CurrentScreen->SetCurItem( LocateSmallestComponent( GetScreen() ) );
......
......@@ -91,9 +91,10 @@ void WinEDA_GerberFrame::OnHotKey( wxDC* DC, int hotkey,
if( (hotkey >= 'a') && (hotkey <= 'z') )
hotkey += 'A' - 'a';
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Gerbview_Hotkey_List );
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Gerbview_Hotkey_List );
if( HK_Descr == NULL ) return;
switch( CommandCode )
switch( HK_Descr->m_Idcommand )
{
default:
case HK_NOT_FOUND:
......
......@@ -5,7 +5,7 @@
COMMON_GLOBL wxString g_BuildVersion
#ifdef EDA_BASE
(wxT("(2007-09-19)"))
(wxT("(2007-09-22)"))
#endif
;
......
......@@ -15,11 +15,11 @@
#define DEFAULT_HOTKEY_FILENAME_EXT wxT( ".key" )
/* define default path for config key file */
#define DEFAULT_HOTKEY_FILENAME_PATH_IS_HOME wxGetHomeDir() + wxT( "/" )
#define DEFAULT_HOTKEY_FILENAME_PATH_IS_HOME wxGetHomeDir() + wxT( "/" )
#define DEFAULT_HOTKEY_FILENAME_PATH_IS_KICAD EDA_Appl->m_BinDir + wxT( "../template/" )
/* keyword idetifier in kicad config use ti store/retrieve path option */
#define HOTKEY_CFG_PATH_OPT wxT("HotkeyPathOption")
#define HOTKEY_CFG_PATH_OPT wxT( "HotkeyPathOption" )
/* Class to handle hotkey commnands. hotkeys have a default value
......@@ -31,9 +31,10 @@ public:
int m_KeyCode; // Key code (ascii value for ascii keys or wxWidgets code for function key
wxString m_InfoMsg; // info message.
int m_Idcommand; // internal id for the corresponding command (see hotkey_id_commnand list)
int m_IdMenuEvent; // id to call the corresponding event (if any) (see id.h)
public:
Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode );
Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent = 0 );
};
/* handle a Section name and the corresponding list of hotkeys (Ki_HotkeyInfo list)
......@@ -84,24 +85,24 @@ COMMON_GLOBL wxString g_ModuleEditSectionTag
;
COMMON_GLOBL int g_ConfigFileLocationChoice; /* 0 = files are in Home directory (usefull under unix)
* 1 = kicad/template ( usefull only under windows )
* 2 ... = unused
* 1 = kicad/template ( usefull only under windows )
* 2 ... = unused
*/
/* Functions:
*/
wxString ReturnHotkeyConfigFilePath( int choice );
void AddHotkeyConfigMenu( wxMenu* menu );
void HandleHotkeyConfigMenuSelection( WinEDA_DrawFrame * frame, int id );
wxString ReturnKeyNameFromKeyCode( int keycode );
wxString ReturnKeyNameFromCommandId( Ki_HotkeyInfo** List, int CommandId );
wxString AddHotkeyName( const wxString& text, Ki_HotkeyInfo** List, int CommandId );
wxString AddHotkeyName( const wxString& text,
struct Ki_HotkeyInfoSectionDescriptor* DescrList,
int CommandId );
void DisplayHotkeyList( WinEDA_DrawFrame* frame,
struct Ki_HotkeyInfoSectionDescriptor* List );
int GetCommandCodeFromHotkey( int key, Ki_HotkeyInfo** List );
wxString ReturnHotkeyConfigFilePath( int choice );
void AddHotkeyConfigMenu( wxMenu* menu );
void HandleHotkeyConfigMenuSelection( WinEDA_DrawFrame* frame, int id );
wxString ReturnKeyNameFromKeyCode( int keycode );
wxString ReturnKeyNameFromCommandId( Ki_HotkeyInfo** List, int CommandId );
wxString AddHotkeyName( const wxString& text, Ki_HotkeyInfo** List, int CommandId );
wxString AddHotkeyName( const wxString& text,
struct Ki_HotkeyInfoSectionDescriptor* DescrList,
int CommandId );
void DisplayHotkeyList( WinEDA_DrawFrame* frame,
struct Ki_HotkeyInfoSectionDescriptor* List );
Ki_HotkeyInfo* GetDescriptorFromHotkey( int key, Ki_HotkeyInfo** List );
#endif // HOTKEYS_BASIC_H
......@@ -282,7 +282,7 @@ enum main_id {
ID_POPUP_SCH_DELETE_NODE,
ID_POPUP_SCH_MOVE_CMP_REQUEST,
ID_POPUP_SCH_DELETE_CMP,
ID_POPUP_SCH_UNUSED_0,
ID_POPUP_SCH_DRAG_CMP_REQUEST,
ID_POPUP_SCH_UNUSED_1,
ID_POPUP_SCH_UNUSED_2,
ID_POPUP_SCH_ENTRY_SELECT_SLASH,
......
......@@ -25,9 +25,9 @@ KICAD_TEMPLATE=$(KICAD_DATA)/template
else
# used by myself (JP Charras) to build a statically linked distribution intalled in /usr/local (with STD_INSTALL = 0)
PREFIX = /usr/local/linux
KICAD_BIN = $(PREFIX)/bin
KICAD_PLUGINS = $(PREFIX)/linux/plugins
PREFIX = /usr/local/kicad
KICAD_BIN = $(PREFIX)/linux
KICAD_PLUGINS = $(KICAD_BIN)/plugins
KICAD_DOCS=$(PREFIX)/help
KICAD_DATA=$(PREFIX)
KICAD_MODULES=$(KICAD_DATA)/modules
......@@ -121,12 +121,15 @@ ifeq ($(KICAD_STATIC_LINK), 1)
LIBS3D = $(WXPATH)/$(PREFIX_WX_LIBS)$(SUFFIX_WX_LIBGL)\
$(MESALIBSPATH)/libGL.a $(MESALIBSPATH)/libGLU.a
AUXLIB = -lXxf86vm
#AUXLIB = /usr/X11R6/lib/libXinerama.a
WXSYSLIB= $(WXPATH)/$(PREFIX_WX_LIBS)-$(LIBVERSION).a \
$(WXPATH)/libwxpng-$(LIBVERSION).a\
$(WXPATH)/libwxjpeg-$(LIBVERSION).a\
$(WXPATH)/libwxzlib-$(LIBVERSION).a\
$(LIBREGEX)\
/usr/X11R6/lib/libXinerama.a \
$(AUXLIB)\
-lgtk-x11-2.0 -lgdk-x11-2.0 \
-latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lgthread-2.0\
-lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl\
......@@ -134,18 +137,8 @@ WXSYSLIB= $(WXPATH)/$(PREFIX_WX_LIBS)-$(LIBVERSION).a \
-L/usr/lib $(PYLIBS)
WXSYSLIB_WITH_GL= $(WXPATH)/$(PREFIX_WX_LIBS)-$(LIBVERSION).a \
$(WXPATH)/libwxpng-$(LIBVERSION).a\
$(WXPATH)/libwxjpeg-$(LIBVERSION).a\
$(WXPATH)/libwxzlib-$(LIBVERSION).a\
$(LIBS3D)\
/usr/X11R6/lib/libXinerama.a \
/usr/X11R6/lib/libXxf86vm.a \
-lgtk-x11-2.0 -lgdk-x11-2.0 \
-latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lgthread-2.0\
-lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl\
-lglib-2.0 -lpangoft2-1.0 -lSM\
-L/usr/lib $(PYLIBS)
WXSYSLIB_WITH_GL= $(WXSYSLIB) $(LIBS3D)
else
ifeq ($(DEBUG), 1)
......
......@@ -186,12 +186,14 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
if( (hotkey >= 'a') && (hotkey <= 'z') )
hotkey += 'A' - 'a';
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
if( CommandCode == HK_NOT_FOUND )
CommandCode = GetCommandCodeFromHotkey( hotkey, s_board_edit_Hotkey_List );
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
if( HK_Descr == NULL )
HK_Descr = GetDescriptorFromHotkey( hotkey, s_board_edit_Hotkey_List );
if( HK_Descr == NULL ) return;
int ll;
switch( CommandCode )
switch( HK_Descr->m_Idcommand )
{
default:
case HK_NOT_FOUND:
......@@ -465,7 +467,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
SetCurItem( module );
}
switch( CommandCode )
switch( HK_Descr->m_Idcommand )
{
case HK_ROTATE_FOOTPRINT: // Rotation
Rotate_Module( DC, module, 900, TRUE );
......@@ -506,11 +508,12 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* DC, int hotkey,
if( (hotkey >= 'a') && (hotkey <= 'z') )
hotkey += 'A' - 'a';
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
if( CommandCode == HK_NOT_FOUND )
CommandCode = GetCommandCodeFromHotkey( hotkey, s_module_edit_Hotkey_List );
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
if( HK_Descr == NULL )
HK_Descr = GetDescriptorFromHotkey( hotkey, s_module_edit_Hotkey_List );
if( HK_Descr == NULL ) return;
switch( CommandCode )
switch( HK_Descr->m_Idcommand )
{
default:
case HK_NOT_FOUND:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment