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.

321 lines
8.3 KiB

  1. /*************************************************************************/
  2. /* viewlib_frame.cpp - fonctions des classes du type WinEDA_ViewlibFrame */
  3. /*************************************************************************/
  4. #ifdef __GNUG__
  5. #pragma implementation
  6. #endif
  7. #include "fctsys.h"
  8. #include "common.h"
  9. #include "program.h"
  10. #include "libcmp.h"
  11. #include "general.h"
  12. #include "bitmaps.h"
  13. #include "protos.h"
  14. #include "id.h"
  15. #include "library_browse.xpm"
  16. /*****************************/
  17. /* class WinEDA_ViewlibFrame */
  18. /*****************************/
  19. BEGIN_EVENT_TABLE(WinEDA_ViewlibFrame, wxFrame)
  20. COMMON_EVENTS_DRAWFRAME
  21. EVT_CLOSE(WinEDA_ViewlibFrame::OnCloseWindow)
  22. EVT_SIZE(WinEDA_ViewlibFrame::OnSize)
  23. EVT_ACTIVATE(WinEDA_DrawFrame::OnActivate)
  24. EVT_TOOL_RANGE(ID_LIBVIEW_START_H_TOOL, ID_LIBVIEW_END_H_TOOL,
  25. WinEDA_ViewlibFrame::Process_Special_Functions)
  26. EVT_TOOL_RANGE(ID_ZOOM_PLUS_BUTT, ID_ZOOM_PAGE_BUTT,
  27. WinEDA_DrawFrame::Process_Zoom)
  28. EVT_TOOL(ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC,
  29. WinEDA_ViewlibFrame::ExportToSchematicLibraryPart)
  30. EVT_KICAD_CHOICEBOX(ID_LIBVIEW_SELECT_PART_NUMBER,
  31. WinEDA_ViewlibFrame::Process_Special_Functions)
  32. EVT_LISTBOX(ID_LIBVIEW_LIB_LIST, WinEDA_ViewlibFrame::ClickOnLibList)
  33. EVT_LISTBOX(ID_LIBVIEW_CMP_LIST, WinEDA_ViewlibFrame::ClickOnCmpList)
  34. END_EVENT_TABLE()
  35. /****************/
  36. /* Constructeur */
  37. /****************/
  38. WinEDA_ViewlibFrame::WinEDA_ViewlibFrame(wxWindow * father, WinEDA_App *parent,
  39. LibraryStruct * Library, wxSemaphore * semaphore ):
  40. WinEDA_DrawFrame(father, VIEWER_FRAME, parent, _("Library browser"),
  41. wxDefaultPosition, wxDefaultSize)
  42. {
  43. m_FrameName = wxT("ViewlibFrame");
  44. m_Draw_Axis = TRUE; // TRUE pour avoir les axes dessines
  45. m_Draw_Grid = TRUE; // TRUE pour avoir la axes dessinee
  46. // Give an icon
  47. SetIcon(wxIcon(library_browse_xpm));
  48. m_CmpList = NULL;
  49. m_LibList = NULL;
  50. m_Semaphore = semaphore;
  51. if ( m_Semaphore ) SetWindowStyle( GetWindowStyle() | wxSTAY_ON_TOP);
  52. m_CurrentScreen = new SCH_SCREEN(VIEWER_FRAME);
  53. m_CurrentScreen->SetZoom(16);
  54. if ( Library == NULL )
  55. {
  56. m_LibListSize.x = 90;
  57. m_LibListSize.y = -1;
  58. m_LibList = new wxListBox(this, ID_LIBVIEW_LIB_LIST,wxPoint(0,0),
  59. m_LibListSize, 0, NULL, wxLB_HSCROLL );
  60. m_LibList->SetFont(*g_DialogFont);
  61. m_LibList->SetBackgroundColour(wxColour(150,255,255));
  62. m_LibList->SetForegroundColour(wxColour(0,0,0));
  63. }
  64. else g_CurrentViewLibraryName = Library->m_Name;
  65. m_CmpListSize.x = 150;
  66. m_CmpListSize.y = -1;
  67. m_CmpList = new wxListBox(this, ID_LIBVIEW_CMP_LIST,wxPoint(m_LibListSize.x,0),
  68. m_CmpListSize, 0, NULL, wxLB_HSCROLL );
  69. m_CmpList->SetFont(*g_DialogFont);
  70. m_CmpList->SetBackgroundColour(wxColour(255,255,200));
  71. m_CmpList->SetForegroundColour(wxColour(0,0,0));
  72. GetSettings();
  73. SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y);
  74. ReCreateHToolbar();
  75. ReCreateVToolbar();
  76. if ( m_LibList) ReCreateListLib();
  77. DisplayLibInfos();
  78. Show(TRUE);
  79. }
  80. /***************/
  81. /* Destructeur */
  82. /***************/
  83. WinEDA_ViewlibFrame::~WinEDA_ViewlibFrame()
  84. {
  85. delete m_CurrentScreen;
  86. m_Parent->m_ViewlibFrame = NULL;
  87. }
  88. /*****************************************************************/
  89. void WinEDA_ViewlibFrame::OnCloseWindow(wxCloseEvent & Event)
  90. /*****************************************************************/
  91. {
  92. SaveSettings();
  93. if ( m_Semaphore ) m_Semaphore->Post();
  94. Destroy();
  95. }
  96. /*****************************************************/
  97. void WinEDA_ViewlibFrame::OnSize(wxSizeEvent & SizeEv)
  98. /*****************************************************/
  99. {
  100. wxSize size;
  101. wxSize maintoolbar_size;
  102. wxSize Vtoolbar_size;
  103. GetClientSize(&size.x, &size.y);
  104. m_FrameSize = size;
  105. size.y -= m_MsgFrameHeight;
  106. if( m_HToolBar )
  107. {
  108. maintoolbar_size = m_HToolBar->GetSize();
  109. }
  110. if( m_VToolBar )
  111. {
  112. Vtoolbar_size = m_VToolBar->GetSize();
  113. m_VToolBar->SetSize(size.x - maintoolbar_size.y, 0,-1, size.y);
  114. }
  115. if ( MsgPanel )
  116. {
  117. MsgPanel->SetSize(0, size.y, size.x, m_MsgFrameHeight);
  118. }
  119. if ( DrawPanel )
  120. {
  121. DrawPanel->SetSize(m_LibListSize.x + m_CmpListSize.x, 0,
  122. size.x - Vtoolbar_size.x - m_LibListSize.x - m_CmpListSize.x,
  123. size.y);
  124. }
  125. if ( m_LibList )
  126. {
  127. m_LibListSize.y = size.y;
  128. m_LibList->SetSize(0, 0, m_LibListSize.x, m_LibListSize.y);
  129. }
  130. if ( m_CmpList )
  131. {
  132. m_CmpListSize.y = size.y;
  133. m_CmpList->SetSize(m_LibListSize.x, 0, m_CmpListSize.x, m_CmpListSize.y);
  134. }
  135. }
  136. /*******************************************/
  137. int WinEDA_ViewlibFrame::BestZoom()
  138. /*******************************************/
  139. {
  140. int bestzoom, ii, jj;
  141. wxSize size, itemsize;
  142. EDA_LibComponentStruct * CurrentLibEntry = NULL;
  143. CurrentLibEntry = FindLibPart(g_CurrentViewComponentName.GetData(),
  144. g_CurrentViewLibraryName.GetData(), FIND_ROOT);
  145. if( CurrentLibEntry == NULL )
  146. {
  147. bestzoom = 16;
  148. m_CurrentScreen->m_Curseur.x = 0;
  149. m_CurrentScreen->m_Curseur.y = 0;
  150. return(bestzoom);
  151. }
  152. EDA_Rect BoundaryBox = CurrentLibEntry->GetBoundaryBox(g_ViewUnit, g_ViewConvert);
  153. itemsize = BoundaryBox.GetSize();
  154. size = DrawPanel->GetClientSize();
  155. size.x -= 60; // Pour marges haut et bas
  156. ii = itemsize.x / size.x;
  157. jj = itemsize.y / size.y;
  158. ii = MAX(ii, jj);
  159. /* determination du zoom existant le plus proche */
  160. for ( bestzoom = 1 ; bestzoom < 512 ; bestzoom <<= 1 )
  161. {
  162. if(bestzoom > ii ) break;
  163. }
  164. m_CurrentScreen->m_Curseur = BoundaryBox.Centre();
  165. m_CurrentScreen->m_Curseur.y = - m_CurrentScreen->m_Curseur.y;
  166. return(bestzoom);
  167. }
  168. /***************************************************/
  169. void WinEDA_ViewlibFrame::ReCreateListLib()
  170. /***************************************************/
  171. {
  172. const wxChar ** ListNames, ** names;
  173. int ii;
  174. bool found = FALSE;
  175. if ( m_LibList == NULL ) return;
  176. ListNames = GetLibNames();
  177. m_LibList->Clear();
  178. for ( names = ListNames, ii = 0; *names != NULL; names++, ii++ )
  179. {
  180. m_LibList->Append(*names);
  181. if ( g_CurrentViewLibraryName.Cmp(*names) == 0)
  182. {
  183. m_LibList->SetSelection(ii, TRUE);
  184. found = TRUE;
  185. }
  186. }
  187. free (ListNames);
  188. /* Librairie courante peut etre non retrouv�e en liste
  189. (peut etre efface lors d'une modification de configuration) */
  190. if ( ! found )
  191. {
  192. g_CurrentViewLibraryName.Empty();
  193. g_CurrentViewComponentName.Empty();
  194. }
  195. ReCreateListCmp();
  196. ReCreateHToolbar();
  197. DisplayLibInfos();
  198. ReDrawPanel();
  199. }
  200. /***********************************************/
  201. void WinEDA_ViewlibFrame::ReCreateListCmp()
  202. /***********************************************/
  203. {
  204. int ii;
  205. EDA_LibComponentStruct *LibEntry = NULL;
  206. LibraryStruct *Library = FindLibrary(g_CurrentViewLibraryName.GetData());
  207. m_CmpList->Clear();
  208. ii = 0;
  209. g_CurrentViewComponentName.Empty();
  210. g_ViewConvert = 1; /* Vue normal / convert */
  211. g_ViewUnit = 1; /* unit� a afficher (A, B ..) */
  212. if ( Library )
  213. LibEntry = (EDA_LibComponentStruct *) PQFirst(&Library->m_Entries, FALSE);
  214. while( LibEntry )
  215. {
  216. m_CmpList->Append(LibEntry->m_Name.m_Text);
  217. LibEntry = (EDA_LibComponentStruct *) PQNext(Library->m_Entries, LibEntry, NULL);
  218. }
  219. }
  220. /********************************************************************/
  221. void WinEDA_ViewlibFrame::ClickOnLibList(wxCommandEvent & event)
  222. /********************************************************************/
  223. {
  224. int ii = m_LibList->GetSelection();
  225. if ( ii < 0 ) return;
  226. wxString name = m_LibList->GetString(ii);
  227. if ( g_CurrentViewLibraryName == name ) return;
  228. g_CurrentViewLibraryName = name;
  229. ReCreateListCmp();
  230. ReDrawPanel();
  231. DisplayLibInfos();
  232. ReCreateHToolbar();
  233. }
  234. /****************************************************************/
  235. void WinEDA_ViewlibFrame::ClickOnCmpList(wxCommandEvent & event)
  236. /****************************************************************/
  237. {
  238. int ii = m_CmpList->GetSelection();
  239. if ( ii < 0 ) return;
  240. wxString name = m_CmpList->GetString(ii);
  241. g_CurrentViewComponentName = name;
  242. DisplayLibInfos();
  243. g_ViewUnit = 1;
  244. g_ViewConvert = 1;
  245. Zoom_Automatique(FALSE);
  246. ReCreateHToolbar();
  247. ReDrawPanel();
  248. }
  249. /****************************************************************************/
  250. void WinEDA_ViewlibFrame::ExportToSchematicLibraryPart(wxCommandEvent& event)
  251. /****************************************************************************/
  252. /* Export to schematic the current viewed component, and close the library browser
  253. */
  254. {
  255. int ii = m_CmpList->GetSelection();
  256. if ( ii >= 0 ) g_CurrentViewComponentName = m_CmpList->GetString(ii);
  257. else g_CurrentViewComponentName.Empty();
  258. Close(TRUE);
  259. }