]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - tools/src/tools/configtool/standalone/wxwin/platformsdlg.cpp
Initial revision
[karo-tx-redboot.git] / tools / src / tools / configtool / standalone / wxwin / platformsdlg.cpp
diff --git a/tools/src/tools/configtool/standalone/wxwin/platformsdlg.cpp b/tools/src/tools/configtool/standalone/wxwin/platformsdlg.cpp
new file mode 100644 (file)
index 0000000..8249e06
--- /dev/null
@@ -0,0 +1,382 @@
+//####COPYRIGHTBEGIN####
+//
+// ----------------------------------------------------------------------------
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+//
+// This program is part of the eCos host tools.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along with
+// this program; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+// ----------------------------------------------------------------------------
+//
+//####COPYRIGHTEND####
+// platformsdlg.cpp :
+//
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   julians
+// Contact(s):  julians
+// Date:        2000/09/06
+// Version:     $Id$
+// Purpose:
+// Description: Implementation file for the ecPlatformsDialog
+// Requires:
+// Provides:
+// See also:
+// Known bugs:
+// Usage:
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "platformsdlg.h"
+#endif
+
+// Includes other headers for precompiled compilation
+#include "ecpch.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "wx/cshelp.h"
+
+#include "configtool.h"
+#include "platformsdlg.h"
+#include "platformeditordlg.h"
+
+#ifdef __WXMSW__
+#include "wx/msw/winundef.h"
+#endif
+
+BEGIN_EVENT_TABLE(ecPlatformsDialog, ecDialog)
+    EVT_BUTTON(ecID_PLATFORMS_MODIFY, ecPlatformsDialog::OnModify)
+    EVT_BUTTON(ecID_PLATFORMS_ADD, ecPlatformsDialog::OnAdd)
+    EVT_BUTTON(ecID_PLATFORMS_DELETE, ecPlatformsDialog::OnDelete)
+    EVT_BUTTON(wxID_OK, ecPlatformsDialog::OnOK)
+    EVT_BUTTON(wxID_CANCEL, ecPlatformsDialog::OnCancel)
+    EVT_UPDATE_UI(ecID_PLATFORMS_MODIFY, ecPlatformsDialog::OnUpdateAny)
+    EVT_UPDATE_UI(ecID_PLATFORMS_DELETE, ecPlatformsDialog::OnUpdateAny)
+END_EVENT_TABLE()
+
+const wxChar* ecPlatformsDialog::sm_arpszTypes[]={
+  wxT("Hardware with breakpoint support"),
+  wxT("Simulator"),
+  wxT("Synthetic target"),
+  wxT("Hardware without breakpoint support"),
+  wxT("Remote simulator")
+};
+
+
+// Frame constructor
+ecPlatformsDialog::ecPlatformsDialog(wxWindow* parent)
+{
+    m_listCtrl = NULL;
+
+    SetExtraStyle(wxDIALOG_EX_CONTEXTHELP);
+
+    ecDialog::Create(parent, ecID_PLATFORMS_DIALOG, _("Platforms"),
+        wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER);
+
+    CreateControls(this);
+
+    Centre(wxBOTH);
+
+    unsigned int i;
+    for(i=0; i < CeCosTestPlatform::Count(); i++)
+    {
+        Add(*CeCosTestPlatform::Get(i));
+    }
+}
+
+ecPlatformsDialog::~ecPlatformsDialog()
+{
+    Clear();
+}
+
+void ecPlatformsDialog::Clear()
+{
+    wxNode* node = m_arTargetInfo.First();
+    while (node)
+    {
+        CeCosTestPlatform* platform = (CeCosTestPlatform*) node->Data();
+        delete platform;
+        node = node->Next();
+    }
+    m_arTargetInfo.Clear();
+}
+
+void ecPlatformsDialog::CreateControls(wxWindow* parent)
+{
+    // Create custom windows first
+    m_listCtrl = new ecPlatformsListCtrl(parent, ecID_PLATFORMS_LIST, wxDefaultPosition, wxSize(450, 300), wxLC_REPORT|wxCLIP_CHILDREN|wxSUNKEN_BORDER);
+    m_listCtrl->InsertColumn(0, _("Target"), wxLIST_FORMAT_LEFT, 70);
+    m_listCtrl->InsertColumn(1, _("Prefix"), wxLIST_FORMAT_LEFT, 70);
+    m_listCtrl->InsertColumn(2, _("Commands"), wxLIST_FORMAT_LEFT, 70);
+    m_listCtrl->InsertColumn(3, _("Inferior"), wxLIST_FORMAT_LEFT, 70);
+    m_listCtrl->InsertColumn(4, _("Prompt"), wxLIST_FORMAT_LEFT, 70);
+    m_listCtrl->InsertColumn(5, _("ServerSideGdb"), wxLIST_FORMAT_LEFT, 80);
+
+    wxSizer *item0 = new wxBoxSizer( wxVERTICAL );
+
+    wxSizer *item1 = new wxBoxSizer( wxHORIZONTAL );
+
+    wxButton *item2 = new wxButton( parent, ecID_PLATFORMS_MODIFY, _("&Modify..."), wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item2, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item3 = new wxButton( parent, ecID_PLATFORMS_ADD, _("&Add..."), wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item3, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item4 = new wxButton( parent, ecID_PLATFORMS_DELETE, _("&Delete..."), wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item4, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item5 = new wxButton( parent, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item6 = new wxButton( parent, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+#ifdef __WXGTK__
+    wxButton *contextButton = new wxContextHelpButton( parent );
+    item1->Add( contextButton, 0, wxALIGN_CENTRE|wxALL, 5 );
+#endif
+
+    item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxWindow *item7 = parent->FindWindow( ecID_PLATFORMS_LIST );
+    wxASSERT( item7 );
+    item0->Add( item7, 2, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+#if 0
+    wxSizer *item0 = new wxBoxSizer( wxVERTICAL );
+
+    wxSizer *item1 = new wxBoxSizer( wxHORIZONTAL );
+
+    wxButton *item2 = new wxButton( parent, ecID_PLATFORMS_MODIFY, "&Modify...", wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item2, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item3 = new wxButton( parent, ecID_PLATFORMS_ADD, "&Add...", wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item3, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item4 = new wxButton( parent, ecID_PLATFORMS_DELETE, "&Delete...", wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item4, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item5 = new wxButton( parent, wxID_OK, "&OK", wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item6 = new wxButton( parent, wxID_CANCEL, "&Cancel", wxDefaultPosition, wxDefaultSize, 0 );
+    item1->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+#ifdef __WXGTK__
+    wxButton *contextButton = new wxContextHelpButton( parent );
+    item1->Add( contextButton, 0, wxALIGN_CENTRE|wxALL, 5 );
+#endif
+
+    item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 0 );
+
+    wxWindow *item7 = parent->FindWindow( ecID_PLATFORMS_LIST );
+    wxASSERT( item7 );
+    item0->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+#endif
+
+    parent->SetAutoLayout( TRUE );
+    parent->SetSizer( item0 );
+    parent->Layout();
+    item0->Fit( parent );
+    item0->SetSizeHints( parent );
+
+    ((wxButton*) FindWindow(wxID_OK))->SetDefault();
+
+    // Add context-sensitive help text
+    parent->FindWindow( ecID_PLATFORMS_LIST )->SetHelpText(_("Displays the list of platforms."));
+    parent->FindWindow( ecID_PLATFORMS_MODIFY )->SetHelpText(_("Changes the characteristics of the currently selected platform."));
+    parent->FindWindow( ecID_PLATFORMS_ADD )->SetHelpText(_("Adds a new platform."));
+    parent->FindWindow( ecID_PLATFORMS_DELETE )->SetHelpText(_("Removes the currently selected platform."));
+    parent->FindWindow( wxID_OK )->SetHelpText(_("Closes the dialog and saves any changes you have made."));
+    parent->FindWindow( wxID_CANCEL )->SetHelpText(_("Closes the dialog without saving any changes you have made."));
+
+#if __WXGTK__
+    parent->FindWindow( wxID_CONTEXT_HELP )->SetHelpText(_("Invokes context-sensitive help for the clicked-on window."));
+#endif
+}
+
+void ecPlatformsDialog::OnModify(wxCommandEvent& event)
+{
+    long n = m_listCtrl->GetItemCount();
+    long i;
+    for (i = 0; i < n; i++)
+    {
+        if (m_listCtrl->GetItemState(i, wxLIST_STATE_SELECTED) & wxLIST_STATE_SELECTED)
+        {
+            CeCosTestPlatform *pti=Platform(i);
+
+            ecPlatformEditorDialog dlg(this);
+
+            dlg.m_strPlatform = pti->Name();
+            dlg.m_strPrefix = pti->Prefix();
+            dlg.m_strGDB = pti->GdbCmds();
+            dlg.m_strCaption = wxT("Modify Platform");
+            dlg.m_strPrompt = pti->Prompt();
+            dlg.m_bServerSideGdb = pti->ServerSideGdb();
+            dlg.m_strInferior = pti->Inferior();
+
+            if ( wxID_CANCEL != dlg.ShowModal() )
+            {
+                *pti = CeCosTestPlatform(dlg.m_strPlatform,dlg.m_strPrefix,dlg.m_strPrompt,dlg.m_strGDB,dlg.m_bServerSideGdb,dlg.m_strInferior);
+                m_listCtrl->SetItem(i, 1, pti->Prefix());
+                m_listCtrl->SetItem(i, 2, pti->GdbCmds());
+                m_listCtrl->SetItem(i, 3, pti->Inferior());
+                m_listCtrl->SetItem(i, 4, pti->Prompt());
+                m_listCtrl->SetItem(i, 5, pti->ServerSideGdb() ? wxT("Y") : wxT("N"));
+            }            
+        }
+    }
+}
+
+static long ecFindListCtrlSelection(long& whereFrom, wxListCtrl* listCtrl)
+{
+    long n = listCtrl->GetItemCount();
+    long i;
+    for (i = whereFrom; i < n; i++)
+    {
+        if (listCtrl->GetItemState(i, wxLIST_STATE_SELECTED) & wxLIST_STATE_SELECTED)
+        {
+            whereFrom = i+1;
+            return i;
+        }
+    }
+    return -1;
+}
+
+void ecPlatformsDialog::OnDelete(wxCommandEvent& event)
+{
+    long sel = -1;
+    long whereFrom = 0;
+    do
+    {
+        sel = ecFindListCtrlSelection(whereFrom, m_listCtrl);
+        if (sel > -1)
+        {
+            if (wxYES == wxMessageBox(wxT("Are you sure you wish to delete this platform?"), wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxYES_NO, this))
+            {
+                delete Platform(sel);
+                m_listCtrl->DeleteItem(sel);
+                delete m_arTargetInfo.Nth(sel);
+                whereFrom = 0;
+            }
+        }
+    } while (sel > -1) ;
+}
+
+void ecPlatformsDialog::OnAdd(wxCommandEvent& event)
+{
+    ecPlatformEditorDialog dlg(this);
+    dlg.m_strCaption = wxT("New Platform");
+    if (wxID_OK == dlg.ShowModal())
+    {
+        if( -1 == m_listCtrl->FindItem(-1, dlg.m_strPlatform) )
+        {
+            Add(CeCosTestPlatform(dlg.m_strPlatform,dlg.m_strPrefix,dlg.m_strPrompt,dlg.m_strGDB,dlg.m_bServerSideGdb,dlg.m_strInferior));  
+        } else {
+            wxMessageBox(wxT("That platform name is already in use."), wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxOK, this);
+        }
+    }
+}
+
+void ecPlatformsDialog::OnCancel(wxCommandEvent& event)
+{
+    event.Skip();
+}
+
+void ecPlatformsDialog::OnOK(wxCommandEvent& event)
+{
+    event.Skip();
+}
+
+void ecPlatformsDialog::Add(const CeCosTestPlatform &ti)
+{
+    wxListCtrl* listCtrl = (wxListCtrl*) FindWindow( ecID_PLATFORMS_LIST );
+    int i = listCtrl->GetItemCount();
+
+    listCtrl->InsertItem(i,ti.Name());
+    listCtrl->SetItem(i,1,ti.Prefix());
+    listCtrl->SetItem(i,2,ti.GdbCmds());
+    listCtrl->SetItem(i,3,ti.Inferior());
+    listCtrl->SetItem(i,4,ti.Prompt());
+    listCtrl->SetItem(i,5,ti.ServerSideGdb() ? wxT("Y"):wxT("N"));
+
+    m_arTargetInfo.Append((wxObject*) new CeCosTestPlatform(ti));
+}
+
+void ecPlatformsDialog::OnUpdateAny(wxUpdateUIEvent& event)
+{
+    event.Enable( m_listCtrl->GetSelectedItemCount() > 0 );
+}
+
+void ecPlatformsDialog::OnDoubleLClick() 
+{
+    wxCommandEvent event;
+    OnModify(event);
+}
+
+void ecPlatformsDialog::OnDeleteKey()
+{
+    wxCommandEvent event;
+    OnDelete(event);
+}
+
+/*
+ * ecPlatformsListCtrl
+ */
+
+IMPLEMENT_CLASS(ecPlatformsListCtrl, wxListCtrl)
+
+BEGIN_EVENT_TABLE(ecPlatformsListCtrl, wxListCtrl)
+    EVT_LEFT_DCLICK(ecPlatformsListCtrl::OnDoubleLClick)
+    EVT_CHAR(ecPlatformsListCtrl::OnChar)
+END_EVENT_TABLE()
+
+ecPlatformsListCtrl::ecPlatformsListCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pt,
+        const wxSize& sz, long style):
+        wxListCtrl(parent, id, pt, sz, style)
+{
+}
+
+void ecPlatformsListCtrl::OnDoubleLClick(wxMouseEvent& event)
+{
+    ecPlatformsDialog* parent = (ecPlatformsDialog*) GetParent();
+    parent->OnDoubleLClick();
+}
+
+void ecPlatformsListCtrl::OnChar(wxKeyEvent& event)
+{
+    if (event.GetKeyCode() == WXK_DELETE)
+    {
+        ecPlatformsDialog* parent = (ecPlatformsDialog*) GetParent();
+        parent->OnDeleteKey();
+    }
+    else
+        event.Skip();
+}