You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

755 lines
28 KiB

19 years ago
19 years ago
17 years ago
19 years ago
18 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
18 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
18 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
18 years ago
18 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
18 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
19 years ago
18 years ago
18 years ago
19 years ago
19 years ago
19 years ago
  1. /*********************************************/
  2. /* tool_pcb.cpp: construction des tool bars */
  3. /*********************************************/
  4. #include "fctsys.h"
  5. #include "common.h"
  6. #include "pcbnew.h"
  7. #include "wxPcbStruct.h"
  8. #include "bitmaps.h"
  9. #include "id.h"
  10. #ifdef __UNIX__
  11. #define LISTBOX_WIDTH 140
  12. #else
  13. #define LISTBOX_WIDTH 120
  14. #endif
  15. #include "wx/ownerdrw.h"
  16. #include "wx/menuitem.h"
  17. #include "hotkeys.h"
  18. #define MUWAVE_ENBL
  19. #define SEL_LAYER_HELP _( \
  20. "Show active layer selections\nand select layer pair for route and place via" )
  21. /* Data to build the layer pair indicator button */
  22. static wxBitmap* LayerPairBitmap = NULL;
  23. static const char s_BitmapLayerIcon[16][16] = {
  24. // 0 = draw pixel with active layer color
  25. // 1 = draw pixel with top layer color (top/bottom layer used in autoroute and place via)
  26. // 2 = draw pixel with bottom layer color
  27. // 3 = draw pixel with via color
  28. { 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 1, 1, 1, 1, 0, 0 },
  29. { 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 1, 1, 0, 0, 0 },
  30. { 0, 0, 0, 0, 0, 3, 3, 0, 1, 1, 3, 3, 0, 0, 0, 0 },
  31. { 2, 2, 2, 2, 3, 3, 0, 1, 1, 1, 1, 3, 3, 2, 2, 2 },
  32. { 2, 2, 2, 2, 3, 3, 1, 1, 1, 0, 0, 3, 3, 2, 2, 2 },
  33. { 2, 2, 2, 2, 3, 3, 1, 1, 1, 1, 0, 3, 3, 2, 2, 2 },
  34. { 0, 0, 0, 0, 0, 3, 3, 1, 1, 0, 3, 3, 0, 0, 0, 0 },
  35. { 0, 0, 0, 0, 0, 1, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0 },
  36. { 0, 0, 0, 0, 0, 1, 1, 3, 3, 3, 0, 0, 0, 0, 0, 0 },
  37. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
  38. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
  39. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
  40. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
  41. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
  42. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
  43. { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }
  44. };
  45. /************************************************************/
  46. void WinEDA_PcbFrame::PrepareLayerIndicator()
  47. /************************************************************/
  48. /* Draw the icon for the "Select layet pair" bitmap tool
  49. */
  50. {
  51. int ii, jj;
  52. int active_layer_color, Route_Layer_TOP_color,
  53. Route_Layer_BOTTOM_color, via_color;
  54. bool change = false;
  55. static int previous_active_layer_color, previous_Route_Layer_TOP_color,
  56. previous_Route_Layer_BOTTOM_color, previous_via_color;
  57. /* get colors, and redraw bitmap button only on changes */
  58. active_layer_color = g_DesignSettings.m_LayerColor[((PCB_SCREEN*)GetScreen())->m_Active_Layer];
  59. if( previous_active_layer_color != active_layer_color )
  60. {
  61. previous_active_layer_color = active_layer_color;
  62. change = TRUE;
  63. }
  64. Route_Layer_TOP_color = g_DesignSettings.m_LayerColor[((PCB_SCREEN*)GetScreen())->m_Route_Layer_TOP];
  65. if( previous_Route_Layer_TOP_color != Route_Layer_TOP_color )
  66. {
  67. previous_Route_Layer_TOP_color = Route_Layer_TOP_color;
  68. change = TRUE;
  69. }
  70. Route_Layer_BOTTOM_color = g_DesignSettings.m_LayerColor[((PCB_SCREEN*)GetScreen())->m_Route_Layer_BOTTOM];
  71. if( previous_Route_Layer_BOTTOM_color != Route_Layer_BOTTOM_color )
  72. {
  73. previous_Route_Layer_BOTTOM_color = Route_Layer_BOTTOM_color;
  74. change = TRUE;
  75. }
  76. via_color = g_DesignSettings.m_ViaColor[g_DesignSettings.m_CurrentViaType ];
  77. if( previous_via_color != via_color )
  78. {
  79. previous_via_color = via_color;
  80. change = TRUE;
  81. }
  82. if( !change && (LayerPairBitmap != NULL) )
  83. return;
  84. /* Creat the bitmap too and its Memory DC, if not already made */
  85. if( LayerPairBitmap == NULL )
  86. {
  87. LayerPairBitmap = new wxBitmap( 16, 16 );
  88. }
  89. /* Draw the icon, with colors according to the active layer and layer pairs for
  90. * via command (change layer)
  91. */
  92. wxMemoryDC iconDC;
  93. iconDC.SelectObject( *LayerPairBitmap );
  94. int buttcolor = -1;
  95. wxPen pen;
  96. for( ii = 0; ii < 16; ii++ )
  97. {
  98. for( jj = 0; jj < 16; jj++ )
  99. {
  100. if( s_BitmapLayerIcon[ii][jj] != buttcolor )
  101. {
  102. buttcolor = s_BitmapLayerIcon[ii][jj];
  103. int color;
  104. switch( buttcolor )
  105. {
  106. default:
  107. case 0:
  108. color = active_layer_color;
  109. break;
  110. case 1:
  111. color = Route_Layer_TOP_color;
  112. break;
  113. case 2:
  114. color = Route_Layer_BOTTOM_color;
  115. break;
  116. case 3:
  117. color = via_color;
  118. break;
  119. }
  120. color &= MASKCOLOR;
  121. pen.SetColour(
  122. ColorRefs[color].m_Red,
  123. ColorRefs[color].m_Green,
  124. ColorRefs[color].m_Blue
  125. );
  126. iconDC.SetPen( pen );
  127. }
  128. iconDC.DrawPoint( jj, ii );
  129. }
  130. }
  131. /* Deselect the Tool Bitmap from DC,
  132. * in order to delete the MemoryDC safely without deleting the bitmap */
  133. iconDC.SelectObject( wxNullBitmap );
  134. if( m_HToolBar )
  135. {
  136. #if wxCHECK_VERSION( 2, 8, 3 ) & !defined(__WXX11__)
  137. m_HToolBar->SetToolNormalBitmap( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR,
  138. *LayerPairBitmap );
  139. #else
  140. int pos = m_HToolBar->GetToolPos( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR );
  141. if( pos != wxNOT_FOUND )
  142. {
  143. m_HToolBar->DeleteTool( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR );
  144. m_HToolBar->InsertTool( pos, ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR,
  145. *LayerPairBitmap, wxNullBitmap, false,
  146. NULL, SEL_LAYER_HELP );
  147. m_HToolBar->Realize();
  148. }
  149. #endif
  150. }
  151. }
  152. /******************************************/
  153. void WinEDA_PcbFrame::ReCreateHToolbar()
  154. /******************************************/
  155. /* Create the main horizontal toolbar for the board editor */
  156. {
  157. wxString msg;
  158. if( m_HToolBar != NULL )
  159. {
  160. D(printf("ReCreateHToolbar\n");)
  161. SetToolbars();
  162. return;
  163. }
  164. m_HToolBar = new WinEDA_Toolbar( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE );
  165. m_HToolBar->SetRows( 1 );
  166. SetToolBar( m_HToolBar );
  167. // Set up toolbar
  168. m_HToolBar->AddTool( ID_NEW_BOARD, wxEmptyString, wxBitmap( new_xpm ),
  169. _( "New board" ) );
  170. m_HToolBar->AddTool( ID_LOAD_FILE, wxEmptyString, wxBitmap( open_xpm ),
  171. _( "Open existing board" ) );
  172. m_HToolBar->AddTool( ID_SAVE_BOARD, wxEmptyString, wxBitmap( save_xpm ),
  173. _( "Save board" ) );
  174. m_HToolBar->AddSeparator();
  175. m_HToolBar->AddTool( ID_SHEET_SET, wxEmptyString, wxBitmap( sheetset_xpm ),
  176. _( "Page settings (size, texts)" ) );
  177. m_HToolBar->AddSeparator();
  178. m_HToolBar->AddTool( ID_OPEN_MODULE_EDITOR, wxEmptyString,
  179. wxBitmap( modedit_xpm ),
  180. _( "Open module editor" ) );
  181. m_HToolBar->AddSeparator();
  182. m_HToolBar->AddTool( wxID_CUT, wxEmptyString, wxBitmap( cut_button ),
  183. _( "Cut selected item" ) );
  184. #if 0
  185. m_HToolBar->AddTool( wxID_COPY, wxEmptyString, wxBitmap( copy_button ),
  186. _( "Copy selected item" ) );
  187. m_HToolBar->AddTool( wxID_PASTE, wxEmptyString, wxBitmap( paste_xpm ),
  188. _( "Paste" ) );
  189. #endif
  190. m_HToolBar->AddSeparator();
  191. m_HToolBar->AddTool( ID_UNDO_BUTT, wxEmptyString, wxBitmap( undo_xpm ),
  192. _( "Undo last edition" ) );
  193. m_HToolBar->AddTool( ID_REDO_BUTT, wxEmptyString, wxBitmap( redo_xpm ),
  194. _( "Redo the last undo command" ) );
  195. m_HToolBar->AddSeparator();
  196. m_HToolBar->AddTool( ID_GEN_PRINT, wxEmptyString, wxBitmap( print_button ),
  197. _( "Print board" ) );
  198. m_HToolBar->AddTool( ID_GEN_PLOT, wxEmptyString, wxBitmap( plot_xpm ),
  199. _( "Plot (HPGL, PostScript, or GERBER format)" ) );
  200. m_HToolBar->AddSeparator();
  201. msg = AddHotkeyName( _( "Zoom in" ), s_Board_Editor_Hokeys_Descr,
  202. HK_ZOOM_IN );
  203. m_HToolBar->AddTool( ID_ZOOM_IN, wxEmptyString, wxBitmap( zoom_in_xpm ),
  204. msg );
  205. msg = AddHotkeyName( _( "Zoom out" ), s_Board_Editor_Hokeys_Descr,
  206. HK_ZOOM_OUT );
  207. m_HToolBar->AddTool( ID_ZOOM_OUT, wxEmptyString,
  208. wxBitmap( zoom_out_xpm ), msg );
  209. msg = AddHotkeyName( _( "Redraw view" ), s_Board_Editor_Hokeys_Descr,
  210. HK_ZOOM_REDRAW );
  211. m_HToolBar->AddTool( ID_ZOOM_REDRAW, wxEmptyString,
  212. wxBitmap( zoom_redraw_xpm ), msg );
  213. m_HToolBar->AddTool( ID_ZOOM_PAGE, wxEmptyString,
  214. wxBitmap( zoom_auto_xpm ),
  215. _( "Zoom auto" ) );
  216. m_HToolBar->AddSeparator();
  217. msg = AddHotkeyName( _( "Find components and texts" ),
  218. s_Board_Editor_Hokeys_Descr,
  219. HK_FIND_ITEM );
  220. m_HToolBar->AddTool( ID_FIND_ITEMS, wxEmptyString, wxBitmap( find_xpm ),
  221. msg );
  222. m_HToolBar->AddSeparator();
  223. m_HToolBar->AddTool( ID_GET_NETLIST, wxEmptyString, wxBitmap( netlist_xpm ),
  224. _( "Read netlist" ) );
  225. m_HToolBar->AddTool( ID_DRC_CONTROL, wxEmptyString, wxBitmap( erc_xpm ),
  226. _( "Pcb Design Rules Check" ) );
  227. m_HToolBar->AddSeparator();
  228. ReCreateLayerBox( m_HToolBar );
  229. PrepareLayerIndicator(); // Initialise the bitmap with current active layer colors for the next tool
  230. m_HToolBar->AddTool( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR, wxEmptyString,
  231. *LayerPairBitmap, SEL_LAYER_HELP );
  232. m_HToolBar->AddSeparator();
  233. m_HToolBar->AddTool( ID_TOOLBARH_PCB_AUTOPLACE, wxEmptyString,
  234. wxBitmap( mode_module_xpm ),
  235. _( "Mode Module: Manual and Automatic Move or Place for modules" ),
  236. wxITEM_CHECK );
  237. m_HToolBar->AddTool( ID_TOOLBARH_PCB_AUTOROUTE, wxEmptyString,
  238. wxBitmap( mode_track_xpm ),
  239. _( "Mode Track and Autorouting" ), wxITEM_CHECK );
  240. // Fast call to FreeROUTE Web Bases router
  241. m_HToolBar->AddSeparator();
  242. m_HToolBar->AddTool( ID_TOOLBARH_PCB_FREEROUTE_ACCESS, wxEmptyString,
  243. wxBitmap( web_support_xpm ),
  244. _( "Fast access to theWeb Based FreeROUTE advanced router" ) );
  245. // after adding the buttons to the toolbar, must call Realize() to reflect
  246. // the changes
  247. m_HToolBar->Realize();
  248. D( printf( "ReCreateHToolbar\n" ); )
  249. SetToolbars();
  250. }
  251. /*********************************************/
  252. void WinEDA_PcbFrame::ReCreateOptToolbar()
  253. /*********************************************/
  254. // Create the left vertical toolbar (option selections)
  255. {
  256. if( m_OptionsToolBar )
  257. return;
  258. // creation du tool bar options
  259. m_OptionsToolBar = new WinEDA_Toolbar( TOOLBAR_OPTION, this,
  260. ID_OPT_TOOLBAR, FALSE );
  261. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_DRC_OFF, wxEmptyString,
  262. wxBitmap( drc_off_xpm ),
  263. _( "Drc OFF" ), wxITEM_CHECK );
  264. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_GRID, wxEmptyString,
  265. wxBitmap( grid_xpm ),
  266. _( "Display Grid OFF" ), wxITEM_CHECK );
  267. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_POLAR_COORD, wxEmptyString,
  268. wxBitmap( polar_coord_xpm ),
  269. _( "Display Polar Coord ON" ), wxITEM_CHECK );
  270. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, wxEmptyString,
  271. wxBitmap( unit_inch_xpm ),
  272. _( "Units in inches" ), wxITEM_CHECK );
  273. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_UNIT_MM, wxEmptyString,
  274. wxBitmap( unit_mm_xpm ),
  275. _( "Units in millimeters" ), wxITEM_CHECK );
  276. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SELECT_CURSOR, wxEmptyString,
  277. wxBitmap( cursor_shape_xpm ),
  278. _( "Change Cursor Shape" ), wxITEM_CHECK );
  279. m_OptionsToolBar->AddSeparator();
  280. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_RATSNEST, wxEmptyString,
  281. wxBitmap( general_ratsnet_xpm ),
  282. _( "Show General Ratsnest" ), wxITEM_CHECK );
  283. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_MODULE_RATSNEST, wxEmptyString,
  284. wxBitmap( local_ratsnet_xpm ),
  285. _( "Show Module Ratsnest when moving" ),
  286. wxITEM_CHECK );
  287. m_OptionsToolBar->AddSeparator();
  288. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_AUTO_DEL_TRACK, wxEmptyString,
  289. wxBitmap( auto_delete_track_xpm ),
  290. _( "Enable Auto Del Track" ), wxITEM_CHECK );
  291. m_OptionsToolBar->AddSeparator();
  292. m_OptionsToolBar->AddRadioTool( ID_TB_OPTIONS_SHOW_ZONES, wxEmptyString,
  293. wxBitmap( show_zone_xpm ), wxNullBitmap,
  294. _( "Show filled areas in zones" ) );
  295. m_OptionsToolBar->AddRadioTool( ID_TB_OPTIONS_SHOW_ZONES_DISABLE, wxEmptyString,
  296. wxBitmap( show_zone_disable_xpm ), wxNullBitmap,
  297. _( "Do not show filled areas in zones" ));
  298. m_OptionsToolBar->AddRadioTool( ID_TB_OPTIONS_SHOW_ZONES_OUTLINES_ONLY, wxEmptyString,
  299. wxBitmap( show_zone_outline_only_xpm ), wxNullBitmap,
  300. _( "Show outlines of filled areas only in zones" ) );
  301. m_OptionsToolBar->AddSeparator();
  302. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_PADS_SKETCH, wxEmptyString,
  303. wxBitmap( pad_sketch_xpm ),
  304. _( "Show Pads Sketch" ), wxITEM_CHECK );
  305. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_TRACKS_SKETCH, wxEmptyString,
  306. wxBitmap( showtrack_xpm ),
  307. _( "Show Tracks Sketch" ), wxITEM_CHECK );
  308. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_HIGH_CONTRAST_MODE,
  309. wxEmptyString,
  310. wxBitmap( palette_xpm ),
  311. _( "High Contrast Mode Display" ),
  312. wxITEM_CHECK );
  313. m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_HIGH_CONTRAST_MODE,
  314. DisplayOpt.ContrastModeDisplay );
  315. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_INVISIBLE_TEXT_MODE,
  316. wxEmptyString,
  317. wxBitmap( invisible_text_xpm ),
  318. _( "Show Invisible Text" ),
  319. wxITEM_CHECK );
  320. m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_INVISIBLE_TEXT_MODE,
  321. g_ModuleTextNOVColor & ITEM_NOT_SHOW );
  322. #ifdef MUWAVE_ENBL
  323. m_OptionsToolBar->AddSeparator();
  324. m_OptionsToolBar->AddTool( ID_TB_OPTIONS_SHOW_EXTRA_VERTICAL_TOOLBAR1,
  325. wxEmptyString,
  326. wxBitmap( mw_toolbar_xpm ),
  327. _( "Display/remove auxiliary vertical toolbar (tools for micro wave applications)\n This is a experimental feature (under development)" ),
  328. wxITEM_CHECK );
  329. #endif
  330. m_OptionsToolBar->Realize();
  331. D(printf("ReCreateOptToolbar\n");)
  332. SetToolbars();
  333. }
  334. /********************************************/
  335. void WinEDA_PcbFrame::ReCreateVToolbar()
  336. /********************************************/
  337. /* Create the main vertical right toolbar, showing usual tools
  338. */
  339. {
  340. if( m_VToolBar )
  341. return;
  342. m_VToolBar = new WinEDA_Toolbar( TOOLBAR_TOOL, this, ID_V_TOOLBAR, FALSE );
  343. // Set up toolbar
  344. m_VToolBar->AddTool( ID_NO_SELECT_BUTT, wxEmptyString,
  345. wxBitmap( cursor_xpm ), wxEmptyString, wxITEM_CHECK );
  346. m_VToolBar->ToggleTool( ID_NO_SELECT_BUTT, TRUE );
  347. m_VToolBar->AddSeparator();
  348. m_VToolBar->AddTool( ID_PCB_HIGHLIGHT_BUTT, wxEmptyString,
  349. wxBitmap( net_hightlight_xpm ), _( "Net highlight" ),
  350. wxITEM_CHECK );
  351. m_VToolBar->AddTool( ID_PCB_SHOW_1_RATSNEST_BUTT, wxEmptyString,
  352. wxBitmap( tool_ratsnet_xpm ),
  353. _( "Display local ratsnest (pad or module)" ),
  354. wxITEM_CHECK );
  355. m_VToolBar->AddSeparator();
  356. m_VToolBar->AddTool( ID_COMPONENT_BUTT, wxEmptyString,
  357. wxBitmap( module_xpm ),
  358. _( "Add modules" ), wxITEM_CHECK );
  359. m_VToolBar->AddTool( ID_TRACK_BUTT, wxEmptyString,
  360. wxBitmap( add_tracks_xpm ),
  361. _( "Add tracks and vias" ), wxITEM_CHECK );
  362. m_VToolBar->AddTool( ID_PCB_ZONES_BUTT, wxEmptyString,
  363. wxBitmap( add_zone_xpm ),
  364. _( "Add zones" ), wxITEM_CHECK );
  365. m_VToolBar->AddSeparator();
  366. m_VToolBar->AddTool( ID_LINE_COMMENT_BUTT, wxEmptyString,
  367. wxBitmap( add_dashed_line_xpm ),
  368. _( "Add graphic line or polygon" ), wxITEM_CHECK );
  369. m_VToolBar->AddTool( ID_PCB_CIRCLE_BUTT, wxEmptyString,
  370. wxBitmap( add_circle_xpm ),
  371. _( "Add graphic circle" ), wxITEM_CHECK );
  372. m_VToolBar->AddTool( ID_PCB_ARC_BUTT, wxEmptyString,
  373. wxBitmap( add_arc_xpm ),
  374. _( "Add graphic arc" ), wxITEM_CHECK );
  375. m_VToolBar->AddTool( ID_TEXT_COMMENT_BUTT, wxEmptyString,
  376. wxBitmap( add_text_xpm ),
  377. _( "Add text" ), wxITEM_CHECK );
  378. m_VToolBar->AddSeparator();
  379. m_VToolBar->AddTool( ID_PCB_COTATION_BUTT, wxEmptyString,
  380. wxBitmap( add_cotation_xpm ),
  381. _( "Add dimension" ), wxITEM_CHECK );
  382. m_VToolBar->AddTool( ID_PCB_MIRE_BUTT, wxEmptyString,
  383. wxBitmap( add_mires_xpm ),
  384. _( "Add layer alignment target" ), wxITEM_CHECK );
  385. m_VToolBar->AddSeparator();
  386. m_VToolBar->AddTool( ID_PCB_DELETE_ITEM_BUTT, wxEmptyString,
  387. wxBitmap( delete_body_xpm ),
  388. _( "Delete items" ), wxITEM_CHECK );
  389. m_VToolBar->AddSeparator();
  390. m_VToolBar->AddTool( ID_PCB_PLACE_OFFSET_COORD_BUTT, wxEmptyString,
  391. wxBitmap( pcb_offset_xpm ),
  392. _( "Offset adjust for drill and place files" ),
  393. wxITEM_CHECK );
  394. m_VToolBar->Realize();
  395. D(printf("ReCreateVToolbar\n");)
  396. SetToolbars();
  397. }
  398. /*********************************************/
  399. void WinEDA_PcbFrame::ReCreateAuxVToolbar()
  400. /*********************************************/
  401. /* Create the auxiliary vertical right toolbar, showing tools fo microwave applications
  402. */
  403. {
  404. if( m_AuxVToolBar )
  405. return;
  406. m_AuxVToolBar = new WinEDA_Toolbar( TOOLBAR_TOOL, this,
  407. ID_AUX_V_TOOLBAR, FALSE );
  408. // Set up toolbar
  409. m_AuxVToolBar->AddTool( ID_PCB_MUWAVE_TOOL_SELF_CMD, wxEmptyString,
  410. wxBitmap( mw_Add_Line_xpm ),
  411. _( "Create line of specified length for microwave applications" ) );
  412. m_AuxVToolBar->AddTool( ID_PCB_MUWAVE_TOOL_GAP_CMD, wxEmptyString,
  413. wxBitmap( mw_Add_Gap_xpm ),
  414. _( "Create gap of specified length for microwave applications" ) );
  415. m_AuxVToolBar->AddSeparator();
  416. m_AuxVToolBar->AddTool( ID_PCB_MUWAVE_TOOL_STUB_CMD, wxEmptyString,
  417. wxBitmap( mw_Add_Stub_xpm ),
  418. _( "Create stub of specified length for microwave applications" ) );
  419. m_AuxVToolBar->AddTool( ID_PCB_MUWAVE_TOOL_STUB_ARC_CMD, wxEmptyString,
  420. wxBitmap( mw_Add_stub_arc_xpm ),
  421. _( "Create stub (arc) of specified length for microwave applications" )
  422. );
  423. m_AuxVToolBar->AddTool( ID_PCB_MUWAVE_TOOL_FUNCTION_SHAPE_CMD, wxEmptyString,
  424. wxBitmap( mw_Add_Shape_xpm ),
  425. _( "Create a polynomial shape for microwave applications" ) );
  426. m_AuxVToolBar->Realize();
  427. SetToolbars();
  428. }
  429. /****************************************************/
  430. void WinEDA_PcbFrame::ReCreateAuxiliaryToolbar()
  431. /****************************************************/
  432. /* Create auxiliary horizontal toolbar
  433. * displays:
  434. * existing track width choice
  435. * selection for auto track width
  436. * existing via size choice
  437. * grid size choice
  438. * zoom level choice
  439. */
  440. {
  441. size_t i;
  442. wxString msg;
  443. if( m_AuxiliaryToolBar == NULL )
  444. {
  445. m_AuxiliaryToolBar = new WinEDA_Toolbar( TOOLBAR_AUX, this,
  446. ID_AUX_TOOLBAR, TRUE );
  447. // Set up toolbar
  448. m_AuxiliaryToolBar->AddSeparator();
  449. m_SelTrackWidthBox = new WinEDAChoiceBox( m_AuxiliaryToolBar,
  450. ID_AUX_TOOLBAR_PCB_TRACK_WIDTH,
  451. wxPoint( -1, -1 ),
  452. wxSize( LISTBOX_WIDTH + 20, -1 ) );
  453. m_AuxiliaryToolBar->AddControl( m_SelTrackWidthBox );
  454. m_SelTrackWidthBox_Changed = TRUE;
  455. m_SelClrWidthBox = new WinEDAChoiceBox( m_AuxiliaryToolBar,
  456. ID_AUX_TOOLBAR_PCB_CLR_WIDTH,
  457. wxPoint( -1, -1 ),
  458. wxSize( LISTBOX_WIDTH + 20, -1 ) );
  459. m_AuxiliaryToolBar->AddControl( m_SelClrWidthBox );
  460. m_SelClrWidthBox_Changed = TRUE;
  461. m_AuxiliaryToolBar->AddTool( ID_AUX_TOOLBAR_PCB_SELECT_AUTO_WIDTH,
  462. wxEmptyString,
  463. wxBitmap( auto_track_width_xpm ),
  464. _( "Auto track width: when starting on an existing track use its width\notherwise, use current width setting" ),
  465. wxITEM_CHECK );
  466. m_AuxiliaryToolBar->AddSeparator();
  467. m_SelViaSizeBox = new WinEDAChoiceBox( m_AuxiliaryToolBar,
  468. ID_AUX_TOOLBAR_PCB_VIA_SIZE,
  469. wxPoint( -1, -1 ),
  470. wxSize( LISTBOX_WIDTH + 10, -1 ) );
  471. m_AuxiliaryToolBar->AddControl( m_SelViaSizeBox );
  472. m_AuxiliaryToolBar->AddSeparator();
  473. // Boite de selection du pas de grille
  474. m_SelGridBox = new WinEDAChoiceBox( m_AuxiliaryToolBar,
  475. ID_ON_GRID_SELECT,
  476. wxPoint( -1, -1 ),
  477. wxSize( LISTBOX_WIDTH, -1 ) );
  478. m_AuxiliaryToolBar->AddControl( m_SelGridBox );
  479. // Boite de selection du Zoom
  480. m_AuxiliaryToolBar->AddSeparator();
  481. m_SelZoomBox = new WinEDAChoiceBox( m_AuxiliaryToolBar,
  482. ID_ON_ZOOM_SELECT,
  483. wxPoint( -1, -1 ),
  484. wxSize( LISTBOX_WIDTH, -1 ) );
  485. msg = _( "Auto" );
  486. m_SelZoomBox->Append( msg );
  487. for( int i = 0; i < (int)GetScreen()->m_ZoomList.GetCount(); i++ )
  488. {
  489. msg = _( "Zoom " );
  490. if ( (GetScreen()->m_ZoomList[i] % GetScreen()->m_ZoomScalar) == 0 )
  491. msg << GetScreen()->m_ZoomList[i] / GetScreen()->m_ZoomScalar;
  492. else
  493. {
  494. wxString value;
  495. value.Printf(wxT("%.1f"),(float)GetScreen()->m_ZoomList[i] / GetScreen()->m_ZoomScalar );
  496. msg += value;
  497. }
  498. m_SelZoomBox->Append( msg );
  499. }
  500. m_AuxiliaryToolBar->AddControl( m_SelZoomBox );
  501. // after adding the buttons to the toolbar, must call Realize()
  502. m_AuxiliaryToolBar->Realize();
  503. }
  504. // mise a jour des affichages
  505. m_SelGridBox->Clear();
  506. wxString format = _( "Grid");
  507. if( g_UnitMetric == INCHES )
  508. format += wxT( " %.1f" );
  509. else
  510. format += wxT( " %.3f" );
  511. for( i = 0; i < GetScreen()->m_GridList.GetCount(); i++ )
  512. {
  513. GRID_TYPE grid = GetScreen()->m_GridList[i];
  514. double value = To_User_Unit( g_UnitMetric, grid.m_Size.x, m_InternalUnits );
  515. if( grid.m_Id != ID_POPUP_GRID_USER )
  516. {
  517. if( g_UnitMetric == INCHES )
  518. msg.Printf( format.GetData(), value * 1000 );
  519. else
  520. msg.Printf( format.GetData(), value );
  521. }
  522. else
  523. msg = _( "User Grid" );
  524. m_SelGridBox->Append( msg );
  525. }
  526. m_SelViaSizeBox_Changed = TRUE;
  527. m_SelTrackWidthBox_Changed = TRUE;
  528. m_SelClrWidthBox_Changed = TRUE;
  529. ReCreateLayerBox( NULL );
  530. SetToolbars();
  531. }
  532. /**************************************************************************/
  533. void WinEDA_PcbFrame::UpdateToolbarLayerInfo()
  534. /**************************************************************************/
  535. {
  536. wxASSERT( m_SelLayerBox );
  537. // Activation de l'affichage sur la bonne couche
  538. // Pour eviter la reentrance (Bug wxGTK version Linux?), la selection n'est faite que si
  539. // elle est mauvaise (Pb corrige sur wxGTK 2.6.0)
  540. int count = m_SelLayerBox->GetCount();
  541. int choice = m_SelLayerBox->GetChoice();
  542. int layer = GetScreen()->m_Active_Layer;
  543. for( int listNdx=0; listNdx<count; ++listNdx )
  544. {
  545. if( (int) (size_t) m_SelLayerBox->GetClientData( listNdx ) == layer )
  546. {
  547. if( listNdx != choice )
  548. m_SelLayerBox->SetSelection( listNdx );
  549. break;
  550. }
  551. }
  552. }
  553. /**************************************************************************/
  554. WinEDAChoiceBox* WinEDA_PcbFrame::ReCreateLayerBox( WinEDA_Toolbar* parent )
  555. /**************************************************************************/
  556. {
  557. if( m_SelLayerBox == NULL )
  558. {
  559. if( parent == NULL )
  560. return NULL;
  561. m_SelLayerBox = new WinEDAChoiceBox( parent,
  562. ID_TOOLBARH_PCB_SELECT_LAYER,
  563. wxPoint( -1, -1 ),
  564. #if defined (__UNIX__)
  565. // Width enough for the longest string: "Component (Page Down)"
  566. // Maybe that string is too long?
  567. wxSize( 230, -1 )
  568. #else
  569. wxSize( LISTBOX_WIDTH + 40, -1 )
  570. #endif
  571. );
  572. parent->AddControl( m_SelLayerBox );
  573. }
  574. int layer_mask = g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount - 1];
  575. layer_mask |= ALL_NO_CU_LAYERS;
  576. unsigned length = 0;
  577. m_SelLayerBox->Clear();
  578. for( int layer=0, listNdx=0; layer <= EDGE_N; layer++ )
  579. {
  580. // List to append hotkeys in layer box selection
  581. static const int HK_SwitchLayer[EDGE_N + 1] = {
  582. HK_SWITCH_LAYER_TO_COPPER,
  583. HK_SWITCH_LAYER_TO_INNER1,
  584. HK_SWITCH_LAYER_TO_INNER2,
  585. HK_SWITCH_LAYER_TO_INNER3,
  586. HK_SWITCH_LAYER_TO_INNER4,
  587. HK_SWITCH_LAYER_TO_INNER5,
  588. HK_SWITCH_LAYER_TO_INNER6,
  589. HK_SWITCH_LAYER_TO_INNER7,
  590. HK_SWITCH_LAYER_TO_INNER8,
  591. HK_SWITCH_LAYER_TO_INNER9,
  592. HK_SWITCH_LAYER_TO_INNER10,
  593. HK_SWITCH_LAYER_TO_INNER11,
  594. HK_SWITCH_LAYER_TO_INNER12,
  595. HK_SWITCH_LAYER_TO_INNER13,
  596. HK_SWITCH_LAYER_TO_INNER14,
  597. HK_SWITCH_LAYER_TO_COMPONENT
  598. };
  599. if( g_TabOneLayerMask[layer] & layer_mask )
  600. {
  601. wxString msg = GetBoard()->GetLayerName( layer );
  602. msg = AddHotkeyName( msg, s_Board_Editor_Hokeys_Descr,
  603. HK_SwitchLayer[layer] );
  604. m_SelLayerBox->Append( msg );
  605. //D(printf("appending layername=%s, ndx=%d, layer=%d\n", CONV_TO_UTF8(msg), listNdx, layer );)
  606. m_SelLayerBox->SetClientData( listNdx, (void*) layer );
  607. length = MAX( length, msg.Len() );
  608. listNdx++;
  609. }
  610. }
  611. m_SelLayerBox->SetToolTip( _( "+/- to switch" ) );
  612. UpdateToolbarLayerInfo();
  613. return m_SelLayerBox;
  614. }