Mercurial > flash_v2
diff host/tools/configtool/standalone/wxwin/conflictwin.cpp @ 160:0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
| author | jlarmour |
|---|---|
| date | Fri, 01 Jun 2001 22:16:29 +0000 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/standalone/wxwin/conflictwin.cpp @@ -0,0 +1,349 @@ +//####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#### +// configtree.cpp : +// +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): julians +// Contact(s): julians +// Date: 2000/09/04 +// Version: $Id: conflictwin.cpp,v 1.3 2001/04/24 14:39:13 julians Exp $ +// Purpose: +// Description: Implementation file for ecConflictListCtrl +// Requires: +// Provides: +// See also: +// Known bugs: +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- +#ifdef __GNUG__ + #pragma implementation "conflictwin.h" +#endif + +// Includes other headers for precompiled compilation +#include "ecpch.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "conflictwin.h" +#include "configtool.h" +#include "configtooldoc.h" +#include "configtree.h" + +/* + * ecConflictListCtrl + */ + +IMPLEMENT_CLASS(ecConflictListCtrl, wxListCtrl) + +BEGIN_EVENT_TABLE(ecConflictListCtrl, wxListCtrl) + EVT_RIGHT_DOWN(ecConflictListCtrl::OnRightClick) + EVT_LEFT_DCLICK(ecConflictListCtrl::OnLeftDClick) + + EVT_MENU(ecID_LOCATE_ITEM, ecConflictListCtrl::OnLocate) + EVT_MENU(ecID_RESOLVE_ITEM, ecConflictListCtrl::OnResolve) +END_EVENT_TABLE() + +ecConflictListCtrl::ecConflictListCtrl(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("Conflicts")).Ok()) + { + SetFont(wxGetApp().GetSettings().GetWindowSettings().GetFont(wxT("Conflicts"))); + } + + InsertColumn(0, "Item", wxLIST_FORMAT_LEFT, 200); + InsertColumn(1, "Conflict", wxLIST_FORMAT_LEFT, 80); + InsertColumn(2, "Property", wxLIST_FORMAT_LEFT, 200); + + m_contextMenu = new wxMenu; + m_contextMenu->Append(ecID_WHATS_THIS, _("&What's This?")); + m_contextMenu->AppendSeparator(); + m_contextMenu->Append(ecID_LOCATE_ITEM, _("&Locate")); + m_contextMenu->Append(ecID_RESOLVE_ITEM, _("&Resolve")); + + m_contextItem = -1; + m_contextCol = 0; +} + +ecConflictListCtrl::~ecConflictListCtrl() +{ + delete m_contextMenu; +} + +void ecConflictListCtrl::OnRightClick(wxMouseEvent& event) +{ + int flags = 0; + long item = HitTest(wxPoint(event.GetX(), event.GetY()), flags); + + if (item >= 0 && !GetParent ()->IsKindOf (CLASSINFO(wxDialog))) // this menu for conflicts view only + { + m_contextItem = item; + + // Find which column we're on + m_contextCol = wxListCtrlFindColumn(*this, 3, event.GetX()); + + // GetContextMenu()->SetClientData((void*) TRUE); + PopupMenu(GetContextMenu(), event.GetX(), event.GetY()); + } + else + { + m_contextItem = -1; + + PopupMenu(wxGetApp().GetWhatsThisMenu(), event.GetX(), event.GetY()); + } +} + +void ecConflictListCtrl::OnLeftDClick(wxMouseEvent& event) +{ + if (!GetParent ()->IsKindOf (CLASSINFO(wxDialog))) // handle double click for conflicts view only + { + long sel = wxListCtrlGetSelection(* this); + if (sel >= 0) + { + // Find which column we're on + int col = wxListCtrlFindColumn(*this, 3, event.GetX()); + + ecConfigItem * pItem = AssociatedItem (sel, col); // get the referenced item + + if (pItem) { // if a referenced item was found + wxGetApp().GetTreeCtrl()->SelectItem (pItem->GetTreeItem()); // select the refreenced item + } + } + } +} + +void ecConflictListCtrl::OnLocate(wxCommandEvent& event) +{ + if (m_contextItem > -1) + { + ecConfigItem * pItem = AssociatedItem (m_contextItem, m_contextCol); // get the referenced item + + if (pItem) { // if a referenced item was found + wxGetApp().GetTreeCtrl()->SelectItem (pItem->GetTreeItem()); // select the refreenced item + } + } +} + +void ecConflictListCtrl::OnResolve(wxCommandEvent& event) +{ + ecConfigToolDoc *pDoc = wxGetApp().GetConfigToolDoc(); + + wxList conflictsOfInterest; + + long n = GetItemCount(); + long i; + for (i = 0; i < n; i++) + { + if (GetItemState(i, wxLIST_STATE_SELECTED) & wxLIST_STATE_SELECTED) + { + conflictsOfInterest.Append((wxObject*) (void*) GetItemData(i)); + } + } + + pDoc->ResolveGlobalConflicts(& conflictsOfInterest); +} + + +void ecConflictListCtrl::AddConflict (const CdlConflict &conf) +{ + // set the item column string + wxString strMacroName = (conf)->get_node ()->get_name ().c_str (); + int nIndex = InsertItem (GetItemCount (), strMacroName); + + nIndex = GetItemCount() - 1; + + SetItemData (nIndex, (long) (conf)); + + // set the conflict column string + if (0 != dynamic_cast<CdlConflict_Unresolved> (conf)) {// a conflict of type 'unresolved' + SetItem (nIndex, 1, wxT("Unresolved")); + } else if (0 != dynamic_cast<CdlConflict_IllegalValue> (conf)) { // a conflict of type 'illegal value' + SetItem (nIndex, 1, wxT("Illegal")); + } else if (0 != dynamic_cast<CdlConflict_EvalException> (conf)) { // a conflict of type 'evaluation exception' + SetItem (nIndex, 1, wxT("Exception")); + } else if (0 != dynamic_cast<CdlConflict_Requires> (conf)) { // a conflict of type 'goal unsatisfied' + SetItem (nIndex, 1, wxT("Unsatisfied")); + } else if (0 != dynamic_cast<CdlConflict_Data> (conf)) { // a conflict of type 'bad data' + SetItem (nIndex, 1, wxT("Bad data")); + } else { + wxASSERT (0); + } + + // set the property column string + wxString strProperty = conf->get_property ()->get_property_name ().c_str (); + strProperty += wxT(" "); + const std::vector<std::string> & argv = conf->get_property ()->get_argv (); + 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 + { + strProperty += argv_i->c_str (); // add the argument to the string + strProperty += wxT (" "); // separate arguments by a space character + } + } + strProperty.Trim (TRUE); // remove the trailing space character + SetItem (nIndex, 2, strProperty); +} + +void ecConflictListCtrl::AddConflicts (const std::list<CdlConflict>& conflicts) +{ + for (std::list<CdlConflict>::const_iterator conf_i=conflicts.begin (); conf_i != conflicts.end (); conf_i++) { + AddConflict(*conf_i); + } +} + +ecConfigItem *ecConflictListCtrl::AssociatedItem(int nRow,int nCol) +{ + const CdlConflict conflict = (CdlConflict) GetItemData (nRow); + wxASSERT (conflict != NULL); + + ecConfigItem *pItem=NULL; + switch(nCol) + { + case 2: + { + const CdlGoalExpression goal = dynamic_cast<CdlGoalExpression> (conflict->get_property ()); + if (! goal) // if the item is not a goal expression + break; // do nothing + 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 + const wxString strName(expression->references [0].get_destination_name ().c_str()); + pItem = wxGetApp().GetConfigToolDoc ()->Find(strName); + } + } + break; + case 0: + pItem = wxGetApp().GetConfigToolDoc ()->Find(wxString(conflict->get_node ()->get_name ().c_str())); + break; + default: + break; + } + return pItem; +} + +// This is taken from CRulesView::FillRules in the MFC version +void ecConflictListCtrl::FillRules() +{ + CdlConfiguration CdlConfig = wxGetApp().GetConfigToolDoc()->GetCdlConfig (); + if (CdlConfig) + { // if configuration information + int nCount=0; + bool bRefill=false; + wxHashTable arMap(wxKEY_INTEGER); + int i; + for ( i = 0 ; i < GetItemCount(); i++) + { + arMap.Put(GetItemData(i), (wxObject*) i); + } + + std::list<CdlConflict>::const_iterator conf_i; + + const std::list<CdlConflict>& conflicts=CdlConfig->get_all_conflicts(); + for (conf_i = conflicts.begin (); conf_i != conflicts.end (); conf_i++) { // for each conflict + nCount++; + if (!arMap.Get((long) * conf_i)) + { + bRefill=true; + break; + } + } + //for (conf_i = CdlConfig->get_structural_conflicts().begin (); conf_i != CdlConfig->get_structural_conflicts().end (); conf_i++) { // for each conflict + // nCount++; + // if(!arMap.Lookup(*conf_i,w)){ + // bRefill=true; + // break; + // } + //} + if(bRefill || nCount != GetItemCount()) + { + DeleteAllItems(); + //m_List.AddConflicts(CdlConfig->get_structural_conflicts()); + AddConflicts(CdlConfig->get_all_conflicts()); + } + } +} + +#if 0 +int CRulesList::CompareFunc(LPARAM lParam1, LPARAM lParam2) +{ + LV_FINDINFO find1 = { LVFI_PARAM, NULL, lParam1, NULL, NULL }; + LV_FINDINFO find2 = { LVFI_PARAM, NULL, lParam2, NULL, NULL }; + const int nIndex1 = FindItem (&find1); + const int nIndex2 = FindItem (&find2); + const CString str1 = GetItemText (nIndex1, m_nLastCol & 0x7fffffff); + const CString str2 = GetItemText (nIndex2, m_nLastCol & 0x7fffffff); + return (m_nLastCol & 0x80000000) ^ str1.Compare (str2); +} + +void CRulesList::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + LPARAM nCol=pNMListView->iSubItem; + if((nCol&0x7fffffff)==(0x7fffffff&m_nLastCol)){ + nCol=m_nLastCol^0x80000000; + } + m_nLastCol=nCol; + SortItems(CompareFunc,(DWORD)this); + + *pResult = 0; +} + +void CRulesList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) +{ + if (GetParent ()->IsKindOf (RUNTIME_CLASS (CRulesView))) { // handle double click for conflicts view only + NM_LISTVIEW * pNMListView = (NM_LISTVIEW *) pNMHDR; + int nItem = pNMListView->iItem; + if (-1 != nItem) { // if the double click was on a row of the list + CConfigItem * pItem = AssociatedItem (nItem, pNMListView->iSubItem); // get the referenced item + if (pItem) { // if a referenced item was found + CConfigTool::GetControlView ()->SelectItem (pItem); // select the refreenced item + } + } + } + + *pResult = 0; + UNUSED_ALWAYS(pNMHDR); +} + +#endif
