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.

742 lines
27 KiB

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