]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - tools/src/tools/configtool/standalone/wxwin/propertywin.cpp
Initial revision
[karo-tx-redboot.git] / tools / src / tools / configtool / standalone / wxwin / propertywin.cpp
diff --git a/tools/src/tools/configtool/standalone/wxwin/propertywin.cpp b/tools/src/tools/configtool/standalone/wxwin/propertywin.cpp
new file mode 100644 (file)
index 0000000..be3c33b
--- /dev/null
@@ -0,0 +1,464 @@
+//####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####
+// propertywin.cpp :
+//
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   julians
+// Contact(s):  julians
+// Date:        2000/09/04
+// Version:     $Id$
+// Purpose:
+// Description: Implementation file for ecPropertyListCtrl
+// Requires:
+// Provides:
+// See also:
+// Known bugs:
+// Usage:
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+    #pragma implementation "propertywin.h"
+#endif
+
+// Includes other headers for precompiled compilation
+#include "ecpch.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "propertywin.h"
+#include "configtool.h"
+#include "configitem.h"
+#include "configtooldoc.h"
+#include "ecutils.h"
+
+// specify the CDL properties which are to be visible in the properties view
+const std::string ecPropertyListCtrl::visible_properties [] =
+{
+       CdlPropertyId_ActiveIf,
+       CdlPropertyId_BuildProc,
+       CdlPropertyId_Calculated,
+       CdlPropertyId_CancelProc,
+       CdlPropertyId_CheckProc,
+       CdlPropertyId_Compile,
+       CdlPropertyId_ConfirmProc,
+       CdlPropertyId_DecorationProc,
+       CdlPropertyId_DefaultValue,
+       CdlPropertyId_Define,
+       CdlPropertyId_DefineHeader,
+       CdlPropertyId_DefineProc,
+//     CdlPropertyId_Description,
+       CdlPropertyId_Dialog,
+//     CdlPropertyId_Display,
+       CdlPropertyId_DisplayProc,
+       CdlPropertyId_Doc,
+       CdlPropertyId_EntryProc,
+       CdlPropertyId_Flavor,
+       CdlPropertyId_DefineFormat,
+       CdlPropertyId_Group,
+       CdlPropertyId_Hardware,
+       CdlPropertyId_IfDefine,
+       CdlPropertyId_Implements,
+       CdlPropertyId_IncludeDir,
+       CdlPropertyId_IncludeFiles,
+       CdlPropertyId_InitProc,
+       CdlPropertyId_InstallProc,
+       CdlPropertyId_LegalValues,
+       CdlPropertyId_Library,
+       CdlPropertyId_LicenseProc,
+       CdlPropertyId_Make,
+       CdlPropertyId_Makefile,
+       CdlPropertyId_MakeObject,
+       CdlPropertyId_NoDefine,
+       CdlPropertyId_Object,
+       CdlPropertyId_Parent,
+       CdlPropertyId_Requires,
+       CdlPropertyId_Screen,
+       CdlPropertyId_Script,
+       CdlPropertyId_UpdateProc,
+       CdlPropertyId_Wizard
+};
+
+const wxChar* ecPropertyListCtrl::sm_fieldTypeImage[ecMAXFIELDTYPE]=
+       {wxT("Type"), wxT("Value"), wxT("Default"), wxT("Macro"), wxT("File"), wxT("URL"), wxT("Enabled")};
+
+
+/*
+ * ecPropertyListCtrl
+ */
+
+IMPLEMENT_CLASS(ecPropertyListCtrl, wxListCtrl)
+
+BEGIN_EVENT_TABLE(ecPropertyListCtrl, wxListCtrl)
+    EVT_RIGHT_DOWN(ecPropertyListCtrl::OnRightClick)
+    EVT_LEFT_DCLICK(ecPropertyListCtrl::OnDoubleClick)
+END_EVENT_TABLE()
+
+ecPropertyListCtrl::ecPropertyListCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pt,
+        const wxSize& sz, long style):
+        wxListCtrl(parent, id, pt, sz, style)
+{
+    if (!wxGetApp().GetSettings().GetWindowSettings().GetUseDefaults() &&
+         wxGetApp().GetSettings().GetWindowSettings().GetFont(wxT("Properties")).Ok())
+    {
+        SetFont(wxGetApp().GetSettings().GetWindowSettings().GetFont(wxT("Properties")));
+    }
+
+    m_f[0]=0.25;
+    m_f[1]=0.75;
+    m_pti = NULL;
+    m_nFirstProperty = 0;
+    m_nOnSizeRecursionCount = 0;
+
+    AddColumns();
+
+#if 0
+    int j;
+    int i = 0;
+    for (j = 0; j < 4; j++)
+    {
+        
+        // Insert some dummy items
+        
+        wxListItem info;
+        info.m_text = _("URL");
+        info.m_mask = wxLIST_MASK_TEXT ; // | wxLIST_MASK_IMAGE | wxLIST_MASK_DATA;
+        info.m_itemId = i;
+        info.m_image = -1;
+        //info.m_data = (long) doc;
+        
+        long item = InsertItem(info);
+        
+        SetItem(i, 1, _("redirects/interrupts.html"));   
+        i ++;
+        
+        info.m_text = _("Enabled");
+        info.m_mask = wxLIST_MASK_TEXT ; // | wxLIST_MASK_IMAGE | wxLIST_MASK_DATA;
+        info.m_itemId = i;
+        info.m_image = -1;
+        //info.m_data = (long) doc;
+        
+        item = InsertItem(info);
+        
+        SetItem(i, 1, _("True"));
+        i ++;
+    }
+#endif
+
+}
+
+void ecPropertyListCtrl::OnRightClick(wxMouseEvent& event)
+{
+    PopupMenu(wxGetApp().GetWhatsThisMenu(), event.GetX(), event.GetY());
+}
+
+void ecPropertyListCtrl::AddColumns()
+{
+    InsertColumn(0, "Property", wxLIST_FORMAT_LEFT, 100);
+    InsertColumn(1, "Value", wxLIST_FORMAT_LEFT, 300);
+}
+
+void ecPropertyListCtrl::Fill(ecConfigItem *pti)
+{
+    if(NULL==pti){
+        ClearAll();
+        AddColumns();
+        m_nFirstProperty=0;
+        m_pti=NULL;
+    } else /* if(pti!=m_pti) */ {
+        m_pti=pti;
+        m_nMaxValueWidth=0;
+        ecOptionType type=m_pti->GetOptionType();
+        int i;  
+        
+        // Initially flag all items as unnecessary - calls of SetItem or SetProperty will change this
+        for(i=GetItemCount()-1;i>=0;--i){
+            SetItemData(i,0);
+        }
+        if (m_pti->HasBool () || (ecOptionTypeNone!=type)){
+            SetItem(ecMacro, m_pti->GetMacro ());
+        }
+        
+        if (m_pti->HasBool ()){
+            SetItem(ecEnabled, m_pti->IsEnabled() ? wxT("True") : wxT("False"));
+        }
+        
+        if(!m_pti->GetFilename().IsEmpty()){
+            SetItem(ecFile, m_pti->GetFilename());
+        }
+        SetItem(ecURL, m_pti->GetURL());
+        
+        if (ecOptionTypeNone!=type){
+
+            switch(type){
+            case ecString:
+                SetItem(ecValue, m_pti->StringValue());
+                SetItem(ecDefaultValue, m_pti->StringDefaultValue());
+                break;
+            case ecLong:
+                SetItem(ecValue, ecUtils::IntToStr(m_pti->Value(), wxGetApp().GetSettings().m_bHex));
+                SetItem(ecDefaultValue, ecUtils::IntToStr(m_pti->DefaultValue(), wxGetApp().GetSettings().m_bHex));
+                break;
+            case ecDouble:
+                SetItem(ecValue, ecUtils::DoubleToStr(m_pti->DoubleValue()));
+                SetItem(ecDefaultValue, ecUtils::DoubleToStr(m_pti->DoubleDefaultValue()));
+                break;
+            case ecEnumerated:
+                SetItem(ecValue,m_pti->StringValue());
+                SetItem(ecDefaultValue,m_pti->StringDefaultValue());
+                break;
+            default:
+                wxASSERT( FALSE );
+                break;
+            }
+            // TODO: set image
+            // SetItem(ecType, ecConfigItem::TreeItemTypeImage[type]);
+        }
+
+        // List all the properties applicable to me
+        const std::string name = ecUtils::UnicodeToStdStr (m_pti->GetMacro ());
+        if (name.size () > 0)
+        {
+            const CdlConfiguration config = wxGetApp().GetConfigToolDoc ()->GetCdlConfig ();
+            const CdlNode node = config->find_node (name, true);
+            wxASSERT (node);
+            const std::vector<CdlProperty> & properties = node->get_properties ();
+            std::vector<CdlProperty>::const_iterator property_i;
+            // CMapStringToPtr map; // count of each property name
+            wxHashTable map(wxKEY_STRING);  // count of each property name
+
+            for (property_i = properties.begin (); property_i != properties.end (); property_i++) {// for each property
+                // get the property name
+                const CdlProperty &prop=*property_i;
+                const wxString strName(prop->get_property_name ().c_str());
+                enum {VISIBLE_PROPERTIES_COUNT=sizeof visible_properties/sizeof visible_properties[0]};
+                if (std::find (visible_properties, visible_properties + VISIBLE_PROPERTIES_COUNT, ecUtils::UnicodeToStdStr(strName)) != visible_properties + VISIBLE_PROPERTIES_COUNT) {// if the property should be displayed
+                    // set the property arguments
+                    wxString strPropertyArgs;
+                    const std::vector<std::string> & argv = prop->get_argv ();
+                    void *p;
+                    p = (void*) map.Delete(strName);
+                    
+                    p=(void *)((int)p+1);
+                    map.Put(strName, (wxObject*) p);
+                    
+                    std::vector<std::string>::const_iterator argv_i;
+                    for (argv_i = argv.begin (); argv_i != argv.end (); argv_i++){ // for each property argument...
+                        if (argv_i != argv.begin ()){                              // ...except the first (the property name)
+                            wxString strArg(ecUtils::StripExtraWhitespace (wxString(argv_i->c_str())));
+                            if (strPropertyArgs.Len() + strArg.Len() + 1 > 256) {// if the string is too long for the list control
+                                break; // no need to add any further arguments
+                            }
+                            strPropertyArgs += strArg; // add the argument to the string
+                            strPropertyArgs += wxT (" "); // separate arguments by a space character
+                        }
+                    }
+                    // the list control appears to display a maximum of 256 characters
+                    int nIndex=SetItem(strName, strPropertyArgs, GetItemCount(), (int)p);
+                    SetItemData(nIndex, (long) prop);
+                    
+                    // display the exclamation icon if the property is in a conflicts list
+                    bool bConflictItem =
+                        //                                     PropertyInConflictsList (* property_i, config->get_structural_conflicts ()) || ignore for now
+                        PropertyInConflictsList (prop, config->get_all_conflicts ());
+
+                    // TODO: set the image for a conflict item
+                    // CListCtrl::SetItem (nIndex, 0, LVIF_IMAGE, NULL, bConflictItem ? 1 : 0, 0, 0, 0 );
+                }
+            }
+        }
+
+        for(i=GetItemCount()-1;i>=0;--i){
+            if(0==GetItemData(i)){
+                DeleteItem(i);
+                if(i<m_nFirstProperty){
+                    m_nFirstProperty--;
+                }
+            }
+        }
+        // TODO
+#if 0
+        CRect rect;
+        GetClientRect(rect);
+        int nAvailWidth=rect.Width()-GetColumnWidth(0);
+        int w=max(m_nMaxValueWidth,nAvailWidth);
+        m_f[1]=double(w)/double(rect.Width());
+        SetColumnWidth(1,w); 
+#endif
+    }
+
+    Refresh();
+}
+
+bool ecPropertyListCtrl::PropertyInConflictsList (CdlProperty property, const std::list<CdlConflict> & conflicts)
+{
+    std::list<CdlConflict>::const_iterator conf_i;
+    for (conf_i = conflicts.begin (); conf_i != conflicts.end (); conf_i++) // for each conflict
+        if (property == (* conf_i)->get_property ())
+            return true;
+        
+        return false;
+}
+
+void ecPropertyListCtrl::RefreshValue()
+{
+    if (!m_pti)
+        return;
+
+    if (m_pti->HasBool ()){
+        SetItem(ecEnabled, m_pti->IsEnabled () ? wxT("True") : wxT("False"));
+    }
+    if (m_pti->GetOptionType () != ecOptionTypeNone){
+        SetItem(ecValue, m_pti->StringValue());
+    }
+    for (int nItem = m_nFirstProperty; nItem < GetItemCount (); nItem++)
+    {
+        CdlProperty property = (CdlProperty) GetItemData (nItem);
+        wxASSERT (property);
+        
+        // display the exclamation icon if the property is in a conflicts list
+        const CdlConfiguration config = wxGetApp().GetConfigToolDoc ()->GetCdlConfig ();
+        bool bConflictItem =
+            //                                         PropertyInConflictsList (property, config->get_structural_conflicts ()) || ignore for now
+            PropertyInConflictsList (property, config->get_all_conflicts ());
+        
+        // TODO
+        // CListCtrl::SetItem (nItem, 0, LVIF_IMAGE, NULL, bConflictItem ? 1 : 0, 0, 0, 0 );
+    }
+    
+}
+
+int ecPropertyListCtrl::SetItem(ecFieldType f, const wxString& value)
+{
+    int nIndex=SetItem(sm_fieldTypeImage[f], value, m_nFirstProperty);
+    if(nIndex==m_nFirstProperty){
+        m_nFirstProperty++;
+    }
+    SetItemData(nIndex,1);
+    return nIndex;
+}
+
+int ecPropertyListCtrl::SetItem(const wxString& item, const wxString& value, int nInsertAs, int nRepeat)
+{
+    wxASSERT( nInsertAs <= GetItemCount() );
+
+/*
+    LVFINDINFO info;
+    info.flags =LVFI_STRING;
+    info.psz   =pszItem;
+    info.vkDirection=VK_DOWN;
+    int nIndex=-1;
+    do {
+        nIndex=FindItem(&info,nIndex);
+    } while (--nRepeat>0 && nIndex!=-1);
+*/
+    // NB: wxListCtrl doesn't support reverse search, so could do it explicitly
+    // by iterating through the items.
+    // But for now, just ignore the nRepeat flag and find the first one.
+    int nIndex = -1;
+    nIndex = FindItem(0, /* nIndex */ item);
+    
+    if(-1==nIndex){
+        nIndex = InsertItem(nInsertAs, item);
+    }
+    
+    wxListCtrl::SetItem(nIndex, 1, value);
+
+    // TODO
+#if 0
+    CDC *pDC=GetDC();
+    CFont *pOldFont=pDC->SelectObject(GetFont());
+    m_nMaxValueWidth=max(m_nMaxValueWidth,pDC->GetTextExtent(pszValue).cx);
+    pDC->SelectObject(pOldFont);
+    ReleaseDC(pDC);
+#endif
+
+    return nIndex;
+}
+
+void ecPropertyListCtrl::OnDoubleClick(wxMouseEvent& event)
+{
+    // Double-clicked the item
+
+    int flags;
+    long item = HitTest(event.GetPosition(), flags);
+    if (item > -1)
+    {
+        const wxString strText = wxListCtrlGetItemTextColumn(*this, item,0);
+        if(strText == wxT("File")){
+            m_pti->ViewHeader();
+        } else if (strText == wxT("URL")) {
+            m_pti->ViewURL();
+        }
+    }
+
+    // TODO
+#if 0    
+    int pos=GetMessagePos();
+    CPoint pt(GET_X_LPARAM(pos),GET_Y_LPARAM(pos));
+    ScreenToClient(&pt);
+    int nItem=HitTest(pt,NULL);
+    
+    if(GetItemData(nItem)>1){
+        // This is a property row
+        const CdlGoalExpression goal = dynamic_cast<CdlGoalExpression> ((CdlProperty) GetItemData (nItem));
+        if (goal){
+            // This is a rule row
+            const CdlExpression expression = goal->get_expression ();
+            if (1 == expression->references.size ()) // if the property contains a single reference
+            {
+                // assume that the reference is to another user visible node and try to find it
+                std::string macro_name = expression->references [0].get_destination_name ();
+                CConfigItem * pItem = CConfigTool::GetConfigToolDoc ()->Find (CString (macro_name.c_str ()));
+                if (pItem) // the referenced node was found so select it
+                {
+                    CConfigTool::GetControlView()->GetTreeCtrl().SelectItem(pItem->HItem());
+                }
+            }
+        }
+    } else {
+        const CString strText(GetItemText(nItem,0));
+        if(strText==FieldTypeImage[File]){
+            m_pti->ViewHeader();
+        } else if (strText==FieldTypeImage[URL]) {
+            m_pti->ViewURL();
+        }
+    }
+#endif
+    event.Skip();
+}