diff --git a/change_log.txt b/change_log.txt index 68ba56b94a..5aeb3fe596 100644 --- a/change_log.txt +++ b/change_log.txt @@ -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 +================================================================================ ++ 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 ================================================================================ + pcbnew diff --git a/common/common_plotPS_functions.cpp b/common/common_plotPS_functions.cpp index be42d429b6..0fcf870ad2 100644 --- a/common/common_plotPS_functions.cpp +++ b/common/common_plotPS_functions.cpp @@ -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; diff --git a/common/dcsvg.cpp b/common/dcsvg.cpp index 5df1830396..7b0e1a460c 100644 --- a/common/dcsvg.cpp +++ b/common/dcsvg.cpp @@ -1,4 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// + // 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; } ; - -wxString wxColStr ( wxColour c ) +static inline double DegToRad( double deg ) { - unsigned char r, g, b ; - r = c.Red (); - g = c.Green (); - b = c. Blue (); + return (deg * M_PI) / 180.0; +}; + +wxString wxColStr( wxColour c ) +{ + 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("") ; s = s + newline ; - write(s); - s = wxT(" ")+ newline ; - write(s); + m_filename = f; + m_sub_images = 0; + wxString s; + s = wxT( "" ); s = s + newline; + write( s ); + s = wxT( " " ) + newline; + write( s ); - s.Printf ( wxT("\n") ); - write(s); - - s = wxT(" SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" ") + newline ; - write(s); - s = wxString (wxT(" Picture generated by wxSVG ")) + wxSVGVersion + wxT(" ")+ newline ; - write(s); - s = wxT(" ") + newline ; - write(s); + s.Printf( wxT( "\n" ) ); + write( s ); + s = wxT( " SVG Picture created as " ) + wxFileNameFromPath( f ) + + wxT( " " ) + newline; + write( s ); + s = wxString( wxT( " Picture generated by wxSVG " ) ) + wxSVGVersion + wxT( + " " ) + newline; + write( s ); + s = wxT( " " ) + 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(" \n \n") ; - write(s); - delete m_outfile ; + wxString s = wxT( " \n \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(" \n"), x1,y1,x2,y2 ); - if (m_OK) + if( m_graphics_changed ) + NewGraphics(); + wxString s; + s.Printf( wxT( " \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(" ") + newline ; - write(s); - DrawLine ( x1,y1,x1,y1 ); - s = wxT(""); - write(s); + + if( m_graphics_changed ) + NewGraphics(); + s = wxT( " " ) + newline; + write( s ); + DrawLine( x1, y1, x1, y1 ); + s = wxT( "" ); + 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(" "), -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( + " " ), -angle, x, y ); + s = s + sTmp + newline; + write( s ); } + //now do the text itself - s.Printf (wxT(" 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; "); - else s = s + wxT("style=\" ") ; - - wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") }; - s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space; - - 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(" ") + newline ; - if (m_OK) - { - write(s); - } - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ; - -} - - -void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ - DoDrawRoundedRectangle(x, y, width, height, 0) ; -} - - -void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius ) - -{ - if (m_graphics_changed) NewGraphics (); - wxString s ; - - s.Printf ( 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) -{ - if (m_graphics_changed) NewGraphics (); - wxString s, sTmp ; - s = wxT(" 0 ) + s = s + wxT( "style=\"font-family:" ) + sTmp + wxT( "; " ); else - s = s + wxT("fill-rule:nonzero; "); + s = s + wxT( "style=\" " ); - s = s + wxT("\" \npoints=\"") ; + wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) }; + s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space; - for (int i = 0; i < n; i++) + 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( " " ) + newline; + if( m_OK ) { - 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); + write( s ); } - s = s + wxT("\" /> ") ; - s = s + newline ; - write(s); - - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ; + wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) ); } -void wxSVGFileDC::DoDrawEllipse (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 ); +} + + +void wxSVGFileDC::DoDrawRoundedRectangle( wxCoord x, + wxCoord y, + wxCoord width, + wxCoord height, + double radius ) { - if (m_graphics_changed) NewGraphics (); + if( m_graphics_changed ) + NewGraphics(); + wxString s; - int rh = height /2 ; - int rw = width /2 ; + s.Printf( 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 ) +{ + if( m_graphics_changed ) + NewGraphics(); + wxString s, sTmp; + 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 ) + +{ + if( m_graphics_changed ) + NewGraphics(); + + int rh = height / 2; + int rw = width / 2; wxString s; - s.Printf ( wxT(" ") + newline ; + s.Printf( 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. + * (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. */ - The arc is drawn in an anticlockwise direction from the start point to - the end point. */ - - if (m_graphics_changed) NewGraphics (); - wxString s ; + 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(" \n") ; - write(s); + s = wxT( " \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 ; + 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 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 + int fSweep; + if( (theta2 - theta1) > 0 ) + fSweep = 0;else + fSweep = 1; + float Axis_rotation = 0.0; +// Draw arc as pie: // s.Printf ( wxT(" ") + newline ; + // Draw a single arc: + s.Printf( 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 ; - // center - double xc = x + rx ; - double yc = y + ry ; + double rx = w / 2; + double ry = h / 2; - 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)) ; + // center + 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) ); ///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(" ") + 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("\n\n \n") ; + case wxCAP_BUTT: + sPenCap = wxT( "stroke-linecap:butt; " ); + break; + + case wxCAP_ROUND: + default: + sPenCap = wxT( "stroke-linecap:round; " ); } - sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"), - w, m_OriginX, m_OriginY, m_scaleX, m_scaleY ); + ; + + 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; " ); + } + + ; + + 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( + " \n" ); + } + + 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(" \n"), sPNG.c_str() ); - s = s + sTmp + wxT("Image from wxSVG ") + newline; + int w = myBitmap.GetWidth(); + int h = myBitmap.GetHeight(); + sTmp.Printf( wxT( " \n" ), sPNG.c_str() ); + s = s + sTmp + wxT( "Image from wxSVG " ) + newline; - if (m_OK && bPNG_OK) + 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 diff --git a/common/hotkeys_basic.cpp b/common/hotkeys_basic.cpp index 9ca1efa23d..5248cb6311 100644 --- a/common/hotkeys_basic.cpp +++ b/common/hotkeys_basic.cpp @@ -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( "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( "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( "+" ), WXK_ADD }, + { wxT( "-" ), WXK_SUBTRACT }, - { wxT( "Up" ), WXK_UP }, - { wxT( "Down" ), WXK_DOWN }, - { wxT( "Left" ), WXK_LEFT }, - { wxT( "Right" ), WXK_RIGHT }, + { 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( "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( "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( "" ), 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; + wxMenuBar* menu = frame->GetMenuBar(); - 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; - } + 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; + } } - diff --git a/cvpcb/cvpcb.h b/cvpcb/cvpcb.h index b31e37f067..c28e2b503d 100644 --- a/cvpcb/cvpcb.h +++ b/cvpcb/cvpcb.h @@ -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" diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 93bac80eff..1b060be147 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -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_UNDO: + case HK_REDO: + if( ItemInEdit ) + break; + { + wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent ); - case HK_REDO: - { - wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_LIBEDIT_REDO); - wxPostEvent(this, event); - } - break; + wxPostEvent( this, event ); + } + break; case HK_REPEAT_LAST: if( LibItemToRepeat && (LibItemToRepeat->m_Flags == 0) diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h index 247e6496f0..4003ee1e46 100644 --- a/eeschema/hotkeys.h +++ b/eeschema/hotkeys.h @@ -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 }; diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 7b18d01529..bac24a3bac 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -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: diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 4f65ccb8ec..1f96981fc8 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -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() ) ); diff --git a/gerbview/hotkeys.cpp b/gerbview/hotkeys.cpp index 29036a8ae4..fa43d5c436 100644 --- a/gerbview/hotkeys.cpp +++ b/gerbview/hotkeys.cpp @@ -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: diff --git a/include/build_version.h b/include/build_version.h index a18ae35d9d..4a81279110 100644 --- a/include/build_version.h +++ b/include/build_version.h @@ -5,7 +5,7 @@ COMMON_GLOBL wxString g_BuildVersion #ifdef EDA_BASE - (wxT("(2007-09-19)")) + (wxT("(2007-09-22)")) #endif ; diff --git a/include/hotkeys_basic.h b/include/hotkeys_basic.h index 5a9bcdc505..3eba021474 100644 --- a/include/hotkeys_basic.h +++ b/include/hotkeys_basic.h @@ -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 diff --git a/include/id.h b/include/id.h index 858254ec65..b3b687db37 100644 --- a/include/id.h +++ b/include/id.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, diff --git a/libs.linux b/libs.linux index cf0c266320..5b6d1251c6 100644 --- a/libs.linux +++ b/libs.linux @@ -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) diff --git a/pcbnew/hotkeys.cpp b/pcbnew/hotkeys.cpp index 6404bc8adb..802c6432ae 100644 --- a/pcbnew/hotkeys.cpp +++ b/pcbnew/hotkeys.cpp @@ -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: