comparison host/tools/configtool/common/win32/RulesList.cpp @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children 74dbf4c3f2e1
comparison
equal deleted inserted replaced
75:41bf073c0c32 76:435cced73e2f
1 //####COPYRIGHTBEGIN####
2 //
3 // ----------------------------------------------------------------------------
4 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
5 //
6 // This program is part of the eCos host tools.
7 //
8 // This program is free software; you can redistribute it and/or modify it
9 // under the terms of the GNU General Public License as published by the Free
10 // Software Foundation; either version 2 of the License, or (at your option)
11 // any later version.
12 //
13 // This program is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 // more details.
17 //
18 // You should have received a copy of the GNU General Public License along with
19 // this program; if not, write to the Free Software Foundation, Inc.,
20 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 //
22 // ----------------------------------------------------------------------------
23 //
24 //####COPYRIGHTEND####
25 // RulesView.cpp : implementation file
26 //
27
28 #include "stdafx.h"
29 #include "ConfigToolDoc.h"
30 #include "RulesList.h"
31
32 #include "RulesView.h"
33 #include "ControlView.h"
34 #include "ConfigItem.h"
35 #include "ConfigTool.h"
36
37 #define INCLUDEFILE <string>
38 #include "IncludeSTL.h"
39
40 #ifdef _DEBUG
41 #define new DEBUG_NEW
42 #undef THIS_FILE
43 static char THIS_FILE[] = __FILE__;
44 #endif
45
46 /////////////////////////////////////////////////////////////////////////////
47 // CRulesList
48
49 CRulesList::CRulesList():
50 m_nLastCol(0x7fffffff),
51 m_fWidth(0.0)
52 {
53 m_f[0]=3.0/7.0;
54 m_f[1]=1.0/7.0;
55 m_f[2]=3.0/7.0;
56 }
57
58 CRulesList::~CRulesList()
59 {
60 }
61
62 BEGIN_MESSAGE_MAP(CRulesList, CTTListCtrl)
63 //{{AFX_MSG_MAP(CRulesList)
64 ON_WM_CREATE()
65 ON_WM_SIZE()
66 ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
67 ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
68 ON_NOTIFY(HDN_ENDTRACKW, 0, OnEndTrack)
69 //}}AFX_MSG_MAP
70 END_MESSAGE_MAP()
71
72 /////////////////////////////////////////////////////////////////////////////
73 // CRulesList drawing
74
75 /////////////////////////////////////////////////////////////////////////////
76 // CRulesList message handlers
77
78 void CRulesList::AddConflict (const CdlConflict &conf)
79 {
80 // set the item column string
81 CString strMacroName = (conf)->get_node ()->get_name ().c_str ();
82 int nIndex = InsertItem (GetItemCount (), strMacroName);
83 SetItemData (nIndex, (DWORD) (conf));
84
85 // set the conflict column string
86 if (0 != dynamic_cast<CdlConflict_Unresolved> (conf)) {// a conflict of type 'unresolved'
87 SetItemText (nIndex, 1, _T("Unresolved"));
88 } else if (0 != dynamic_cast<CdlConflict_IllegalValue> (conf)) { // a conflict of type 'illegal value'
89 SetItemText (nIndex, 1, _T("Illegal"));
90 } else if (0 != dynamic_cast<CdlConflict_EvalException> (conf)) { // a conflict of type 'evaluation exception'
91 SetItemText (nIndex, 1, _T("Exception"));
92 } else if (0 != dynamic_cast<CdlConflict_Requires> (conf)) { // a conflict of type 'goal unsatisfied'
93 SetItemText (nIndex, 1, _T("Unsatisfied"));
94 } else if (0 != dynamic_cast<CdlConflict_Data> (conf)) { // a conflict of type 'bad data'
95 SetItemText (nIndex, 1, _T("Bad data"));
96 } else {
97 ASSERT (0);
98 }
99
100 // set the property column string
101 CString strProperty = conf->get_property ()->get_property_name ().c_str ();
102 strProperty += _T(" ");
103 const std::vector<std::string> & argv = conf->get_property ()->get_argv ();
104 std::vector<std::string>::const_iterator argv_i;
105 for (argv_i = argv.begin (); argv_i != argv.end (); argv_i++) {// for each property argument...
106 if (argv_i != argv.begin ()) // ...except the first
107 {
108 strProperty += argv_i->c_str (); // add the argument to the string
109 strProperty += _T (" "); // separate arguments by a space character
110 }
111 }
112 strProperty.TrimRight (); // remove the trailing space character
113 SetItemText (nIndex, 2, strProperty);
114 }
115
116 int CRulesList::OnCreate(LPCREATESTRUCT lpCreateStruct)
117 {
118 lpCreateStruct->style|=LVS_REPORT;
119 if (CTTListCtrl::OnCreate(lpCreateStruct) == -1)
120 return -1;
121 SetExtendedStyle(LVS_EX_FULLROWSELECT);
122
123 InsertColumn(0,_T("Item"), LVCFMT_LEFT,0,0);
124 InsertColumn(1,_T("Conflict"),LVCFMT_LEFT,0,1);
125 InsertColumn(2,_T("Property"),LVCFMT_LEFT,0,2);
126
127 return 0;
128 }
129
130 void CRulesList::OnSize(UINT nType, int cx, int cy)
131 {
132 CTTListCtrl::OnSize(nType, cx, cy);
133 m_fWidth=cx;
134 for(int i=0;i<NCOLS;i++){
135 SetColumnWidth(i,int(cx*m_f[i]));
136 }
137 }
138
139 int CRulesList::CompareFunc(LPARAM lParam1, LPARAM lParam2)
140 {
141 LV_FINDINFO find1 = { LVFI_PARAM, NULL, lParam1, NULL, NULL };
142 LV_FINDINFO find2 = { LVFI_PARAM, NULL, lParam2, NULL, NULL };
143 const int nIndex1 = FindItem (&find1);
144 const int nIndex2 = FindItem (&find2);
145 const CString str1 = GetItemText (nIndex1, m_nLastCol & 0x7fffffff);
146 const CString str2 = GetItemText (nIndex2, m_nLastCol & 0x7fffffff);
147 return (m_nLastCol & 0x80000000) ^ str1.Compare (str2);
148 }
149
150 void CRulesList::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
151 {
152 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
153 LPARAM nCol=pNMListView->iSubItem;
154 if((nCol&0x7fffffff)==(0x7fffffff&m_nLastCol)){
155 nCol=m_nLastCol^0x80000000;
156 }
157 m_nLastCol=nCol;
158 SortItems(CompareFunc,(DWORD)this);
159
160 *pResult = 0;
161 }
162
163 void CRulesList::OnEndTrack(NMHEADER *pNMHeader, LRESULT*)
164 {
165 m_f[pNMHeader->iItem]=pNMHeader->pitem->cxy/m_fWidth;
166 }
167
168 void CRulesList::AddConflicts (const std::list<CdlConflict>& conflicts)
169 {
170 for (std::list<CdlConflict>::const_iterator conf_i=conflicts.begin (); conf_i != conflicts.end (); conf_i++) {
171 AddConflict(*conf_i);
172 }
173 }
174
175 void CRulesList::AddConflicts (const std::vector<CdlConflict>& conflicts)
176 {
177 for (std::vector<CdlConflict>::const_iterator conf_i=conflicts.begin (); conf_i != conflicts.end (); conf_i++) {
178 AddConflict(*conf_i);
179 }
180 }
181
182 void CRulesList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
183 {
184 if (GetParent ()->IsKindOf (RUNTIME_CLASS (CRulesView))) { // handle double click for conflicts view only
185 NM_LISTVIEW * pNMListView = (NM_LISTVIEW *) pNMHDR;
186 int nItem = pNMListView->iItem;
187 if (-1 != nItem) { // if the double click was on a row of the list
188 CConfigItem * pItem = AssociatedItem (nItem, pNMListView->iSubItem); // get the referenced item
189 if (pItem) { // if a referenced item was found
190 CConfigTool::GetControlView ()->SelectItem (pItem); // select the refreenced item
191 }
192 }
193 }
194
195 *pResult = 0;
196 UNUSED_ALWAYS(pNMHDR);
197 }
198
199 CConfigItem *CRulesList::AssociatedItem(int nRow,int nCol)
200 {
201 const CdlConflict conflict = (CdlConflict) GetItemData (nRow);
202 ASSERT (conflict);
203
204 CConfigItem *pItem=NULL;
205 switch(nCol){
206 case 2:
207 {
208 const CdlGoalExpression goal = dynamic_cast<CdlGoalExpression> (conflict->get_property ());
209 if (! goal) // if the item is not a goal expression
210 break; // do nothing
211 const CdlExpression expression = goal->get_expression ();
212 if (1 == expression->references.size ()) // if the property contains a single reference
213 {
214 // assume that the reference is to another user visible node and try to find it
215 const CString strName(expression->references [0].get_destination_name ().c_str());
216 pItem = CConfigTool::GetConfigToolDoc ()->Find(strName);
217 }
218 }
219 break;
220 case 0:
221 pItem = CConfigTool::GetConfigToolDoc ()->Find(CString(conflict->get_node ()->get_name ().c_str()));
222 break;
223 default:
224 break;
225 }
226 return pItem;
227 }