/*********************************/ /* get_component_dialog.cpp */ /*********************************/ #include "fctsys.h" #include "gr_basic.h" #include "common.h" #include "macros.h" #include "wxstruct.h" /****************************************************************************/ /* Show a dialog frame to choose a name from an history list, or a new name */ /* to select a component or a module */ /****************************************************************************/ static unsigned s_HistoryMaxCount = 8; // Max number of items displayed in history list static wxString s_ItemName; enum selcmp_id { ID_ACCEPT_NAME = 3900, ID_ACCEPT_KEYWORD, ID_ENTER_NAME, ID_CANCEL, ID_LIST_ALL, ID_EXTRA_TOOL, ID_SEL_BY_LISTBOX }; /***************************************/ class WinEDA_SelectCmp: public wxDialog /***************************************/ { private: WinEDA_DrawFrame * m_Parent; bool m_AuxTool; wxString * m_Text; wxTextCtrl * m_TextCtrl; wxListBox * m_List; public: bool m_GetExtraFunction; public: // Constructor and destructor WinEDA_SelectCmp(WinEDA_DrawFrame *parent, const wxPoint& framepos, wxArrayString & HistoryList, const wxString & Title, bool show_extra_tool ); ~WinEDA_SelectCmp() {}; private: void Accept(wxCommandEvent& event); void GetExtraSelection(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(WinEDA_SelectCmp, wxDialog) EVT_BUTTON(ID_ACCEPT_NAME, WinEDA_SelectCmp::Accept) EVT_BUTTON(ID_ACCEPT_KEYWORD, WinEDA_SelectCmp::Accept) EVT_BUTTON(ID_CANCEL, WinEDA_SelectCmp::Accept) EVT_BUTTON(ID_LIST_ALL, WinEDA_SelectCmp::Accept) EVT_BUTTON(ID_EXTRA_TOOL, WinEDA_SelectCmp::GetExtraSelection) EVT_LISTBOX(ID_SEL_BY_LISTBOX, WinEDA_SelectCmp::Accept) END_EVENT_TABLE() /****************************************************************************/ WinEDA_SelectCmp::WinEDA_SelectCmp(WinEDA_DrawFrame *parent, const wxPoint& framepos, wxArrayString & HistoryList, const wxString & Title, bool show_extra_tool ): wxDialog(parent, -1, Title, framepos, wxDefaultSize, DIALOG_STYLE) /****************************************************************************/ /* Dialog frame to choose a component or a footprint This dialog shows an history of last selected items */ { wxButton * Button; wxStaticText * Text; m_Parent = parent; m_AuxTool = show_extra_tool; m_GetExtraFunction = FALSE; SetFont(*g_DialogFont); s_ItemName.Empty(); m_Text = & s_ItemName; wxBoxSizer* MainBoxSizer = new wxBoxSizer(wxHORIZONTAL); SetSizer(MainBoxSizer); wxBoxSizer* LeftBoxSizer = new wxBoxSizer(wxVERTICAL); MainBoxSizer->Add(LeftBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxADJUST_MINSIZE, 5); wxBoxSizer* RightBoxSizer = new wxBoxSizer(wxVERTICAL); MainBoxSizer->Add(RightBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); Text = new wxStaticText(this, -1, _("Name:")); LeftBoxSizer->Add(Text, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5); m_TextCtrl = new wxTextCtrl(this, ID_ENTER_NAME, *m_Text); m_TextCtrl->SetInsertionPoint(1); LeftBoxSizer->Add(m_TextCtrl, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM|wxADJUST_MINSIZE, 5); Text = new wxStaticText(this, -1, _("History list:")); LeftBoxSizer->Add(Text, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5); m_List = new wxListBox(this, ID_SEL_BY_LISTBOX, wxDefaultPosition, wxSize(220, -1), HistoryList, wxLB_SINGLE ); LeftBoxSizer->Add(m_List, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM|wxADJUST_MINSIZE, 5); Button = new wxButton(this, ID_ACCEPT_NAME, _("OK")); Button->SetForegroundColour(*wxRED); Button->SetDefault(); RightBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxBOTTOM, 5); Button = new wxButton(this, ID_ACCEPT_KEYWORD, _("Search KeyWord")); Button->SetForegroundColour(*wxRED); RightBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); Button = new wxButton(this, ID_CANCEL, _("Cancel")); Button->SetForegroundColour(*wxBLUE); RightBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); Button = new wxButton(this, ID_LIST_ALL, _("List All")); Button->SetForegroundColour(wxColor(0, 80, 0)); RightBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); #ifndef __WXMAC__ if ( m_AuxTool ) /* The selection can be done by an extra function */ { Button = new wxButton(this, ID_EXTRA_TOOL, _("By Lib Browser")); Button->SetForegroundColour(wxColor(0, 0, 0)); // Listbox Color RightBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); } #endif GetSizer()->Fit(this); GetSizer()->SetSizeHints(this); } /*********************************************************/ void WinEDA_SelectCmp::Accept(wxCommandEvent& event) /*********************************************************/ { switch (event.GetId() ) { case ID_SEL_BY_LISTBOX: *m_Text = m_List->GetStringSelection(); break; case ID_ACCEPT_NAME: *m_Text = m_TextCtrl->GetValue(); break; case ID_ACCEPT_KEYWORD: *m_Text = wxT("= ") + m_TextCtrl->GetValue(); break; case ID_CANCEL: *m_Text = wxEmptyString; break; case ID_LIST_ALL: *m_Text = wxT("*"); break; } m_Text->Trim(FALSE); // Remove blanks at beginning m_Text->Trim(TRUE); // Remove blanks at end Close(TRUE); } /**************************************************************/ void WinEDA_SelectCmp::GetExtraSelection(wxCommandEvent& event) /**************************************************************/ /* Get the component name by the extra function */ { m_GetExtraFunction = TRUE; Close(TRUE); } /******************************************************************************/ wxString GetComponentName(WinEDA_DrawFrame * frame, wxArrayString & HistoryList, const wxString & Title, wxString(*AuxTool)(WinEDA_DrawFrame *parent)) /*******************************************************************************/ /* Dialog frame to choose a component name */ { wxPoint framepos; int x, y, w, h; bool GetExtraFunction; framepos = wxGetMousePosition(); wxClientDisplayRect(&x, &y, &w, &h); framepos.x -= 100; framepos.y -= 50; if ( framepos.x < x ) framepos.x = x; if ( framepos.y < y ) framepos.y = y; if ( framepos.x < x ) framepos.x = x; x += w -350; if ( framepos.x > x ) framepos.x = x; if ( framepos.y < y ) framepos.y = y; WinEDA_SelectCmp * selframe = new WinEDA_SelectCmp(frame, framepos, HistoryList, Title, AuxTool ? TRUE : FALSE); selframe->ShowModal(); GetExtraFunction = selframe->m_GetExtraFunction; selframe->Destroy(); if ( GetExtraFunction ) s_ItemName = AuxTool(frame); return s_ItemName; } /*******************************************************************************/ void AddHistoryComponentName(wxArrayString & HistoryList, const wxString & Name) /*******************************************************************************/ /* Add the string "Name" to the history list HistoryList */ { int ii, c_max; if ( HistoryList.GetCount() > 0) { if (Name == HistoryList[0] ) return; /* remove an old identical selection if exists */ for ( ii = 1; (unsigned)ii < HistoryList.GetCount(); ii ++ ) { if ( Name == HistoryList[ii] ) { HistoryList.RemoveAt(ii); ii--; } } /* shift the list */ if ( HistoryList.GetCount() < s_HistoryMaxCount ) HistoryList.Add(wxT("")); c_max = HistoryList.GetCount() - 2; for ( ii = c_max; ii >= 0 ; ii -- ) HistoryList[ii+1] = HistoryList[ii]; /* Add the new name at the beginning of the history list */ HistoryList[0] = Name; } else HistoryList.Add(Name); }