236 lines
5.5 KiB
C++
236 lines
5.5 KiB
C++
/****************/
|
|
/* displlst.cpp */
|
|
/****************/
|
|
|
|
#include "fctsys.h"
|
|
#include "wxstruct.h"
|
|
#include "gr_basic.h"
|
|
#include "common.h"
|
|
#include "macros.h"
|
|
#include "kicad_string.h"
|
|
|
|
|
|
enum listbox {
|
|
ID_LISTBOX_LIST = 8000
|
|
};
|
|
|
|
|
|
BEGIN_EVENT_TABLE( WinEDAListBox, wxDialog )
|
|
EVT_BUTTON( wxID_OK, WinEDAListBox::OnOkClick )
|
|
EVT_BUTTON( wxID_CANCEL, WinEDAListBox::OnCancelClick )
|
|
EVT_LISTBOX( ID_LISTBOX_LIST, WinEDAListBox::ClickOnList )
|
|
EVT_LISTBOX_DCLICK( ID_LISTBOX_LIST, WinEDAListBox::D_ClickOnList )
|
|
EVT_CHAR( WinEDAListBox::OnKeyEvent )
|
|
EVT_CHAR_HOOK( WinEDAListBox::OnKeyEvent )
|
|
EVT_CLOSE( WinEDAListBox::OnClose )
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
/* Used to display a list of elements for selection.
|
|
* ITEMLIST* = pointer to the list of names
|
|
* = Reftext preselection
|
|
* = Movefct callback function to display comments
|
|
*/
|
|
WinEDAListBox::WinEDAListBox( WinEDA_DrawFrame* parent, const wxString& title,
|
|
const wxChar** itemlist, const wxString& reftext,
|
|
void(* movefct)(wxString& Text) ,
|
|
const wxColour& colour, wxPoint dialog_position ) :
|
|
wxDialog( parent, -1, title, dialog_position, wxDefaultSize,
|
|
wxDEFAULT_DIALOG_STYLE | MAYBE_RESIZE_BORDER )
|
|
{
|
|
const wxChar** names;
|
|
|
|
m_ItemList = itemlist;
|
|
m_Parent = parent;
|
|
m_MoveFct = movefct;
|
|
m_WinMsg = NULL;
|
|
SetReturnCode( -1 );
|
|
|
|
wxBoxSizer* GeneralBoxSizer = new wxBoxSizer( wxVERTICAL );
|
|
|
|
SetSizer( GeneralBoxSizer );
|
|
|
|
m_List = new wxListBox( this, ID_LISTBOX_LIST, wxDefaultPosition,
|
|
wxSize( 300, 200 ), 0, NULL,
|
|
wxLB_NEEDED_SB | wxLB_SINGLE | wxLB_HSCROLL );
|
|
|
|
if( colour != wxNullColour )
|
|
{
|
|
m_List->SetBackgroundColour( colour );
|
|
m_List->SetForegroundColour( *wxBLACK );
|
|
}
|
|
|
|
GeneralBoxSizer->Add( m_List, 0, wxGROW | wxALL, 5 );
|
|
|
|
if( itemlist )
|
|
{
|
|
for( names = m_ItemList; *names != NULL; names++ )
|
|
m_List->Append( *names );
|
|
}
|
|
|
|
if( m_MoveFct )
|
|
{
|
|
m_WinMsg = new wxTextCtrl( this, -1, wxEmptyString,
|
|
wxDefaultPosition, wxSize( -1, 60 ),
|
|
wxTE_READONLY | wxTE_MULTILINE );
|
|
|
|
GeneralBoxSizer->Add( m_WinMsg, 0, wxGROW | wxALL, 5 );
|
|
}
|
|
|
|
wxSizer* buttonSizer = CreateButtonSizer( wxOK | wxCANCEL );
|
|
|
|
if( buttonSizer )
|
|
GeneralBoxSizer->Add( buttonSizer, 0, wxGROW | wxALL, 5 );
|
|
|
|
GetSizer()->Fit( this );
|
|
GetSizer()->SetSizeHints( this );
|
|
|
|
if( dialog_position == wxDefaultPosition )
|
|
{
|
|
Centre();
|
|
}
|
|
else // Ensure the window dialog is inside the main window :
|
|
{
|
|
wxPoint pos = dialog_position;
|
|
wxPoint maxpos;
|
|
maxpos.x = parent->GetPosition().x + parent->GetSize().x;
|
|
maxpos.y = parent->GetPosition().y + parent->GetSize().y;
|
|
wxPoint endpoint;
|
|
endpoint.x = pos.x + GetSize().x;
|
|
endpoint.y = pos.y + GetSize().y;
|
|
|
|
if( endpoint.x > maxpos.x )
|
|
pos.x -= endpoint.x - maxpos.x;
|
|
if( endpoint.y > maxpos.y )
|
|
pos.y -= endpoint.y - maxpos.y;
|
|
|
|
if( pos.x < parent->GetPosition().x )
|
|
pos.x = parent->GetPosition().x;
|
|
if( pos.y < parent->GetPosition().y )
|
|
pos.y = parent->GetPosition().y;
|
|
Move( pos );
|
|
}
|
|
}
|
|
|
|
|
|
WinEDAListBox::~WinEDAListBox()
|
|
{
|
|
}
|
|
|
|
|
|
void WinEDAListBox::MoveMouseToOrigin()
|
|
{
|
|
int x, y, w, h;
|
|
wxSize list_size = m_List->GetSize();
|
|
int orgx = m_List->GetRect().GetLeft();
|
|
int orgy = m_List->GetRect().GetTop();
|
|
|
|
wxClientDisplayRect( &x, &y, &w, &h );
|
|
|
|
WarpPointer( x + orgx + 20, y + orgy + (list_size.y / 2) );
|
|
}
|
|
|
|
|
|
wxString WinEDAListBox::GetTextSelection()
|
|
{
|
|
wxString text = m_List->GetStringSelection();
|
|
|
|
return text;
|
|
}
|
|
|
|
|
|
void WinEDAListBox::Append( const wxString& item )
|
|
{
|
|
m_List->Append( item );
|
|
}
|
|
|
|
|
|
void WinEDAListBox::InsertItems( const wxArrayString& itemlist, int position )
|
|
{
|
|
m_List->InsertItems( itemlist, position );
|
|
}
|
|
|
|
|
|
void WinEDAListBox::OnCancelClick( wxCommandEvent& event )
|
|
{
|
|
EndModal( -1 );
|
|
}
|
|
|
|
|
|
void WinEDAListBox::ClickOnList( wxCommandEvent& event )
|
|
{
|
|
wxString text;
|
|
|
|
if( m_MoveFct )
|
|
{
|
|
m_WinMsg->Clear();
|
|
text = m_List->GetStringSelection();
|
|
m_MoveFct( text );
|
|
m_WinMsg->WriteText( text );
|
|
}
|
|
}
|
|
|
|
|
|
void WinEDAListBox::D_ClickOnList( wxCommandEvent& event )
|
|
{
|
|
int ii = m_List->GetSelection();
|
|
|
|
EndModal( ii );
|
|
}
|
|
|
|
|
|
void WinEDAListBox::OnOkClick( wxCommandEvent& event )
|
|
{
|
|
int ii = m_List->GetSelection();
|
|
|
|
EndModal( ii );
|
|
}
|
|
|
|
|
|
void WinEDAListBox::OnClose( wxCloseEvent& event )
|
|
{
|
|
EndModal( -1 );
|
|
}
|
|
|
|
|
|
/* Sort alphabetically, case insensitive.
|
|
*/
|
|
static int SortItems( const wxString** ptr1, const wxString** ptr2 )
|
|
{
|
|
return StrNumICmp( (*ptr1)->GetData(), (*ptr2)->GetData() );
|
|
}
|
|
|
|
|
|
void WinEDAListBox:: SortList()
|
|
{
|
|
int ii, NbItems = m_List->GetCount();
|
|
const wxString** BufList;
|
|
|
|
if( NbItems <= 0 )
|
|
return;
|
|
|
|
BufList = (const wxString**) MyZMalloc( 100 * NbItems * sizeof(wxString*) );
|
|
for( ii = 0; ii < NbItems; ii++ )
|
|
{
|
|
BufList[ii] = new wxString( m_List->GetString (ii) );
|
|
}
|
|
|
|
qsort( BufList, NbItems, sizeof(wxString*),
|
|
( int( * ) ( const void*, const void* ) )SortItems );
|
|
|
|
m_List->Clear();
|
|
for( ii = 0; ii < NbItems; ii++ )
|
|
{
|
|
m_List->Append( *BufList[ii] );
|
|
delete BufList[ii];
|
|
}
|
|
|
|
free( BufList );
|
|
}
|
|
|
|
|
|
void WinEDAListBox::OnKeyEvent( wxKeyEvent& event )
|
|
{
|
|
event.Skip();
|
|
}
|